/** * Главный компонент управления персонами * Объединяет список персон, детальный просмотр и форму редактирования */ import { useEffect, useState } from "react" import { Alert, AlertDescription } from "@/components/ui/alert" import { useModal } from "@/features/modals/services" import { PersonDatabaseService } from "../services/person-database-service" import type { PersonAppearance, PersonProfile } from "../types/person" import { PersonDetail } from "./person-detail" import { PersonList } from "./person-list" interface PersonManagerProps { className?: string } export function PersonManager({ className }: PersonManagerProps) { const [persons, setPersons] = useState([]) const [selectedPersonId, setSelectedPersonId] = useState(null) const [selectedPerson, setSelectedPerson] = useState(null) const [appearances, setAppearances] = useState([]) const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState(null) const { openModal } = useModal() const personDatabase = PersonDatabaseService.getInstance() // Загрузка всех персон при монтировании useEffect(() => { void loadPersons() }, []) // Загрузка данных о выбранной персоне useEffect(() => { if (selectedPersonId) { void loadPersonDetails(selectedPersonId) } else { setSelectedPerson(null) setAppearances([]) } }, [selectedPersonId]) const loadPersons = async () => { try { setIsLoading(true) setError(null) const allPersons = await personDatabase.getAllPersons() setPersons(allPersons) } catch (err) { setError("Ошибка загрузки персон") console.error("Failed to load persons:", err) } finally { setIsLoading(false) } } const loadPersonDetails = async (personId: string) => { try { const person = persons.find((p) => p.id === personId) if (person) { setSelectedPerson(person) // Здесь можно загрузить дополнительные данные о появлениях персоны // const personAppearances = await loadPersonAppearances(personId) // setAppearances(personAppearances) setAppearances([]) // Пока заглушка } } catch (err) { setError("Ошибка загрузки данных персоны") console.error("Failed to load person details:", err) } } const handleSelectPerson = (personId: string) => { setSelectedPersonId(personId) } const handleCreatePerson = () => { openModal("person-form", { person: null, onSave: handleSavePerson, isLoading, }) } const handleEditPerson = (personId: string) => { const person = persons.find((p) => p.id === personId) if (person) { openModal("person-form", { person, onSave: handleSavePerson, isLoading, }) } } const handleDeletePerson = async (personId: string) => { if (confirm("Вы уверены, что хотите удалить эту персону?")) { try { await personDatabase.deletePerson(personId) await loadPersons() // Если удаляем выбранную персону, сбрасываем выбор if (selectedPersonId === personId) { setSelectedPersonId(null) } } catch (err) { setError("Ошибка удаления персоны") console.error("Failed to delete person:", err) } } } const handleSavePerson = async (personData: Partial) => { try { if (personData.id) { // Обновление существующей персоны await personDatabase.updatePerson(personData.id, personData) } else { // Создание новой персоны await personDatabase.addPerson({ name: personData.name!, description: personData.notes, tags: personData.tags, thumbnailPath: personData.thumbnails?.[0]?.imageUrl, }) } await loadPersons() } catch (err) { setError("Ошибка сохранения персоны") console.error("Failed to save person:", err) throw err // Пробрасываем ошибку для обработки в форме } } const handleCloseDetail = () => { setSelectedPersonId(null) } const handleEditFromDetail = () => { if (selectedPerson) { handleEditPerson(selectedPerson.id) } } return (
{/* Список персон */}
{/* Детальный просмотр */}
{error && ( {error} )} {selectedPerson ? ( ) : (

Выберите персону

Выберите персону из списка слева для просмотра подробной информации

)}
) }