import { useMutation, useQuery } from '@tanstack/react-query' import { useState } from 'react' import { useTranslation } from 'react-i18next' import { HttpError } from '@/shared/api/client' import type { MetadataCandidate, ShowDto } from '@/shared/api/types' import { Button } from '@/shared/ui/button' import { Card, CardContent, CardHeader, CardTitle } from '@/shared/ui/card' import { Input } from '@/shared/ui/input' import { Label } from '@/shared/ui/label' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/shared/ui/select' import { toast } from '@/shared/ui/toast-store' import { imageUrl } from '@/features/admin/images/api' import { ImageGallery } from '@/features/admin/images/ImageGallery' import { applyMetadata, clearMetadata, getMetadataProviders, refreshEpisodesMetadata, renameShow, searchMetadata, setShowOriginalName, setShowPoster, updateMetadata, } from './api' export function ShowMetadataCard({ show, onChanged }: { show: ShowDto; onChanged: () => void }) { const { t } = useTranslation() const [galleryOpen, setGalleryOpen] = useState(false) const [provider, setProvider] = useState('') const [name, setName] = useState(show.name) const [originalName, setOriginalName] = useState(show.originalName ?? '') const [results, setResults] = useState([]) const [searched, setSearched] = useState(false) const [description, setDescription] = useState(show.description ?? '') const [year, setYear] = useState(show.year != null ? String(show.year) : '') const { data: providers } = useQuery({ queryKey: ['admin', 'metadata', 'providers'], queryFn: getMetadataProviders, }) const onError = (error: unknown) => toast.error(error instanceof HttpError ? error.detail : t('common.error')) const changed = () => onChanged() const setPoster = useMutation({ mutationFn: (imageId: string) => setShowPoster(show.id, imageId), onSuccess: () => { toast.success(t('settings.saved')) changed() }, onError, }) const effectiveProvider = provider || providers?.[0] || '' // Метаданные ищем по оригинальному названию (иначе — по обычному). const searchTerm = originalName.trim() || name.trim() const search = useMutation({ mutationFn: () => searchMetadata(effectiveProvider, searchTerm), onSuccess: (data) => { setResults(data) setSearched(true) }, onError, }) const apply = useMutation({ mutationFn: (externalId: string) => applyMetadata(show.id, effectiveProvider, externalId), onSuccess: () => { setResults([]) setSearched(false) toast.success(t('admin.metadata.applied')) changed() }, onError, }) // Одна кнопка «Сохранить»: пишем только изменённое. Оригинальное название идёт своим эндпоинтом // (не трогает привязку к источнику), описание/год — ручной правкой метаданных. const save = useMutation({ mutationFn: async () => { const yearNum = year.trim() ? Number(year) : null const infoChanged = (description.trim() || null) !== (show.description ?? null) || yearNum !== (show.year ?? null) if (name.trim() && name.trim() !== show.name) await renameShow(show.id, name.trim()) if (originalName.trim() !== (show.originalName ?? '')) await setShowOriginalName(show.id, originalName.trim() || null) if (infoChanged) await updateMetadata(show.id, { description: description.trim() || null, year: yearNum }) }, onSuccess: () => { toast.success(t('settings.saved')) changed() }, onError, }) const clear = useMutation({ mutationFn: () => clearMetadata(show.id), onSuccess: () => { setDescription('') setYear('') changed() }, onError, }) const refreshEpisodes = useMutation({ mutationFn: () => refreshEpisodesMetadata(show.id), onSuccess: (count) => { toast.success(t('admin.metadata.refreshedCount', { count })) onChanged() }, onError, }) const linked = !!show.metadataExternalId && !!show.metadataProvider && show.metadataProvider !== 'manual' return ( {t('admin.metadata.title')} {/* Постер */}
{show.posterImageId ? ( ) : ( {t('admin.metadata.noPoster')} )}
setPoster.mutate(img.id)} />
{/* Название + поиск + ручная правка */}
setName(e.target.value)} />
{ setOriginalName(e.target.value) setSearched(false) }} />

{t('admin.metadata.originalNameHint')}

{providers && providers.length > 0 && (searched || results.length > 0) && (
{searched && results.length === 0 && (

{t('admin.metadata.nothingFound')}

)} {results.length > 0 && (
    {results.map((r) => (
  • {r.posterUrl ? ( ) : (
    )}
    {r.title} {r.year != null && ( ({r.year}) )}
    {r.overview && (

    {r.overview}

    )}
  • ))}
)}
)}