import { Button } from '@affine/admin/components/ui/button'; import { Input } from '@affine/admin/components/ui/input'; import { useQuery } from '@affine/admin/use-query'; import { getUserByEmailQuery } from '@affine/graphql'; import { ExportIcon, ImportIcon, PlusIcon } from '@blocksuite/icons/rc'; import type { Table } from '@tanstack/react-table'; import { type SetStateAction, startTransition, useCallback, useEffect, useMemo, useState, } from 'react'; import { useRightPanel } from '../../panel/context'; import type { UserType } from '../schema'; import { DiscardChanges } from './discard-changes'; import { ExportUsersDialog } from './export-users-dialog'; import { ImportUsersDialog } from './import-users-dialog'; import { CreateUserForm } from './user-form'; interface DataTableToolbarProps { data: TData[]; setDataTable: (data: TData[]) => void; selectedUsers: UserType[]; table?: Table; } const useSearch = () => { const [value, setValue] = useState(''); const { data } = useQuery({ query: getUserByEmailQuery, variables: { email: value }, }); const result = useMemo(() => data?.userByEmail, [data]); return { result, query: setValue, }; }; function useDebouncedValue(value: T, delay: number): T { const [debouncedValue, setDebouncedValue] = useState(value); useEffect(() => { const handler = setTimeout(() => { setDebouncedValue(value); }, delay); return () => { clearTimeout(handler); }; }, [value, delay]); return debouncedValue; } export function DataTableToolbar({ data, selectedUsers, setDataTable, table, }: DataTableToolbarProps) { const [value, setValue] = useState(''); const [dialogOpen, setDialogOpen] = useState(false); const [exportDialogOpen, setExportDialogOpen] = useState(false); const [importDialogOpen, setImportDialogOpen] = useState(false); const debouncedValue = useDebouncedValue(value, 1000); const { setPanelContent, openPanel, closePanel, isOpen } = useRightPanel(); const { result, query } = useSearch(); const handleConfirm = useCallback(() => { setPanelContent(); if (dialogOpen) { setDialogOpen(false); } if (!isOpen) { openPanel(); } }, [setPanelContent, closePanel, dialogOpen, isOpen, openPanel]); useEffect(() => { query(debouncedValue); }, [debouncedValue, query]); useEffect(() => { startTransition(() => { if (!debouncedValue) { setDataTable(data); } else if (result) { setDataTable([result as TData]); } else { setDataTable([]); } }); }, [data, debouncedValue, result, setDataTable]); const onValueChange = useCallback( (e: { currentTarget: { value: SetStateAction } }) => { setValue(e.currentTarget.value); }, [] ); const handleCancel = useCallback(() => { setDialogOpen(false); }, []); const handleOpenConfirm = useCallback(() => { if (isOpen) { return setDialogOpen(true); } return handleConfirm(); }, [handleConfirm, isOpen]); const handleExportUsers = useCallback(() => { if (!table) return; const selectedRows = table.getFilteredSelectedRowModel().rows; if (selectedRows.length === 0) { alert('Please select at least one user to export'); return; } setExportDialogOpen(true); }, [table]); const handleImportUsers = useCallback(() => { setImportDialogOpen(true); }, []); return (
{table && ( )}
); }