5180 fichiers 38.5 Mo 0 téléchargements 202 vues mis à jour il y a 5 heures ui
useHelp.ts 10.3 Ko Télécharger le fichier
import {
    CallForHelpDisabledNotifyMessageEvent,
    CallForHelpPendingCallsDeletedMessageEvent,
    CallForHelpPendingCallsMessageEvent,
    CallForHelpReplyMessageEvent,
    CallForHelpResultMessageEvent,
    DeletePendingCallsForHelpMessageComposer,
    GetGuideReportingStatusMessageComposer,
    GetPendingCallsForHelpMessageComposer,
    GuideReportingStatusMessageEvent,
    GuideTicketCreationResultMessageEvent,
    GuideTicketResolutionMessageEvent,
    IssueCloseNotificationMessageEvent,
    PendingGuideTicketData,
    SanctionStatusEvent,
    SanctionStatusMessageParser
} from '@octane/renderer';
import { useRef, useState } from 'react';
import { registerSharedHook, useSharedHook } from '@/state/useSharedHook';
import {
    CallForHelpResult,
    creationResultCode,
    GetCloseReasonKey,
    GetConfigurationValue,
    IHelpReport,
    LocalizeText,
    NotificationAlertType,
    ReportState,
    ReportType,
    reportingStatusCode,
    resolutionCode,
    SendMessageComposer
} from '../../api';
import { useMessageEvent } from '../events';
import { useNotification } from '../notification';

/** AIR HabboHelp.guardiansEnabled: bully reports go to the Guardians instead of the moderators. */
export const isGuardiansEnabled = (): boolean => GetConfigurationValue<boolean>('guardians.enabled', true) !== false;

/** AIR ChatReviewReporterFeedbackCtrl.enabled: the reporter sees what became of the report. */
const isReporterFeedbackEnabled = (): boolean => GetConfigurationValue<boolean>('chatreviewreporterfeedbackctrl.enabled', true) !== false;

const createReport = (type: number): IHelpReport => ({
    reportType: type,
    reportedUserId: -1,
    reportedChats: [],
    cfhCategory: -1,
    cfhTopic: -1,
    roomId: -1,
    roomName: '',
    messageId: -1,
    threadId: -1,
    groupId: -1,
    extraData: '',
    roomObjectId: -1,
    message: '',
    currentStep: 0
});

const useHelpState = () => {
    const [activeReport, setActiveReport] = useState<IHelpReport>(null);
    const [sanctionInfo, setSanctionInfo] = useState<SanctionStatusMessageParser>(null);
    /** The localization code of the reporter feedback window ("sent", "nochat", "valid", ...), or null. */
    const [bullyReportFeedback, setBullyReportFeedback] = useState<string>(null);
    /** The report the user already has open, shown instead of starting a new one. */
    const [pendingBullyTicket, setPendingBullyTicket] = useState<PendingGuideTicketData>(null);
    /** The user a bully report was asked for, while the server answers whether one may be made. */
    const pendingBullyReportRef = useRef<number>(null);
    const { simpleAlert = null, showConfirm = null } = useNotification();

    /**
     * AIR CallForHelpManager: with the Guardians on, a bully report first asks the server whether
     * the user may report (GetGuideReportingStatus); only an "ok" opens the report.
     */
    const startBullyReport = (reportedUserId: number = -1) => {
        pendingBullyReportRef.current = reportedUserId > 0 ? reportedUserId : -1;
        SendMessageComposer(new GetGuideReportingStatusMessageComposer());
    };

    const report = (type: number, options: Partial<IHelpReport>) => {
        if (type === ReportType.BULLY && isGuardiansEnabled()) {
            startBullyReport(options?.reportedUserId ?? -1);
            return;
        }

        const newReport: IHelpReport = {
            reportType: type,
            reportedUserId: -1,
            reportedChats: [],
            cfhCategory: -1,
            cfhTopic: -1,
            roomId: -1,
            roomName: '',
            messageId: -1,
            threadId: -1,
            groupId: -1,
            extraData: '',
            roomObjectId: -1,
            message: '',
            currentStep: 0
        };

        switch (type) {
            case ReportType.BULLY:
            case ReportType.EMERGENCY:
            case ReportType.IM:
                newReport.reportedUserId = options.reportedUserId;
                newReport.currentStep = ReportState.SELECT_CHATS;
                break;
            case ReportType.ROOM:
                newReport.roomId = options.roomId;
                newReport.roomName = options.roomName;
                newReport.currentStep = ReportState.SELECT_TOPICS;
                break;
            case ReportType.THREAD:
                newReport.groupId = options.groupId;
                newReport.threadId = options.threadId;
                newReport.currentStep = ReportState.SELECT_TOPICS;
                break;
            case ReportType.MESSAGE:
                newReport.groupId = options.groupId;
                newReport.threadId = options.threadId;
                newReport.messageId = options.messageId;
                newReport.currentStep = ReportState.SELECT_TOPICS;
                break;
            case ReportType.PHOTO:
                newReport.extraData = options.extraData;
                newReport.roomId = options.roomId;
                newReport.reportedUserId = options.reportedUserId;
                newReport.roomObjectId = options.roomObjectId;
                newReport.currentStep = ReportState.SELECT_TOPICS;
                break;
            case ReportType.GUIDE:
                break;
        }

        setActiveReport(newReport);
    };

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

        let message = parser.messageText;

        switch (parser.resultType) {
            case CallForHelpResult.TOO_MANY_PENDING_CALLS_CODE:
                SendMessageComposer(new GetPendingCallsForHelpMessageComposer());
                simpleAlert(LocalizeText('help.cfh.error.pending'), NotificationAlertType.MODERATION, null, null, LocalizeText('help.cfh.error.title'));
                break;
            case CallForHelpResult.HAS_ABUSIVE_CALL_CODE:
                simpleAlert(LocalizeText('help.cfh.error.abusive'), NotificationAlertType.ABUSIVE, null, null, LocalizeText('help.cfh.error.title'));
                break;
            default:
                if (message.trim().length === 0) {
                    message = LocalizeText('help.cfh.sent.text');
                }

                simpleAlert(message, NotificationAlertType.MODERATION, null, null, LocalizeText('help.cfh.sent.title'));
        }
    });

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

        const message = parser.messageText.length === 0 ? LocalizeText('help.cfh.closed.' + GetCloseReasonKey(parser.closeReason)) : parser.messageText;

        simpleAlert(message, NotificationAlertType.MODERATION, null, null, LocalizeText('mod.alert.title'));
    });

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

        if (parser.count > 0) {
            showConfirm(
                LocalizeText('help.emergency.pending.title') + '\n' + parser.pendingCalls[0].message,
                () => {
                    SendMessageComposer(new DeletePendingCallsForHelpMessageComposer());
                },
                null,
                LocalizeText('help.emergency.pending.button.discard'),
                LocalizeText('help.emergency.pending.button.keep'),
                LocalizeText('help.emergency.pending.message.subtitle')
            );
        }
    });

    useMessageEvent<CallForHelpPendingCallsDeletedMessageEvent>(CallForHelpPendingCallsDeletedMessageEvent, (event) => {
        const message = 'Your pending calls were deleted'; // todo: add localization

        simpleAlert(message, NotificationAlertType.MODERATION, null, null, LocalizeText('mod.alert.title'));
    });

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

        simpleAlert(parser.message, NotificationAlertType.MODERATION, null, null, LocalizeText('help.cfh.reply.title'));
    });

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

        simpleAlert(
            LocalizeText('help.emergency.global_mute.message'),
            NotificationAlertType.MODERATION,
            parser.infoUrl,
            LocalizeText('help.emergency.global_mute.link'),
            LocalizeText('help.emergency.global_mute.subtitle')
        );
    });

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

        setSanctionInfo(parser);
    });

    useMessageEvent<GuideReportingStatusMessageEvent>(GuideReportingStatusMessageEvent, (event) => {
        const parser = event.getParser();
        const reportedUserId = pendingBullyReportRef.current;

        pendingBullyReportRef.current = null;

        if (!parser) return;

        switch (parser.statusCode) {
            case 0:
                // Nothing was asked for: an answer on its own opens nothing.
                if (reportedUserId === null) return;

                setActiveReport({ ...createReport(ReportType.BULLY), reportedUserId, currentStep: ReportState.SELECT_USER });
                return;
            case 1:
                if (parser.pendingTicket) setPendingBullyTicket(parser.pendingTicket);
                return;
            default: {
                const code = reportingStatusCode(parser.statusCode);

                if (code.length) setBullyReportFeedback(code);
            }
        }
    });

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

        if (parser && isReporterFeedbackEnabled()) setBullyReportFeedback(creationResultCode(parser.result));
    });

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

        if (parser && isReporterFeedbackEnabled()) setBullyReportFeedback(resolutionCode(parser.resolution));
    });

    return {
        activeReport,
        setActiveReport,
        sanctionInfo,
        setSanctionInfo,
        report,
        startBullyReport,
        bullyReportFeedback,
        setBullyReportFeedback,
        pendingBullyTicket,
        setPendingBullyTicket
    };
};

export const useHelp = () => useSharedHook(useHelpState);

registerSharedHook(useHelpState);
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