'use client'; import React, {useCallback, useContext, useMemo, useState} from 'react'; import {useSpells, UseSpellsConfig} from '@/hooks/settings/useSpells'; import {useTranslations} from '@/lib/i18n'; import {SpellEditState, SpellListItem} from '@/lib/types/spell'; import {SeriesSpellListItem} from '@/lib/types/series'; import {BookContext, BookContextProps} from '@/context/BookContext'; import PulseLoader from '@/components/ui/PulseLoader'; import ToolDetailHeader from '@/components/book/settings/ToolDetailHeader'; import SeriesImportSelector from '@/components/form/SeriesImportSelector'; import AlertBox from '@/components/ui/AlertBox'; import SpellTagManager from '@/components/book/settings/spells/SpellTagManager'; import SpellEditorList from './SpellEditorList'; import SpellEditorDetail from './SpellEditorDetail'; import SpellEditorEdit from './SpellEditorEdit'; /** * SpellEditor - Orchestrateur pour ComposerRightBar * Mêmes fonctionnalités que SpellSettings, layout condensé */ export default function SpellEditor(): React.JSX.Element { const t = useTranslations(); const {book}: BookContextProps = useContext(BookContext); const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); const config: UseSpellsConfig = useMemo(function (): UseSpellsConfig { return { entityType: 'book', entityId: book?.bookId || '', }; }, [book?.bookId]); const { spells, seriesSpells, tags, selectedSpell, selectedSeriesSpell, toolEnabled, isLoading, bookSeriesId, showTagManager, viewMode, saveSpell, deleteSpell, updateSpellField, toggleTool, importFromSeries, exportToSeries, setSelectedSpell, setShowTagManager, enterDetailMode, enterEditMode, exitEditMode, backToList, addNewSpell, createTag, updateTag, deleteTag, handleSyncComplete, } = useSpells(config); const availableSeriesSpells = useMemo(function (): SeriesSpellListItem[] { return seriesSpells.filter(function (ss: SeriesSpellListItem): boolean { return !spells.some(function (s: SpellListItem): boolean { return s.seriesSpellId === ss.id; }); }); }, [seriesSpells, spells]); const handleSpellChange = useCallback(function (key: keyof SpellEditState, value: string | string[] | null): void { updateSpellField(key, value); }, [updateSpellField]); async function handleSave(): Promise { await exitEditMode(true); } function handleCancel(): void { exitEditMode(false); } async function handleDelete(): Promise { if (selectedSpell?.id) { await deleteSpell(selectedSpell.id); setShowDeleteConfirm(false); backToList(); } } if (isLoading) { return ; } const isNew: boolean = selectedSpell?.id === null; const canExport: boolean = Boolean(bookSeriesId && selectedSpell?.id && !selectedSpell.seriesSpellId); return (
{showTagManager && ( )} {!showTagManager && viewMode === 'list' && (
{/* Import from series */} {bookSeriesId && availableSeriesSpells.length > 0 && ( )}
)} {!showTagManager && viewMode === 'detail' && selectedSpell && (
)} {!showTagManager && viewMode === 'edit' && selectedSpell && (
)}
{showDeleteConfirm && selectedSpell?.id && ( )}
); }