From 958a5aab5f69a2d4024827322a19ce5443ca3b07 Mon Sep 17 00:00:00 2001 From: daydreamer-json Date: Sun, 8 Mar 2026 08:18:02 +0900 Subject: [PATCH] refactor(pages): improve overview rendering and layout logic --- pages/src/assets/ts/renderers/overview.ts | 126 ++++++++++++++++++---- 1 file changed, 105 insertions(+), 21 deletions(-) diff --git a/pages/src/assets/ts/renderers/overview.ts b/pages/src/assets/ts/renderers/overview.ts index cd39312..1476018 100644 --- a/pages/src/assets/ts/renderers/overview.ts +++ b/pages/src/assets/ts/renderers/overview.ts @@ -1,3 +1,4 @@ +import { DateTime } from 'luxon'; import { fetchJson } from '../api.js'; import type { MirrorFileEntry, StoredData } from '../types.js'; import { BASE_URL, FILE_SIZE_OPTS, gameTargets, launcherTargets } from '../utils/constants.js'; @@ -34,28 +35,48 @@ export async function renderOverview(container: HTMLElement, mirrorFileDb: Mirro const sectionIn = document.createElement('div'); section.className = 'card mb-3'; sectionIn.className = 'card-body'; + + const [globalPkg, chinaPkg] = await Promise.all([ + (async () => { + const url = `${BASE_URL}/akEndfield/launcher/game/6/all.json`; + const dat = await fetchJson[]>(url); + const latest = dat.at(-1); + if (!latest) return { version: '---', date: '---' }; + return { + version: latest.rsp.version, + date: DateTime.fromISO(latest.updatedAt).toFormat('yyyy/MM/dd HH:mm:ss'), + }; + })(), + (async () => { + const url = `${BASE_URL}/akEndfield/launcher/game/1/all.json`; + const dat = await fetchJson[]>(url); + const latest = dat.at(-1); + if (!latest) return { version: '---', date: '---' }; + return { + version: latest.rsp.version, + date: DateTime.fromISO(latest.updatedAt).toFormat('yyyy/MM/dd HH:mm:ss'), + }; + })(), + ]); + sectionIn.innerHTML = ` -

Latest Game Packages

-

- ${await ( - async () => { - const url = `${BASE_URL}/akEndfield/launcher/game/6/all.json`; - const dat = await fetchJson[]>(url); - return dat.at(-1)?.rsp.version; - } - )()}
- Latest Version (Global) -

-

- ${await ( - async () => { - const url = `${BASE_URL}/akEndfield/launcher/game/1/all.json`; - const dat = await fetchJson[]>(url); - return dat.at(-1)?.rsp.version; - } - )()}
- Latest Version (China) -

+

Latest Game Packages

+
+
+

+ ${globalPkg.version}
+ ${globalPkg.date}
+ Latest Version (Global) +

+
+
+

+ ${chinaPkg.version}
+ ${chinaPkg.date}
+ Latest Version (China) +

+
+
`; const tableWrapper = document.createElement('div'); @@ -156,6 +177,69 @@ export async function renderOverview(container: HTMLElement, mirrorFileDb: Mirro } } + // 3. Latest Game Resources (Global) + { + const resPlatforms = ['Windows', 'Android', 'iOS', 'PlayStation']; + const resData = await Promise.all( + resPlatforms.map(async (p) => { + try { + const url = `${BASE_URL}/akEndfield/launcher/game_resources/6/${p}/all.json`; + const dat = await fetchJson[]>(url); + return dat.at(-1); + } catch { + return undefined; + } + }), + ); + + const resSection = document.createElement('div'); + resSection.className = 'card mb-3'; + const resSectionIn = document.createElement('div'); + resSectionIn.className = 'card-body'; + resSectionIn.innerHTML = ` +

Latest Game Resources

+
+ ${resPlatforms + .map((p, i) => { + const item = resData[i]; + if (!item) { + return ` +
+

+ ---
+ ${p} +

+
+ `; + } + + const version = (() => { + const initialRes = item.rsp.resources.find((e: any) => e.name === 'initial'); + const mainRes = item.rsp.resources.find((e: any) => e.name === 'main'); + if (!initialRes || !mainRes) return '---'; + if (initialRes.version === mainRes.version) return mainRes.version; + return item.rsp.res_version; + })(); + + const dateStr = DateTime.fromISO(item.updatedAt).toFormat('yyyy/MM/dd HH:mm:ss'); + + return ` +
+

+ ${version}
+ ${dateStr}
+ ${p} +

+
+ `; + }) + .join('')} +
+ `; + resSection.appendChild(resSectionIn); + container.appendChild(resSection); + } + const mirrorSection = document.createElement('div'); mirrorSection.className = 'card'; mirrorSection.innerHTML = `