import type { Release } from './releaseUtils' import { computed, onMounted, ref } from 'vue' import { findPrerelease } from './releaseUtils' export function useLatestVersion() { const latestRelease = ref(null) const prereleaseRelease = ref(null) const nightlyRelease = ref(null) const latestVersion = computed(() => latestRelease.value?.tag_name.replace(/^v/, '') ?? null) const prereleaseVersion = computed(() => prereleaseRelease.value?.tag_name.replace(/^v/, '') ?? null) const loading = ref(true) const error = ref(null) onMounted(async () => { async function fetchRelease(path: string): Promise { const response = await fetch(`https://api.github.com/repos/EasyTier/EasyTier/releases${path}`, { signal: AbortSignal.timeout(10000) }) if (!response.ok) throw new Error('Failed to fetch releases from GitHub API') return response.json() } const [latest, releases, nightly] = await Promise.allSettled([ fetchRelease('/latest'), fetchRelease('?per_page=100'), fetchRelease('/tags/nightly'), ]) if (latest.status === 'fulfilled') latestRelease.value = latest.value if (releases.status === 'fulfilled') prereleaseRelease.value = findPrerelease(releases.value) if (nightly.status === 'fulfilled') nightlyRelease.value = nightly.value const failure = [latest, releases, nightly].find(result => result.status === 'rejected') if (failure?.status === 'rejected') error.value = failure.reason instanceof Error ? failure.reason.message : 'Unknown error' loading.value = false }) return { latestVersion, prereleaseVersion, latestRelease, prereleaseRelease, nightlyRelease, loading, error } }