Skip to content

Commit c6c1dd0

Browse files
feat: check if device is up again properly
1 parent 9dbe784 commit c6c1dd0

File tree

10 files changed

+69
-75
lines changed

10 files changed

+69
-75
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ license = "MIT OR Apache-2.0"
77
name = "omnect-ui"
88
readme = "README.md"
99
repository = "git@github.com:omnect/omnect-ui.git"
10-
version = "0.8.0"
10+
version = "0.8.1"
1111
build = "src/build.rs"
1212

1313
[dependencies]

vue/bun.lock

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vue/package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,20 @@
1717
"dependencies": {
1818
"@mdi/font": "^7.4.47",
1919
"@vueuse/core": "^12.8.2",
20-
"axios": "^1.8.3",
20+
"axios": "^1.8.4",
2121
"centrifuge": "^5.3.4",
2222
"vue": "^3.5.13",
23-
"vuetify": "^3.7.16"
23+
"vuetify": "^3.8.1"
2424
},
2525
"devDependencies": {
2626
"@biomejs/biome": "1.9.4",
27-
"@types/bun": "^1.2.5",
28-
"@vitejs/plugin-vue": "^5.2.1",
27+
"@types/bun": "^1.2.8",
28+
"@vitejs/plugin-vue": "^5.2.3",
2929
"@vue/tsconfig": "^0.7.0",
3030
"typescript": "~5.7.3",
3131
"unocss": "^65.5.0",
32-
"vite": "^6.2.1",
33-
"vite-plugin-vuetify": "^2.1.0",
32+
"vite": "^6.2.5",
33+
"vite-plugin-vuetify": "^2.1.1",
3434
"vue-router": "^4.5.0",
3535
"vue-tsc": "^2.2.8"
3636
}

vue/src/App.vue

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,36 +10,24 @@ import UserMenu from "./components/UserMenu.vue"
1010
import { useCentrifuge } from "./composables/useCentrifugo"
1111
import { useOverlaySpinner } from "./composables/useOverlaySpinner"
1212
import { useSnackbar } from "./composables/useSnackbar"
13-
import { CentrifugeSubscriptionType } from "./enums/centrifuge-subscription-type.enum"
14-
import type { UpdateValidationStatus } from "./types/update-validation-status"
13+
import { useWaitReconnect } from "./composables/useWaitReconnect"
1514
1615
axios.defaults.validateStatus = (_) => true
1716
1817
const { snackbarState } = useSnackbar()
19-
const { overlaySpinnerState, reset, updateDone } = useOverlaySpinner()
20-
const { initializeCentrifuge, onConnected, history, subscribe } = useCentrifuge()
18+
const { overlaySpinnerState, reset } = useOverlaySpinner()
19+
const { initializeCentrifuge } = useCentrifuge()
20+
const { onConnected } = useWaitReconnect()
2121
const { lgAndUp } = useDisplay()
2222
const router = useRouter()
2323
const route = useRoute()
2424
const showSideBar: Ref<boolean> = ref(lgAndUp.value)
2525
2626
onConnected(() => {
27-
if (!overlaySpinnerState.isUpdateRunning) {
28-
reset()
29-
return
30-
}
31-
32-
history(checkUpdateState, CentrifugeSubscriptionType.UpdateStatus)
33-
subscribe(checkUpdateState, CentrifugeSubscriptionType.UpdateStatus)
34-
updateDone.trigger()
27+
reset()
28+
router.push("/login")
3529
})
3630
37-
const checkUpdateState = (data: UpdateValidationStatus) => {
38-
if (overlaySpinnerState.isUpdateRunning && (data.status === "Succeeded" || data.status === "Recovered")) {
39-
reset()
40-
}
41-
}
42-
4331
const toggleSideBar = () => {
4432
showSideBar.value = !showSideBar.value
4533
}

vue/src/components/UpdateInfo.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ import { useFetch } from "@vueuse/core"
33
import { ref, toRef } from "vue"
44
import { useOverlaySpinner } from "../composables/useOverlaySpinner"
55
import { useSnackbar } from "../composables/useSnackbar"
6+
import { useWaitReconnect } from "../composables/useWaitReconnect"
67
import router from "../plugins/router"
78
import type { UpdateManifest } from "../types/update-manifest"
89
import KeyValuePair from "./ui-components/KeyValuePair.vue"
910
1011
const { showError: snackbarShowError } = useSnackbar()
1112
const { overlaySpinnerState, reset: resetOverlay } = useOverlaySpinner()
13+
const { startWaitReconnect, stopWaitReconnect } = useWaitReconnect()
1214
1315
const props = defineProps<{
1416
updateManifest: UpdateManifest | undefined
@@ -43,11 +45,13 @@ const triggerUpdate = () => {
4345
overlaySpinnerState.text = "Please have some patience, the update may take some time."
4446
overlaySpinnerState.overlay = true
4547
overlaySpinnerState.isUpdateRunning = true
48+
startWaitReconnect()
4649
}
4750
4851
const showError = (errorMsg: string) => {
4952
resetOverlay()
5053
snackbarShowError(errorMsg)
54+
stopWaitReconnect()
5155
}
5256
5357
const toggleEnforceConnect = (v: boolean | null) => {

vue/src/composables/useCentrifugo.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import { Centrifuge, type PublicationContext, SubscriptionState } from "centrifuge"
22
import { type Ref, ref } from "vue"
33
import type { CentrifugeSubscriptionType } from "../enums/centrifuge-subscription-type.enum"
4-
import { useEventHook } from "./useEventHook"
54

65
const centrifuge: Ref<Centrifuge | undefined> = ref(undefined)
7-
const connectedEvent = useEventHook()
86

97
export function useCentrifuge() {
108
const centrifuge_url = `wss://${window.location.hostname}:8000/connection/websocket`
@@ -24,7 +22,6 @@ export function useCentrifuge() {
2422
})
2523
.on("connected", (ctx) => {
2624
console.debug(`connected over ${ctx.transport}`)
27-
connectedEvent.trigger()
2825
})
2926
.on("disconnected", (ctx) => {
3027
console.debug(`disconnected: ${ctx.code}, ${ctx.reason}`)
@@ -96,5 +93,5 @@ export function useCentrifuge() {
9693
}
9794
}
9895

99-
return { subscribe, unsubscribe, unsubscribeAll, initializeCentrifuge, token, history, onConnected: connectedEvent.on }
96+
return { subscribe, unsubscribe, unsubscribeAll, initializeCentrifuge, token, history }
10097
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import axios, { AxiosError } from "axios"
2+
import { ref } from "vue"
3+
import { useEventHook } from "./useEventHook"
4+
5+
const connectedEvent = useEventHook()
6+
7+
export function useWaitReconnect() {
8+
const wasDown = ref(false)
9+
const reconnectInterval = ref()
10+
11+
const startWaitReconnect = async () => {
12+
reconnectInterval.value = setInterval(checkReconnect, 5_000)
13+
}
14+
15+
const stopWaitReconnect = () => {
16+
wasDown.value = false
17+
clearInterval(reconnectInterval.value)
18+
connectedEvent.trigger()
19+
}
20+
21+
const checkReconnect = async () => {
22+
try {
23+
const res = await axios.get("/", {
24+
timeout: 2_500
25+
})
26+
if (res.status === 200 && wasDown.value) {
27+
stopWaitReconnect()
28+
}
29+
} catch (error) {
30+
const err = error as AxiosError
31+
if (err.isAxiosError && err.code === "ECONNABORTED") {
32+
wasDown.value = true
33+
}
34+
}
35+
}
36+
37+
return { startWaitReconnect, stopWaitReconnect, onConnected: connectedEvent.on }
38+
}

vue/src/pages/DeviceOverview.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ import DeviceInfo from "../components/DeviceInfo.vue"
55
import DeviceNetworks from "../components/DeviceNetworks.vue"
66
import { useCentrifuge } from "../composables/useCentrifugo"
77
import { useOverlaySpinner } from "../composables/useOverlaySpinner"
8+
import { useWaitReconnect } from "../composables/useWaitReconnect"
89
import { CentrifugeSubscriptionType } from "../enums/centrifuge-subscription-type.enum"
910
import type { FactoryResetStatus, OnlineStatus, SystemInfo, Timeouts } from "../types"
1011
import type { UpdateValidationStatus } from "../types/update-validation-status"
1112
1213
const { subscribe, history } = useCentrifuge()
1314
const { overlaySpinnerState } = useOverlaySpinner()
15+
const { startWaitReconnect } = useWaitReconnect()
1416
1517
const online = ref(false)
1618
const systemInfo: Ref<SystemInfo | undefined> = ref(undefined)
@@ -36,12 +38,14 @@ const deviceInfo: Ref<Map<string, string | number>> = computed(
3638
const showIsRebooting = () => {
3739
overlaySpinnerState.title = "Device is rebooting"
3840
overlaySpinnerState.overlay = true
41+
startWaitReconnect()
3942
}
4043
4144
const showIsResetting = () => {
4245
overlaySpinnerState.title = "The device is being reset"
4346
overlaySpinnerState.text = "Please have some patience, the resetting may take some time."
4447
overlaySpinnerState.overlay = true
48+
startWaitReconnect()
4549
}
4650
4751
const updateOnlineStatus = (data: OnlineStatus) => {

vue/src/pages/DeviceUpdate.vue

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,17 @@
11
<script setup lang="ts">
22
import { useFetch } from "@vueuse/core"
33
import { onMounted, ref } from "vue"
4-
import DialogContent from "../components/DialogContent.vue"
54
import UpdateFileUpload from "../components/UpdateFileUpload.vue"
65
import UpdateInfo from "../components/UpdateInfo.vue"
76
import { useCentrifuge } from "../composables/useCentrifugo"
8-
import { useOverlaySpinner } from "../composables/useOverlaySpinner"
97
import { useSnackbar } from "../composables/useSnackbar"
108
import { CentrifugeSubscriptionType } from "../enums/centrifuge-subscription-type.enum"
119
import router from "../plugins/router"
1210
import type { SystemInfo } from "../types"
13-
import type { UpdateValidationStatus } from "../types/update-validation-status"
1411
15-
const { updateDone } = useOverlaySpinner()
1612
const { showError } = useSnackbar()
1713
const { history } = useCentrifuge()
1814
19-
const updateStatus = ref("Recovered")
20-
const updateDoneDialog = ref(false)
2115
const currentVersion = ref<string>()
2216
const loadUpdatePayload = ref({
2317
update_file_path: ""
@@ -48,45 +42,14 @@ const loadUpdateData = (filename: string) => {
4842
loadUpdate(false)
4943
}
5044
51-
const checkUpdateState = (data: UpdateValidationStatus) => {
52-
updateStatus.value = data.status
53-
}
54-
5545
onMounted(() => {
56-
updateDone.on(() => {
57-
data.value = undefined
58-
history(checkUpdateState, CentrifugeSubscriptionType.UpdateStatus)
59-
updateDoneDialog.value = true
60-
})
61-
6246
history((data: SystemInfo) => {
6347
currentVersion.value = data.os.version
6448
}, CentrifugeSubscriptionType.SystemInfo)
6549
})
6650
</script>
6751

6852
<template>
69-
<v-dialog persistent v-model="updateDoneDialog" width="25vw" :no-click-animation="true">
70-
<DialogContent v-if="updateStatus === 'Succeeded'" title="Update done" dialog-type="default"
71-
:show-close="false">
72-
<div class="flex flex-col gap-2 mb-8 items-center">
73-
<v-icon size="128" icon="mdi-checkbox-marked-circle-outline" color="success"></v-icon>
74-
<strong class="text-xl">Update installed successfully</strong>
75-
</div>
76-
<div class="flex justify-end -mr-4 mt-4">
77-
<v-btn variant="text" color="primary" @click="updateDoneDialog = false">OK</v-btn>
78-
</div>
79-
</DialogContent>
80-
<DialogContent v-else title="Update failed" dialog-type="Warning" :show-close="false">
81-
<div class="flex flex-col gap-2 mb-8 items-center">
82-
<v-icon size="128" icon="mdi-alert-circle-outline" color="warning"></v-icon>
83-
<strong class="text-xl">Update installation failed and recovered to previous version.</strong>
84-
</div>
85-
<div class="flex justify-end -mr-4 mt-4">
86-
<v-btn variant="text" color="primary" @click="updateDoneDialog = false">OK</v-btn>
87-
</div>
88-
</DialogContent>
89-
</v-dialog>
9053
<v-sheet :border="true" rounded class="m-20">
9154
<v-row class="m-8">
9255
<v-col sm="12" xl="6">

0 commit comments

Comments
 (0)