import { useForm } from "react-hook-form"; import { Button } from "@/shared/common/ui/button"; import { Label } from "@/shared/common/ui/label"; import { Textarea } from "@/shared/common/ui/textarea"; import { ImageIcon, Loader2 } from "lucide-react"; import { useEffect, useMemo, useState } from "react"; import { FormFeild } from "../components/FormFeild"; import { CreateNewsPayload, NewsItem } from "../types/newsTypes"; import { useNewsCategory } from "../hooks/useNewsCategory"; import { useNavigate, useParams } from "react-router-dom"; import { useNews } from "../hooks/useNews"; import { toast } from "sonner"; import { ContactUsParams } from "../hooks/useContactUs"; interface FormData { titleEn: string; titleAm: string; subTitleAm: string; subTitleEn: string; bodyAm: string; bodyEn: string; newsCategoryId: string; image: FileList; isActive: boolean; isFeatured: boolean; } export const EditNews = () => { const { id } = useParams(); const { singleItem: item, updateItem } = useNews(undefined, id); const [isSubmitting, setIsSubmitting] = useState(false); const navigate = useNavigate(); const defaultValues = useMemo( () => ({ titleEn: item?.title?.en || "", titleAm: item?.title?.am || "", subTitleAm: item?.subTitle?.am || "", subTitleEn: item?.subTitle?.en || "", bodyAm: item?.body?.am || "", bodyEn: item?.body?.en || "", newsCategoryId: item?.newsCategoryId || "", isActive: item?.isActive || false, isFeatured: item?.isFeatured || false, image: undefined, }), [item] // 👈 recompute only when item changes ); const { register, handleSubmit, watch, setValue, reset, formState: { errors }, } = useForm({ defaultValues, }); useEffect(() => { if (item) { reset(defaultValues); } }, [item, defaultValues, reset]); const imageFile = watch("image")?.[0]; const [imagePreview, setImagePreview] = useState( item?.presigned || "" ); // Fetch news categories for dropdown const { items: categories } = useNewsCategory(); useEffect(() => { if (imageFile) { const url = URL.createObjectURL(imageFile); setImagePreview(url); return () => URL.revokeObjectURL(url); } }, [imageFile]); const ImageUpload = ({ label, preview, existingName, register, error, onView, id, isRequired = false, }: { label: string; preview: string | null; existingName?: string; register: any; error?: string; onView: () => void; id: string; isRequired?: boolean; }) => (
{preview && (
{existingName || "Selected Image"}
)}
{error &&

{error}

}
); const handleEditSubmit = async (formData: FormData) => { if (!item) return; setIsSubmitting(true); try { const imageFile = formData.image?.[0]; const payload: CreateNewsPayload = { newsCategoryId: formData.newsCategoryId, title: { am: formData.titleAm || "", en: formData.titleEn || "", }, subTitle: { am: formData.subTitleAm || "", en: formData.subTitleEn || "", }, body: { am: formData.bodyAm || "", en: formData.bodyEn || "", }, // Only include fileInfo if there's a new image ...(imageFile && { fileInfo: { fileName: imageFile.name, contentType: imageFile.type, size: imageFile.size, originalname: imageFile.name, }, }), isActive: formData.isActive, isFeatured: formData.isFeatured, }; await updateItem({ id: item.id, data: payload, ...(imageFile && { imageFile }), }); toast.success("News updated successfully"); navigate(-1); } catch (error) { toast.error("Failed to update news"); console.error("Update error:", error); setIsSubmitting(false); } }; return (
{/* Category Selection */}

Category

{errors.newsCategoryId && (

{errors.newsCategoryId.message}

)}
{/* Title Section */}

Title

{/* Subtitle Section */}

Subtitle

{/* Body Section */}

Content