5180 fichiers 38.5 Mo 0 téléchargements 255 vues mis à jour il y a 5 heures ui
AchievementsView.tsx 6.2 Ko Télécharger le fichier
import { AddLinkEventTracker, ILinkEventTracker, RemoveLinkEventTracker } from '@octane/renderer';
import { FC, useEffect } from 'react';
import { AchievementUtilities, LocalizeText } from '../../api';
import { DraggableWindowPosition } from '../../common';
import { useAchievements } from '../../hooks';
import { OctaneCard } from '../../layout';
import { AchievementCategoryView } from './AchievementCategoryView';
import { AirAchievementProgressBar } from './AirAchievementProgressBar';
import { AchievementsCategoryListView } from './category-list';
import { BaseButton } from '../../common/BaseButton';
import { NativeTextTree } from '../../common/native-text/NativeTextTree';

export const AchievementsView: FC = () => {
    const {
        isVisible,
        isLoaded,
        show,
        close,
        achievementCategories = [],
        selectedCategoryCode = null,
        setSelectedCategoryCode = null,
        achievementScore = 0,
        getProgress = 0,
        getMaxProgress = 0,
        selectedCategory = null
    } = useAchievements();

    useEffect(() => {
        const linkTracker: ILinkEventTracker = {
            linkReceived: (url: string) => {
                const parts = url.split('/');

                if (parts.length < 2) return;

                switch (parts[1]) {
                    case 'show':
                        show(parts[2]);
                        return;
                    case 'hide':
                        close();
                        return;
                    case 'toggle':
                        if (isVisible) close();
                        else show();
                        return;
                }
            },
            eventUrlPrefix: 'achievements/'
        };

        const questTracker: ILinkEventTracker = {
            eventUrlPrefix: 'questengine/achievements',
            linkReceived: (url) => {
                const category = url.split('/')[2];
                if (category) show(category);
                else show();
            }
        };

        AddLinkEventTracker(linkTracker);
        AddLinkEventTracker(questTracker);

        return () => {
            RemoveLinkEventTracker(linkTracker);
            RemoveLinkEventTracker(questTracker);
        };
    }, [close, isVisible, show]);

    if (!isVisible || !isLoaded) return null;

    return (
        <NativeTextTree>
            <OctaneCard
                className="octane-achievements-air octane-card-frame-3 octane-card-frame-teal"
                uniqueKey="achievements"
                windowPosition={DraggableWindowPosition.TOP_CENTER}
                offsetTop={-30}
                data-view={selectedCategory ? 'category' : 'categories'}
            >
                <OctaneCard.Header headerText={LocalizeText('inventory.achievements')} onCloseClick={close} />
                <OctaneCard.Content className="air-achievements-content">
                    {!selectedCategory && (
                        <>
                            <AchievementsCategoryListView
                                categories={achievementCategories}
                                selectedCategoryCode={selectedCategoryCode}
                                setSelectedCategoryCode={setSelectedCategoryCode}
                            />
                            <div className="air-achievements-category-footer">
                                <AirAchievementProgressBar
                                    className="air-achievements-total-progress"
                                    width={246}
                                    maxProgress={getMaxProgress}
                                    progress={getProgress}
                                    key={getMaxProgress}
                                    localizationKey="achievements.categories.totalprogress"
                                />
                                <div className="air-achievements-score">
                                    {LocalizeText('achievements.categories.score', ['score'], [achievementScore.toString()])}
                                </div>
                            </div>
                        </>
                    )}
                    {selectedCategory && (
                        <>
                            <div className="air-achievements-category-header">
                                <BaseButton
                                    type="button"
                                    className="air-achievements-back"
                                    onClick={() => setSelectedCategoryCode(null)}
                                    aria-label={LocalizeText('generic.back')}
                                />
                                <div className="air-achievements-category-name">{AchievementUtilities.getAchievementCategoryName(selectedCategory)}</div>
                                <div className="air-achievements-category-progress">
                                    {LocalizeText(
                                        'achievements.details.categoryprogress',
                                        ['progress', 'limit'],
                                        [selectedCategory.getProgress().toString(), selectedCategory.getMaxProgress().toString()]
                                    )}
                                </div>
                                <img
                                    className="air-achievements-category-icon"
                                    src={AchievementUtilities.getAchievementCategoryImageUrl(selectedCategory, true)}
                                    onError={(event) => {
                                        event.currentTarget.style.visibility = 'hidden';
                                    }}
                                    onLoad={(event) => {
                                        event.currentTarget.style.visibility = 'visible';
                                    }}
                                    alt=""
                                    draggable={false}
                                />
                            </div>
                            <AchievementCategoryView category={selectedCategory} />
                        </>
                    )}
                </OctaneCard.Content>
            </OctaneCard>
        </NativeTextTree>
    );
};
15Sujets
1Dépôts
20Membres
2En ligne
Profile
Inscrit
Dernière visite
Messages
0
Votes positifs
0
Votes négatifs
0

Nous utilisons des cookies pour assurer le bon fonctionnement du site et améliorer votre expérience. en savoir plus

Autoriser