Skip to content

Commit e7e897e

Browse files
fix: reset upload btn state on new route selection (commaai#340)
same purpose as commaai/connect#338 (GH closed my PR when i rebased and dropped the commit) https://github.com/user-attachments/assets/31471d8a-cc93-492e-b880-04a0feeb4c62 Co-authored-by: Cameron Clough <cameronjclough@gmail.com>
1 parent 0507b64 commit e7e897e

File tree

1 file changed

+26
-6
lines changed

1 file changed

+26
-6
lines changed

src/components/RouteUploadButtons.tsx

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { VoidComponent } from 'solid-js'
1+
import { createEffect, createSignal, on, type VoidComponent } from 'solid-js'
22
import { createStore } from 'solid-js/store'
33
import clsx from 'clsx'
44

@@ -7,7 +7,8 @@ import Button from './material/Button'
77
import { uploadAllSegments, type FileType } from '~/api/upload'
88
import type { Route } from '~/types'
99

10-
type ButtonType = 'road' | 'driver' | 'logs' | 'route'
10+
const BUTTON_TYPES = ['road', 'driver', 'logs', 'route']
11+
type ButtonType = (typeof BUTTON_TYPES)[number]
1112
type ButtonState = 'idle' | 'loading' | 'success' | 'error'
1213

1314
const BUTTON_TO_FILE_TYPES: Record<Exclude<ButtonType, 'route'>, FileType[]> = {
@@ -66,9 +67,28 @@ const RouteUploadButtons: VoidComponent<RouteUploadButtonsProps> = (props) => {
6667
route: 'idle',
6768
} as Record<ButtonType, ButtonState>,
6869
})
70+
const [abortController, setAbortController] = createSignal(new AbortController())
71+
72+
createEffect(
73+
on(
74+
() => props.route,
75+
() => {
76+
abortController().abort()
77+
setAbortController(new AbortController())
78+
setUploadStore('states', BUTTON_TYPES, 'idle')
79+
},
80+
),
81+
)
6982

7083
const handleUpload = async (type: ButtonType) => {
7184
if (!props.route) return
85+
const { fullname, maxqlog } = props.route
86+
const { signal } = abortController()
87+
88+
const updateButtonStates = (types: readonly ButtonType[], state: ButtonState) => {
89+
if (signal.aborted) return
90+
setUploadStore('states', types, state)
91+
}
7292

7393
const uploadButtonTypes: ButtonType[] = [type]
7494
const uploadFileTypes: FileType[] = []
@@ -79,13 +99,13 @@ const RouteUploadButtons: VoidComponent<RouteUploadButtonsProps> = (props) => {
7999
uploadFileTypes.concat(BUTTON_TO_FILE_TYPES[check])
80100
}
81101

82-
setUploadStore('states', uploadButtonTypes, 'loading')
102+
updateButtonStates(uploadButtonTypes, 'loading')
83103
try {
84-
await uploadAllSegments(props.route.fullname, props.route.maxqlog + 1, uploadFileTypes)
85-
setUploadStore('states', uploadButtonTypes, 'success')
104+
await uploadAllSegments(fullname, maxqlog + 1, uploadFileTypes)
105+
updateButtonStates(uploadButtonTypes, 'success')
86106
} catch (err) {
87107
console.error('Failed to upload', err)
88-
setUploadStore('states', uploadButtonTypes, 'error')
108+
updateButtonStates(uploadButtonTypes, 'error')
89109
}
90110
}
91111

0 commit comments

Comments
 (0)