gitscope
https://dev.kronoz.win/r/marzneshin.git
dashboard/src/features/entity-table/hooks/use-sidebar-entity-table.ts · v0.5.3
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 4cebd65 Mardin 2y ago useFiltering,
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 4cebd65 Mardin 2y ago type SortableSidebarQueryKey,
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 4cebd65 Mardin 2y ago import { useScreenBreakpoint } from "@marzneshin/hooks";
17 4cebd65 Mardin 2y ago import {
18 4cebd65 Mardin 2y ago type SidebarEntityCardSectionsProps
19 4cebd65 Mardin 2y ago } from "@marzneshin/features/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 manualSorting = false,
46 4cebd65 Mardin 2y ago onCreate,
47 4cebd65 Mardin 2y ago onEdit,
48 4cebd65 Mardin 2y ago onOpen,
49 4cebd65 Mardin 2y ago onDelete,
50 4cebd65 Mardin 2y ago sidebarEntityId,
51 4cebd65 Mardin 2y ago setSidebarEntityId,
52 4cebd65 Mardin 2y ago sidebarEntities,
53 4cebd65 Mardin 2y ago sidebarCardProps,
54 4cebd65 Mardin 2y ago secondaryEntityKey,
55 4cebd65 Mardin 2y ago }: UseSidebarEntityTableParams<T, S>) => {
56 4cebd65 Mardin 2y ago const { t } = useTranslation();
57 4cebd65 Mardin 2y ago const filtering = useFiltering({ column: filteredColumn });
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 4cebd65 Mardin 2y ago const { onPaginationChange, pageIndex, pageSize } = usePagination();
62 4cebd65 Mardin 2y ago
63 4cebd65 Mardin 2y ago const sortedQuery: SortableSidebarQueryKey = [
64 4cebd65 Mardin 2y ago entityKey,
65 4cebd65 Mardin 2y ago sidebarEntityId,
66 4cebd65 Mardin 2y ago secondaryEntityKey,
67 4cebd65 Mardin 2y ago pageIndex,
68 4cebd65 Mardin 2y ago pageSize,
69 4cebd65 Mardin 2y ago filtering.columnFilters,
70 4cebd65 Mardin 2y ago sorting.sorting[0]?.id ? sorting.sorting[0].id : "created_at",
71 4cebd65 Mardin 2y ago sorting.sorting[0]?.desc,
72 4cebd65 Mardin 2y ago ];
73 4cebd65 Mardin 2y ago
74 4cebd65 Mardin 2y ago const query: SidebarQueryKey = [
75 4cebd65 Mardin 2y ago entityKey,
76 4cebd65 Mardin 2y ago sidebarEntityId,
77 4cebd65 Mardin 2y ago secondaryEntityKey,
78 4cebd65 Mardin 2y ago pageIndex,
79 4cebd65 Mardin 2y ago pageSize,
80 4cebd65 Mardin 2y ago filtering.columnFilters,
81 4cebd65 Mardin 2y ago ];
82 4cebd65 Mardin 2y ago
83 4cebd65 Mardin 2y ago const { data, isFetching } = useQuery({
84 4cebd65 Mardin 2y ago queryFn: fetchEntity,
85 4cebd65 Mardin 2y ago queryKey: manualSorting ? sortedQuery : query,
86 4cebd65 Mardin 2y ago initialData: { entity: [], pageCount: 1 },
87 4cebd65 Mardin 2y ago });
88 4cebd65 Mardin 2y ago
89 4cebd65 Mardin 2y ago const columns = columnsFn({ onEdit, onDelete, onOpen });
90 4cebd65 Mardin 2y ago const table = useEntityTable({
91 4cebd65 Mardin 2y ago data,
92 4cebd65 Mardin 2y ago columns,
93 4cebd65 Mardin 2y ago pageSize,
94 4cebd65 Mardin 2y ago pageIndex,
95 4cebd65 Mardin 2y ago rowSelection,
96 4cebd65 Mardin 2y ago visibility,
97 4cebd65 Mardin 2y ago sorting,
98 4cebd65 Mardin 2y ago onPaginationChange,
99 4cebd65 Mardin 2y ago });
100 4cebd65 Mardin 2y ago
101 4cebd65 Mardin 2y ago const entityTableContextValue = useMemo(
102 4cebd65 Mardin 2y ago () => ({
103 4cebd65 Mardin 2y ago table,
104 4cebd65 Mardin 2y ago data: data.entity,
105 4cebd65 Mardin 2y ago filtering,
106 4cebd65 Mardin 2y ago isLoading: isFetching,
107 4cebd65 Mardin 2y ago }),
108 4cebd65 Mardin 2y ago [table, data.entity, filtering, isFetching],
109 4cebd65 Mardin 2y ago );
110 4cebd65 Mardin 2y ago
111 4cebd65 Mardin 2y ago const sidebarEntityTableContextValue = useMemo(
112 4cebd65 Mardin 2y ago () => ({
113 4cebd65 Mardin 2y ago sidebarEntities,
114 4cebd65 Mardin 2y ago setSidebarEntityId,
115 4cebd65 Mardin 2y ago sidebarEntityId,
116 4cebd65 Mardin 2y ago sidebarCardProps
117 4cebd65 Mardin 2y ago }),
118 4cebd65 Mardin 2y ago [sidebarEntities, setSidebarEntityId, sidebarEntityId, sidebarCardProps],
119 4cebd65 Mardin 2y ago );
120 4cebd65 Mardin 2y ago
121 4cebd65 Mardin 2y ago return {
122 4cebd65 Mardin 2y ago t,
123 4cebd65 Mardin 2y ago desktop,
124 4cebd65 Mardin 2y ago table,
125 4cebd65 Mardin 2y ago entityTableContextValue,
126 4cebd65 Mardin 2y ago sidebarEntityTableContextValue,
127 4cebd65 Mardin 2y ago columns,
128 4cebd65 Mardin 2y ago onCreate
129 4cebd65 Mardin 2y ago };
130 4cebd65 Mardin 2y ago };