'use client';
import { useState } from 'react';
import Link from 'next/link';
import { usePathname, useRouter } from 'next/navigation';
import { zodResolver } from '@hookform/resolvers/zod';
import { ColumnDef } from '@tanstack/react-table';
import { EllipsisVertical } from 'lucide-react';
import { useForm, useWatch } from 'react-hook-form';
import * as z from 'zod';
import { formatDateTime } from '@kit/shared/dates';
import { Tables } from '@kit/supabase/database';
import { Button } from '@kit/ui/button';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuTrigger,
} from '@kit/ui/dropdown-menu';
import { DataTable } from '@kit/ui/enhanced-data-table';
import { Form, FormControl, FormField, FormItem } from '@kit/ui/form';
import { Input } from '@kit/ui/input';
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectLabel,
SelectTrigger,
SelectValue,
} from '@kit/ui/select';
import { AdminDeleteAccountDialog } from './admin-delete-account-dialog';
import { AdminDeleteUserDialog } from './admin-delete-user-dialog';
import { AdminImpersonateUserDialog } from './admin-impersonate-user-dialog';
import { AdminResetPasswordDialog } from './admin-reset-password-dialog';
type Account = Tables<'accounts'>;
const FiltersSchema = z.object({
type: z.enum(['all', 'team', 'personal']),
query: z.string().optional(),
});
export function AdminAccountsTable(
props: React.PropsWithChildren<{
data: Account[];
pageCount: number;
pageSize: number;
page: number;
filters: {
type: 'all' | 'team' | 'personal';
query: string;
};
}>,
) {
return (
);
}
function AccountsTableFilters(props: {
filters: z.output;
}) {
const form = useForm({
resolver: zodResolver(FiltersSchema),
defaultValues: {
type: props.filters?.type ?? 'all',
query: props.filters?.query ?? '',
},
mode: 'onChange',
reValidateMode: 'onChange',
});
const router = useRouter();
const pathName = usePathname();
const onSubmit = ({ type, query }: z.output) => {
const params = new URLSearchParams({
account_type: type,
query: query ?? '',
});
const url = `${pathName}?${params.toString()}`;
router.push(url);
};
const type = useWatch({ control: form.control, name: 'type' });
const options = {
all: 'All Accounts',
team: 'Team',
personal: 'Personal',
};
return (
);
}
function getColumns(): ColumnDef[] {
return [
{
id: 'name',
header: 'Name',
cell: ({ row }) => {
return (
{row.original.name}
);
},
},
{
id: 'email',
header: 'Email',
accessorKey: 'email',
},
{
id: 'type',
header: 'Type',
cell: ({ row }) => {
return row.original.is_personal_account ? 'Personal' : 'Team';
},
},
{
id: 'created_at',
header: 'Created At',
cell: ({ row }) => {
return formatDateTime(row.original.created_at);
},
},
{
id: 'updated_at',
header: 'Updated At',
cell: ({ row }) => {
return formatDateTime(row.original.updated_at);
},
},
{
id: 'actions',
header: '',
cell: ({ row }) => ,
},
];
}
type ActiveDialog =
| 'reset-password'
| 'impersonate'
| 'delete-user'
| 'delete-account'
| null;
function ActionsCell({ account }: { account: Account }) {
const [activeDialog, setActiveDialog] = useState(null);
const isPersonalAccount = account.is_personal_account;
return (
}
/>
Actions
View
}
/>
{isPersonalAccount && (
<>
setActiveDialog('reset-password')}
>
Send Reset Password link
setActiveDialog('impersonate')}
>
Impersonate User
setActiveDialog('delete-user')}
>
Delete Personal Account
>
)}
{!isPersonalAccount && (
setActiveDialog('delete-account')}
>
Delete Team Account
)}
{isPersonalAccount && (
<>
!open && setActiveDialog(null)}
/>
!open && setActiveDialog(null)}
/>
!open && setActiveDialog(null)}
/>
>
)}
{!isPersonalAccount && (
!open && setActiveDialog(null)}
/>
)}
);
}