5180 fichiers 38.5 Mo 0 téléchargements 239 vues mis à jour il y a 5 heures ui
nitro-v36-with-renderer-v36 / src / components / quests / QuestCompletedView.tsx
QuestCompletedView.tsx 5.7 Ko Télécharger le fichier
import { CreateLinkEvent } from '@octane/renderer';
import { FC, useEffect, useState } from 'react';
import { getActivityPointName, getCampaignImageUrl, getCampaignName, getQuestCompletedText, isQuestRewardVisible, localizeWithFallback } from '../../api';
import { Button, DraggableWindowPosition } from '../../common';
import { useQuests } from '../../hooks';
import { OctaneCard } from '../../layout';
import { BaseButton } from '../../common/BaseButton';
import { NativeTextTree } from '../../common/native-text/NativeTextTree';

/** The official dialog waits two seconds after the completion packet before it appears. */
const SHOW_DELAY_MS = 2000;

/**
 * The QuestCompletedDialog (426x215): congratulations, the quest's completed text, the reward and
 * either the "next quest" button or, for the last quest of a campaign, the "more quests" button.
 */
export const QuestCompletedView: FC<{}> = () => {
    const { completion = null, requestNextQuest = null, clearCompletion = null } = useQuests();
    const [visibleFor, setVisibleFor] = useState<number>(0);

    useEffect(() => {
        if (!completion || !completion.showDialog) {
            setVisibleFor(0);

            return;
        }

        const timeout = window.setTimeout(() => setVisibleFor(completion.receivedAt), SHOW_DELAY_MS);

        return () => window.clearTimeout(timeout);
    }, [completion]);

    if (!completion || !completion.showDialog || visibleFor !== completion.receivedAt) return null;

    const quest = completion.quest;
    const lastQuestInCampaign = quest.lastQuestInCampaign;
    const campaignName = getCampaignName(quest.campaignCode);
    const rewardVisible = isQuestRewardVisible(quest.activityPointType, quest.rewardCurrencyAmount);
    const currencyName = getActivityPointName(quest.activityPointType);

    const close = () => clearCompletion && clearCompletion();

    const onNextQuest = () => {
        requestNextQuest && requestNextQuest();
        close();
    };

    const onMoreQuests = () => {
        CreateLinkEvent('quests/show');
        close();
    };

    const onCatalog = () => {
        CreateLinkEvent(quest.catalogPageName && quest.catalogPageName.length ? `catalog/open/${quest.catalogPageName}` : 'catalog/open');
        close();
    };

    return (
        <NativeTextTree>
            <OctaneCard className="octane-quest-completed" uniqueKey="quest-completed" windowPosition={DraggableWindowPosition.CENTER}>
                <OctaneCard.Header
                    headerText={
                        lastQuestInCampaign
                            ? localizeWithFallback('quests.completed.campaign.title', '%category% completed!', ['category'], [campaignName])
                            : localizeWithFallback('quests.completed.quest.title', '%category% quest completed', ['category'], [campaignName])
                    }
                    onCloseClick={onNextQuest}
                />
                <OctaneCard.Content className="octane-quest-completed-content">
                    <div className="octane-quest-completed-banner">
                        <div className="octane-quest-completed-icon" data-campaign={lastQuestInCampaign}>
                            {lastQuestInCampaign && <img src={getCampaignImageUrl(quest.campaignCode)} alt="" draggable={false} />}
                        </div>
                        <div className="octane-quest-completed-texts">
                            <div className="octane-quest-completed-congrats">
                                {lastQuestInCampaign
                                    ? localizeWithFallback('quests.completed.campaign.caption', 'Campaign completed!')
                                    : localizeWithFallback('quests.completed.quest.caption', 'Quest completed!')}
                            </div>
                            <div className="octane-quest-completed-desc">{getQuestCompletedText(quest)}</div>
                            {rewardVisible && (
                                <div className="octane-quest-completed-reward">
                                    {localizeWithFallback(
                                        'quests.completed.reward',
                                        'You earned %amount% %currencyname%!',
                                        ['amount', 'currencyname'],
                                        [String(quest.rewardCurrencyAmount), currencyName]
                                    )}
                                </div>
                            )}
                        </div>
                    </div>
                    <div className="octane-quest-completed-actions">
                        {!lastQuestInCampaign && rewardVisible && (
                            <BaseButton className="octane-quest-link" onClick={onCatalog}>
                                {localizeWithFallback('quests.completed.cataloglink', 'Spend your %currencyname%', ['currencyname'], [currencyName])}
                            </BaseButton>
                        )}
                        <div className="grow" />
                        {lastQuestInCampaign && (
                            <Button variant="secondary" className="octane-quest-completed-button" onClick={onMoreQuests}>
                                {localizeWithFallback('quests.campaigncompleted.more', 'More quests')}
                            </Button>
                        )}
                        {!lastQuestInCampaign && (
                            <Button variant="secondary" className="octane-quest-completed-button" onClick={onNextQuest}>
                                {localizeWithFallback('quests.completed.next', 'Next quest')}
                            </Button>
                        )}
                    </div>
                </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