"use client"; import { useState, useEffect } from "react"; import { Users, Check, Search } from "lucide-react"; import Modal from "../ui/Modal"; import Button from "../ui/Button"; import toast from "react-hot-toast"; import { useRouter } from "next/navigation"; interface UserOption { id: string; name: string | null; username: string | null; } interface CreateSharedFolderModalProps { isOpen: boolean; onClose: () => void; onCreated: () => void; } const inputClasses = "field"; export default function CreateSharedFolderModal({ isOpen, onClose, onCreated, }: CreateSharedFolderModalProps) { const router = useRouter(); const [name, setName] = useState(""); const [users, setUsers] = useState([]); const [selectedIds, setSelectedIds] = useState([]); const [userSearch, setUserSearch] = useState(""); const [loading, setLoading] = useState(false); const [loadingUsers, setLoadingUsers] = useState(false); useEffect(() => { if (!isOpen) return; setLoadingUsers(true); fetch("/api/users/public") .then((r) => r.ok ? r.json() : []) .then((data) => setUsers(Array.isArray(data) ? data : [])) .finally(() => setLoadingUsers(false)); }, [isOpen]); const handleClose = () => { setName(""); setSelectedIds([]); setUserSearch(""); onClose(); }; const toggleUser = (id: string) => { setSelectedIds((prev) => prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id] ); }; const handleCreate = async () => { if (!name.trim()) return; setLoading(true); try { const res = await fetch("/api/shared-spaces", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ name: name.trim(), memberIds: selectedIds }), }); if (res.ok) { const space = await res.json(); toast.success(`Dossier partagé "${name}" créé`); handleClose(); onCreated(); // Navigate to the new shared space router.push(`/dashboard/shared-space/${space.id}`); } else { const data = await res.json(); toast.error(data.error || "Erreur lors de la création"); } } catch { toast.error("Erreur réseau"); } finally { setLoading(false); } }; const filteredUsers = users.filter((u) => { const q = userSearch.toLowerCase(); return ( u.username?.toLowerCase().includes(q) || u.name?.toLowerCase().includes(q) ); }); return ( {/* Name */}
setName(e.target.value)} onKeyDown={(e) => e.key === "Enter" && handleCreate()} placeholder="Ex: Projet Alpha, Famille..." className={inputClasses} autoFocus />
{/* User picker */}
{loadingUsers ? (
Chargement des utilisateurs...
) : users.length === 0 ? (

Aucun autre utilisateur disponible.

) : (
{/* Search within users */} {users.length > 4 && (
setUserSearch(e.target.value)} placeholder="Filtrer les utilisateurs..." className="w-full pl-7 pr-3 py-1.5 text-xs bg-gray-50 dark:bg-white/5 border border-gray-200 dark:border-white/10 rounded focus:outline-none text-gray-900 dark:text-white" />
)}
{filteredUsers.length === 0 && (

Aucun résultat

)} {filteredUsers.map((u) => { const isSelected = selectedIds.includes(u.id); const displayName = u.name || u.username || u.id; const initial = displayName[0].toUpperCase(); return ( ); })}
)}
{/* Info note */}

ℹ Vous serez automatiquement membre. Le dossier apparaîtra dans la sidebar de chaque membre.

); }