import { Trans } from "@lingui/macro" import { ActionIcon, Box, Code, Container, Group, Table, Text, Title, useMantineTheme } from "@mantine/core" import { closeAllModals, openConfirmModal, openModal } from "@mantine/modals" import { client, errorToStrings } from "app/client" import type { UserModel } from "app/types" import { Alert } from "components/Alert" import { Loader } from "components/Loader" import { RelativeDate } from "components/RelativeDate" import { UserEdit } from "components/admin/UserEdit" import type { ReactNode } from "react" import { useAsync, useAsyncCallback } from "react-async-hook" import { TbCheck, TbPencil, TbPlus, TbTrash, TbX } from "react-icons/tb" function BooleanIcon({ value }: { value: boolean }) { return value ? : } export function AdminUsersPage() { const theme = useMantineTheme() const query = useAsync(async () => await client.admin.getAllUsers(), []) const users = query.result?.data.sort((a, b) => a.id - b.id) const deleteUser = useAsyncCallback(client.admin.deleteUser, { onSuccess: () => { query.execute() closeAllModals() }, }) const openUserEditModal = (title: ReactNode, user?: UserModel) => { openModal({ title, children: ( { query.execute() closeAllModals() }} /> ), }) } const openUserDeleteModal = (user: UserModel) => { const userName = user.name openConfirmModal({ title: Delete user, children: ( Are you sure you want to delete user {userName} ? ), labels: { confirm: Confirm, cancel: Cancel }, confirmProps: { color: "red" }, onConfirm: async () => await deleteUser.execute({ id: user.id }), }) } if (!users) return return ( <Group> <Trans>Manage users</Trans> <ActionIcon color={theme.primaryColor} variant="subtle" onClick={() => openUserEditModal(<Trans>Add user</Trans>)}> <TbPlus size={20} /> </ActionIcon> </Group> {deleteUser.error && ( )} Id Name E-mail Date created Last login date Admin Enabled Actions {users.map(u => ( {u.id} {u.name} {u.email} openUserEditModal(Edit user, u)} > openUserDeleteModal(u)} loading={deleteUser.loading} > ))}
) }