"use client" import { useEffect, useMemo, useState } from "react" import { Pencil, Plus, Trash2, UsersRound } from "lucide-react" import { useAdminUserGroups } from "@/lib/api/hooks/use-admin-queries" import { useCreateAdminUserGroup, useDeleteAdminUserGroup, useUpdateAdminUserGroup, } from "@/lib/api/hooks/use-admin-mutations" import type { AdminUserGroup } from "@/lib/api/admin-types" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Textarea } from "@/components/ui/textarea" export function UsersGroupsDialog({ open, onOpenChange, }: { open: boolean onOpenChange: (open: boolean) => void }) { const [q, setQ] = useState("") const [editorOpen, setEditorOpen] = useState(false) const [editing, setEditing] = useState(null) const queryParams = useMemo( () => ({ page: 1, page_size: 100, q: q.trim() || undefined }), [q] ) const { data, isFetching } = useAdminUserGroups(queryParams) const groups = data?.groups ?? [] function openCreate() { setEditing(null) setEditorOpen(true) } function openEdit(group: AdminUserGroup) { setEditing(group) setEditorOpen(true) } return ( <> Groupes d'utilisateurs
setQ(e.target.value)} placeholder="Rechercher un groupe" className="h-9" />
{isFetching ? (

Chargement…

) : groups.length === 0 ? (

Aucun groupe.

) : ( groups.map((group) => ( openEdit(group)} /> )) )}
) } function GroupRow({ group, onEdit, }: { group: AdminUserGroup onEdit: () => void }) { const deleteGroup = useDeleteAdminUserGroup() return (
{group.name}
{group.description ? (
{group.description}
) : null}
{group.member_count.toLocaleString("fr-FR")} membre(s)
) } function GroupEditorDialog({ open, onOpenChange, group, }: { open: boolean onOpenChange: (open: boolean) => void group: AdminUserGroup | null }) { const createGroup = useCreateAdminUserGroup() const updateGroup = useUpdateAdminUserGroup(group?.id ?? "") const [name, setName] = useState("") const [description, setDescription] = useState("") const isEdit = Boolean(group) useEffect(() => { if (!open) return setName(group?.name ?? "") setDescription(group?.description ?? "") }, [open, group]) async function submit() { const trimmedName = name.trim() if (!trimmedName) return if (isEdit && group) { await updateGroup.mutateAsync({ name: trimmedName, description: description.trim(), }) } else { await createGroup.mutateAsync({ name: trimmedName, description: description.trim() || undefined, }) } onOpenChange(false) } return ( {isEdit ? "Modifier le groupe" : "Nouveau groupe"}
setName(e.target.value)} />