1- import type { VoidComponent } from 'solid-js'
1+ import { createEffect , createSignal , on , type VoidComponent } from 'solid-js'
22import { createStore } from 'solid-js/store'
33import clsx from 'clsx'
44
@@ -7,7 +7,8 @@ import Button from './material/Button'
77import { uploadAllSegments , type FileType } from '~/api/upload'
88import 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 ]
1112type ButtonState = 'idle' | 'loading' | 'success' | 'error'
1213
1314const 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