The login dialog stayed open with a success line after the code was accepted, though nothing is left to do in it. It now closes and a toast says the login is stored. The toast is a new swarm-ui primitive: a short note raised with showToast, rendered by a ToastHost at the app root, gone after a few seconds or on click.
46 lines
1.4 KiB
JavaScript
46 lines
1.4 KiB
JavaScript
// The toast list. Run by `npm test`, which Node runs with its built-in test
|
|
// runner and type stripping, so the `.ts` module is imported as it is.
|
|
import assert from "node:assert/strict";
|
|
import { test } from "node:test";
|
|
import {
|
|
currentToasts,
|
|
dismissToast,
|
|
showToast,
|
|
subscribeToasts,
|
|
toastDuration,
|
|
} from "../src/ui/toast/toasts.ts";
|
|
|
|
test("an error stays longer than the other tones", () => {
|
|
assert.ok(toastDuration("error") > toastDuration("ok"));
|
|
assert.equal(toastDuration("info"), toastDuration("ok"));
|
|
});
|
|
|
|
test("a toast is listed with its tone and duration, oldest first", () => {
|
|
const a = showToast("first", "ok");
|
|
const b = showToast("second", "error", 100);
|
|
const list = currentToasts().filter((t) => t.id === a || t.id === b);
|
|
assert.deepEqual(
|
|
list.map((t) => [t.message, t.tone, t.duration]),
|
|
[
|
|
["first", "ok", toastDuration("ok")],
|
|
["second", "error", 100],
|
|
],
|
|
);
|
|
dismissToast(a);
|
|
dismissToast(b);
|
|
});
|
|
|
|
test("dismissing removes one toast and tells the subscribers once", () => {
|
|
const a = showToast("keep");
|
|
const b = showToast("drop");
|
|
let calls = 0;
|
|
const stop = subscribeToasts(() => calls++);
|
|
dismissToast(b);
|
|
dismissToast(b);
|
|
assert.equal(calls, 1);
|
|
assert.ok(currentToasts().some((t) => t.id === a));
|
|
assert.ok(!currentToasts().some((t) => t.id === b));
|
|
stop();
|
|
dismissToast(a);
|
|
assert.equal(calls, 1);
|
|
});
|