Skip to content

Commit c508e20

Browse files
committed
fix: filter views without id and use explicit typeof checks in useViewsAssignment
Filter out views with undefined id when setting state to prevent unstable React keys downstream. Replace !!id with typeof id === 'string' for explicit type narrowing that correctly handles edge cases. Signed-off-by: Lee Calcote <lee.calcote@layer5.io>
1 parent 0a67d9a commit c508e20

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

src/custom/Workspaces/hooks/useViewsAssignment.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,15 @@ const useViewAssignment = ({
6363
const [unassignviewFromWorkspace] = useUnassignViewFromWorkspaceMutation();
6464

6565
useEffect(() => {
66-
const viewsDataRtk = views?.views ? views.views : [];
67-
setviewsData((prevData) => [...prevData, ...viewsDataRtk]);
66+
const viewsDataRtk: MesheryViewWithLocation[] = views?.views ? views.views : [];
67+
const viewsWithId = viewsDataRtk.filter((view) => typeof view.id === 'string');
68+
setviewsData((prevData) => [...prevData, ...viewsWithId]);
6869
}, [views]);
6970

7071
useEffect(() => {
71-
const viewsOfWorkspaceDataRtk = viewsOfWorkspace?.views ? viewsOfWorkspace.views : [];
72-
setWorkspaceviewsData((prevData) => [...prevData, ...viewsOfWorkspaceDataRtk]);
72+
const viewsOfWorkspaceDataRtk: MesheryViewWithLocation[] = viewsOfWorkspace?.views ? viewsOfWorkspace.views : [];
73+
const viewsWithId = viewsOfWorkspaceDataRtk.filter((view) => typeof view.id === 'string');
74+
setWorkspaceviewsData((prevData) => [...prevData, ...viewsWithId]);
7375
}, [viewsOfWorkspace]);
7476

7577
const handleAssignviewModal = (e?: React.MouseEvent): void => {
@@ -99,8 +101,8 @@ const useViewAssignment = ({
99101
};
100102

101103
const getAddedAndRemovedviews = (allAssignedviews: MesheryViewWithLocation[]): AddedAndRemovedViews => {
102-
const originalviewsIds = workspaceviewsData.map((view) => view.id).filter((id): id is string => !!id);
103-
const updatedviewsIds = allAssignedviews.map((view) => view.id).filter((id): id is string => !!id);
104+
const originalviewsIds = workspaceviewsData.map((view) => view.id).filter((id): id is string => typeof id === 'string');
105+
const updatedviewsIds = allAssignedviews.map((view) => view.id).filter((id): id is string => typeof id === 'string');
104106

105107
const addedviewsIds = updatedviewsIds.filter((id) => !originalviewsIds.includes(id));
106108
const removedviewsIds = originalviewsIds.filter((id) => !updatedviewsIds.includes(id));

0 commit comments

Comments
 (0)