diff --git a/frontend/src/components/PersonCard.jsx b/frontend/src/components/PersonCard.jsx index 747ab48..c1260ed 100644 --- a/frontend/src/components/PersonCard.jsx +++ b/frontend/src/components/PersonCard.jsx @@ -16,6 +16,9 @@ import { firstNameLabel, fullNameLabel, isFirstNameUnknown } from '../utils/pers import { isYearOnly } from '../utils/dateInput.js' import DateField from './DateField.jsx' +// Aucune modification en cours (référence stable) +const NO_EDITS = Object.freeze({}) + const TYPE_LABELS = { photo: t('Photo'), video: t('Vidéo'), @@ -93,12 +96,16 @@ const PersonCard = ({ } }, [tab, person.id, treeId, immichToken, lifeRevision]) - // État local pour les modifications en mode édition - const [edits, setEdits] = useState({}) + // Modifications en cours, rattachées à la personne qu'elles concernent. Au changement de fiche, + // le premier rendu ne doit pas voir celles de la personne d'avant : un champ qui s'initialise à + // ce moment-là (DateField) les garderait, et la date d'une personne passait sur une autre. + const [editState, setEditState] = useState(() => ({ personId: person.id, values: {}, changed: false })) + const ownEdits = editState.personId === person.id + const edits = ownEdits ? editState.values : NO_EDITS + const hasChanges = ownEdits && editState.changed // Prénom inconnu (case cochée) et saisie de prénom vide sans case : le prénom est demandé avant l'enregistrement const [unknownFirstName, setUnknownFirstName] = useState(() => isFirstNameUnknown(person)) const [firstNameMissing, setFirstNameMissing] = useState(false) - const [hasChanges, setHasChanges] = useState(false) const [saving, setSaving] = useState(false) const [saveSuccess, setSaveSuccess] = useState(false) const [showDeleteConfirm, setShowDeleteConfirm] = useState(false) @@ -119,10 +126,9 @@ const PersonCard = ({ // Reset edits quand la personne change useEffect(() => { - setEdits({}) + setEditState({ personId: person.id, values: {}, changed: false }) setUnknownFirstName(isFirstNameUnknown(person)) setFirstNameMissing(false) - setHasChanges(false) setShowDeleteConfirm(false) setActiveRelationSearch(null) setRelationSearchQuery('') @@ -199,8 +205,12 @@ const PersonCard = ({ } const handleFieldChange = (field, value) => { - setEdits(prev => ({ ...prev, [field]: value })) - setHasChanges(true) + const personId = person.id + setEditState(prev => ({ + personId, + values: { ...(prev.personId === personId ? prev.values : {}), [field]: value }, + changed: true, + })) } const handleSave = async () => { @@ -211,8 +221,9 @@ const PersonCard = ({ } setSaving(true) try { - await onSave(person.id, edits) - setHasChanges(false) + const savedFor = person.id + await onSave(savedFor, edits) + setEditState(prev => (prev.personId === savedFor ? { ...prev, changed: false } : prev)) setSaveSuccess(true) setTimeout(() => setSaveSuccess(false), 2000) } finally {