Skip to content
This repository was archived by the owner on Nov 10, 2023. It is now read-only.

Commit ca494ff

Browse files
author
Diogo Soares
committed
edit delegate label
1 parent 7501928 commit ca494ff

File tree

4 files changed

+143
-26
lines changed

4 files changed

+143
-26
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import { ReactElement } from 'react'
2+
3+
import { getExplorerInfo } from 'src/config'
4+
import Field from 'src/components/forms/Field'
5+
import GnoForm from 'src/components/forms/GnoForm'
6+
import TextField from 'src/components/forms/TextField'
7+
import { composeValidators, required, validAddressBookName } from 'src/components/forms/validator'
8+
import Block from 'src/components/layout/Block'
9+
import Hairline from 'src/components/layout/Hairline'
10+
import Row from 'src/components/layout/Row'
11+
import Modal, { Modal as GenericModal } from 'src/components/Modal'
12+
import PrefixedEthHashInfo from 'src/components/PrefixedEthHashInfo'
13+
import { ModalHeader } from 'src/routes/safe/components/Balances/SendModal/screens/ModalHeader'
14+
15+
import { useStyles } from './style'
16+
17+
type EditDelegateModalProps = {
18+
isOpen: boolean
19+
onClose: () => void
20+
delegate: string
21+
onSubmit: (label: string) => void
22+
}
23+
24+
export const EditDelegateModal = ({ isOpen, onClose, delegate, onSubmit }: EditDelegateModalProps): ReactElement => {
25+
const classes = useStyles()
26+
27+
const handleSubmit = ({ label }: { label: string }): void => {
28+
console.log('submit label', label)
29+
onSubmit(label)
30+
onClose()
31+
}
32+
33+
return (
34+
<Modal description="Edit delegate label" handleClose={onClose} open={isOpen} title="Edit delegate label">
35+
<ModalHeader onClose={onClose} title="Edit delegate label" />
36+
<Hairline />
37+
<GnoForm onSubmit={handleSubmit} subscription={{ pristine: true }}>
38+
{(...args) => {
39+
const pristine = args[2].pristine
40+
return (
41+
<>
42+
<Block className={classes.container}>
43+
<Row margin="md">
44+
<Field
45+
component={TextField}
46+
name="label"
47+
placeholder="Label"
48+
label="Label*"
49+
type="text"
50+
validate={composeValidators(required, validAddressBookName)}
51+
/>
52+
</Row>
53+
<Row>
54+
<Block justify="center">
55+
<PrefixedEthHashInfo
56+
hash={delegate}
57+
showCopyBtn
58+
showAvatar
59+
explorerUrl={getExplorerInfo(delegate)}
60+
/>
61+
</Block>
62+
</Row>
63+
</Block>
64+
<GenericModal.Footer>
65+
<GenericModal.Footer.Buttons
66+
cancelButtonProps={{ onClick: onClose }}
67+
confirmButtonProps={{ disabled: pristine, text: 'Save' }}
68+
/>
69+
</GenericModal.Footer>
70+
</>
71+
)
72+
}}
73+
</GnoForm>
74+
</Modal>
75+
)
76+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { createStyles, makeStyles } from '@material-ui/core'
2+
3+
import { lg, md } from 'src/theme/variables'
4+
5+
export const useStyles = makeStyles(
6+
createStyles({
7+
heading: {
8+
padding: lg,
9+
justifyContent: 'space-between',
10+
boxSizing: 'border-box',
11+
height: '74px',
12+
},
13+
manage: {
14+
fontSize: lg,
15+
},
16+
container: {
17+
padding: `${md} ${lg}`,
18+
minHeight: '200px',
19+
},
20+
close: {
21+
height: '35px',
22+
width: '35px',
23+
},
24+
}),
25+
)

src/routes/safe/components/Settings/Delegates/index.tsx

Lines changed: 42 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import { currentSafeWithNames } from 'src/logic/safe/store/selectors'
1414
import { getChainInfo, getExplorerInfo } from 'src/config'
1515
import { checksumAddress } from 'src/utils/checksumAddress'
1616
import { getWeb3 } from 'src/logic/wallets/getWeb3'
17-
import { AddDelegateModal } from 'src/routes/safe/components/Settings/Delegates/AddDelegateModal'
1817
import { userAccountSelector } from 'src/logic/wallets/store/selectors'
1918
import Table from 'src/components/Table'
2019
import { cellWidth } from 'src/components/Table/TableHead'
@@ -23,8 +22,9 @@ import { styles } from './style'
2322
import PrefixedEthHashInfo from 'src/components/PrefixedEthHashInfo'
2423
import Row from 'src/components/layout/Row'
2524
import ButtonHelper from 'src/components/ButtonHelper'
26-
import { grantedSelector } from 'src/routes/safe/container/selector'
25+
import { AddDelegateModal } from 'src/routes/safe/components/Settings/Delegates/AddDelegateModal'
2726
import { RemoveDelegateModal } from 'src/routes/safe/components/Settings/Delegates/RemoveDelegateModal'
27+
import { EditDelegateModal } from 'src/routes/safe/components/Settings/Delegates/EditDelegateModal'
2828

2929
// TODO: these types will come from the Client GW SDK once #72 is merged
3030
type Page<T> = {
@@ -56,10 +56,11 @@ const useStyles = makeStyles(styles)
5656
const Delegates = (): ReactElement => {
5757
const { address: safeAddress } = useSelector(currentSafeWithNames)
5858
const userAccount = useSelector(userAccountSelector)
59-
const granted = useSelector(grantedSelector)
6059
const { transactionService } = getChainInfo()
6160
const [delegatesList, setDelegatesList] = useState<DelegateResponse['results']>([])
6261
const [addDelegateModalOpen, setAddDelegateModalOpen] = useState<boolean>(false)
62+
const [editDelegateModalOpen, setEditDelegateModalOpen] = useState<boolean>(false)
63+
const [delegateToEdit, setDelegateToEdit] = useState<string>('')
6364
const [removeDelegateModalOpen, setRemoveDelegateModalOpen] = useState<boolean>(false)
6465
const [addressToRemove, setAddressToRemove] = useState<string>('')
6566
const columns = generateColumns()
@@ -118,6 +119,32 @@ const Delegates = (): ReactElement => {
118119
})
119120
}
120121

122+
const handleEditDelegateLabel = async (label) => {
123+
// close Edit delegate modal
124+
setEditDelegateModalOpen(false)
125+
126+
const delegate = checksumAddress(delegateToEdit)
127+
const signature = await getSignature(delegate)
128+
129+
const requestOptions = {
130+
method: 'POST',
131+
headers: { 'Content-type': 'application/json' },
132+
body: JSON.stringify({
133+
safe: safeAddress,
134+
delegate: delegate,
135+
signature: signature,
136+
label: label,
137+
}),
138+
}
139+
140+
const url = `${transactionService}/api/v1/safes/${safeAddress}/delegates/`
141+
fetch(url, requestOptions)
142+
.then((response) => response.json())
143+
.then(() => {
144+
fetchDelegates()
145+
})
146+
}
147+
121148
const handleRemoveDelegate = async (address: string) => {
122149
// close Remove delegate modal
123150
setRemoveDelegateModalOpen(false)
@@ -187,32 +214,24 @@ const Delegates = (): ReactElement => {
187214
<Row align="end" className={classes.actions}>
188215
<ButtonHelper
189216
onClick={() => {
190-
// setSelectedEntry({
191-
// entry: row,
192-
// isOwnerAddress: userOwner,
193-
// })
194-
// setEditCreateEntryModalOpen(true)
217+
setDelegateToEdit(row[DELEGATE_ADDRESS_ID])
218+
setEditDelegateModalOpen(true)
195219
}}
196220
>
197-
<Icon
198-
size="sm"
199-
type="edit"
200-
tooltip="Edit delegate"
201-
className={granted ? classes.editEntryButton : classes.editEntryButtonNonOwner}
202-
/>
221+
<Icon size="sm" type="edit" tooltip="Edit delegate" className={classes.editEntryButton} />
203222
</ButtonHelper>
204223
<ButtonHelper
205224
onClick={() => {
206-
setRemoveDelegateModalOpen(true)
207225
setAddressToRemove(row[DELEGATE_ADDRESS_ID])
226+
setRemoveDelegateModalOpen(true)
208227
}}
209228
>
210229
<Icon
211230
size="sm"
212231
type="delete"
213232
color="error"
214233
tooltip="Remove delegate"
215-
className={granted ? classes.removeEntryButton : classes.removeEntryButtonNonOwner}
234+
className={classes.removeEntryButton}
216235
/>
217236
</ButtonHelper>
218237
</Row>
@@ -228,13 +247,16 @@ const Delegates = (): ReactElement => {
228247
onClose={() => setAddDelegateModalOpen(false)}
229248
onSubmit={handleAddDelegate}
230249
/>
250+
<EditDelegateModal
251+
delegate={delegateToEdit}
252+
isOpen={editDelegateModalOpen}
253+
onClose={() => setEditDelegateModalOpen(false)}
254+
onSubmit={handleEditDelegateLabel}
255+
/>
231256
<RemoveDelegateModal
232257
delegateToDelete={addressToRemove}
233258
isOpen={removeDelegateModalOpen}
234-
onClose={() => {
235-
setRemoveDelegateModalOpen(false)
236-
setAddressToRemove('')
237-
}}
259+
onClose={() => setRemoveDelegateModalOpen(false)}
238260
onSubmit={handleRemoveDelegate}
239261
/>
240262
</StyledBlock>

src/routes/safe/components/Settings/Delegates/style.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,12 @@ export const styles = createStyles({
4040
editEntryButton: {
4141
cursor: 'pointer',
4242
},
43-
editEntryButtonNonOwner: {
44-
cursor: 'pointer',
45-
},
4643
removeEntryButton: {
4744
cursor: 'pointer',
4845
},
4946
removeEntryButtonDisabled: {
5047
cursor: 'default',
5148
},
52-
removeEntryButtonNonOwner: {
53-
cursor: 'pointer',
54-
},
5549
leftIcon: {
5650
marginRight: sm,
5751
},

0 commit comments

Comments
 (0)