1
- import React , { useEffect , useState } from 'react' ;
1
+ import React , { useEffect , useReducer , useState } from 'react' ;
2
2
import { Button , Col , Form , InputGroup , OverlayTrigger , Tooltip } from "react-bootstrap" ;
3
3
import AddAggregatorModal from "./AddAggregatorModal" ;
4
+ import { initAggregatorList , aggregatorListReducer } from "./reducer" ;
4
5
5
6
export default function AggregatorSetter ( props ) {
6
- const CUSTOM_AGGREGATORS_KEY = "CUSTOM_AGGREGATORS" ;
7
- const [ availableAggregators , setAvailableAggregators ] = useState ( [ ] ) ;
8
7
const [ showAddModal , toggleAddModal ] = useState ( false ) ;
9
- const [ canRemoveSelected , setCanRemoveSelected ] = useState ( false ) ;
10
-
11
- useEffect ( ( ) => {
12
- setAvailableAggregators ( getAggregatorsList ( ) ) ;
13
- } , [ props . defaultAvailableAggregators ] ) ;
14
-
8
+ const [ state , dispatch ] =
9
+ useReducer (
10
+ aggregatorListReducer ,
11
+ [ props . aggregator , props . defaultAvailableAggregators ] ,
12
+ initAggregatorList ) ;
13
+
15
14
useEffect ( ( ) => {
16
- setCanRemoveSelected ( ! props . defaultAvailableAggregators . includes ( props . aggregator ) ) ;
17
-
18
- let aggregators = getAggregatorsList ( ) ;
19
- if ( ! aggregators . includes ( props . aggregator ) ) {
20
- aggregators . push ( props . aggregator ) ;
21
- saveCustomAggregatorSources ( aggregators ) ;
22
- setAvailableAggregators ( aggregators ) ;
23
- }
24
- } , [ props . aggregator ] ) ;
25
-
26
- function getAggregatorsList ( ) {
27
- let aggregators = [ ...props . defaultAvailableAggregators ] ;
28
-
29
- const storedAggregators = JSON . parse ( localStorage . getItem ( CUSTOM_AGGREGATORS_KEY ) ) ;
30
- if ( storedAggregators ) {
31
- aggregators = aggregators . concat ( storedAggregators ) ;
32
- }
33
-
34
- return aggregators ;
35
- }
36
-
37
- function handleChange ( aggregator ) {
15
+ const aggregator = props . aggregator ;
16
+ dispatch ( { type : 'addAggregator' , aggregator : aggregator } ) ;
38
17
props . onAggregatorChange ( aggregator ) ;
39
- }
18
+ } , [ props . aggregator ] ) ;
40
19
41
20
function copySelected ( ) {
42
21
if ( window . isSecureContext && props . aggregator ) {
43
22
navigator . clipboard . writeText ( props . aggregator ) . then ( ( ) => { } ) ;
44
23
}
45
24
}
46
25
47
- function showAddAggregatorSourceModal ( ) {
48
- toggleAddModal ( true ) ;
49
- }
50
-
51
- function hideAddAggregatorSourceModal ( ) {
52
- toggleAddModal ( false ) ;
26
+ function handleChange ( aggregator ) {
27
+ dispatch ( { type : 'aggregatorSelected' , aggregator : aggregator } ) ;
28
+ props . onAggregatorChange ( aggregator ) ;
53
29
}
54
30
55
31
function addAggregatorSource ( aggregator ) {
56
- if ( availableAggregators . includes ( aggregator ) ) {
57
- return ;
58
- }
59
-
60
- const aggregators = [ ...availableAggregators , aggregator ] ;
61
- setAvailableAggregators ( aggregators ) ;
62
- handleChange ( aggregator ) ;
63
- saveCustomAggregatorSources ( aggregators ) ;
32
+ props . onAggregatorChange ( aggregator ) ;
64
33
}
65
34
66
35
function deleteSelectedAggregatorSource ( ) {
67
- if ( ! canRemoveSelected ) {
68
- return ;
69
- }
70
-
71
- const aggregators = availableAggregators . filter ( a => a !== props . aggregator ) ;
72
- setAvailableAggregators ( aggregators ) ;
73
- handleChange ( availableAggregators . at ( 0 ) ) ;
74
- saveCustomAggregatorSources ( aggregators ) ;
75
- }
76
-
77
- function saveCustomAggregatorSources ( aggregators ) {
78
- const customAggregators = aggregators . filter ( a => ! props . defaultAvailableAggregators . includes ( a ) ) ;
79
- localStorage . setItem ( CUSTOM_AGGREGATORS_KEY , JSON . stringify ( customAggregators ) ) ;
36
+ dispatch ( { type : 'deleteSelected' , aggregator : props . aggregator } ) ;
37
+ props . onAggregatorChange ( state . availableAggregators . at ( 0 ) ) ;
80
38
}
81
39
82
40
return (
83
41
< >
84
42
< AddAggregatorModal
85
43
show = { showAddModal }
86
44
onAdd = { addAggregatorSource }
87
- onAskClose = { hideAddAggregatorSourceModal } />
45
+ onAskClose = { ( ) => toggleAddModal ( false ) } />
88
46
89
47
< Form . Group as = { Col } className = { props . className } >
90
48
< Form . Label > Aggregator:</ Form . Label >
91
49
< InputGroup >
92
- < Button variant = "outline-success" onClick = { showAddAggregatorSourceModal } >
50
+ < Button variant = "outline-success" onClick = { ( ) => toggleAddModal ( true ) } >
93
51
< i className = "bi bi-plus-circle" > </ i >
94
52
</ Button >
95
- { canRemoveSelected &&
53
+ { state . canRemoveSelected &&
96
54
< >
97
55
< Button variant = "outline-danger" onClick = { deleteSelectedAggregatorSource } >
98
56
< i className = "bi bi-dash-circle" > </ i >
@@ -105,7 +63,7 @@ export default function AggregatorSetter(props) {
105
63
</ >
106
64
}
107
65
< Form . Select value = { props . aggregator } onChange = { e => handleChange ( e . target . value ) } >
108
- { availableAggregators . map ( ( aggregator , index ) =>
66
+ { state . availableAggregators . map ( ( aggregator , index ) =>
109
67
< option key = { "agg-" + index } value = { aggregator } > { aggregator } </ option >
110
68
) }
111
69
</ Form . Select >
0 commit comments