import { useEffect, useState } from 'react'; import AboutTab from './components/tabs/AboutTab'; import GamePackagesTab from './components/tabs/GamePackagesTab'; import LauncherTab from './components/tabs/LauncherTab'; import OverviewTab from './components/tabs/OverviewTab'; import PatchesTab from './components/tabs/PatchesTab'; import ResourcesTab from './components/tabs/ResourcesTab'; import WebTab from './components/tabs/WebTab'; import type { LauncherWebMainBgImage, MirrorFileEntry, StoredData } from './types'; import { fetchJson, preloadData } from './utils/api'; import { BASE_URL } from './utils/constants'; const getMirrorUrl = (url: string) => { try { const u = new URL(url); return `https://raw.githubusercontent.com/daydreamer-json/ak-endfield-api-archive/refs/heads/main/output/raw/${u.hostname}${u.pathname}`; } catch { return url; } }; function App() { const [activeTab, setActiveTab] = useState('overview'); const [mirrorFileDb, setMirrorFileDb] = useState([]); const [loading, setLoading] = useState(true); const [bgImage, setBgImage] = useState(null); const [bgVisible, setBgVisible] = useState(false); useEffect(() => { const getPreferredTheme = () => { return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; }; const setTheme = (theme: string) => { document.documentElement.setAttribute('data-bs-theme', theme); }; setTheme(getPreferredTheme()); const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); const handleChange = () => setTheme(getPreferredTheme()); mediaQuery.addEventListener('change', handleChange); return () => mediaQuery.removeEventListener('change', handleChange); }, []); useEffect(() => { const init = async () => { try { await preloadData(); } catch (e) { console.warn('Preload failed', e); } // Fetch mirror list try { const db = await fetchJson(`${BASE_URL}/mirror_file_list.json`); setMirrorFileDb(db); } catch (e) { console.warn('Failed to fetch mirror list', e); } finally { setLoading(false); } // Fetch latest background image try { const url = `${BASE_URL}/akEndfield/launcher/web/6/main_bg_image/en-us/all.json`; const data = await fetchJson[]>(url); if (data.length > 0) { // Sort by updatedAt descending const sorted = data.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()); const latest = sorted.find((entry) => entry.rsp?.main_bg_image?.url); if (latest?.rsp?.main_bg_image?.url) { const mirrorUrl = getMirrorUrl(latest.rsp.main_bg_image.url); // Preload the image const img = new Image(); img.src = mirrorUrl; img.onload = () => { setBgImage(mirrorUrl); // Small delay to trigger transition setTimeout(() => setBgVisible(true), 1); }; } } } catch (e) { console.warn('Failed to fetch background image', e); } }; init(); }, []); const renderContent = () => { if (loading) { return (

Loading data...

); } switch (activeTab) { case 'overview': return ; case 'game': return ; case 'patch': return ; case 'resources': return ; case 'launcher': return ; case 'web-pretty': return ; case 'about': return ; default: return null; } }; return ( <> {(() => { const blurRadius = 4; const opacity = 0.3; const opacityAnimSec = 1; const blurAnimSec = 1; const blurRadiusTmp = bgVisible ? blurRadius : blurRadius * 2; return (
); })()}

Arknights: Endfield API Archive

{renderContent()}

(C) daydreamer-json and contributors

Debug Panel

Debug Log

                    
                  
); } export default App;