import { defineStore } from 'pinia' import { ref } from 'vue' import { api, allPages, recentAndActiveTasks, errorMessage, type Desktop, type Terminal, type User, type Task, type Resource, type Settings, type Overview } from '../api' export const usePlatform = defineStore('platform', () => { const desktops = ref([]), terminals = ref([]), users = ref([]) const tasks = ref([]), resources = ref([]) const settings = ref(null), overview = ref(null) const loading = ref(false), error = ref(''), updatedAt = ref('') let inFlight: Promise | undefined let generation = 0 function refresh() { if (inFlight) return inFlight loading.value = !updatedAt.value const startedGeneration = generation inFlight = (async () => { try { const [d, t, u, k, r, s, o] = await Promise.all([allPages(api.desktops), allPages(api.terminals), allPages(api.users), recentAndActiveTasks(), api.resources(), api.settings(), api.overview()]) if (startedGeneration !== generation) return desktops.value = d; terminals.value = t; users.value = u; tasks.value = k; resources.value = r.items; settings.value = s; overview.value = o updatedAt.value = new Date().toLocaleTimeString('zh-CN'); error.value = '' } catch (e) { if (startedGeneration === generation) error.value = errorMessage(e) } finally { if (startedGeneration === generation) { loading.value = false; inFlight = undefined } } })() return inFlight } function clear() { generation++; inFlight = undefined; loading.value = false; desktops.value = []; terminals.value = []; users.value = []; tasks.value = []; resources.value = []; settings.value = null; overview.value = null; error.value = ''; updatedAt.value = '' } return { desktops, terminals, users, tasks, resources, settings, overview, loading, error, updatedAt, refresh, clear } })