import { useState } from 'react' import { useMutation, useQueryClient } from '@tanstack/react-query' import { useTranslation } from 'react-i18next' import ReactMarkdown from 'react-markdown' import remarkGfm from 'remark-gfm' import { toast } from '@/shared/ui/toast-store' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/shared/ui/dialog' import { Button } from '@/shared/ui/button' import { Input } from '@/shared/ui/input' import { Label } from '@/shared/ui/label' import { Textarea } from '@/shared/ui/textarea' import { HttpError } from '@/shared/api/client' import type { NewsPostDto } from '@/shared/api/types' import { createPost, updatePost } from './api' export function NewsFormDialog({ post, open, onOpenChange, }: { post?: NewsPostDto open?: boolean onOpenChange?: (open: boolean) => void }) { const { t } = useTranslation() const queryClient = useQueryClient() const [internalOpen, setInternalOpen] = useState(false) const [title, setTitle] = useState(post?.title ?? '') const [body, setBody] = useState(post?.body ?? '') const [previewMode, setPreviewMode] = useState(false) const isControlled = open !== undefined const dialogOpen = isControlled ? open : internalOpen const setDialogOpen = isControlled ? onOpenChange! : setInternalOpen const mutation = useMutation({ mutationFn: () => (post ? updatePost(post.id, title.trim(), body.trim()) : createPost(title.trim(), body.trim())), onSuccess: async () => { toast.success(post ? t('admin.news.updated') : t('admin.news.created')) await queryClient.invalidateQueries({ queryKey: ['admin-news'] }) setDialogOpen(false) }, onError: (error) => toast.error(error instanceof HttpError ? error.detail : t('auth.genericError')), }) const canSubmit = title.trim() && body.trim() return ( {!isControlled && ( )} {post ? post.title : t('admin.news.create')}
{ e.preventDefault() if (canSubmit) mutation.mutate() }} >
setTitle(e.target.value)} required />
{previewMode ? (
{body || t('admin.news.body')}
) : (