1
1
import PermScanWifiIcon from '@mui/icons-material/PermScanWifi' ;
2
2
import { Button } from '@mui/material' ;
3
- import { useEffect , useState , useCallback , useRef } from 'react' ;
3
+ import { useRequest } from 'alova' ;
4
+ import { useState , useCallback , useRef } from 'react' ;
4
5
import { toast } from 'react-toastify' ;
5
6
6
7
import WiFiNetworkSelector from './WiFiNetworkSelector' ;
7
8
import type { FC } from 'react' ;
8
- import type { WiFiNetwork , WiFiNetworkList } from 'types' ;
9
9
import * as NetworkApi from 'api/network' ;
10
10
import { ButtonRow , FormLoader , SectionContent } from 'components' ;
11
11
12
12
import { useI18nContext } from 'i18n/i18n-react' ;
13
13
14
14
const NUM_POLLS = 10 ;
15
- const POLLING_FREQUENCY = 500 ;
16
-
17
- const compareNetworks = ( network1 : WiFiNetwork , network2 : WiFiNetwork ) => {
18
- if ( network1 . rssi < network2 . rssi ) return 1 ;
19
- if ( network1 . rssi > network2 . rssi ) return - 1 ;
20
- return 0 ;
21
- } ;
15
+ const POLLING_FREQUENCY = 1000 ;
22
16
23
17
const WiFiNetworkScanner : FC = ( ) => {
24
18
const { LL } = useI18nContext ( ) ;
25
19
26
20
const pollCount = useRef ( 0 ) ;
27
- const [ networkList , setNetworkList ] = useState < WiFiNetworkList > ( ) ;
28
21
const [ errorMessage , setErrorMessage ] = useState < string > ( ) ;
29
22
23
+ const { data : networkList , send : getNetworkList } = useRequest ( NetworkApi . listNetworks , {
24
+ immediate : false
25
+ } ) ;
26
+
27
+ const {
28
+ send : scanNetworks ,
29
+ onSuccess : onSuccessScanNetworks ,
30
+ onError : onErrorScanNetworks
31
+ } = useRequest ( NetworkApi . scanNetworks ) ;
32
+
30
33
const finishedWithError = useCallback ( ( message : string ) => {
31
34
toast . error ( message ) ;
32
- setNetworkList ( undefined ) ;
33
35
setErrorMessage ( message ) ;
36
+ pollCount . current = 0 ;
34
37
} , [ ] ) ;
35
38
36
- const pollNetworkList = useCallback ( async ( ) => {
37
- try {
38
- const response = await NetworkApi . listNetworks ( ) ;
39
- if ( response . status === 202 ) {
40
- const completedPollCount = pollCount . current + 1 ;
41
- if ( completedPollCount < NUM_POLLS ) {
42
- pollCount . current = completedPollCount ;
43
- setTimeout ( pollNetworkList , POLLING_FREQUENCY ) ;
44
- } else {
45
- finishedWithError ( LL . PROBLEM_LOADING ( ) ) ;
46
- }
47
- } else {
48
- const newNetworkList = response . data ;
49
- newNetworkList . networks . sort ( compareNetworks ) ;
50
- setNetworkList ( newNetworkList ) ;
51
- }
52
- } catch ( error ) {
53
- if ( error . response ) {
54
- finishedWithError ( LL . PROBLEM_LOADING ( ) + ' ' + error . response ?. data . message ) ;
39
+ onErrorScanNetworks ( ( event ) => {
40
+ console . log ( 'onErrorScanNetworks' ) ; // TODO fix
41
+ if ( event . error ?. message === 'Wait' ) {
42
+ // 202
43
+ console . log ( 'not ready...: ' , event . error ?. message ) ; // TODO fix
44
+ const completedPollCount = pollCount . current + 1 ;
45
+ if ( completedPollCount < NUM_POLLS ) {
46
+ pollCount . current = completedPollCount ;
47
+ setTimeout ( scanNetworks , POLLING_FREQUENCY ) ;
55
48
} else {
56
49
finishedWithError ( LL . PROBLEM_LOADING ( ) ) ;
57
50
}
51
+ } else {
52
+ finishedWithError ( LL . PROBLEM_LOADING ( ) ) ;
58
53
}
59
- } , [ finishedWithError , LL ] ) ;
54
+ } ) ;
60
55
61
- const startNetworkScan = useCallback ( async ( ) => {
56
+ onSuccessScanNetworks ( ( ) => {
57
+ console . log ( 'onCompleteScanNetworks' ) ; // TODO fix
62
58
pollCount . current = 0 ;
63
- setNetworkList ( undefined ) ;
64
- setErrorMessage ( undefined ) ;
65
- try {
66
- await NetworkApi . scanNetworks ( ) ;
67
- setTimeout ( pollNetworkList , POLLING_FREQUENCY ) ;
68
- } catch ( error ) {
69
- if ( error . response ) {
70
- finishedWithError ( LL . PROBLEM_LOADING ( ) + ' ' + error . response ?. data . message ) ;
71
- } else {
72
- finishedWithError ( LL . PROBLEM_LOADING ( ) ) ;
73
- }
74
- }
75
- } , [ finishedWithError , pollNetworkList , LL ] ) ;
76
-
77
- useEffect ( ( ) => {
78
- void startNetworkScan ( ) ;
79
- } , [ startNetworkScan ] ) ;
59
+ void getNetworkList ( ) ; // fetch the list
60
+ } ) ;
80
61
81
62
const renderNetworkScanner = ( ) => {
82
63
if ( ! networkList ) {
@@ -93,7 +74,7 @@ const WiFiNetworkScanner: FC = () => {
93
74
startIcon = { < PermScanWifiIcon /> }
94
75
variant = "outlined"
95
76
color = "secondary"
96
- onClick = { startNetworkScan }
77
+ onClick = { scanNetworks }
97
78
disabled = { ! errorMessage && ! networkList }
98
79
>
99
80
{ LL . SCAN_AGAIN ( ) } …
0 commit comments