import { ActionIcon, Box, Menu } from '@mantine/core'; import { useDisclosure } from '@mantine/hooks'; import { IconEdit, IconMenu, IconPassword, IconTrash } from '@tabler/icons-react'; import { useCallback, useMemo, useRef, useState } from 'react'; import { deleteAdmin, getAdmins } from '../apis/admin'; import { AdminModal, GrantNewPasswordModal } from '../components/admin'; import Table from '../lib/table/table'; import { IColumn, TRefTableFn } from '../lib/table/type'; import { useConfirmStore } from '../lib/zustand/use-confirm'; import { IAdmin } from '../system/type'; import { formatTime } from '../utils'; export default function Admins() { const { setConfirm } = useConfirmStore(); const refTableFn: TRefTableFn = useRef({}); const [adminModelOpened, adminModel] = useDisclosure(false); const [grantOpened, grantModel] = useDisclosure(false); const [clickData, setClickData] = useState(null); const columns: IColumn[] = [ { key: 'id', title: 'ID', typeFilter: 'number', }, { key: 'username', title: 'Username', typeFilter: 'text', }, { key: 'email', title: 'Email', typeFilter: 'text', }, { key: 'created_at', title: 'Created at', typeFilter: 'none', renderRow(row) { return {formatTime(row.created_at)}; }, }, { key: 'updated_at', title: 'Update at', typeFilter: 'none', renderRow(row) { return {formatTime(row.updated_at)}; }, }, ]; const handleDelete = (admin: IAdmin) => { setConfirm({ title: 'Delete ?', message: 'This admin will be delete', handleOk: async () => { await deleteAdmin(admin); if (refTableFn.current?.fetchData) { refTableFn.current.fetchData(); } }, }); }; const getAdminsFn = useCallback(getAdmins, []); const table = useMemo(() => { return ( { adminModel.open(); }, }, ], }} refTableFn={refTableFn} striped showLoading={true} highlightOnHover styleDefaultHead={{ justifyContent: 'flex-start', width: 'fit-content', }} options={{ query: getAdminsFn, pathToData: 'data.data', keyOptions: { last_page: 'lastPage', per_page: 'perPage', from: 'from', to: 'to', total: 'total', }, }} rows={[]} withColumnBorders showChooses={false} withTableBorder columns={columns} actions={{ title: Action, body: (row) => { return ( { setClickData(row); adminModel.open(); }} leftSection={} > Edit { setClickData(row); grantModel.open(); }} leftSection={} > Grant new password handleDelete(row)} leftSection={}> Delete ); }, }} rowKey="id" /> ); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( {table} { setClickData(null); adminModel.close(); }} /> { setClickData(null); grantModel.close(); }} /> ); }