import { useState, useEffect } from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { useQuery, useMutation } from "@tanstack/react-query"; import { useToast } from "@/hooks/use-toast"; import { apiRequest, queryClient } from "@/lib/queryClient"; import type { SocialPage, Media, Post } from "@shared/schema"; import { format } from "date-fns"; import { Image as ImageIcon, CheckCircle } from "lucide-react"; interface EditScheduledPostDialogProps { open: boolean; onOpenChange: (open: boolean) => void; scheduledPost: any; } export default function EditScheduledPostDialog({ open, onOpenChange, scheduledPost }: EditScheduledPostDialogProps) { const { toast } = useToast(); const [date, setDate] = useState(""); const [time, setTime] = useState(""); const [pageId, setPageId] = useState(""); const [postText, setPostText] = useState(""); const [selectedMediaIds, setSelectedMediaIds] = useState([]); const { data: pages = [] } = useQuery({ queryKey: ["/api/pages"], }); const { data: postData } = useQuery<{ post: Post; media: Media[] }>({ queryKey: ["/api/posts", scheduledPost?.postId], enabled: !!scheduledPost?.postId && open, }); const { data: allMedia = [] } = useQuery({ queryKey: ["/api/media"], enabled: open, }); useEffect(() => { if (scheduledPost && open) { const scheduledAt = new Date(scheduledPost.scheduledAt); setDate(format(scheduledAt, "yyyy-MM-dd")); setTime(format(scheduledAt, "HH:mm")); setPageId(scheduledPost.pageId); } }, [scheduledPost, open]); useEffect(() => { if (postData && open) { setPostText(postData.post.content); setSelectedMediaIds(postData.media.map(m => m.id)); } }, [postData, open]); const updateScheduledMutation = useMutation({ mutationFn: (data: { scheduledAt: string; pageId: string }) => apiRequest('PATCH', `/api/scheduled-posts/${scheduledPost.id}`, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['/api/scheduled-posts'] }); }, }); const updatePostTextMutation = useMutation({ mutationFn: (data: { content: string }) => apiRequest('PATCH', `/api/posts/${scheduledPost?.postId}`, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['/api/posts', scheduledPost?.postId] }); }, }); const updatePostMediaMutation = useMutation({ mutationFn: (data: { mediaIds: string[] }) => apiRequest('PATCH', `/api/posts/${scheduledPost?.postId}/media`, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['/api/posts', scheduledPost?.postId] }); }, }); const handleSave = async () => { if (!date || !time || !pageId) { toast({ title: "Erreur", description: "Veuillez remplir tous les champs", variant: "destructive", }); return; } try { const scheduledAt = new Date(`${date}T${time}`); await updateScheduledMutation.mutateAsync({ scheduledAt: scheduledAt.toISOString(), pageId }); if (postData && postText !== postData.post.content) { await updatePostTextMutation.mutateAsync({ content: postText }); } const currentMediaIds = postData?.media.map(m => m.id) || []; if (JSON.stringify(selectedMediaIds) !== JSON.stringify(currentMediaIds)) { await updatePostMediaMutation.mutateAsync({ mediaIds: selectedMediaIds }); } toast({ title: "Modifications enregistrées", description: "Le post a été mis à jour avec succès", }); onOpenChange(false); } catch (error) { toast({ title: "Erreur", description: "Impossible de modifier le post", variant: "destructive", }); } }; const toggleMediaSelection = (mediaId: string) => { setSelectedMediaIds(prev => { if (prev.includes(mediaId)) { return prev.filter(id => id !== mediaId); } else { if (prev.length >= 10) { toast({ title: "Limite atteinte", description: "Maximum 10 photos par publication", variant: "destructive", }); return prev; } return [...prev, mediaId]; } }); }; const isPending = updateScheduledMutation.isPending || updatePostTextMutation.isPending || updatePostMediaMutation.isPending; return ( Modifier le post