fix: harden automatic mobile boards

This commit is contained in:
ajnart committed 2026-07-28 21:28:53 +02:00
1 parent 7959c20d88
commit d0b9348b86
37 files changed
+619 -143

No files matched your search

+11
View File
@@ -30,6 +30,17 @@ describe("board layout selection", () => {
expect(getCurrentLayout(createBoard(), false, viewportWidth)).toBe(expectedLayoutId);
});
test("legacy mode falls back to the desktop layout before the client viewport is known", () => {
expect(getCurrentLayout(createBoard(), false, undefined)).toBe("large");
});
test("rejects boards without a layout", () => {
const board = { ...createBoard(), layouts: [] };
expect(() => getDesktopLayout(board)).toThrow("Board must have a layout");
expect(() => getCurrentLayout(board, false, 390)).toThrow("Board must have a layout");
});
test("keeps every saved layout available for reversible mutations", () => {
expect(getBoardLayouts(createBoard())).toEqual(["small", "medium", "large"]);
});
+11
View File
@@ -27,4 +27,15 @@ describe("requestBoardEditAction", () => {
void deferredAction?.();
expect(action).toHaveBeenCalledOnce();
});
test("reports rejected actions instead of creating an unhandled rejection", async () => {
const error = new Error("sign-out failed");
const reportError = vi.fn();
vi.stubGlobal("reportError", reportError);
requestBoardEditAction(() => Promise.reject(error));
await vi.waitFor(() => expect(reportError).toHaveBeenCalledWith(error));
vi.unstubAllGlobals();
});
});
+20 -2
View File
@@ -12,9 +12,27 @@ export type BoardEditActionResult = boolean | void;
export type BoardEditAction = () => BoardEditActionResult | Promise<BoardEditActionResult>;
export type BoardEditActionEvent = CustomEvent<{ action: BoardEditAction }>;
const reportBoardEditActionError = (error: unknown) => {
const reportError = (globalThis as { reportError?: (reportedError: unknown) => void }).reportError;
if (reportError) {
reportError(error);
return;
}
console.error("Board edit action failed", error);
};
const runBoardEditAction = (action: BoardEditAction) => {
try {
void Promise.resolve(action()).catch(reportBoardEditActionError);
} catch (error) {
reportBoardEditActionError(error);
}
};
export const requestBoardEditAction = (action: BoardEditAction) => {
if (typeof document === "undefined") {
void action();
runBoardEditAction(action);
return;
}
@@ -24,7 +42,7 @@ export const requestBoardEditAction = (action: BoardEditAction) => {
});
if (document.dispatchEvent(event)) {
void action();
runBoardEditAction(action);
}
};