-
Notifications
You must be signed in to change notification settings - Fork 586
/
Copy pathuse-software-update.ts
53 lines (45 loc) · 1.33 KB
/
use-software-update.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import {useCallback} from 'react'
import {toast} from '@/components/ui/toast'
import {trpcReact} from '@/trpc/trpc'
import {t} from '@/utils/i18n'
export type UpdateState = 'initial' | 'checking' | 'at-latest' | 'update-available' | 'upgrading'
export function useSoftwareUpdate() {
const ctx = trpcReact.useContext()
const latestVersionQ = trpcReact.system.checkUpdate.useQuery(undefined, {
retry: false,
refetchOnReconnect: false,
refetchOnWindowFocus: false,
})
const osVersionQ = trpcReact.system.version.useQuery()
const currentVersion = osVersionQ.data
const latestVersion = latestVersionQ.data
const checkLatest = useCallback(async () => {
try {
ctx.system.checkUpdate.invalidate()
const latestVersion = await ctx.system.checkUpdate.fetch()
if (!latestVersion) {
throw new Error(t('software-update.failed-to-check'))
}
} catch (error) {
toast.error(t('software-update.failed-to-check'))
}
}, [ctx.system.checkUpdate])
let state: UpdateState = 'initial'
if (latestVersionQ.isLoading) {
state = 'initial'
} else if (latestVersionQ.isRefetching) {
state = 'checking'
} else if (latestVersionQ.error) {
state = 'initial'
} else if (!latestVersionQ.data.available) {
state = 'at-latest'
} else {
state = 'update-available'
}
return {
state,
currentVersion,
latestVersion,
checkLatest,
}
}