Refresh settings page in realtime

This commit is contained in:
kris
2026-04-07 18:43:26 +08:00
parent 07ecce3d0d
commit d1e5a1ac5e
7 changed files with 204 additions and 1 deletions

View File

@@ -0,0 +1,18 @@
import test from "node:test";
import assert from "node:assert/strict";
import { readFile } from "node:fs/promises";
test("settings page refreshes when user settings change", async () => {
const source = await readFile(
new URL("../src/app/me/settings/page.tsx", import.meta.url),
"utf8",
);
assert.match(source, /import \{ RealtimeRefresh \}/, "expected settings page to import RealtimeRefresh");
assert.match(source, /<RealtimeRefresh/, "expected settings page to render RealtimeRefresh");
assert.match(
source,
/events=\{\["settings\.updated"\]\}/,
"expected settings page to refresh on settings.updated",
);
});

View File

@@ -0,0 +1,62 @@
import test from "node:test";
import assert from "node:assert/strict";
import os from "node:os";
import path from "node:path";
import { mkdtemp, rm } from "node:fs/promises";
let runtimeRoot = "";
let readState: (typeof import("../src/lib/boss-data"))["readState"];
let writeState: (typeof import("../src/lib/boss-data"))["writeState"];
let updateUserSettings: (typeof import("../src/lib/boss-data"))["updateUserSettings"];
let subscribeBossEvents: (typeof import("../src/lib/boss-events"))["subscribeBossEvents"];
async function setup() {
if (runtimeRoot) return;
runtimeRoot = await mkdtemp(path.join(os.tmpdir(), "boss-settings-events-"));
process.env.BOSS_RUNTIME_ROOT = runtimeRoot;
process.env.BOSS_STATE_FILE = path.join(runtimeRoot, "boss-state.json");
const [data, events] = await Promise.all([
import("../src/lib/boss-data.ts"),
import("../src/lib/boss-events.ts"),
]);
readState = data.readState;
writeState = data.writeState;
updateUserSettings = data.updateUserSettings;
subscribeBossEvents = events.subscribeBossEvents;
}
async function resetSettingsState() {
const state = await readState();
state.user.settings = {
liveUpdates: true,
showRiskBadges: true,
confirmDangerousActions: true,
preferredEntryPoint: "conversations",
};
await writeState(state);
}
test.beforeEach(async () => {
await setup();
await resetSettingsState();
});
test.after(async () => {
if (runtimeRoot) {
await rm(runtimeRoot, { recursive: true, force: true });
}
});
test("updateUserSettings publishes settings refresh event", async () => {
const events: Array<{ event: string }> = [];
const unsubscribe = subscribeBossEvents((event) => {
events.push({ event });
});
await updateUserSettings({ liveUpdates: false });
unsubscribe();
assert.equal(events.at(-1)?.event, "settings.updated");
});