Initial release of Web Tools 0.0.5

This commit is contained in:
mid
2026-08-07 21:51:15 +08:00
commit fa14e9e5b9
71 changed files with 6365 additions and 0 deletions
+58
View File
@@ -0,0 +1,58 @@
import { readonly, ref } from 'vue'
import defaultNavigationData from '@shared/default-navigation.json'
import type { NavigationConfig } from '@/types'
const navigation = ref<NavigationConfig>(structuredClone(defaultNavigationData) as NavigationConfig)
const loading = ref(false)
const loadError = ref('')
let loaded = false
let pendingLoad: Promise<void> | undefined
export function useNavigation() {
async function loadNavigation(force = false) {
if (loaded && !force) return
if (pendingLoad && !force) return pendingLoad
pendingLoad = (async () => {
loading.value = true
loadError.value = ''
try {
const response = await fetch('/api/navigation', { headers: { Accept: 'application/json' } })
if (!response.ok) throw new Error(`读取配置失败(${response.status})`)
navigation.value = await response.json() as NavigationConfig
loaded = true
} catch (error) {
loadError.value = error instanceof Error ? error.message : '读取配置失败'
} finally {
loading.value = false
pendingLoad = undefined
}
})()
return pendingLoad
}
async function saveNavigation(next: NavigationConfig) {
const response = await fetch('/api/navigation', {
method: 'PUT',
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
body: JSON.stringify(next),
})
const payload = await response.json().catch(() => ({})) as NavigationConfig & { error?: string }
if (!response.ok) throw new Error(payload.error || `保存配置失败(${response.status})`)
navigation.value = payload
loaded = true
return payload
}
function resetLocalNavigation() {
return structuredClone(defaultNavigationData) as NavigationConfig
}
return {
navigation: readonly(navigation),
loading: readonly(loading),
loadError: readonly(loadError),
loadNavigation,
saveNavigation,
resetLocalNavigation,
}
}