'use client'; import React, {useCallback, useContext, useMemo, useState} from 'react'; import {useCharacters, UseCharactersConfig} from '@/hooks/settings/useCharacters'; import {useTranslations} from 'next-intl'; import {CharacterProps} from '@/lib/models/Character'; import {SeriesCharacterProps} from '@/lib/models/Series'; import {BookContext} from '@/context/BookContext'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {faSpinner, faToggleOn} from '@fortawesome/free-solid-svg-icons'; import ToolDetailHeader from '@/components/book/settings/ToolDetailHeader'; import InputField from '@/components/form/InputField'; import ToggleSwitch from '@/components/form/ToggleSwitch'; import SeriesImportSelector from '@/components/form/SeriesImportSelector'; import AlertBox from '@/components/AlertBox'; import CharacterEditorList from './CharacterEditorList'; import CharacterEditorDetail from './CharacterEditorDetail'; import CharacterEditorEdit from './CharacterEditorEdit'; /** * CharacterEditor - Orchestrateur pour ComposerRightBar * Mêmes fonctionnalités que CharacterSettings, layout condensé */ export default function CharacterEditor(): React.JSX.Element { const t = useTranslations(); const {book} = useContext(BookContext); const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); const config: UseCharactersConfig = useMemo(function (): UseCharactersConfig { return { entityType: 'book', entityId: book?.bookId || '', }; }, [book?.bookId]); const { characters, seriesCharacters, selectedCharacter, toolEnabled, isLoading, bookSeriesId, viewMode, saveCharacter, deleteCharacter, updateCharacterField, addAttribute, removeAttribute, toggleTool, importFromSeries, exportToSeries, refreshSeriesCharacters, setSelectedCharacter, enterDetailMode, enterEditMode, exitEditMode, backToList, addNewCharacter, } = useCharacters(config); const availableSeriesCharacters = useMemo(function (): SeriesCharacterProps[] { return seriesCharacters.filter(function (sc: SeriesCharacterProps): boolean { return !characters.some(function (c: CharacterProps): boolean { return c.seriesCharacterId === sc.id; }); }); }, [seriesCharacters, characters]); const handleCharacterChange = useCallback(function (key: keyof CharacterProps, value: string | number | null): void { updateCharacterField(key, value); }, [updateCharacterField]); async function handleSave(): Promise { await exitEditMode(true); } function handleCancel(): void { exitEditMode(false); } async function handleDelete(): Promise { if (selectedCharacter?.id) { await deleteCharacter(selectedCharacter.id); setShowDeleteConfirm(false); backToList(); } } function getSeriesCharacterForSelected(): SeriesCharacterProps | null { if (!selectedCharacter?.seriesCharacterId) return null; return seriesCharacters.find(function (sc: SeriesCharacterProps): boolean { return sc.id === selectedCharacter.seriesCharacterId; }) || null; } if (isLoading) { return (
); } const isNew: boolean = selectedCharacter?.id === null; const canExport: boolean = Boolean(bookSeriesId && selectedCharacter?.id && !selectedCharacter.seriesCharacterId); return (
{viewMode === 'list' && (
{/* Toggle tool */}
} />
{toolEnabled && ( <> {/* Import from series */} {bookSeriesId && availableSeriesCharacters.length > 0 && ( )} )}
)} {viewMode === 'detail' && selectedCharacter && (
)} {viewMode === 'edit' && selectedCharacter && (
)}
{showDeleteConfirm && selectedCharacter?.id && ( )}
); }