Kokkoja as of 2026-10-10: the teacher's requests, the Session window, notices, the QR code, the license
This commit is contained in:
1 parent
95c80d04c9
commit
1d087af633
32 files changed
+4917
-890
No files matched your search
+16
-15
@@ -205,12 +205,15 @@ export class NotebookWriter {
|
||||
* @param {string} notebook
|
||||
* @param {() => string | null} content Produces the file of the present
|
||||
* page, or null if there is no page to save yet.
|
||||
* @param {(message: string, problem: boolean) => void} onStatus
|
||||
* @param {object} events
|
||||
* @param {(time: string) => void} events.onSaved The page was written, at that time of day.
|
||||
* @param {(message: string) => void} events.onKept What keeping the page did.
|
||||
* @param {(message: string) => void} events.onProblem A write or keep failed.
|
||||
*/
|
||||
constructor(notebook, content, onStatus) {
|
||||
constructor(notebook, content, events) {
|
||||
this.notebook = notebook;
|
||||
this.content = content;
|
||||
this.onStatus = onStatus;
|
||||
this.events = events;
|
||||
/** @type {number | null} */
|
||||
this.timer = null;
|
||||
/** Time of the oldest change not yet written, or 0. */
|
||||
@@ -232,7 +235,7 @@ export class NotebookWriter {
|
||||
*/
|
||||
enqueue(work) {
|
||||
this.queue = this.queue.then(work).catch((error) => {
|
||||
this.onStatus(error instanceof Error ? error.message : String(error), true);
|
||||
this.events.onProblem(error instanceof Error ? error.message : String(error));
|
||||
// The page is still in memory: try to write it again shortly.
|
||||
if (this.timer === null) this.timer = setTimeout(() => this.writeNow(), RETRY_MS);
|
||||
});
|
||||
@@ -272,27 +275,25 @@ export class NotebookWriter {
|
||||
const text = this.content();
|
||||
if (text === null) return;
|
||||
await this.put(text);
|
||||
this.onStatus(`Saved at ${new Date().toLocaleTimeString()}`, false);
|
||||
this.events.onSaved(new Date().toLocaleTimeString());
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* The user asked to keep the page as it is now.
|
||||
* @returns {Promise<string | null>} The name of the kept page, or null
|
||||
* if there was nothing to keep.
|
||||
* @returns {Promise<{kept: string | null, new: boolean}>} The name of
|
||||
* the kept page, or null if there was nothing to keep, and whether
|
||||
* the copy was made just now.
|
||||
*/
|
||||
keepPage() {
|
||||
this.writeNow();
|
||||
/** @type {string | null} */
|
||||
let kept = null;
|
||||
let result = { kept: /** @type {string | null} */ (null), new: false };
|
||||
return this.enqueue(async () => {
|
||||
const result = await keepCurrentPage(this.notebook);
|
||||
kept = result.kept;
|
||||
this.onStatus(
|
||||
result = await keepCurrentPage(this.notebook);
|
||||
this.events.onKept(
|
||||
result.kept === null ? 'The page is blank: nothing to keep'
|
||||
: result.new ? `Kept as ${result.kept}` : `Already kept as ${result.kept}`,
|
||||
false);
|
||||
}).then(() => kept);
|
||||
: result.new ? `Kept as ${result.kept}` : `Already kept as ${result.kept}`);
|
||||
}).then(() => result);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in new issue
Block a user