66 lines
1.7 KiB
TypeScript

import React, { useState } from 'react';
export interface EINInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {
label: string;
error?: string;
required?: boolean;
helpText?: string;
}
export const EINInput: React.FC<EINInputProps> = ({
label,
error,
required,
helpText,
value,
onChange,
className = '',
...props
}) => {
const formatEIN = (value: string) => {
// Remove all non-digits
const digits = value.replace(/\D/g, '');
// Format as XX-XXXXXXX
if (digits.length <= 2) {
return digits;
}
return `${digits.slice(0, 2)}-${digits.slice(2, 9)}`;
};
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const formatted = formatEIN(e.target.value);
const syntheticEvent = {
...e,
target: { ...e.target, value: formatted }
} as React.ChangeEvent<HTMLInputElement>;
onChange?.(syntheticEvent);
};
return (
<div className="space-y-1">
<label className="block text-sm font-medium text-gray-700">
{label}
{required && <span className="text-red-500 ml-1">*</span>}
</label>
<input
type="text"
placeholder="XX-XXXXXXX"
maxLength={10}
value={value}
onChange={handleChange}
className={`w-full px-3 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-[#667eea] focus:border-transparent transition-all font-mono ${
error ? 'border-red-300 bg-red-50' : 'border-gray-300'
} ${className}`}
{...props}
/>
{helpText && !error && (
<p className="text-xs text-gray-500">{helpText}</p>
)}
{error && (
<p className="text-xs text-red-600">{error}</p>
)}
</div>
);
};