import { useState } from 'react'; import { useMutation } from '@tanstack/react-query'; import { BookOpen, Copy, Trash2, BookMarked } from 'lucide-react'; import toast from 'react-hot-toast'; import { GostCitation } from '../components/GostCitation'; import { useBibliographyStore } from '../store/bibliography'; import { api } from '../api/client'; import type { GostResultData } from '../types'; export function Bibliography() { const { sources, removeSource, clearSources } = useBibliographyStore(); const [style, setStyle] = useState<'7.1' | '7.0.5'>('7.1'); const [formattedResult, setFormattedResult] = useState(null); const formatMutation = useMutation({ mutationFn: async () => { // Создать задачу GOST форматирования const task = await api.post('/tasks/', { type: 'gost', input_data: { doc_ids: sources.map((s) => s.id), style, }, }); const taskId = task.data.id; // Диспатчить задачу await api.post('/gost/format', { task_id: taskId, doc_ids: sources.map((s) => s.id), style, }); // Простое форматирование прямо на клиенте (используем ГОСТ-цитаты из источников) return { bibliography: sources.map((s, i) => ({ number: i + 1, citation: s.gost_citation, doc_id: s.id, })), style, total: sources.length, } as GostResultData; }, onSuccess: (data) => { setFormattedResult(data); toast.success('Библиография отформатирована'); }, onError: () => { // При ошибке используем локальные ГОСТ-цитаты setFormattedResult({ bibliography: sources.map((s, i) => ({ number: i + 1, citation: s.gost_citation, doc_id: s.id, })), style, total: sources.length, }); }, }); const handleFormat = () => { if (sources.length === 0) { toast.error('Добавьте источники в библиографию'); return; } formatMutation.mutate(); }; const handleCopyAll = () => { if (!formattedResult) return; const text = formattedResult.bibliography .map((e) => `${e.number}. ${e.citation}`) .join('\n'); navigator.clipboard.writeText(text).then(() => { toast.success('Список литературы скопирован'); }); }; return (

Список литературы

Добавляйте источники из результатов поиска и форматируйте библиографию по ГОСТ.

{/* Источники в списке */} {sources.length > 0 ? (
Источников: {sources.length}
{sources.map((source) => (

{source.title}

{source.authors.slice(0, 2).map((a) => a.last_name).join(', ')} {source.year && ` · ${source.year}`}

))}
) : (

Нажмите «В библиографию» на любом источнике из результатов поиска

)} {/* Настройки форматирования */} {sources.length > 0 && (
)} {/* Результат */} {formattedResult && (
Список литературы · ГОСТ {style}
{formattedResult.bibliography.map((entry) => ( ))}
)}
); }