diff --git a/components/Task.tsx b/components/Task.tsx index ff96cc3..42166c2 100644 --- a/components/Task.tsx +++ b/components/Task.tsx @@ -1,5 +1,7 @@ import { Component } from "preact"; -import { TaskDetail, TaskStatus } from "../task.ts"; +import Icon from "preact-material-components/Icon"; +import { TaskDetail, TaskStatus, TaskType } from "../task.ts"; +import t from "../server/i18n.ts"; type Props = { task: TaskDetail; @@ -28,16 +30,16 @@ export default class Task extends Component { console.log(task); return (
- Task Id: {task.base.id} + unfold_more + {t("task.id")} + {task.base.id}
); } componentDidMount(): void { - self.addEventListener("task_started", this.state.task_changed); - self.addEventListener("task_finished", this.state.task_changed); + self.addEventListener("task_changed", this.state.task_changed); } componentWillUnmount(): void { - self.removeEventListener("task_started", this.state.task_changed); - self.removeEventListener("task_finished", this.state.task_changed); + self.removeEventListener("task_changed", this.state.task_changed); } } diff --git a/islands/TaskManager.tsx b/islands/TaskManager.tsx index af7f9bc..e9d82ea 100644 --- a/islands/TaskManager.tsx +++ b/islands/TaskManager.tsx @@ -33,6 +33,7 @@ export default class TaskManager extends Component { return; } this.sortable = new Sortable(ul.current, { + handle: ".task_handle", onSort: (evt: SortableEvent) => { if ( evt.newIndex === undefined || evt.oldIndex === undefined @@ -53,6 +54,11 @@ export default class TaskManager extends Component { }; ws.onmessage = (e) => { const t: TaskServerSocketData = JSON.parse(e.data); + function sendTaskChangedEvent(id: number) { + self.dispatchEvent( + new CustomEvent("task_changed", { detail: id }), + ); + } if (t.type == "close") { ws.close(); } else if (t.type == "tasks") { @@ -107,11 +113,7 @@ export default class TaskManager extends Component { this.forceUpdate(); } else { task.status = TaskStatus.Running; - self.dispatchEvent( - new CustomEvent("task_started", { - detail: t.detail.id, - }), - ); + sendTaskChangedEvent(t.detail.id); const tl = task_list.value; const ind = tl.indexOf(task.base.id); if (ind > 0) { @@ -123,11 +125,7 @@ export default class TaskManager extends Component { const task = tasks.value.get(t.detail.id); if (task !== undefined) { task.status = TaskStatus.Finished; - self.dispatchEvent( - new CustomEvent("task_finished", { - detail: t.detail.id, - }), - ); + sendTaskChangedEvent(t.detail.id); const tl = task_list.value; const ind = tl.indexOf(task.base.id); if (ind < tl.length - 1 && ind > -1) { @@ -135,6 +133,12 @@ export default class TaskManager extends Component { this.sortable?.sort(tl.map((t) => t.toString())); } } + } else if (t.type == "task_progress") { + const task = tasks.value.get(t.detail.task_id); + if (task !== undefined) { + task.progress = t.detail.detail; + sendTaskChangedEvent(t.detail.task_id); + } } }; self.addEventListener("beforeunload", () => { diff --git a/server/i18ns.ts b/server/i18ns.ts index 0e6e6d6..37e942d 100644 --- a/server/i18ns.ts +++ b/server/i18ns.ts @@ -6,8 +6,8 @@ import { pick } from "accept-language-parser/"; const whole_maps = new Map(); const LANGUAGES = ["zh-cn"]; -type MODULE = "common" | "settings"; -const MODULES: MODULE[] = ["common", "settings"]; +type MODULE = "common" | "settings" | "task"; +const MODULES: MODULE[] = ["common", "settings", "task"]; export async function load_translation(signal?: AbortSignal) { const base = import.meta.resolve("../translation").slice(8); diff --git a/task.ts b/task.ts index b9d7ecc..820fec4 100644 --- a/task.ts +++ b/task.ts @@ -1,5 +1,3 @@ -import { DiscriminatedUnion } from "./utils.ts"; - export enum TaskType { Download, ExportZip, @@ -24,20 +22,16 @@ export type TaskExportZipProgress = { total_page: number; }; -type TaskId> = { - [P in keyof T]: ({ - task_id: number; - } & T[P]) extends infer U ? { [Q in keyof U]: U[Q] } : never; -}; - export type TaskProgressBasicType = { [TaskType.Download]: TaskDownloadProgess; [TaskType.ExportZip]: TaskExportZipProgress; }; -export type TaskProgressType = TaskId; - -export type TaskProgress = DiscriminatedUnion<"type", TaskProgressType>; +export type TaskProgress = { + type: T; + task_id: number; + detail: TaskProgressBasicType[T]; +}; export enum TaskStatus { Wait, diff --git a/task_manager.ts b/task_manager.ts index 4bbcff7..2f50556 100644 --- a/task_manager.ts +++ b/task_manager.ts @@ -3,7 +3,7 @@ import { Config } from "./config.ts"; import { EhDb } from "./db.ts"; import { check_running } from "./pid_check.ts"; import { add_exit_handler } from "./signal_handler.ts"; -import { Task, TaskProgress, TaskProgressType, TaskType } from "./task.ts"; +import { Task, TaskProgress, TaskProgressBasicType, TaskType } from "./task.ts"; import { download_task } from "./tasks/download.ts"; import { DEFAULT_EXPORT_ZIP_CONFIG, @@ -162,14 +162,12 @@ export class TaskManager extends EventTarget { dispatchEvent(type: T, detail: EventMap[T]) { return super.dispatchEvent(new CustomEvent(type, { detail })); } - dispatchTaskProgressEvent( + dispatchTaskProgressEvent( type: T, - detail: TaskProgressType[T], + task_id: number, + detail: TaskProgressBasicType[T], ) { - return this.dispatchEvent( - "task_progress", - { type, ...detail }, - ); + return this.dispatchEvent("task_progress", { type, task_id, detail }); } force_abort(reason?: unknown) { this.#force_abort.abort(reason); diff --git a/tasks/download.ts b/tasks/download.ts index 4e0e4eb..cb3834f 100644 --- a/tasks/download.ts +++ b/tasks/download.ts @@ -55,11 +55,14 @@ class DownloadManager { ); } #sendEvent() { - return this.#manager.dispatchTaskProgressEvent(TaskType.Download, { - task_id: this.#task.id, - downloaded_page: this.#progress.downloaded_page, - total_page: this.#progress.total_page, - }); + return this.#manager.dispatchTaskProgressEvent( + TaskType.Download, + this.#task.id, + { + downloaded_page: this.#progress.downloaded_page, + total_page: this.#progress.total_page, + }, + ); } async add_new_task(f: () => Promise) { while (1) { diff --git a/tasks/export_zip.ts b/tasks/export_zip.ts index 71c5668..3c7445c 100644 --- a/tasks/export_zip.ts +++ b/tasks/export_zip.ts @@ -33,8 +33,7 @@ export async function export_zip( added_page: 0, }; const sendEvent = () => { - manager.dispatchTaskProgressEvent(TaskType.ExportZip, { - task_id: task.id, + manager.dispatchTaskProgressEvent(TaskType.ExportZip, task.id, { added_page: progress.added_page, total_page: progress.total_page, }); diff --git a/translation/en/task.jsonc b/translation/en/task.jsonc new file mode 100644 index 0000000..3f2751a --- /dev/null +++ b/translation/en/task.jsonc @@ -0,0 +1,3 @@ +{ + "id": "Task ID: " +} diff --git a/translation/zh-cn/task.jsonc b/translation/zh-cn/task.jsonc new file mode 100644 index 0000000..f8fa9f0 --- /dev/null +++ b/translation/zh-cn/task.jsonc @@ -0,0 +1,3 @@ +{ + "id": "任务ID:" +}