"use client"; import { ColumnDef } from "@tanstack/react-table"; import { ExtendedColumnDef } from "@app/components/ui/data-table"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@app/components/ui/dropdown-menu"; import { Button } from "@app/components/ui/button"; import { ArrowRight, ArrowUpDown, Crown, MoreHorizontal } from "lucide-react"; import { UsersDataTable } from "@app/components/UsersDataTable"; import { useState, useEffect } from "react"; import ConfirmDeleteDialog from "@app/components/ConfirmDeleteDialog"; import { useOrgContext } from "@app/hooks/useOrgContext"; import { toast } from "@app/hooks/useToast"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { formatAxiosError } from "@app/lib/api"; import { createApiClient } from "@app/lib/api"; import { getUserDisplayName } from "@app/lib/getUserDisplayName"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { useUserContext } from "@app/hooks/useUserContext"; import { useTranslations } from "next-intl"; import IdpTypeBadge from "./IdpTypeBadge"; export type UserRow = { id: string; email: string | null; displayUsername: string | null; username: string; name: string | null; idpId: number | null; idpName: string; type: string; idpVariant: string | null; status: string; role: string; isOwner: boolean; }; type UsersTableProps = { users: UserRow[]; }; export default function UsersTable({ users: u }: UsersTableProps) { const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [selectedUser, setSelectedUser] = useState(null); const [users, setUsers] = useState(u); const router = useRouter(); const api = createApiClient(useEnvContext()); const { user, updateUser } = useUserContext(); const { org } = useOrgContext(); const t = useTranslations(); const [isRefreshing, setIsRefreshing] = useState(false); // Update local state when props change (e.g., after refresh) useEffect(() => { setUsers(u); }, [u]); const refreshData = async () => { console.log("Data refreshed"); setIsRefreshing(true); try { await new Promise((resolve) => setTimeout(resolve, 200)); router.refresh(); } catch (error) { toast({ title: t("error"), description: t("refreshError"), variant: "destructive" }); } finally { setIsRefreshing(false); } }; const columns: ExtendedColumnDef[] = [ { accessorKey: "displayUsername", enableHiding: false, friendlyName: t("username"), header: ({ column }) => { return ( ); } }, { accessorKey: "idpName", friendlyName: t("identityProvider"), header: ({ column }) => { return ( ); }, cell: ({ row }) => { const userRow = row.original; return ( ); } }, { accessorKey: "role", friendlyName: t("role"), header: ({ column }) => { return ( ); }, cell: ({ row }) => { const userRow = row.original; return (
{userRow.role}
); } }, { id: "actions", enableHiding: false, header: () => , cell: ({ row }) => { const userRow = row.original; return (
{!userRow.isOwner && ( <> {t("accessUsersManage")} {`${userRow.username}-${userRow.idpId}` !== `${user?.username}-${user?.idpId}` && ( { setIsDeleteModalOpen( true ); setSelectedUser( userRow ); }} > {t("accessUserRemove")} )} )}
{!userRow.isOwner && ( )}
); } } ]; async function removeUser() { if (selectedUser) { const res = await api .delete(`/org/${org!.org.orgId}/user/${selectedUser.id}`) .catch((e) => { toast({ variant: "destructive", title: t("userErrorOrgRemove"), description: formatAxiosError( e, t("userErrorOrgRemoveDescription") ) }); }); if (res && res.status === 200) { toast({ variant: "default", title: t("userOrgRemoved"), description: t("userOrgRemovedDescription", { email: selectedUser.email || "" }) }); setUsers((prev) => prev.filter((u) => u.id !== selectedUser?.id) ); } } setIsDeleteModalOpen(false); } return ( <> { setIsDeleteModalOpen(val); setSelectedUser(null); }} dialog={

{t("userQuestionOrgRemove")}

{t("userMessageOrgRemove")}

} buttonText={t("userRemoveOrgConfirm")} onConfirm={removeUser} string={ selectedUser ? getUserDisplayName({ email: selectedUser.email, name: selectedUser.name, username: selectedUser.username }) : "" } title={t("userRemoveOrg")} /> { router.push( `/${org?.org.orgId}/settings/access/users/create` ); }} onRefresh={refreshData} isRefreshing={isRefreshing} /> ); }