import { useSetAtom } from 'jotai'; import { equals } from 'ramda'; import { useCallback, useRef } from 'react'; import PageSkeleton from '../../PageSkeleton'; import { DataTable } from '../DataTable'; import { PageHeader } from '../Header'; import { PageLayout } from '../Layout'; import { canDeleteSubItemsAtom, formLabelButtonsAtom, openFormModalAtom } from './atoms'; import DeleteModal from './DeleteModal'; import AddModal from './Form/AddModal'; import UpdateModal from './Form/UpdateModal'; import { useGetItems } from './hooks/useGetItems'; import Listing from './Listing'; import type { CrudPageRootProps } from './models'; export const CrudPageRoot = < TData extends { id: number; name: string }, TFilters, TItem extends { id: number; name: string }, TItemForm >({ labels, decoder, queryKeyName, filtersAtom, getSearchParameters, baseEndpoint, columns, subItems, filters, deleteItem, form }: CrudPageRootProps): JSX.Element => { const previousCanDeleteSubItemRef = useRef(undefined); const previousFormLabelButtonsRef = useRef(null); const { isDataEmpty, hasItems, isLoading, items, total } = useGetItems< TData, TFilters >({ baseEndpoint, decoder, filtersAtom, getSearchParameters, queryKeyName }); const setOpenFormModal = useSetAtom(openFormModalAtom); const setCanDeleteSubItem = useSetAtom(canDeleteSubItemsAtom); const setFormLabelButton = useSetAtom(formLabelButtonsAtom); if ( !equals(previousCanDeleteSubItemRef.current, subItems?.canDeleteSubItems) ) { setCanDeleteSubItem(subItems?.canDeleteSubItems ?? true); previousCanDeleteSubItemRef.current = subItems?.canDeleteSubItems; } if (!equals(previousFormLabelButtonsRef.current, form.labels)) { setFormLabelButton({ add: { cancel: form.labels.add.cancel, confirm: form.labels.add.confirm }, update: { cancel: form.labels.update.cancel, confirm: form.labels.update.confirm } }); previousFormLabelButtonsRef.current = form.labels; } const add = useCallback(() => setOpenFormModal('add'), [setOpenFormModal]); if (isLoading && !hasItems) { return ; } return (
{isDataEmpty && !isLoading ? ( ) : ( )} deleteEndpoint={deleteItem.deleteEndpoint} labels={deleteItem.labels} listingQueryKey={queryKeyName} modalSize={deleteItem.modalSize} /> Form={form.Form} modalSize={form.modalSize} title={form.labels.update.title} {...form.getItem} />
); };