import { useMutation, useQuery } from '@tanstack/react-query' import { Tag } from 'lucide-react' import { useState } from 'react' import { useTranslation } from 'react-i18next' import { listGenres } from '@/features/admin/genres/api' import { qk } from '@/shared/api/query-keys' import type { ShowDto } from '@/shared/api/types' import { useApiError } from '@/shared/lib/use-api-error' import { Badge } from '@/shared/ui/badge' import { Button } from '@/shared/ui/button' import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '@/shared/ui/dialog' import { setShowGenres } from './api' /** * Жанры шоу: бейджи в шапке карточки + диалог правки. Основной жанр отмечается отдельно — * он показывается в списке шоу и участвует в отборе контента наравне с остальными. */ export function ShowGenresField({ show, onChanged, }: Readonly<{ show: ShowDto; onChanged: () => void }>) { const { t } = useTranslation() const [open, setOpen] = useState(false) const [selected, setSelected] = useState([]) const [primary, setPrimary] = useState(null) const { data: genres } = useQuery({ queryKey: qk.genres.all, queryFn: listGenres, enabled: open, }) const onError = useApiError() const mutation = useMutation({ mutationFn: () => setShowGenres(show.id, selected, primary), onSuccess: () => { onChanged() setOpen(false) }, onError, }) const openDialog = () => { setSelected(show.genres.map((g) => g.id)) setPrimary(show.genres.find((g) => g.isPrimary)?.id ?? null) setOpen(true) } const toggle = (id: string) => { setSelected((prev) => { const next = prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id] // Снятый жанр не может остаться основным — иначе сервер молча выберет другой. if (!next.includes(id) && primary === id) setPrimary(next[0] ?? null) if (next.includes(id) && primary === null) setPrimary(id) return next }) } return ( <>
{show.genres.length === 0 ? ( {t('admin.shows.genresEmpty')} ) : ( show.genres.map((genre) => ( {genre.name} )) )}
{t('admin.shows.genresEdit')}

{t('admin.shows.genresHint')}

{(genres ?? []).map((genre) => { const checked = selected.includes(genre.id) return (
{checked && ( )}
) })}
) }