30 lines
1.9 KiB
TypeScript
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 }
|
|
})
|