import { useState, useCallback } from "react"; import { useDropzone } from "react-dropzone"; import { Button } from "@/components/ui/button"; import { useMutation, useQuery } from "@tanstack/react-query"; import { apiRequest, queryClient } from "@/lib/queryClient"; import { CloudUpload, Image as ImageIcon, Video, X, Upload } from "lucide-react"; import { useToast } from "@/hooks/use-toast"; import { SiFacebook, SiInstagram } from "react-icons/si"; export default function MediaUpload() { const { toast } = useToast(); const [selectedFile, setSelectedFile] = useState(null); const { data: mediaList } = useQuery({ queryKey: ["/api/media"], }); const uploadMutation = useMutation({ mutationFn: async (file: File) => { const formData = new FormData(); formData.append("file", file); const response = await fetch("/api/media/upload", { method: "POST", body: formData, }); if (!response.ok) throw new Error("Upload failed"); return response.json(); }, onSuccess: (data) => { queryClient.invalidateQueries({ queryKey: ["/api/media"] }); setSelectedFile(data); toast({ title: "Succès", description: "Média téléchargé et traité avec succès", }); }, onError: () => { toast({ title: "Erreur", description: "Impossible de télécharger le média", variant: "destructive", }); }, }); const onDrop = useCallback((acceptedFiles: File[]) => { if (acceptedFiles.length > 0) { uploadMutation.mutate(acceptedFiles[0]); } }, []); const { getRootProps, getInputProps, isDragActive, open } = useDropzone({ onDrop, accept: { "image/*": [".png", ".jpg", ".jpeg", ".gif"], "video/*": [".mp4", ".mov"], }, maxSize: 52428800, }); const deleteMutation = useMutation({ mutationFn: async (id: string) => { await apiRequest("DELETE", `/api/media/${id}`); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["/api/media"] }); setSelectedFile(null); }, }); return (

Médiathèque

Téléchargement et recadrage automatique

{isDragActive ? "Déposez vos fichiers ici" : "Glissez-déposez vos fichiers"}

ou cliquez pour parcourir

PNG, JPG, MP4 jusqu'à 50MB

Fichiers téléchargés {(mediaList as any[])?.length || 0} média(s)

{(mediaList as any[])?.slice(0, 5).map((media: any) => (
setSelectedFile(media)} className="flex items-center gap-4 p-4 rounded-xl bg-muted/30 border border-border/50 cursor-pointer hover:bg-muted hover:shadow-md transition-all" data-testid={`media-item-${media.id}`} >
{media.type === "video" ? (

{media.fileName}

{(media.fileSize / 1024 / 1024).toFixed(1)} MB

Prêt
))}

Aperçu et recadrage automatique

Feed
1080×1080
{selectedFile?.facebookFeedUrl || selectedFile?.instagramFeedUrl ? ( Feed preview ) : (
)}
Story
1080×1920
{selectedFile?.instagramStoryUrl ? ( Story preview ) : (
)}
); }