5180 fichiers 38.5 Mo 0 téléchargements 246 vues mis à jour il y a 5 heures ui
nitro-v36-with-renderer-v36 / src / hooks / help / useHabboWay.ts
useHabboWay.ts 3.7 Ko Télécharger le fichier
import {
    AddLinkEventTracker,
    GetQuizQuestionsComposer,
    ILinkEventTracker,
    PostQuizAnswersComposer,
    QuizDataMessageEvent,
    QuizResultsMessageEvent,
    RemoveLinkEventTracker
} from '@octane/renderer';
import { useEffect, useState } from 'react';
import {
    applyQuizResults,
    createQuizState,
    getQuizAnswersToPost,
    getQuizAnswerTexts,
    HABBO_WAY_QUIZ_CODE,
    IQuizState,
    LocalizeText,
    moveQuizQuestion,
    SAFETY_QUIZ_CODE,
    selectQuizAnswer,
    SendMessageComposer,
    showQuizAnalysis
} from '../../api';
import { useMessageEvent } from '../events';

const localizeOrEmpty = (key: string): string => {
    const value = LocalizeText(key);

    return value && value !== key ? value : '';
};

/**
 * AIR help/HabboWayController, SafetyBookletController and HabboWayQuizController: the paged
 * Habbo Way and safety booklet windows and the quiz they lead to. Opened by `help/habboway`,
 * `help/safetybooklet` and `help/quiz/<code>`.
 */
export const useHabboWay = () => {
    const [habboWayPage, setHabboWayPage] = useState<number>(-1);
    const [bookletPage, setBookletPage] = useState<number>(-1);
    const [quiz, setQuiz] = useState<IQuizState>(null);

    const startQuiz = (quizCode: string) => SendMessageComposer(new GetQuizQuestionsComposer(quizCode));

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

                switch (parts[1]) {
                    case 'habboway':
                        setHabboWayPage(0);
                        return;
                    case 'safetybooklet':
                        setBookletPage(0);
                        return;
                    case 'quiz':
                        startQuiz(parts[2] === 'safety' || parts[2] === SAFETY_QUIZ_CODE ? SAFETY_QUIZ_CODE : HABBO_WAY_QUIZ_CODE);
                        return;
                }
            },
            eventUrlPrefix: 'help/'
        };

        AddLinkEventTracker(linkTracker);

        return () => RemoveLinkEventTracker(linkTracker);
    }, []);

    useMessageEvent<QuizDataMessageEvent>(QuizDataMessageEvent, (event) => {
        const parser = event.getParser();

        if (!parser) return;

        const answerCounts = parser.questionIds.map((questionId) => getQuizAnswerTexts(parser.quizCode, questionId, localizeOrEmpty).length);

        // _rc945f4bc23fedd: the quiz replaces the Habbo Way and the safety booklet windows.
        setHabboWayPage(-1);
        setBookletPage(-1);
        setQuiz(createQuizState(parser.quizCode, parser.questionIds, answerCounts));
    });

    useMessageEvent<QuizResultsMessageEvent>(QuizResultsMessageEvent, (event) => {
        const parser = event.getParser();

        if (!parser) return;

        setQuiz((current) => (current && current.quizCode === parser.quizCode ? applyQuizResults(current, parser.questionIdsForWrongAnswers) : current));
    });

    const moveQuestion = (index: number) => {
        if (!quiz) return;

        const next = moveQuizQuestion(quiz, index);

        if (next.submitted && !quiz.submitted) {
            SendMessageComposer(new PostQuizAnswersComposer(quiz.quizCode, getQuizAnswersToPost(quiz.answers)));
        }

        setQuiz(next);
    };

    return {
        habboWayPage,
        setHabboWayPage,
        bookletPage,
        setBookletPage,
        quiz,
        startQuiz,
        selectAnswer: (answer: number) => setQuiz((current) => (current ? selectQuizAnswer(current, answer) : current)),
        moveQuestion,
        reviewQuiz: () => setQuiz((current) => (current ? showQuizAnalysis(current) : current)),
        closeQuiz: () => setQuiz(null)
    };
};
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