the-tip-top-frontend/components/forms/FormField.tsx
soufiane 0a00c04b54 fix: reduce code duplication and add tests for SonarQube quality gate
- 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>
2025-12-01 14:54:24 +01:00

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>
);
}