"use client"; import React, { useState, useEffect, useRef } from 'react'; import { Calendar, Activity, Heart, Pill, Droplet, Dumbbell, FileText } from 'lucide-react'; interface HealthData { // 1. Informations de base date?: string; poids?: number; temperature?: number; tension?: string; // Format: "120/80" frequenceCardiaque?: number; // 2. État de santé / symptômes maladie?: string; symptomes?: string; niveauDouleur?: number; // 0-10 niveauEnergie?: 'faible' | 'moyen' | 'bon'; qualiteSommeil?: 'mauvais' | 'moyen' | 'bon' | number; // ou 1-5 // 3. Médicaments et soins medicaments?: string; traitementEnCours?: boolean; consultationMedicale?: boolean; notesMedicales?: string; // 4. Habitudes & mode de vie hydratation?: number; // verres d'eau activitePhysique?: 'aucune' | 'légère' | 'intense'; dureeActivite?: number; // minutes alimentationParticuliere?: boolean; commentaireAlimentation?: string; stress?: 'faible' | 'moyen' | 'élevé'; // 5. Champ libre notesPersonnelles?: string; } interface HealthFormProps { content: string; onContentChange: (content: string) => void; date?: string; } export const HealthForm: React.FC = ({ content, onContentChange, date }) => { const [data, setData] = useState(() => { // Parse existing content if available if (content) { try { return JSON.parse(content); } catch { // If not JSON, try to parse as markdown or return empty return {}; } } return {}; }); // Use ref to track last sent content to prevent infinite loops const lastSentContentRef = useRef(''); // Update data when content prop changes (e.g., after save or when note is loaded) useEffect(() => { if (content && content !== lastSentContentRef.current) { try { const parsed = JSON.parse(content); // Only update if the parsed content is different from current data // This prevents overwriting user's current edits const currentJson = JSON.stringify(data); const newJson = JSON.stringify(parsed); if (currentJson !== newJson) { console.log('[HealthForm] Updating data from content prop'); setData(parsed); } } catch { // If not valid JSON, ignore } } }, [content]); // Only depend on content, not on data to avoid loops // Initialize date if not set useEffect(() => { if (!data.date && date) { setData(prev => ({ ...prev, date: date.split('T')[0] })); } else if (!data.date) { setData(prev => ({ ...prev, date: new Date().toISOString().split('T')[0] })); } }, [data.date, date]); // Update parent content whenever data changes (with a small delay to avoid too many updates) // Only update if content actually changed to prevent infinite loops useEffect(() => { const jsonContent = JSON.stringify(data, null, 2); // Only update if content is different from last sent content if (jsonContent !== lastSentContentRef.current) { const timer = setTimeout(() => { lastSentContentRef.current = jsonContent; onContentChange(jsonContent); }, 500); // Increased delay to reduce updates return () => clearTimeout(timer); } }, [data, onContentChange]); // Stable dependencies const updateField = (field: keyof HealthData, value: any) => { setData(prev => ({ ...prev, [field]: value })); }; return (
{/* 1. Informations de base */}

Informations de base

updateField('date', e.target.value)} className="w-full px-3 py-2 border border-carnet-border rounded-md text-sm text-carnet-text-primary bg-white focus:outline-none focus:ring-1 focus:ring-primary" />
updateField('poids', e.target.value ? parseFloat(e.target.value) : undefined)} placeholder="Ex: 70.5" className="w-full px-3 py-2 border border-carnet-border rounded-md text-sm text-carnet-text-primary bg-white focus:outline-none focus:ring-1 focus:ring-primary" />
updateField('temperature', e.target.value ? parseFloat(e.target.value) : undefined)} placeholder="Ex: 37.2" className="w-full px-3 py-2 border border-carnet-border rounded-md text-sm text-carnet-text-primary bg-white focus:outline-none focus:ring-1 focus:ring-primary" />
updateField('tension', e.target.value)} placeholder="Ex: 120/80" className="w-full px-3 py-2 border border-carnet-border rounded-md text-sm text-carnet-text-primary bg-white focus:outline-none focus:ring-1 focus:ring-primary" />
updateField('frequenceCardiaque', e.target.value ? parseInt(e.target.value) : undefined)} placeholder="Ex: 72" className="w-full px-3 py-2 border border-carnet-border rounded-md text-sm text-carnet-text-primary bg-white focus:outline-none focus:ring-1 focus:ring-primary" />
{/* 2. État de santé / symptômes */}

État de santé / symptômes

updateField('maladie', e.target.value)} placeholder="Ex: grippe, rhume, migraine, fatigue, aucun" className="w-full px-3 py-2 border border-carnet-border rounded-md text-sm text-carnet-text-primary bg-white focus:outline-none focus:ring-1 focus:ring-primary" />