@@ -3,12 +3,83 @@ import { useSelectorTyped } from "../../../../../store/rootReducer";
3
3
import { shallowEqual , useDispatch } from "react-redux" ;
4
4
import { AddRemote } from "./AddRemote" ;
5
5
import { ActionUI } from "../../../../../store/slices/UiSlice" ;
6
- import { FaTrash } from "react-icons/fa" ;
6
+ import { FaPen , FaTrash } from "react-icons/fa" ;
7
7
import { IRemoteInfo } from "common_library" ;
8
8
import { IpcUtils } from "../../../../../lib/utils/IpcUtils" ;
9
9
import { ModalData } from "../../../../modals/ModalData" ;
10
10
import { ActionModals } from "../../../../../store" ;
11
- import { EnumModals } from "../../../../../lib" ;
11
+ import { EnumModals , useMultiState } from "../../../../../lib" ;
12
+ import { Form } from "react-bootstrap" ;
13
+ import { AppButton } from "../../../../common" ;
14
+
15
+ interface ISingleRemoteProps {
16
+ url :string ;
17
+ name :string ;
18
+ handleRemove :( ) => void ;
19
+ onUpdate :( url :string ) => void ;
20
+
21
+ }
22
+
23
+ interface ISingleRemoteState {
24
+ isEditing :boolean ;
25
+ value :string ;
26
+ }
27
+
28
+ function SingleRemote ( props :ISingleRemoteProps ) {
29
+ const [ state , setState ] = useMultiState < ISingleRemoteState > ( { isEditing :false , value :props . url } ) ;
30
+ const dispatch = useDispatch ( ) ;
31
+ const handleSave = ( ) => {
32
+ setState ( { isEditing :false } ) ;
33
+ props . onUpdate ( state . value ) ;
34
+ }
35
+
36
+ const handleCancel = ( ) => {
37
+ setState ( { isEditing :false , value :props . url } ) ;
38
+ }
39
+
40
+ const handleRemove = ( ) => {
41
+ const yesHandler = ( ) => {
42
+ props . handleRemove ( ) ;
43
+ }
44
+ ModalData . confirmationModal . YesHandler = yesHandler ;
45
+ ModalData . confirmationModal . message = "Remove remote '" + props . name + "' ?" ;
46
+ dispatch ( ActionModals . showModal ( EnumModals . CONFIRMATION ) ) ;
47
+ }
48
+
49
+ useEffect ( ( ) => {
50
+ setState ( { value :props . url } ) ;
51
+ } , [ props . url ] ) ;
52
+
53
+ return < div className = "d-flex border w-100 align-items-center" >
54
+ < div className = "flex-grow-1" >
55
+ < div className = "d-flex" >
56
+ < b className = "" > { props . name } </ b >
57
+ </ div >
58
+ < div >
59
+ { ! state . isEditing && < span > { props . url } </ span > }
60
+ { state . isEditing &&
61
+ < div className = "d-flex align-items-center pt-1" >
62
+ < Form . Control type = "text" value = { state . value } onChange = { e => setState ( { value :e . target . value } ) } />
63
+
64
+ < div className = "px-2 d-flex align-items-center" >
65
+ < span className = "pe-3" >
66
+ < AppButton text = "Save" className = "text-primary" onClick = { ( ) => handleSave ( ) } />
67
+ </ span >
68
+ < AppButton text = "Cancel" className = "text-danger hover-brighter" title = "Remove" onClick = { _ => handleCancel ( ) } />
69
+ </ div >
70
+ </ div >
71
+ }
72
+ </ div >
73
+ </ div >
74
+ { ! state . isEditing && < div className = "px-2" >
75
+ < span className = "pe-3" >
76
+ < FaPen className = "text-primary" onClick = { ( ) => setState ( { isEditing :true } ) } />
77
+ </ span >
78
+ < FaTrash className = "text-danger hover-brighter" title = "Remove" onClick = { _ => handleRemove ( ) } />
79
+ </ div > }
80
+
81
+ </ div >
82
+ }
12
83
13
84
function RemoteListComponent ( ) {
14
85
const store = useSelectorTyped ( state => ( {
@@ -22,15 +93,15 @@ function RemoteListComponent(){
22
93
} , [ ] )
23
94
24
95
const handleRemove = ( remote :IRemoteInfo ) => {
25
- const remoteHandler = ( ) => {
26
- IpcUtils . removeRemote ( remote . name ) . then ( _ => {
27
- dispatch ( ActionUI . increamentVersion ( "remoteList" ) ) ;
28
- } )
29
- }
30
- ModalData . confirmationModal . YesHandler = remoteHandler ;
31
- ModalData . confirmationModal . message = "Remove remote '" + remote . name + "' ?" ;
32
- dispatch ( ActionModals . showModal ( EnumModals . CONFIRMATION ) ) ;
96
+ IpcUtils . removeRemote ( remote . name ) . then ( _ => {
97
+ dispatch ( ActionUI . increamentVersion ( "remoteList" ) ) ;
98
+ } )
99
+ }
33
100
101
+ const handleUpdate = ( remote :IRemoteInfo , url :string ) => {
102
+ IpcUtils . runRemote ( [ "set-url" , remote . name , url ] ) . then ( _ => {
103
+ dispatch ( ActionUI . increamentVersion ( "remoteList" ) ) ;
104
+ } ) ;
34
105
}
35
106
36
107
return < div className = "w-100 p-1" >
@@ -39,20 +110,8 @@ function RemoteListComponent(){
39
110
</ div >
40
111
{
41
112
store . remotes . map ( r => (
42
- < div key = { r . url + r . name } className = "d-flex border w-100 align-items-center" >
43
- < div className = "flex-grow-1" >
44
- < div className = "d-flex" >
45
- < b className = "" > { r . name } </ b >
46
- </ div >
47
- < div >
48
- < span > { r . url } </ span >
49
- </ div >
50
- </ div >
51
- < div className = "pe-2" >
52
- < FaTrash className = "text-danger hover-brighter" title = "Remove" onClick = { _ => handleRemove ( r ) } />
53
- </ div >
54
- </ div >
55
-
113
+ < SingleRemote key = { r . url + r . name } handleRemove = { ( ) => handleRemove ( r ) } name = { r . name } url = { r . url }
114
+ onUpdate = { ( url ) => handleUpdate ( r , url ) } />
56
115
) )
57
116
}
58
117
</ div >
0 commit comments