'use client'; import React, {useCallback, useContext, useMemo, useState} from 'react'; import {useSpells, UseSpellsConfig} from '@/hooks/settings/useSpells'; import {useTranslations} from 'next-intl'; import {SpellEditState, SpellListItem} from '@/lib/models/Spell'; import {SeriesSpellListItem} 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 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} = 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 (
{viewMode === 'list' && (
{/* Toggle tool */}
} />
{toolEnabled && ( <> {/* Import from series */} {bookSeriesId && availableSeriesSpells.length > 0 && ( )} )}
)} {viewMode === 'detail' && selectedSpell && (
)} {viewMode === 'edit' && selectedSpell && (
)}
{showDeleteConfirm && selectedSpell?.id && ( )} {showTagManager && ( )}
); }