nitro-v36-with-renderer-v36
/
src /
components /
help /
views /
name-change /
NameChangeInputView.tsx
NameChangeInputView.tsx 4.6 Ko
Télécharger le fichier
import { CheckUserNameMessageComposer, CheckUserNameResultMessageEvent } from '@octane/renderer';
import { FC, useState } from 'react';
import { LocalizeText, SendMessageComposer } from '../../../../api';
import { useMessageEvent } from '../../../../hooks';
import { OctaneInput } from '../../../../layout';
import { NameChangeLayoutViewProps } from './NameChangeView.types';
import { BaseButton } from '../../../../common/BaseButton';
import { NativeTextTree } from '../../../../common/native-text/NativeTextTree';
const AVAILABLE: number = 0;
const TOO_SHORT: number = 2;
const TOO_LONG: number = 3;
const NOT_VALID: number = 4;
const TAKEN_WITH_SUGGESTIONS: number = 5;
const DISABLED: number = 6;
export const NameChangeInputView: FC<NameChangeLayoutViewProps> = (props) => {
const { onAction = null } = props;
const [newUsername, setNewUsername] = useState<string>('');
const [canProceed, setCanProceed] = useState<boolean>(false);
const [isChecking, setIsChecking] = useState<boolean>(false);
const [errorCode, setErrorCode] = useState<string>(null);
const [suggestions, setSuggestions] = useState<string[]>([]);
const check = () => {
if (newUsername === '') return;
setCanProceed(false);
setSuggestions([]);
setErrorCode(null);
setIsChecking(true);
SendMessageComposer(new CheckUserNameMessageComposer(newUsername));
};
const handleUsernameChange = (username: string) => {
setCanProceed(false);
setSuggestions([]);
setErrorCode(null);
setNewUsername(username);
};
useMessageEvent<CheckUserNameResultMessageEvent>(CheckUserNameResultMessageEvent, (event) => {
setIsChecking(false);
const parser = event.getParser();
if (!parser) return;
switch (parser.resultCode) {
case AVAILABLE:
setCanProceed(true);
break;
case TOO_SHORT:
setErrorCode('short');
break;
case TOO_LONG:
setErrorCode('long');
break;
case NOT_VALID:
setErrorCode('invalid');
break;
case TAKEN_WITH_SUGGESTIONS:
setSuggestions(parser.nameSuggestions);
setErrorCode('taken');
break;
case DISABLED:
setErrorCode('change_not_allowed');
}
});
return (
<NativeTextTree>
<div className="flex flex-col h-full gap-3">
<div>{LocalizeText('tutorial.name_change.info.select')}</div>
<div className="flex gap-2">
<OctaneInput type="text" value={newUsername} onChange={(event) => handleUsernameChange(event.target.value)} />
<BaseButton className="habbo-btn-secondary" disabled={newUsername === '' || isChecking} onClick={check}>
{LocalizeText('tutorial.name_change.check')}
</BaseButton>
</div>
{!errorCode && !canProceed && <div className="octane-card-panel p-2 text-center">{LocalizeText('help.tutorial.name.info')}</div>}
{errorCode && (
<div className="p-2 text-center text-white rounded bg-danger">{LocalizeText(`help.tutorial.name.${errorCode}`, ['name'], [newUsername])}</div>
)}
{canProceed && (
<div className="p-2 text-center text-white rounded bg-success">{LocalizeText('help.tutorial.name.available', ['name'], [newUsername])}</div>
)}
{suggestions && (
<div className="flex flex-col gap-2">
{suggestions.map((suggestion, index) => (
<BaseButton key={index} className="octane-card-row p-1 cursor-pointer col w-full text-left" onClick={() => handleUsernameChange(suggestion)}>
{suggestion}
</BaseButton>
))}
</div>
)}
<div className="flex gap-2">
<BaseButton className="w-full habbo-btn-secondary" disabled={!canProceed} onClick={() => onAction('confirmation', newUsername)}>
{LocalizeText('tutorial.name_change.pick')}
</BaseButton>
<BaseButton className="w-full habbo-btn-secondary" onClick={() => onAction('close')}>
{LocalizeText('cancel')}
</BaseButton>
</div>
</div>
</NativeTextTree>
);
};
