43 lines
1.1 KiB
TypeScript
43 lines
1.1 KiB
TypeScript
import { useRegisterSW } from "virtual:pwa-register/react"
|
|
import { useMount } from "react-use"
|
|
import { useToast } from "./useToast"
|
|
|
|
export function usePWA() {
|
|
const toaster = useToast()
|
|
const { updateServiceWorker, needRefresh: [needRefresh] } = useRegisterSW()
|
|
|
|
useMount(async () => {
|
|
const update = () => {
|
|
updateServiceWorker().then(() => localStorage.setItem("updated", "1"))
|
|
}
|
|
await delay(1000)
|
|
if (localStorage.getItem("updated")) {
|
|
localStorage.removeItem("updated")
|
|
toaster("更新成功,赶快体验吧", {
|
|
action: {
|
|
label: "查看更新",
|
|
onClick: () => {
|
|
window.open(`${Homepage}/releases/tag/v${Version}`)
|
|
},
|
|
},
|
|
})
|
|
} else if (needRefresh) {
|
|
if (!navigator) return
|
|
|
|
if ("connection" in navigator && !navigator.onLine) return
|
|
|
|
const resp = await myFetch("/latest")
|
|
|
|
if (resp.v && resp.v !== Version) {
|
|
toaster("有更新,5 秒后自动更新", {
|
|
action: {
|
|
label: "立刻更新",
|
|
onClick: update,
|
|
},
|
|
onDismiss: update,
|
|
})
|
|
}
|
|
}
|
|
})
|
|
}
|