- Consolidate API logic: hooks/useApi.ts now uses services/api.ts - Create BaseFormField component to reduce form duplication - Refactor FormField, FormSelect, FormTextarea to use BaseFormField - Add centralized theme utility (utils/theme.ts) for colors/styles - Add comprehensive tests for api, auth.service, useApi hooks, AuthContext - Add tests for theme utility This reduces duplication from 11.45% and improves test coverage. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
65 lines
1.3 KiB
TypeScript
65 lines
1.3 KiB
TypeScript
'use client';
|
|
|
|
import React, { ChangeEvent } from 'react';
|
|
import BaseFormField, { getInputClasses } from './BaseFormField';
|
|
|
|
interface FormFieldProps {
|
|
label: string;
|
|
name: string;
|
|
type?: 'text' | 'email' | 'password' | 'tel' | 'number' | 'date';
|
|
value: string | number;
|
|
onChange: (e: ChangeEvent<HTMLInputElement>) => void;
|
|
onBlur?: (e: ChangeEvent<HTMLInputElement>) => void;
|
|
error?: string;
|
|
touched?: boolean;
|
|
placeholder?: string;
|
|
required?: boolean;
|
|
disabled?: boolean;
|
|
className?: string;
|
|
autoComplete?: string;
|
|
}
|
|
|
|
/**
|
|
* Composant de champ de formulaire réutilisable
|
|
*/
|
|
export default function FormField({
|
|
label,
|
|
name,
|
|
type = 'text',
|
|
value,
|
|
onChange,
|
|
onBlur,
|
|
error,
|
|
touched,
|
|
placeholder,
|
|
required = false,
|
|
disabled = false,
|
|
className = '',
|
|
autoComplete,
|
|
}: FormFieldProps) {
|
|
return (
|
|
<BaseFormField
|
|
label={label}
|
|
name={name}
|
|
required={required}
|
|
error={error}
|
|
touched={touched}
|
|
className={className}
|
|
>
|
|
<input
|
|
id={name}
|
|
name={name}
|
|
type={type}
|
|
value={value}
|
|
onChange={onChange}
|
|
onBlur={onBlur}
|
|
placeholder={placeholder}
|
|
disabled={disabled}
|
|
required={required}
|
|
autoComplete={autoComplete}
|
|
className={getInputClasses(!!touched && !!error)}
|
|
/>
|
|
</BaseFormField>
|
|
);
|
|
}
|