Skip to content

Commit 2d8ea78

Browse files
committed
Fix cascade delete bug in UI
1 parent 10f96e9 commit 2d8ea78

6 files changed

Lines changed: 62 additions & 425 deletions

File tree

frontend/app/inspections/[id]/page.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,7 @@ const InspectionDetailPage = () => {
168168
</button>
169169
<button
170170
onClick={() => router.push("/inspections")}
171-
className="text-sm text-gray-500 hover:text-gray-700"
172-
>
173-
View all inspections
174-
</button>
171+
className="text-sm text-gray-500 hover:text-gray-700"></button>
175172
</div>
176173
{inspection && (
177174
<h1 className="text-2xl font-bold">

frontend/context/InspectionsContext.tsx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import React, { createContext, useContext, useEffect, useMemo, useState } from "react";
44
import { Inspection } from "@/types/inspection";
55
import { apiUrl, authHeaders } from "@/lib/api";
6+
import {
7+
TRANSFORMER_REMOVED_EVENT,
8+
TransformerRemovedDetail,
9+
} from "@/lib/events";
610

711
const parseMaybeJson = (value: unknown): unknown => {
812
if (typeof value !== "string") return value;
@@ -144,6 +148,31 @@ export function InspectionsProvider({ children }: { children: React.ReactNode })
144148

145149
// Do not refetch on route change to avoid unnecessary reloads
146150

151+
useEffect(() => {
152+
if (typeof window === "undefined") return;
153+
const onTransformerRemoved = (event: Event) => {
154+
const detail = (event as CustomEvent<TransformerRemovedDetail>).detail;
155+
if (!detail) return;
156+
const removedId = detail.id ?? undefined;
157+
const removedNumber = detail.transformerNumber ?? undefined;
158+
if (!removedId && !removedNumber) return;
159+
setInspections((prev) =>
160+
prev.filter((inspection) => {
161+
const nestedTransformer = (inspection as unknown as { transformer?: { id?: string | null; transformerNumber?: string | null } }).transformer;
162+
const matchesId = removedId && ((inspection as unknown as { transformerId?: string | null }).transformerId === removedId || nestedTransformer?.id === removedId);
163+
const matchesNumber =
164+
removedNumber &&
165+
((inspection.transformerNumber && inspection.transformerNumber === removedNumber) || nestedTransformer?.transformerNumber === removedNumber);
166+
return !(matchesId || matchesNumber);
167+
})
168+
);
169+
};
170+
window.addEventListener(TRANSFORMER_REMOVED_EVENT, onTransformerRemoved as EventListener);
171+
return () => {
172+
window.removeEventListener(TRANSFORMER_REMOVED_EVENT, onTransformerRemoved as EventListener);
173+
};
174+
}, []);
175+
147176
const fetchInspectionById = async (id: string): Promise<Inspection | null> => {
148177
try {
149178
const res = await fetch(`/api/inspections/${id}`, {

frontend/context/TransformersContext.tsx

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import React, { createContext, useContext, useEffect, useMemo, useState } from "react";
44
import { Transformer } from "@/types/transformer";
55
import { apiUrl, authHeaders } from "@/lib/api";
6+
import { dispatchTransformerRemoved } from "@/lib/events";
67

78
type TransformersContextValue = {
89
transformers: Transformer[];
@@ -176,9 +177,14 @@ export function TransformersProvider({ children }: { children: React.ReactNode }
176177
};
177178

178179
const deleteTransformer = async (index: number) => {
179-
const id = transformers[index]?.id;
180+
const transformer = transformers[index];
181+
if (!transformer) return;
182+
const id = transformer.id ?? null;
183+
const transformerNumber = transformer.transformerNumber ?? null;
184+
180185
if (!id) {
181186
setTransformers((prev) => prev.filter((_, i) => i !== index));
187+
dispatchTransformerRemoved({ id, transformerNumber });
182188
return;
183189
}
184190
const res = await fetch(apiUrl(`/api/transformers/${id}`), {
@@ -193,7 +199,17 @@ export function TransformersProvider({ children }: { children: React.ReactNode }
193199
return;
194200
}
195201
setLastError(null);
196-
setTransformers((prev) => prev.filter((item) => item.id !== id));
202+
setTransformers((prev) =>
203+
prev.filter((item) => {
204+
if (id) {
205+
if (item.id) return item.id !== id;
206+
// Fallback to transformerNumber if id is missing locally
207+
return item.transformerNumber !== transformerNumber;
208+
}
209+
return item.transformerNumber !== transformerNumber;
210+
})
211+
);
212+
dispatchTransformerRemoved({ id, transformerNumber });
197213
};
198214

199215
const value = useMemo(

frontend/lib/events.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export const TRANSFORMER_REMOVED_EVENT = "transformer:removed" as const;
2+
3+
export type TransformerRemovedDetail = {
4+
id?: string | null;
5+
transformerNumber?: string | null;
6+
};
7+
8+
export const dispatchTransformerRemoved = (detail: TransformerRemovedDetail) => {
9+
if (typeof window === "undefined") return;
10+
window.dispatchEvent(new CustomEvent(TRANSFORMER_REMOVED_EVENT, { detail }));
11+
};

0 commit comments

Comments
 (0)