86 lines
2.6 KiB
TypeScript
86 lines
2.6 KiB
TypeScript
import { useState } from 'react';
|
|
import { invoke } from '@tauri-apps/api/core';
|
|
import { useAppStore } from '../../store/appStore';
|
|
import LeftPanel from './LeftPanel';
|
|
import CenterPanel from './CenterPanel';
|
|
import RightPanel from './RightPanel';
|
|
import ConfigScreen from '../config/ConfigScreen';
|
|
import UpdateChecker from '../update/UpdateChecker';
|
|
import styles from './AppShell.module.css';
|
|
|
|
export default function AppShell() {
|
|
const { centerMode, setCenterMode, uoRoot, servuoScripts } = useAppStore();
|
|
const [indexingAssets, setIndexingAssets] = useState(false);
|
|
const [indexingScripts, setIndexingScripts] = useState(false);
|
|
|
|
async function handleIndexAssets() {
|
|
if (!uoRoot) return;
|
|
setIndexingAssets(true);
|
|
try {
|
|
const count = await invoke<number>('index_assets', { uoRoot });
|
|
alert(`Indexed ${count.toLocaleString()} tiles.`);
|
|
} catch (e) {
|
|
alert(`Asset index failed: ${e}`);
|
|
} finally {
|
|
setIndexingAssets(false);
|
|
}
|
|
}
|
|
|
|
async function handleIndexScripts() {
|
|
if (!servuoScripts) {
|
|
alert('Set the ServUO Scripts path in Config first.');
|
|
return;
|
|
}
|
|
setIndexingScripts(true);
|
|
try {
|
|
const count = await invoke<number>('index_scripts', { scriptsPath: servuoScripts });
|
|
alert(`Indexed ${count.toLocaleString()} classes.`);
|
|
} catch (e) {
|
|
alert(`Script index failed: ${e}`);
|
|
} finally {
|
|
setIndexingScripts(false);
|
|
}
|
|
}
|
|
|
|
return (
|
|
<div className={styles.shell}>
|
|
<header className={styles.header}>
|
|
<span className={`${styles.title} font-cinzel`}>Artificer's Scrollwork</span>
|
|
<div className={styles.headerActions}>
|
|
<UpdateChecker />
|
|
<button
|
|
className={styles.headerBtn}
|
|
onClick={handleIndexAssets}
|
|
disabled={indexingAssets}
|
|
>
|
|
{indexingAssets ? 'Indexing…' : '[Assets]'}
|
|
</button>
|
|
<button
|
|
className={styles.headerBtn}
|
|
onClick={handleIndexScripts}
|
|
disabled={indexingScripts}
|
|
>
|
|
{indexingScripts ? 'Indexing…' : '[Scripts]'}
|
|
</button>
|
|
<button
|
|
className={styles.headerBtn}
|
|
onClick={() => setCenterMode('config')}
|
|
>
|
|
[Config]
|
|
</button>
|
|
</div>
|
|
</header>
|
|
|
|
{centerMode === 'config' ? (
|
|
<ConfigScreen onDone={() => setCenterMode('empty')} />
|
|
) : (
|
|
<div className={styles.panels}>
|
|
<LeftPanel />
|
|
<CenterPanel />
|
|
<RightPanel />
|
|
</div>
|
|
)}
|
|
</div>
|
|
);
|
|
}
|