import React, { CSSProperties, FC, useState } from 'react'; import { useRecoilValue } from 'recoil'; import { Input, Button, Select, Form } from 'antd'; import { useTranslation } from 'next-export-i18n'; import { MessageType } from '../../../interfaces/socket-events'; import WebsocketService from '../../../services/websocket-service'; import { websocketServiceAtom, currentUserAtom } from '../../stores/ClientConfigStore'; import { validateDisplayName } from '../../../utils/displayNameValidation'; import { Translation } from '../../ui/Translation/Translation'; import { Localization } from '../../../types/localization'; import styles from './NameChangeModal.module.scss'; const { Option } = Select; export type UserColorProps = { color: number; }; const UserColor: FC = ({ color }) => { const style: CSSProperties = { textAlign: 'center', backgroundColor: `var(--theme-color-users-${color})`, width: '100%', height: '100%', }; return
; }; type NameChangeModalProps = { closeModal: () => void; }; export const NameChangeModal: FC = ({ closeModal }) => { const { t } = useTranslation(); const currentUser = useRecoilValue(currentUserAtom); const websocketService = useRecoilValue(websocketServiceAtom); const [newName, setNewName] = useState(currentUser?.displayName || ''); const characterLimit = 30; if (!currentUser) { return null; } const { displayName, displayColor } = currentUser; const saveEnabled = () => { if (!newName || !displayName) return false; const validation = validateDisplayName(newName, displayName, characterLimit); return validation.isValid && websocketService?.isConnected(); }; const handleNameChange = () => { if (!newName || !displayName) return; const validation = validateDisplayName(newName, displayName, characterLimit); if (!validation.isValid || !websocketService?.isConnected()) { return; } const nameChange = { type: MessageType.NAME_CHANGE, newName: validation.trimmedName, }; websocketService.send(nameChange); closeModal(); }; const handleColorChange = (color: string) => { const colorChange = { type: MessageType.COLOR_CHANGE, newColor: Number(color), }; websocketService.send(colorChange); }; const showCount = info => info.count > characterLimit ? ( ) : ( '' ); const maxColor = 8; // 0...n const colorOptions = [...Array(maxColor)].map((_, i) => i); const placeholderText = t(Localization.Frontend.NameChangeModal.placeholder) || 'Your chat display name'; const validation = validateDisplayName(newName, displayName, characterLimit); const saveButton = ( ); return (
setNewName(e.target.value)} placeholder={placeholderText} aria-label={placeholderText} showCount={{ formatter: showCount }} defaultValue={displayName} className={styles.inputGroup} /> {!validation.isValid && validation.errorMessage && (
{validation.errorMessage}
)} } className={styles.colorChange} >
); };