import { useMemo } from 'react';
import { ColumnDef } from '@tanstack/react-table';
import { toast } from 'sonner';
import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime';
import { DataTable } from '@/components/DataTable/DataTable';
// import useTitle from '../hooks/useTitle';
import { Checkbox } from '@/components/ui/checkbox';
import { DataTableColumnHeader } from '@/components/DataTable/DataTableColumnHeader';
import Error from '@/pages/Errors';
import DataTableShimmer from '@/components/DataTable/DataTableShimmer';
import { Settings2, Trash2 } from 'lucide-react';
import AlertDialogDemo from '@/components/AlertDialogDemo';
import {
useBulkDeleteUserMutation,
useDeleteUserMutation,
useGetUsersByAdminQuery,
} from '@/app/backend/endpoints/accounts';
import { useNavigate } from 'react-router-dom';
import useTitle from '@/hooks/useTitle';
dayjs.extend(relativeTime);
export default function Accounts() {
useTitle('Accounts');
const {
data: dataWrap,
isLoading,
isError,
isFetching,
} = useGetUsersByAdminQuery();
const data = dataWrap?.data;
const navigate = useNavigate();
// const [update, { isLoading: isUpdating }] = useUpdateIsActiveMutation();
// const isUpdating = false;
const [deleteUser, { isLoading: isDeleting }] = useDeleteUserMutation();
const [deleteUsers, { isLoading: isBulkDeleting }] =
useBulkDeleteUserMutation();
const bulkDeleteMutation = (ids: number[]) => {
deleteUsers({ user_ids: ids })
.unwrap()
.then(() => {
toast.success('Accounts deleted successfully');
})
.catch(() => {
toast.error('Error deleting accounts');
});
};
const columns: ColumnDef<UserI>[] = useMemo(
() => [
{
id: 'select',
header: ({ table }) => (
<div className="flex items-center pl-2">
<Checkbox
checked={table.getIsAllPageRowsSelected()}
onCheckedChange={(value) =>
table.toggleAllPageRowsSelected(!!value)
}
aria-label="Select all"
/>
</div>
),
cell: ({ row }) => (
<div className="flex items-center pl-2">
<Checkbox
checked={row.getIsSelected()}
onCheckedChange={(value) => row.toggleSelected(!!value)}
aria-label="Select row"
onClick={(e) => e.stopPropagation()}
/>
</div>
),
enableSorting: false,
enableHiding: false,
},
{
accessorKey: 'fullName',
header: ({ column }) => (
<DataTableColumnHeader
column={column}
title="Full Name"
// sorting={false}
/>
),
cell: ({ row }) => (
<span className="font-medium">
{row.original.role === 'school' ? (row.original as SchoolI).schoolName : (row.original.firstName + ' ' + row.original.lastName)}
</span>
),
},
{
accessorKey: 'email',
header: ({ column }) => (
<DataTableColumnHeader column={column} title="Email" />
),
cell: ({ row }) => (
<span className="font-medium">{row.original.email}</span>
),
},
{
accessorKey: 'role',
header: ({ column }) => (
<DataTableColumnHeader column={column} title="Role" />
),
cell: ({ row }) => (
<span className="font-medium">{row.original.role}</span>
),
},
{
id: 'actions',
header: () => (
<span className="hover:text-accent-foreground cursor-pointer text-xs">
Actions
</span>
),
cell: ({ row }) => (
<div className="flex space-x-2">
<Settings2
className="cursor-pointer h-8 w-8 border border-grey-300 rounded-md p-[5px]"
onClick={() => {
// console.log(row.original.user_id);
navigate('edit/' + row.original.user_id, {
state: { role: row.original.role },
});
}}
/>
<AlertDialogDemo
title="Are you absolutely sure?"
description="This action cannot be undone. This will permanently delete the account and remove the data from our servers."
action="Delete"
isDeleting={isDeleting}
onClick={() => {
deleteUser({ user_id: row.original.user_id })
.unwrap()
.then((response) => {
toast.success(response.message);
})
.catch((error: any) => {
toast.error(
error?.data?.message ?? error?.error.toString()
);
});
}}
>
<Trash2
className="cursor-pointer h-8 w-8 border border-grey-300 rounded-md p-[5px] text-red-500"
onClick={() => {
// console.log(row.original.user_id);
}}
/>
</AlertDialogDemo>
</div>
),
},
],
[]
);
if (isLoading) return <DataTableShimmer columns={4} />;
if (isError) return <Error fullScreen={false} />;
return (
<DataTable<UserI, string>
columns={columns}
data={data ?? []}
totalEntries={data?.length ?? 0}
isFetching={isFetching}
bulkDeleteHandler={(ids) => {
bulkDeleteMutation(ids);
}}
bulkDeleteIsLoading={isBulkDeleting}
selectRows
name="A New Account"
title="Accounts"
/>
);
}