diff --git a/components/BTextField.tsx b/components/BTextField.tsx index 421f42d..8027b01 100644 --- a/components/BTextField.tsx +++ b/components/BTextField.tsx @@ -16,6 +16,8 @@ interface DataType { } type Props = { + /**@default {true} */ + clear_cache?: boolean; value?: TextType[T]; name?: string; description?: string; @@ -26,7 +28,7 @@ type Props = { fullwidth?: boolean; disabled?: boolean; children?: ComponentChildren; - set_value?: StateUpdater; + set_value?: (v: TextType[T]) => void; min?: DataType[T]; max?: DataType[T]; outlined?: boolean; @@ -38,6 +40,24 @@ export default class BTextField static contextType = BCtx; ref: Ref | undefined; declare context: ContextType; + clear() { + const e = this.ref?.current; + if (e) { + const b = e.base; + if (b) { + const t = b as HTMLElement; + const d = t.querySelector("input"); + if (d) { + d.value = ""; + } + } + } + } + get clear_cache() { + return this.props.clear_cache !== undefined + ? this.props.clear_cache + : true; + } update(value: TextType[T]) { const e = this.ref?.current; if (e) { @@ -67,13 +87,15 @@ export default class BTextField } componentDidMount() { if (this.props.value !== undefined) this.update(this.props.value); + else if (this.clear_cache) this.clear(); } - componentWillUpdate( - nextProps: Readonly>, - _nextState: Readonly, - _nextContext: unknown, - ) { - if (nextProps.value !== undefined) this.update(nextProps.value); + componentDidUpdate( + previousProps: Readonly>, + previousState: Readonly, + snapshot: unknown, + ): void { + if (this.props.value !== undefined) this.update(this.props.value); + else if (this.clear_cache) this.clear(); } get_value(e: HTMLInputElement): TextType[T] { const type = this.props.type; diff --git a/components/NewTask.tsx b/components/NewTask.tsx index 0ba333e..361abdc 100644 --- a/components/NewTask.tsx +++ b/components/NewTask.tsx @@ -15,6 +15,8 @@ import BContext from "./BContext.tsx"; import Button from "preact-material-components/Button"; import { sendTaskMessage } from "../islands/TaskManager.tsx"; import Snackbar from "preact-material-components/Snackbar"; +import { GalleryResult } from "../server/gallery.ts"; +import { tw } from "twind"; export type NewTaskProps = { show: boolean; @@ -36,24 +38,27 @@ export default class NewTask extends Component { const show_snack = (message: string) => { snack.current?.MDComponent?.show({ message }); }; + const [dgid, set_dgid1] = useState(); + const [token, set_token1] = useState(); + const [url, set_url1] = useState(); + const [dcfg, set_dcfg] = useState(generate_download_cfg()); + const [overwrite_cfg, set_overwrite_cfg1] = useState(false); + const [ezgid, set_ezgid1] = useState(); + const [ginfo, set_ginfo] = useState(); + const [abort, set_abort] = useState(); if (task_type === TaskType.Download) { - const [gid, set_gid1] = useState(); - const [token, set_token1] = useState(); - const [url, set_url1] = useState(); - const [cfg, set_cfg] = useState(generate_download_cfg()); - const [overwrite_cfg, set_overwrite_cfg1] = useState(false); const set_url: StateUpdater = (u) => { const n = typeof u === "string" ? u : u(url || ""); set_url1(n); const p = parseUrl(n); if (p && p.type !== UrlType.Single) { - set_gid1(p.gid); + set_dgid(p.gid); set_token1(p.token); } }; - const set_gid: StateUpdater = (u) => { - const g = typeof u === "number" ? u : u(gid || 0); - set_gid1(g); + const set_dgid: StateUpdater = (u) => { + const g = typeof u === "number" ? u : u(dgid || 0); + set_dgid1(g); if (g && token) { set_url1(`https://e-hentai.org/g/${g}/${token}/`); } @@ -61,26 +66,26 @@ export default class NewTask extends Component { const set_token: StateUpdater = (u) => { const n = typeof u === "string" ? u : u(url || ""); set_token1(n); - if (gid && n) { - set_url1(`https://e-hentai.org/g/${gid}/${n}/`); + if (dgid && n) { + set_url1(`https://e-hentai.org/g/${dgid}/${n}/`); } }; const set_overwrite_cfg: StateUpdater = (u) => { const n = typeof u === "boolean" ? u : u(overwrite_cfg); set_overwrite_cfg1(n); if (n === true) { - set_cfg(generate_download_cfg()); + set_dcfg(generate_download_cfg()); } }; let cfg_div = null; if (overwrite_cfg) { cfg_div = (
- + { { { { set_value={set_url} /> { {cfg_div}
); - if (gid && token) { + if (dgid && token) { submit = () => { return sendTaskMessage({ type: "new_download_task", - gid, + gid: dgid, token, - cfg: overwrite_cfg ? cfg : undefined, + cfg: overwrite_cfg ? dcfg : undefined, }); }; clean = () => { - set_gid1(undefined); + set_dgid1(undefined); set_token1(undefined); set_url1(undefined); }; } + } else if (task_type === TaskType.ExportZip) { + const fetch_ginfo = (gid: number) => { + set_abort(new AbortController()); + fetch(`/api/gallery/${gid}`).then(async (res) => { + try { + set_ginfo(await res.json()); + } catch (e) { + set_ginfo({ + ok: false, + status: -1, + error: e.toString(), + }); + } + }).catch((e) => { + set_ginfo({ ok: false, status: -1, error: e.toString() }); + }).finally(() => { + set_abort(undefined); + }); + }; + const set_ezgid = (g: number) => { + if (abort) abort.abort(); + set_ezgid1(g); + if (!isNaN(g)) fetch_ginfo(g); + }; + let ginfo_div = null; + if (ginfo?.ok) { + ginfo_div = ( +
+
+ {t("task.gallery_title")} + {ginfo.data.meta.title} +
+
+ {t("task.gallery_page")} + {ginfo.data.pages.length} +
+
+ ); + } else if (ginfo?.ok === false) { + ginfo_div = ( +
+
{ginfo.error}
+
+ ); + } + config_div = ( +
+ + {ginfo_div} +
+ ); } const sub = () => { if (submit) { diff --git a/translation/en/task.jsonc b/translation/en/task.jsonc index ef8b203..6cfea99 100644 --- a/translation/en/task.jsonc +++ b/translation/en/task.jsonc @@ -13,5 +13,7 @@ "gallery_id": "Gallery ID: ", "gallery_token": "Gallery token: ", "overwrite_cfg": "Overwrite default config.", - "submit_failed": "Failed to submit task." + "submit_failed": "Failed to submit task.", + "gallery_title": "Gallery title: ", + "gallery_page": "Number of pages: " } diff --git a/translation/zh-cn/task.jsonc b/translation/zh-cn/task.jsonc index 4050bf3..1209e9d 100644 --- a/translation/zh-cn/task.jsonc +++ b/translation/zh-cn/task.jsonc @@ -13,5 +13,7 @@ "gallery_id": "画廊ID:", "gallery_token": "画廊令牌:", "overwrite_cfg": "覆盖默认设置。", - "submit_failed": "提交任务失败" + "submit_failed": "提交任务失败", + "gallery_title": "画廊标题:", + "gallery_page": "页数:" }