gitscope
https://dev.kronoz.win/r/marzneshin.git
dashboard/src/libs/entity-table/hooks/use-sidebar-entity-table.ts · v0.7.4
Source
1 4cebd65 Mardin 2y ago import { useMemo } from "react";
2 4cebd65 Mardin 2y ago import { useTranslation } from "react-i18next";
3 4cebd65 Mardin 2y ago import { useQuery } from "@tanstack/react-query";
4 4cebd65 Mardin 2y ago import {
5 65bbe9d Mardin 2y ago usePrimaryFiltering,
6 4cebd65 Mardin 2y ago usePagination,
7 4cebd65 Mardin 2y ago useEntityTable,
8 4cebd65 Mardin 2y ago useVisibility,
9 4cebd65 Mardin 2y ago useSorting,
10 65bbe9d Mardin 2y ago useFilters,
11 4cebd65 Mardin 2y ago type EntitySidebarQueryKeyType,
12 4cebd65 Mardin 2y ago type FetchEntityReturn,
13 4cebd65 Mardin 2y ago type SidebarQueryKey,
14 4cebd65 Mardin 2y ago type UseRowSelectionReturn
15 4cebd65 Mardin 2y ago } from ".";
16 d636f3f Dawsh 2y ago import { useScreenBreakpoint } from "@marzneshin/common/hooks";
17 4cebd65 Mardin 2y ago import {
18 4cebd65 Mardin 2y ago type SidebarEntityCardSectionsProps
19 7389ad0 Mardin 2y ago } from "@marzneshin/libs/entity-table/components";
20 4cebd65 Mardin 2y ago
21 4cebd65 Mardin 2y ago interface UseSidebarEntityTableParams<T, S> {
22 4cebd65 Mardin 2y ago fetchEntity: ({ queryKey }: EntitySidebarQueryKeyType) => FetchEntityReturn<T>;
23 4cebd65 Mardin 2y ago sidebarEntities: S[];
24 4cebd65 Mardin 2y ago setSidebarEntityId: (entity: string | undefined) => void;
25 4cebd65 Mardin 2y ago sidebarEntityId?: string;
26 4cebd65 Mardin 2y ago sidebarCardProps: SidebarEntityCardSectionsProps<S>;
27 4cebd65 Mardin 2y ago secondaryEntityKey: string;
28 4cebd65 Mardin 2y ago columnsFn: any;
29 4cebd65 Mardin 2y ago filteredColumn: string;
30 4cebd65 Mardin 2y ago entityKey: string;
31 4cebd65 Mardin 2y ago rowSelection?: UseRowSelectionReturn;
32 4cebd65 Mardin 2y ago manualSorting?: boolean;
33 4cebd65 Mardin 2y ago onCreate: () => void;
34 4cebd65 Mardin 2y ago onEdit: (entity: T) => void;
35 4cebd65 Mardin 2y ago onOpen: (entity: T) => void;
36 4cebd65 Mardin 2y ago onDelete: (entity: T) => void;
37 4cebd65 Mardin 2y ago }
38 4cebd65 Mardin 2y ago
39 4cebd65 Mardin 2y ago export const useSidebarEntityTable = <T, S>({
40 4cebd65 Mardin 2y ago fetchEntity,
41 4cebd65 Mardin 2y ago columnsFn,
42 4cebd65 Mardin 2y ago filteredColumn,
43 4cebd65 Mardin 2y ago rowSelection,
44 4cebd65 Mardin 2y ago entityKey,
45 4cebd65 Mardin 2y ago onCreate,
46 4cebd65 Mardin 2y ago onEdit,
47 4cebd65 Mardin 2y ago onOpen,
48 4cebd65 Mardin 2y ago onDelete,
49 4cebd65 Mardin 2y ago sidebarEntityId,
50 4cebd65 Mardin 2y ago setSidebarEntityId,
51 4cebd65 Mardin 2y ago sidebarEntities,
52 4cebd65 Mardin 2y ago sidebarCardProps,
53 4cebd65 Mardin 2y ago secondaryEntityKey,
54 4cebd65 Mardin 2y ago }: UseSidebarEntityTableParams<T, S>) => {
55 4cebd65 Mardin 2y ago const { t } = useTranslation();
56 65bbe9d Mardin 2y ago const primaryFilter = usePrimaryFiltering({ column: filteredColumn });
57 65bbe9d Mardin 2y ago const filters = useFilters();
58 4cebd65 Mardin 2y ago const sorting = useSorting();
59 4cebd65 Mardin 2y ago const visibility = useVisibility();
60 4cebd65 Mardin 2y ago const desktop = useScreenBreakpoint("md");
61 8b82d79 Mardin 1y ago const { onPaginationChange, pageIndex, pageSize } = usePagination({entityKey});
62 4cebd65 Mardin 2y ago
63 4cebd65 Mardin 2y ago const query: SidebarQueryKey = [
64 4cebd65 Mardin 2y ago entityKey,
65 4cebd65 Mardin 2y ago sidebarEntityId,
66 4cebd65 Mardin 2y ago secondaryEntityKey,
67 65bbe9d Mardin 2y ago {
68 65bbe9d Mardin 2y ago page: pageIndex,
69 65bbe9d Mardin 2y ago size: pageSize,
70 65bbe9d Mardin 2y ago },
71 65bbe9d Mardin 2y ago primaryFilter.columnFilters,
72 65bbe9d Mardin 2y ago {
73 65bbe9d Mardin 2y ago sortBy: sorting.sorting[0]?.id ? sorting.sorting[0].id : "created_at",
74 65bbe9d Mardin 2y ago desc: sorting.sorting[0]?.desc
75 65bbe9d Mardin 2y ago },
76 65bbe9d Mardin 2y ago { filters: filters.columnsFilter }
77 4cebd65 Mardin 2y ago ];
78 4cebd65 Mardin 2y ago
79 4cebd65 Mardin 2y ago const { data, isFetching } = useQuery({
80 4cebd65 Mardin 2y ago queryFn: fetchEntity,
81 65bbe9d Mardin 2y ago queryKey: query,
82 7738ec1 Mardin 2y ago initialData: { entities: [], pageCount: 1 },
83 4cebd65 Mardin 2y ago });
84 4cebd65 Mardin 2y ago
85 4cebd65 Mardin 2y ago const columns = columnsFn({ onEdit, onDelete, onOpen });
86 4cebd65 Mardin 2y ago const table = useEntityTable({
87 4cebd65 Mardin 2y ago data,
88 4cebd65 Mardin 2y ago columns,
89 4cebd65 Mardin 2y ago pageSize,
90 4cebd65 Mardin 2y ago pageIndex,
91 4cebd65 Mardin 2y ago rowSelection,
92 4cebd65 Mardin 2y ago visibility,
93 4cebd65 Mardin 2y ago sorting,
94 4cebd65 Mardin 2y ago onPaginationChange,
95 4cebd65 Mardin 2y ago });
96 4cebd65 Mardin 2y ago
97 4cebd65 Mardin 2y ago const entityTableContextValue = useMemo(
98 8b82d79 Mardin 1y ago () => ({ entityKey, table, data: data.entities, primaryFilter, filters, isLoading: isFetching }),
99 8b82d79 Mardin 1y ago [entityKey, table, data.entities, filters, primaryFilter, isFetching],
100 4cebd65 Mardin 2y ago );
101 4cebd65 Mardin 2y ago
102 4cebd65 Mardin 2y ago const sidebarEntityTableContextValue = useMemo(
103 4cebd65 Mardin 2y ago () => ({
104 4cebd65 Mardin 2y ago sidebarEntities,
105 4cebd65 Mardin 2y ago setSidebarEntityId,
106 4cebd65 Mardin 2y ago sidebarEntityId,
107 4cebd65 Mardin 2y ago sidebarCardProps
108 4cebd65 Mardin 2y ago }),
109 4cebd65 Mardin 2y ago [sidebarEntities, setSidebarEntityId, sidebarEntityId, sidebarCardProps],
110 4cebd65 Mardin 2y ago );
111 4cebd65 Mardin 2y ago
112 4cebd65 Mardin 2y ago return {
113 4cebd65 Mardin 2y ago t,
114 4cebd65 Mardin 2y ago desktop,
115 4cebd65 Mardin 2y ago table,
116 4cebd65 Mardin 2y ago entityTableContextValue,
117 4cebd65 Mardin 2y ago sidebarEntityTableContextValue,
118 4cebd65 Mardin 2y ago columns,
119 4cebd65 Mardin 2y ago onCreate
120 4cebd65 Mardin 2y ago };
121 4cebd65 Mardin 2y ago };