"use client" import React from "react" import DashboardPage from "@/base/components/layout/dashboard/dashboard-page" import type { DashboardHeaderProps } from "@/base/components/layout/dashboard" import { Card, CardContent } from "@/shared/components/ui/card" import { DataTable, type ActionsColumnOptions } from "@/shared/data-view/table-view" import { useResourcePage, type UseResourcePageOptions, type ResourceItem, type ResourcePageClient } from "./use-resource-page" import type { ColumnDef } from "@tanstack/react-table" export type ResourceFormProps = { resourceId: string | null initialData: ResourceItem | null onSuccess: () => void } export type ResourcePageHeaderHelpers = { selectedItem: ResourceItem | null invalidateQuery: () => void } export type ResourcePageColumnHelpers = { actionsColumn: (options?: Partial>>) => ColumnDef, unknown> openEdit: (row: ResourceItem) => void deleteItem: (id: string) => Promise } export type ResourcePageContext = { selectedItem: ResourceItem | null isDialogOpen: boolean dialogResourceId: string | null isLoading: boolean data: ResourceItem[] openCreate: () => void openEdit: (row: ResourceItem) => void closeDialog: () => void deleteItem: (id: string) => Promise invalidateQuery: () => void } type ReactNodeOrRender = | React.ReactNode | ((context: ResourcePageContext) => React.ReactNode) export type ResourcePageProps = UseResourcePageOptions & { columns: ColumnDef>[] | ((helpers: ResourcePageColumnHelpers) => ColumnDef>[]) headerProps?: DashboardHeaderProps | ((helpers: ResourcePageHeaderHelpers) => DashboardHeaderProps) header?: ReactNodeOrRender | null pageTitle?: string paramKey?: string onRowClick?: (row: ResourceItem) => void toolbar?: ReactNodeOrRender } export function ResourcePage({ columns: columnsProp, headerProps: headerPropsProp, header, pageTitle, routeKey, getClient, queryOptions, paramKey, onRowClick, toolbar, extraParams, }: ResourcePageProps) { type TItem = ResourceItem const page = useResourcePage({ routeKey, getClient, queryOptions, paramKey, extraParams }) const columns = typeof columnsProp === "function" ? columnsProp({ actionsColumn: page.actionsColumn, openEdit: page.openEdit, deleteItem: page.deleteItem, }) : columnsProp type ListResponse = { data?: TItem[] } const responseData = page.data as ListResponse | undefined const items = (responseData?.data ?? []) as TItem[] const context: ResourcePageContext = { selectedItem: page.selectedItem, isDialogOpen: page.isDialogOpen, dialogResourceId: page.dialogResourceId, isLoading: page.isLoading, data: items, openCreate: page.openCreate, openEdit: page.openEdit, closeDialog: page.closeDialog, deleteItem: page.deleteItem, invalidateQuery: () => page.invalidateQuery(), } const resolvedHeaderProps = typeof headerPropsProp === "function" ? headerPropsProp({ selectedItem: page.selectedItem, invalidateQuery: () => page.invalidateQuery(), }) : headerPropsProp const resolvedHeader = typeof header === "function" ? header(context) : header const resolvedToolbar = typeof toolbar === "function" ? toolbar(context) : toolbar return ( ) }