Snai3i-MarketPlace / frontend / src / pages / Dashboard / Accounts / index.tsx
index.tsx
Raw
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"
    />
  );
}