import { useState } from "react"; import { format } from "date-fns"; import * as locales from "date-fns/locale"; import { defaultDateFormat, ConfirmationDialog, Role, useAuthController, useCustomizationController, User, useSnackbarController, useTranslation } from "@firecms/core"; import { Avatar, Button, CenteredView, DeleteIcon, IconButton, Table, TableBody, TableCell, TableHeader, TableRow, Tooltip, Typography, } from "@firecms/ui"; import { useUserManagement } from "../../hooks"; import { RoleChip } from "../roles"; import { PersistedUser } from "../../types"; export function UsersTable({ onUserClicked }: { onUserClicked: (user: User) => void; }) { const { t } = useTranslation(); const { users, saveUser, deleteUser } = useUserManagement(); const authController = useAuthController(); const snackbarController = useSnackbarController(); const customizationController = useCustomizationController(); const dateUtilsLocale = customizationController?.locale ? locales[customizationController?.locale as keyof typeof locales] : undefined; const dateFormat: string = customizationController?.dateTimeFormat ?? defaultDateFormat; const [userToBeDeleted, setUserToBeDeleted] = useState(undefined); const [deleteInProgress, setDeleteInProgress] = useState(false); return (
{t("email")} {t("name")} {t("roles")} {t("created_on")} {users && users.map((user) => { const userRoles: Role[] | undefined = user.roles; const formattedDate = user.created_on ? format(user.created_on, dateFormat, { locale: dateUtilsLocale }) : ""; return ( { onUserClicked(user); }} > {user.displayName ? user.displayName[0].toUpperCase() : (user.email ? user.email[0].toUpperCase() : "U")}
{user.email}
{user.uid && (
{user.uid}
)}
{user.displayName} {userRoles ?
{userRoles.map(userRole => )}
: null}
{formattedDate} { event.stopPropagation(); return setUserToBeDeleted(user); }}>
); })} {(!users || users.length === 0) && {t("no_users_yet")} }
{ if (userToBeDeleted) { setDeleteInProgress(true); deleteUser(userToBeDeleted) .then(() => { setUserToBeDeleted(undefined); }) .catch((error) => { snackbarController.open({ type: "error", message: "Error deleting user: " + error.message, }) }) .finally(() => { setDeleteInProgress(false); }) } }} onCancel={() => { setUserToBeDeleted(undefined); }} title={<>{t("delete_confirmation_title")}} body={<>{t("delete_user_confirmation")}} />
); }