'use client'; import React, {Dispatch, SetStateAction, useContext, useEffect, useState} from 'react'; import { Attribute, CharacterAttribute, CharacterAttributeSection, CharacterElement, CharacterProps, isCharacterCategory, isCharacterStatus, } from '@/lib/types/character'; import { advancedCharacterElements, basicCharacterElements, characterCategories, characterStatus } from '@/lib/constants/character'; import {SeriesCharacterProps} from '@/lib/types/series'; import InputField from '@/components/form/InputField'; import TextInput from '@/components/form/TextInput'; import TextAreaInput from '@/components/form/TextAreaInput'; import NumberInput from '@/components/form/NumberInput'; import SelectBox from '@/components/form/SelectBox'; import CharacterSectionElement from '@/components/book/settings/characters/CharacterSectionElement'; import SyncFieldWrapper from '@/components/form/SyncFieldWrapper'; import {SlidersHorizontal} from 'lucide-react'; import {useTranslations} from '@/lib/i18n'; import {SessionContext, SessionContextProps} from '@/context/SessionContext'; import {AlertContext, AlertContextProps} from '@/context/AlertContext'; import {LangContext, LangContextProps} from '@/context/LangContext'; import {apiGet} from '@/lib/api/client'; type AttributeResponse = { type: string; values: Attribute[] }[]; interface CharacterEditorEditProps { character: CharacterProps; setCharacter: Dispatch>; onCharacterChange: (key: keyof CharacterProps, value: string | number | null) => void; onAddAttribute: (section: CharacterAttributeSection, attr: Attribute) => Promise; onRemoveAttribute: (section: CharacterAttributeSection, idx: number, id: string) => Promise; seriesCharacter?: SeriesCharacterProps | null; onSyncComplete?: () => void; } /** * CharacterEditorEdit - Version sidebar édition * Mêmes fonctionnalités que CharacterSettingsEdit, layout linéaire */ export default function CharacterEditorEdit({ character, setCharacter, onCharacterChange, onAddAttribute, onRemoveAttribute, seriesCharacter, onSyncComplete, }: CharacterEditorEditProps): React.JSX.Element { const t = useTranslations(); const {lang}: LangContextProps = useContext(LangContext); const {session}: SessionContextProps = useContext(SessionContext); const {errorMessage}: AlertContextProps = useContext(AlertContext); const [showAdvanced, setShowAdvanced] = useState(false); useEffect(function (): void { if (character?.id !== null) { getAttributes().then(); } }, [character?.id]); async function getAttributes(): Promise { try { const response: AttributeResponse = await apiGet( 'character/attribute', session.accessToken, lang, {characterId: character?.id} ); if (response) { const attributes: CharacterAttribute = {}; response.forEach(function (item: { type: string; values: Attribute[] }): void { attributes[item.type] = item.values; }); setCharacter(function (prev: CharacterProps | null): CharacterProps | null { if (!prev) return null; return { ...prev, physical: attributes.physical ?? [], psychological: attributes.psychological ?? [], relations: attributes.relations ?? [], skills: attributes.skills ?? [], weaknesses: attributes.weaknesses ?? [], strengths: attributes.strengths ?? [], goals: attributes.goals ?? [], motivations: attributes.motivations ?? [], arc: attributes.arc ?? [], secrets: attributes.secrets ?? [], fears: attributes.fears ?? [], flaws: attributes.flaws ?? [], beliefs: attributes.beliefs ?? [], conflicts: attributes.conflicts ?? [], quotes: attributes.quotes ?? [], distinguishingMarks: attributes.distinguishingMarks ?? [], items: attributes.items ?? [], affiliations: attributes.affiliations ?? [], }; }); } } catch (e: unknown) { if (e instanceof Error) { errorMessage(e.message); } } } return (
{/* Informations de base */}

{t('characterDetail.basicInfo')}

): void { onCharacterChange('name', e.target.value); }} placeholder={t('characterDetail.namePlaceholder')} /> } /> ): void { onCharacterChange('lastName', e.target.value); }} placeholder={t('characterDetail.lastNamePlaceholder')} /> } /> ): void { const selectedCategory: string = e.target.value; setCharacter(function (prev: CharacterProps | null): CharacterProps | null { return prev ? { ...prev, category: isCharacterCategory(selectedCategory) ? selectedCategory : 'none' } : prev; }); }} data={characterCategories} translate /> } /> ): void { onCharacterChange('gender', e.target.value); }} placeholder={t('characterDetail.genderPlaceholder')} /> } /> } />
{/* Histoire */}

{t('characterDetail.historySection')}

): void { onCharacterChange('biography', e.target.value); }} placeholder={t('characterDetail.biographyPlaceholder')} /> } /> ): void { onCharacterChange('role', e.target.value); }} placeholder={t('characterDetail.roleFullPlaceholder')} /> } />
{/* Attributs de base */} {basicCharacterElements.map(function (item: CharacterElement, index: number): React.JSX.Element { return ( ); })} {/* Toggle Mode Avancé */}
{t('characterDetail.advancedMode')}
{/* Sections avancées */} {showAdvanced && ( <>

{t('characterDetail.identitySection')}

): void { onCharacterChange('species', e.target.value); }} placeholder={t('characterDetail.speciesPlaceholder')} /> } /> ): void { const selectedStatus: string = e.target.value; setCharacter(function (prev: CharacterProps | null): CharacterProps | null { return prev ? { ...prev, status: isCharacterStatus(selectedStatus) ? selectedStatus : 'alive' } : prev; }); }} data={characterStatus} translate /> } />

{t('characterDetail.authorSection')}

): void { onCharacterChange('notes', e.target.value); }} placeholder={t('characterDetail.notesPlaceholder')} /> } />
{advancedCharacterElements.map(function (item: CharacterElement, index: number): React.JSX.Element { return ( ); })} )}
); }