Sobes.tech
Назад к вопросам
Middle
5

export const usePhoneMask = ({ mask, initialValue, maskPlaceholder, }: UsePhoneMaskParams): UsePhoneMaskReturn => { // code here };

Компании, где спрашивали
BCraft

Ответ от нейросети

sobes.tech AI

Функция usePhoneMask — это React hook, который помогает применять маску к номеру телефона при вводе.

Пример реализации на TypeScript:

import { useState, useEffect } from 'react';

interface UsePhoneMaskParams {
  mask: string; // например, '+7 (___) ___-__-__'
  initialValue?: string;
  maskPlaceholder?: string; // символ для заполнения, например '_'
}

interface UsePhoneMaskReturn {
  value: string;
  onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
}

export const usePhoneMask = ({ mask, initialValue = '', maskPlaceholder = '_' }: UsePhoneMaskParams): UsePhoneMaskReturn => {
  const [value, setValue] = useState(initialValue);

  const formatValue = (input: string) => {
    let i = 0;
    const def = mask.replace(/[^_\d]/g, '');
    let val = input.replace(/\D/g, '');
    let formatted = '';

    for (const char of mask) {
      if (char === maskPlaceholder) {
        if (val[i]) {
          formatted += val[i];
          i++;
        } else {
          formatted += maskPlaceholder;
        }
      } else {
        formatted += char;
      }
    }
    return formatted;
  };

  const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    const inputVal = e.target.value;
    const formatted = formatValue(inputVal);
    setValue(formatted);
  };

  useEffect(() => {
    if (initialValue) {
      setValue(formatValue(initialValue));
    }
  }, [initialValue]);

  return { value, onChange };
};

Этот хук принимает маску, начальное значение и символ заполнителя, возвращает текущее значение и обработчик изменения, который форматирует ввод пользователя согласно маске.