Skip to content

Commit a2c111e

Browse files
committed
feat: add useDesignAssignment hook for managing design assignments in workspaces
Signed-off-by: Amit Amrutiya <amitamrutiya2210@gmail.com>
1 parent 37933af commit a2c111e

1 file changed

Lines changed: 150 additions & 0 deletions

File tree

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
/* eslint-disable @typescript-eslint/no-explicit-any */
2+
import { useEffect, useState } from 'react';
3+
import { Pattern } from '../../CustomCatalog/CustomCard';
4+
import { withDefaultPageArgs } from '../../PerformersSection/PerformersSection';
5+
import { AssignmentHookResult } from '../types';
6+
7+
interface AddedAndRemovedDesigns {
8+
addedDesignsIds: string[];
9+
removedDesignsIds: string[];
10+
}
11+
12+
interface useDesignAssignmentProps {
13+
workspaceId: string;
14+
useGetDesignsOfWorkspaceQuery: any;
15+
useAssignDesignToWorkspaceMutation: any;
16+
useUnassignDesignFromWorkspaceMutation: any;
17+
}
18+
19+
const useDesignAssignment = ({
20+
workspaceId,
21+
useGetDesignsOfWorkspaceQuery,
22+
useAssignDesignToWorkspaceMutation,
23+
useUnassignDesignFromWorkspaceMutation
24+
}: useDesignAssignmentProps): AssignmentHookResult<Pattern> => {
25+
const [designsPage, setDesignsPage] = useState<number>(0);
26+
const [designsData, setDesignsData] = useState<Pattern[]>([]);
27+
const designsPageSize = 25;
28+
const [designsOfWorkspacePage, setDesignsOfWorkspacePage] = useState<number>(0);
29+
const [workspaceDesignsData, setWorkspaceDesignsData] = useState<Pattern[]>([]);
30+
const [assignDesignModal, setAssignDesignModal] = useState<boolean>(false);
31+
const [skipDesigns, setSkipDesigns] = useState<boolean>(true);
32+
const [disableTransferButton, setDisableTransferButton] = useState<boolean>(true);
33+
const [assignedDesigns, setAssignedDesigns] = useState<Pattern[]>([]);
34+
35+
const { data: designs } = useGetDesignsOfWorkspaceQuery(
36+
withDefaultPageArgs({
37+
workspaceId,
38+
page: designsPage,
39+
pagesize: designsPageSize,
40+
filter: '{"assigned":false}'
41+
}),
42+
{
43+
skip: skipDesigns
44+
}
45+
);
46+
47+
const { data: designsOfWorkspace } = useGetDesignsOfWorkspaceQuery(
48+
withDefaultPageArgs({
49+
workspaceId,
50+
page: designsOfWorkspacePage,
51+
pagesize: designsPageSize
52+
}),
53+
{
54+
skip: skipDesigns
55+
}
56+
);
57+
58+
const [assignDesignToWorkspace] = useAssignDesignToWorkspaceMutation();
59+
const [unassignDesignFromWorkspace] = useUnassignDesignFromWorkspaceMutation();
60+
61+
useEffect(() => {
62+
const designsDataRtk = designs?.designs ? designs.designs : [];
63+
setDesignsData((prevData) => [...prevData, ...designsDataRtk]);
64+
}, [designs]);
65+
66+
useEffect(() => {
67+
const designsOfWorkspaceDataRtk = designsOfWorkspace?.designs ? designsOfWorkspace.designs : [];
68+
setWorkspaceDesignsData((prevData) => [...prevData, ...designsOfWorkspaceDataRtk]);
69+
}, [designsOfWorkspace]);
70+
71+
const handleAssignDesignModal = (e?: React.MouseEvent): void => {
72+
e?.stopPropagation();
73+
setAssignDesignModal(true);
74+
setSkipDesigns(false);
75+
};
76+
77+
const handleAssignDesignModalClose = (e?: React.MouseEvent): void => {
78+
e?.stopPropagation();
79+
setAssignDesignModal(false);
80+
setSkipDesigns(true);
81+
};
82+
83+
const handleAssignablePageDesign = (): void => {
84+
const pagesCount = Math.ceil(Number(designs?.total_count) / designsPageSize);
85+
if (designsPage < pagesCount - 1) {
86+
setDesignsPage((prevDesignsPage) => prevDesignsPage + 1);
87+
}
88+
};
89+
90+
const handleAssignedPageDesign = (): void => {
91+
const pagesCount = Math.ceil(Number(designsOfWorkspace?.total_count) / designsPageSize);
92+
if (designsOfWorkspacePage < pagesCount - 1) {
93+
setDesignsOfWorkspacePage((prevPage) => prevPage + 1);
94+
}
95+
};
96+
97+
const getAddedAndRemovedDesigns = (allAssignedDesigns: Pattern[]): AddedAndRemovedDesigns => {
98+
const originalDesignsIds = workspaceDesignsData.map((design) => design.id);
99+
const updatedDesignsIds = allAssignedDesigns.map((design) => design.id);
100+
101+
const addedDesignsIds = updatedDesignsIds.filter((id) => !originalDesignsIds.includes(id));
102+
const removedDesignsIds = originalDesignsIds.filter((id) => !updatedDesignsIds.includes(id));
103+
104+
return { addedDesignsIds, removedDesignsIds };
105+
};
106+
107+
const handleAssignDesigns = async (): Promise<void> => {
108+
const { addedDesignsIds, removedDesignsIds } = getAddedAndRemovedDesigns(assignedDesigns);
109+
110+
for (const id of addedDesignsIds) {
111+
await assignDesignToWorkspace({
112+
workspaceId,
113+
designId: id
114+
}).unwrap();
115+
}
116+
117+
for (const id of removedDesignsIds) {
118+
await unassignDesignFromWorkspace({
119+
workspaceId,
120+
designId: id
121+
}).unwrap();
122+
}
123+
124+
setDesignsData([]);
125+
setWorkspaceDesignsData([]);
126+
handleAssignDesignModalClose();
127+
};
128+
129+
const handleAssignDesignsData = (updatedAssignedData: Pattern[]): void => {
130+
const { addedDesignsIds, removedDesignsIds } = getAddedAndRemovedDesigns(updatedAssignedData);
131+
setDisableTransferButton(!(addedDesignsIds.length > 0 || removedDesignsIds.length > 0));
132+
setAssignedDesigns(updatedAssignedData);
133+
};
134+
135+
return {
136+
data: designsData,
137+
workspaceData: workspaceDesignsData,
138+
assignModal: assignDesignModal,
139+
handleAssignModal: handleAssignDesignModal,
140+
handleAssignModalClose: handleAssignDesignModalClose,
141+
handleAssignablePage: handleAssignablePageDesign,
142+
handleAssignedPage: handleAssignedPageDesign,
143+
handleAssign: handleAssignDesigns,
144+
handleAssignData: handleAssignDesignsData,
145+
disableTransferButton,
146+
assignedItems: assignedDesigns
147+
};
148+
};
149+
150+
export default useDesignAssignment;

0 commit comments

Comments
 (0)