- 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>
62 lines
1.2 KiB
TypeScript
62 lines
1.2 KiB
TypeScript
'use client';
|
|
|
|
import React, { ChangeEvent } from 'react';
|
|
import BaseFormField, { getInputClasses } from './BaseFormField';
|
|
|
|
interface FormTextareaProps {
|
|
label: string;
|
|
name: string;
|
|
value: string;
|
|
onChange: (e: ChangeEvent<HTMLTextAreaElement>) => void;
|
|
onBlur?: (e: ChangeEvent<HTMLTextAreaElement>) => void;
|
|
error?: string;
|
|
touched?: boolean;
|
|
placeholder?: string;
|
|
required?: boolean;
|
|
disabled?: boolean;
|
|
rows?: number;
|
|
className?: string;
|
|
}
|
|
|
|
/**
|
|
* Composant de textarea de formulaire réutilisable
|
|
*/
|
|
export default function FormTextarea({
|
|
label,
|
|
name,
|
|
value,
|
|
onChange,
|
|
onBlur,
|
|
error,
|
|
touched,
|
|
placeholder,
|
|
required = false,
|
|
disabled = false,
|
|
rows = 4,
|
|
className = '',
|
|
}: FormTextareaProps) {
|
|
return (
|
|
<BaseFormField
|
|
label={label}
|
|
name={name}
|
|
required={required}
|
|
error={error}
|
|
touched={touched}
|
|
className={className}
|
|
>
|
|
<textarea
|
|
id={name}
|
|
name={name}
|
|
value={value}
|
|
onChange={onChange}
|
|
onBlur={onBlur}
|
|
placeholder={placeholder}
|
|
disabled={disabled}
|
|
required={required}
|
|
rows={rows}
|
|
className={getInputClasses(!!touched && !!error)}
|
|
/>
|
|
</BaseFormField>
|
|
);
|
|
}
|