Skip to content

Commit 2d5b2ab

Browse files
committed
[local-explorer-ui] Fixed adding default worker per review.
1 parent fe18dad commit 2d5b2ab

2 files changed

Lines changed: 79 additions & 3 deletions

File tree

packages/local-explorer-ui/src/__e2e__/worker-selector.spec.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,68 @@ describe("worker selector", () => {
179179
);
180180
});
181181

182+
test("keeps workerless Message-ID detail lookups unfiltered", async ({
183+
expect,
184+
}) => {
185+
const requestedWorkers: Array<string | null> = [];
186+
const requestedEmailIds: Array<string | null> = [];
187+
await page.route(EMAIL_ROUTING_DETAIL_ROUTE, async (route) => {
188+
const search = new URL(route.request().url()).searchParams;
189+
const emailId = search.get("email_id");
190+
if (emailId !== null) {
191+
requestedWorkers.push(search.get("worker"));
192+
requestedEmailIds.push(emailId);
193+
}
194+
await route.fulfill({
195+
contentType: "application/json",
196+
body: JSON.stringify({
197+
errors: [],
198+
messages: [],
199+
result:
200+
emailId === null
201+
? []
202+
: {
203+
attachments: [],
204+
events: [],
205+
forwards: [],
206+
from: "legacy@example.com",
207+
headers: {},
208+
messageId: emailId,
209+
outcome: "ok",
210+
raw: "Content-Type: text/plain\r\n\r\nLegacy body",
211+
rawSize: 11,
212+
receivedAt: "2026-09-11T00:00:00.000Z",
213+
replies: [],
214+
subject: "Legacy detail",
215+
text: "Legacy body",
216+
to: "recipient@example.com",
217+
worker: "worker-2",
218+
},
219+
result_info:
220+
emailId === null
221+
? { count: 0, has_more: false, per_page: 10 }
222+
: undefined,
223+
success: true,
224+
}),
225+
});
226+
});
227+
await loadWorkers(2);
228+
229+
const messageId = "<legacy@example.com>";
230+
await page.goto(
231+
new URL(
232+
`/cdn-cgi/local/explorer/email/routing/${encodeURIComponent(messageId)}?lookup=message-id`,
233+
viteUrl
234+
).toString()
235+
);
236+
237+
await page.getByText("Legacy detail").last().waitFor();
238+
expect(new URL(page.url()).searchParams.get("worker")).toBeNull();
239+
await expect.poll(() => requestedEmailIds.length).toBeGreaterThan(0);
240+
expect(requestedEmailIds.every((id) => id === messageId)).toBe(true);
241+
expect(requestedWorkers.every((worker) => worker === null)).toBe(true);
242+
});
243+
182244
test("discards stale email lists after switching workers", async ({
183245
expect,
184246
}) => {

packages/local-explorer-ui/src/routes/email.tsx

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ import { getSelectedWorker } from "../components/WorkerSelector";
1010

1111
export const Route = createFileRoute("/email")({
1212
component: EmailLayout,
13-
validateSearch: (search: Record<string, unknown>): { worker?: string } => ({
13+
validateSearch: (
14+
search: Record<string, unknown>
15+
): { lookup?: "message-id"; worker?: string } => ({
16+
lookup: search.lookup === "message-id" ? "message-id" : undefined,
1417
worker: typeof search.worker === "string" ? search.worker : undefined,
1518
}),
1619
});
@@ -52,7 +55,11 @@ function EmailLayout(): JSX.Element {
5255
// no longer visible, preserve the requested identity so the detail API can
5356
// report it as missing or unavailable instead of targeting the default Worker.
5457
if (routingDetailParams) {
55-
if (search.worker !== undefined || selectedWorker === "") {
58+
if (
59+
search.lookup === "message-id" ||
60+
search.worker !== undefined ||
61+
selectedWorker === ""
62+
) {
5663
return;
5764
}
5865
void navigate({
@@ -74,7 +81,14 @@ function EmailLayout(): JSX.Element {
7481
to: listRoute,
7582
});
7683
}
77-
}, [listRoute, navigate, routingDetailParams, search.worker, selectedWorker]);
84+
}, [
85+
listRoute,
86+
navigate,
87+
routingDetailParams,
88+
search.lookup,
89+
search.worker,
90+
selectedWorker,
91+
]);
7892

7993
return <Outlet />;
8094
}

0 commit comments

Comments
 (0)