vdi-cloud/console/src/stores/platform.ts

30 lines
1.9 KiB
TypeScript

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<Desktop[]>([]), terminals = ref<Terminal[]>([]), users = ref<User[]>([])
const tasks = ref<Task[]>([]), resources = ref<Resource[]>([])
const settings = ref<Settings | null>(null), overview = ref<Overview | null>(null)
const loading = ref(false), error = ref(''), updatedAt = ref('')
let inFlight: Promise<void> | 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 }
})