5180 fichiers 38.5 Mo 0 téléchargements 280 vues mis à jour il y a 6 heures ui
nitro-v36-with-renderer-v36 / src / components / help / views / SanctionStatusView.tsx
SanctionStatusView.tsx 5.9 Ko Télécharger le fichier
import { FC } from 'react';
import { FaArrowCircleRight } from 'react-icons/fa';
import { CreateLinkEvent, localizeWithFallback, LocalizeText } from '../../../api';
import { OctaneCardContentView, OctaneCardHeaderView, OctaneCardView } from '../../../common';
import { useHelp } from '../../../hooks';
import { BaseButton } from '../../../common/BaseButton';
import { NativeTextTree } from '../../../common/native-text/NativeTextTree';

const SERVER_DATE = /^\w{3} (\w{3}) (\d{1,2}) (\d{2}:\d{2}:\d{2}) [A-Z]{2,5} (\d{4})$/;

/** The server sends a date as its own text ("Fri Oct 09 21:30:58 CEST 2026"); a text of another shape is left as it came. */
export const formatServerDate = (text: string): string => {
    const match = SERVER_DATE.exec((text ?? '').trim());

    if (!match) return text;

    const date = new Date(`${match[1]} ${match[2]} ${match[4]} ${match[3]}`);

    return Number.isNaN(date.getTime()) ? text : date.toLocaleString();
};

export const SanctionSatusView: FC<{}> = (props) => {
    const { sanctionInfo = null, setSanctionInfo = null } = useHelp();

    const sanctionLocalization = (param: string, sanctionName: string, length?: number) => {
        let localizationName = `help.sanction.${param}`;

        switch (sanctionName) {
            case 'ALERT':
                localizationName = localizationName + '.alert';
                break;
            case 'MUTE':
                localizationName = localizationName + '.mute';
                break;
            case 'BAN_PERMANENT':
                localizationName = localizationName + '.permban';
                break;
            default:
                localizationName = localizationName + '.ban';
                if (length > 24) {
                    localizationName = localizationName + '.days';
                    return LocalizeText(localizationName, ['days'], [(length / 24).toString()]);
                }
        }

        return LocalizeText(localizationName, ['hours'], [length.toString()]);
    };

    if (!sanctionInfo) return null;

    return (
        <NativeTextTree>
            <OctaneCardView className="octane-help octane-sanction-info min-w-0 w-[min(450px,calc(100vw-16px))] max-w-[calc(100vw-16px)] max-h-[calc(100vh-16px)]" theme="primary-slim">
                <OctaneCardHeaderView headerText={LocalizeText('help.sanction.info.title')} onCloseClick={() => setSanctionInfo(null)} />
                <OctaneCardContentView className="text-black">
                    <div className="flex min-h-[170px] flex-col">
                        <div className="octane-sanction-info__body flex flex-col gap-1">
                            {sanctionInfo.sanctionReason === 'cfh.reason.EMPTY' ? (
                                <div className="font-bold">{LocalizeText('help.sanction.current.none')}</div>
                            ) : (
                                <>
                                    {(sanctionInfo.probationHoursLeft > 0 || sanctionInfo.isSanctionActive) && (
                                        <div className="font-bold">{LocalizeText('help.sanction.probation.reminder')}</div>
                                    )}
                                    <div className={`font-bold ${sanctionInfo.isSanctionNew ? 'text-danger' : ''}`}>
                                        {LocalizeText('help.sanction.last.sanction')}{' '}
                                        {sanctionLocalization('current', sanctionInfo.sanctionName, sanctionInfo.sanctionLengthHours)}
                                    </div>
                                    <div>
                                        {LocalizeText('generic.start.time')} {formatServerDate(sanctionInfo.sanctionCreationTime)}
                                    </div>
                                    <div>
                                        {LocalizeText('generic.reason')} {sanctionInfo.sanctionReason}
                                    </div>
                                    <div>
                                        {LocalizeText('help.sanction.probation.days.left')} {Math.trunc(sanctionInfo.probationHoursLeft / 24) + 1}
                                    </div>
                                </>
                            )}
                            {sanctionInfo.hasCustomMute && !sanctionInfo.isSanctionActive && (
                                <div className="font-bold">{LocalizeText('help.sanction.custom.mute')}</div>
                            )}
                            {sanctionInfo.tradeLockExpiryTime && sanctionInfo.tradeLockExpiryTime.length > 0 && (
                                <div className="font-bold">
                                    {LocalizeText('trade.locked.until')} {formatServerDate(sanctionInfo.tradeLockExpiryTime)}
                                </div>
                            )}
                            {sanctionInfo.sanctionReason !== 'cfh.reason.EMPTY' && (
                                <div>{sanctionLocalization('next', sanctionInfo.nextSanctionName, sanctionInfo.nextSanctionLengthHours)}</div>
                            )}
                        </div>
                        <div className="mt-auto flex items-end justify-between gap-3 pt-3">
                            <BaseButton type="button" className="help-link" onClick={() => CreateLinkEvent('habbopages/help')}>
                                <FaArrowCircleRight className="help-link__icon" />
                                {LocalizeText('help.main.faq.link.text')}
                            </BaseButton>
                            <BaseButton type="button" className="habbo-btn-green habbo-btn-green--auto" onClick={() => setSanctionInfo(null)}>
                                {localizeWithFallback('generic.got.it', 'Got it')}
                            </BaseButton>
                        </div>
                    </div>
                </OctaneCardContentView>
            </OctaneCardView>
        </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