'use client' import { useState, ChangeEvent, useEffect, useRef, KeyboardEvent } from 'react'; import styles from '@/app/styles/login.module.scss'; interface PhoneInputProps { phoneState: string | undefined; validateHandler: (e: ChangeEvent) => void; } export default function PhoneInput({ phoneState, validateHandler }: PhoneInputProps) { const [phone, setPhone] = useState(phoneState ? phoneState : ''); const inputRef = useRef(null); const formatPhoneNumber = (value: string, isBackspace: boolean): string => { if (value === '+') { return value; } const digitsOnly = value.replace(/\D/g, ''); if (!digitsOnly) { return ''; } const limitedDigits = digitsOnly.slice(0, 11); const countryCode = 7; const phoneNumber = limitedDigits.startsWith('7') ? limitedDigits.slice(1) : limitedDigits; let formatted = `+${countryCode}`; if (phoneNumber.length > 0) { formatted += ` (${phoneNumber.slice(0, 3)}`; } if (phoneNumber.length >= 3) { formatted += `) ${phoneNumber.slice(3, 6)}`; } if (phoneNumber.length >= 6) { formatted += `-${phoneNumber.slice(6, 8)}`; } if (phoneNumber.length >= 8) { formatted += `-${phoneNumber.slice(8, 10)}`; } if (isBackspace) { const lastChar = formatted[formatted.length - 1]; const specialChars = ['-', '(', ')', ' ']; if (specialChars.includes(lastChar)) { if (lastChar === ' ' && formatted[formatted.length - 2] === ')') { return formatted.slice(0, -2); } return formatted.slice(0, -1); } } return formatted; }; const handleChange = (e: ChangeEvent): void => { const input = e.target.value; const nativeEvent = e.nativeEvent as InputEvent; const isBackspace = nativeEvent.inputType === 'deleteContentBackward'; const formatted = formatPhoneNumber(input, isBackspace); setPhone(formatted); }; const range = useRef<{ start: number | null, key: string; } | null>(null); const handleKeyDown = (e: KeyboardEvent): void => { const input = e.currentTarget; range.current = { start: input.selectionStart, key: e.key }; }; useEffect(() => { console.log('use'); if (range.current?.key === 'Backspace' && inputRef.current) { const startPos = range.current.start ?? 0; const newPosition = Math.max(0, startPos - 1); inputRef.current.setSelectionRange(newPosition, newPosition); } else if (range.current?.key === 'Delete' && inputRef.current) { inputRef.current.setSelectionRange(range.current.start, range.current.start); } }, [phone]); return ( { handleChange(e); validateHandler(e); }} onKeyDown={(e) => { handleKeyDown(e); }} /> ) }