Skip to content

Commit 3bda2a2

Browse files
Merge pull request #11486 from brave/site-permission-panel-improvements
Improvements to the Site Permissions Panel
2 parents 2225ce2 + b3742ea commit 3bda2a2

File tree

12 files changed

+228
-39
lines changed

12 files changed

+228
-39
lines changed

components/brave_wallet/browser/brave_wallet_constants.h

+4
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,10 @@ constexpr webui::LocalizedString kLocalizedStrings[] = {
375375
IDS_BRAVE_WALLET_SITE_PERMISSIONS_TITLE},
376376
{"braveWalletSitePermissionsDisconnect",
377377
IDS_BRAVE_WALLET_SITE_PERMISSIONS_DISCONNECT},
378+
{"braveWalletSitePermissionsSwitch",
379+
IDS_BRAVE_WALLET_SITE_PERMISSIONS_SWITCH},
380+
{"braveWalletSitePermissionsNewAccount",
381+
IDS_BRAVE_WALLET_SITE_PERMISSIONS_NEW_ACCOUNT},
378382
{"braveWalletPanelNotConnected", IDS_BRAVE_WALLET_PANEL_NOT_CONNECTED},
379383
{"braveWalletTransactionDetailBoxFunction",
380384
IDS_BRAVE_WALLET_TRANSACTION_DETAIL_BOX_FUNCTION},

components/brave_wallet_ui/common/actions/wallet_actions.ts

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
UpdateUnapprovedTransactionGasFieldsType,
2222
SitePermissionsPayloadType,
2323
RemoveSitePermissionPayloadType,
24+
AddSitePermissionPayloadType,
2425
UpdateUnapprovedTransactionSpendAllowanceType
2526
} from '../constants/action_types'
2627
import {
@@ -103,6 +104,7 @@ export const defaultBaseCurrencyChanged = createAction<DefaultBaseCurrencyChange
103104
export const defaultBaseCryptocurrencyChanged = createAction<DefaultBaseCryptocurrencyChanged>('defaultBaseCryptocurrencyChanged')
104105
export const setSitePermissions = createAction<SitePermissionsPayloadType>('setSitePermissions')
105106
export const removeSitePermission = createAction<RemoveSitePermissionPayloadType>('removeSitePermission')
107+
export const addSitePermission = createAction<AddSitePermissionPayloadType>('addSitePermission')
106108
export const queueNextTransaction = createAction('queueNextTransaction')
107109
export const refreshBalancesAndPrices = createAction('refreshBalancesAndPrices')
108110
export const setMetaMaskInstalled = createAction<boolean>('setMetaMaskInstalled')

components/brave_wallet_ui/common/async/handlers.ts

+6
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,12 @@ handler.on(WalletActions.removeSitePermission.getType(), async (store: Store, pa
603603
await refreshWalletInfo(store)
604604
})
605605

606+
handler.on(WalletActions.addSitePermission.getType(), async (store: Store, payload: RemoveSitePermissionPayloadType) => {
607+
const braveWalletService = getAPIProxy().braveWalletService
608+
await braveWalletService.addEthereumPermission(payload.origin, payload.account)
609+
await refreshWalletInfo(store)
610+
})
611+
606612
handler.on(WalletActions.transactionStatusChanged.getType(), async (store: Store, payload: TransactionStatusChanged) => {
607613
const status = payload.txInfo.txStatus
608614
if (status === TransactionStatus.Confirmed || status === TransactionStatus.Error) {

components/brave_wallet_ui/common/constants/action_types.ts

+5
Original file line numberDiff line numberDiff line change
@@ -102,3 +102,8 @@ export type RemoveSitePermissionPayloadType = {
102102
origin: string
103103
account: string
104104
}
105+
106+
export type AddSitePermissionPayloadType = {
107+
origin: string
108+
account: string
109+
}

components/brave_wallet_ui/components/extension/connected-account-item/index.tsx

+43-5
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,31 @@ import {
1111
NameAndAddressColumn,
1212
AccountCircle,
1313
LeftSide,
14-
DisconnectButton
14+
PrimaryButton,
15+
RightSide
1516
} from './style'
1617

1718
// Utils
1819
import { reduceAddress } from '../../../utils/reduce-address'
1920

2021
export interface Props {
22+
isActive: boolean
23+
hasPermission: boolean
2124
account: WalletAccountType
2225
onDisconnect: (address: string) => void
26+
onConnect: (account: WalletAccountType) => void
27+
onSwitchAccount: (account: WalletAccountType) => void
2328
}
2429

25-
const ConnectedAccountItem = (props: Props) => {
26-
const { account, onDisconnect } = props
30+
const SitePermissionAccountItem = (props: Props) => {
31+
const {
32+
account,
33+
isActive,
34+
hasPermission,
35+
onDisconnect,
36+
onConnect,
37+
onSwitchAccount
38+
} = props
2739

2840
const orb = React.useMemo(() => {
2941
return create({ seed: account.address.toLowerCase(), size: 8, scale: 16 }).toDataURL()
@@ -33,6 +45,14 @@ const ConnectedAccountItem = (props: Props) => {
3345
onDisconnect(account.address)
3446
}
3547

48+
const onClickConnect = () => {
49+
onConnect(account)
50+
}
51+
52+
const onClickSwitchAccount = () => {
53+
onSwitchAccount(account)
54+
}
55+
3656
return (
3757
<StyledWrapper>
3858
<LeftSide>
@@ -44,9 +64,27 @@ const ConnectedAccountItem = (props: Props) => {
4464
</AccountAddressText>
4565
</NameAndAddressColumn>
4666
</LeftSide>
47-
<DisconnectButton onClick={onClickDisconnect}>{getLocale('braveWalletSitePermissionsDisconnect')}</DisconnectButton>
67+
<RightSide>
68+
<PrimaryButton
69+
onClick={
70+
hasPermission
71+
? isActive
72+
? onClickDisconnect
73+
: onClickSwitchAccount
74+
: onClickConnect
75+
}
76+
>
77+
{
78+
hasPermission
79+
? isActive
80+
? getLocale('braveWalletSitePermissionsDisconnect')
81+
: getLocale('braveWalletSitePermissionsSwitch')
82+
: getLocale('braveWalletAddAccountConnect')
83+
}
84+
</PrimaryButton>
85+
</RightSide>
4886
</StyledWrapper>
4987
)
5088
}
5189

52-
export default ConnectedAccountItem
90+
export default SitePermissionAccountItem

components/brave_wallet_ui/components/extension/connected-account-item/style.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ export const LeftSide = styled.div`
2828
flex-direction: row;
2929
`
3030

31+
export const RightSide = styled.div`
32+
display: flex;
33+
align-items: center;
34+
justify-content: flex-end;
35+
flex-direction: column;
36+
margin-right: 10px;
37+
`
38+
3139
export const AccountCircle = styled.div<StyleProps>`
3240
width: 40px;
3341
height: 40px;
@@ -52,8 +60,8 @@ export const AccountAddressText = styled.span`
5260
color: ${(p) => p.theme.color.text02};
5361
`
5462

55-
export const DisconnectButton = styled(WalletButton) <Partial<StyleProps>>`
56-
display: flex;;
63+
export const PrimaryButton = styled(WalletButton) <Partial<StyleProps>>`
64+
display: flex;
5765
cursor: pointer;
5866
outline: none;
5967
border: none;
@@ -65,7 +73,7 @@ export const DisconnectButton = styled(WalletButton) <Partial<StyleProps>>`
6573
font-weight: 600;
6674
color: ${(p) => p.theme.color.interactive05};
6775
@media (prefers-color-scheme: dark) {
68-
color: ${(p) => p.theme.palette.white};
76+
color: ${(p) => p.theme.palette.blurple300};
6977
}
7078
letter-spacing: 0.01em;
7179
`

components/brave_wallet_ui/components/extension/site-permissions-panel/index.tsx

+62-23
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import * as React from 'react'
22
import { WalletAccountType } from '../../../constants/types'
33
import { getLocale } from '../../../../common/locale'
44
import {
5-
ConnectHeader,
65
DividerLine,
76
ConnectedAccountItem
87
} from '../'
@@ -12,43 +11,83 @@ import {
1211
StyledWrapper,
1312
AddressContainer,
1413
AddressScrollContainer,
15-
AccountsTitle
14+
AccountsTitle,
15+
SiteOriginTitle,
16+
HeaderRow,
17+
HeaderColumn,
18+
FavIcon,
19+
NewAccountButton
1620
} from './style'
17-
// import { getLocale } from '../../../../common/locale'
1821

1922
export interface Props {
20-
onDisconnect: (origin: string, address: string) => void
23+
onDisconnect: (origin: string, address: string, connectedAccounts: WalletAccountType[]) => void
24+
onConnect: (origin: string, address: WalletAccountType) => void
25+
onSwitchAccount: (account: WalletAccountType) => void
26+
onAddAccount: () => void
27+
selectedAccount: WalletAccountType
2128
siteURL: string
2229
connectedAccounts: WalletAccountType[]
30+
accounts: WalletAccountType[]
2331
}
2432

2533
const SitePermissions = (props: Props) => {
26-
const { siteURL, connectedAccounts, onDisconnect } = props
34+
const {
35+
siteURL,
36+
connectedAccounts,
37+
selectedAccount,
38+
accounts,
39+
onDisconnect,
40+
onConnect,
41+
onSwitchAccount,
42+
onAddAccount
43+
} = props
2744

2845
const onDisconnectFromOrigin = (address: string) => {
29-
onDisconnect(siteURL, address)
46+
const newConnectedAccounts = connectedAccounts.filter((accounts) => accounts.address.toLowerCase() !== address.toLowerCase())
47+
onDisconnect(siteURL, address, newConnectedAccounts)
3048
}
3149

50+
const onConnectToOrigin = (account: WalletAccountType) => {
51+
onConnect(siteURL, account)
52+
}
53+
54+
const onClickSwitchAccount = (account: WalletAccountType) => {
55+
onSwitchAccount(account)
56+
}
57+
58+
const checkForPermission = React.useCallback((address: string): boolean => {
59+
return connectedAccounts.some(account => account.address.toLowerCase() === address.toLowerCase())
60+
}, [connectedAccounts])
61+
62+
const checkIsActive = React.useCallback((address: string): boolean => {
63+
return address.toLowerCase() === selectedAccount.address.toLowerCase()
64+
}, [selectedAccount])
65+
3266
return (
3367
<StyledWrapper>
34-
<ConnectHeader hideTitle={true} url={siteURL} />
68+
<HeaderRow>
69+
<FavIcon src={`chrome://favicon/size/64@1x/${siteURL}`} />
70+
<HeaderColumn>
71+
<SiteOriginTitle>{siteURL}</SiteOriginTitle>
72+
<AccountsTitle>{getLocale('braveWalletSitePermissionsAccounts').replace('$1', connectedAccounts.length.toString())}</AccountsTitle>
73+
</HeaderColumn>
74+
</HeaderRow>
3575
<AddressContainer>
36-
<AccountsTitle>{getLocale('braveWalletSitePermissionsAccounts').replace('$1', connectedAccounts.length.toString())}</AccountsTitle>
37-
{connectedAccounts.length !== 0 &&
38-
<>
39-
<DividerLine />
40-
<AddressScrollContainer>
41-
{connectedAccounts.map((account) => (
42-
<ConnectedAccountItem
43-
key={account.id}
44-
account={account}
45-
onDisconnect={onDisconnectFromOrigin}
46-
/>
47-
))}
48-
</AddressScrollContainer>
49-
<DividerLine />
50-
</>
51-
}
76+
<NewAccountButton onClick={onAddAccount}>{getLocale('braveWalletSitePermissionsNewAccount')}</NewAccountButton>
77+
<DividerLine />
78+
<AddressScrollContainer>
79+
{accounts.map((account) => (
80+
<ConnectedAccountItem
81+
isActive={checkIsActive(account.address)}
82+
key={account.id}
83+
account={account}
84+
onDisconnect={onDisconnectFromOrigin}
85+
onConnect={onConnectToOrigin}
86+
onSwitchAccount={onClickSwitchAccount}
87+
hasPermission={checkForPermission(account.address)}
88+
/>
89+
))}
90+
</AddressScrollContainer>
5291
</AddressContainer>
5392
</StyledWrapper>
5493
)
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import styled from 'styled-components'
2+
import { WalletButton } from '../../shared/style'
23

34
export const StyledWrapper = styled.div`
45
display: flex;
@@ -9,12 +10,29 @@ export const StyledWrapper = styled.div`
910
justify-content: flex-start;
1011
`
1112

12-
export const AddressContainer = styled.div`
13+
export const HeaderRow = styled.div`
1314
display: flex;
14-
flex-direction: column;
15+
flex-direction: row;
1516
align-items: center;
17+
justify-content: flex-start;
18+
width: 100%;
19+
padding: 4px 12px 12px ;
20+
`
21+
22+
export const HeaderColumn = styled.div`
23+
display: flex;
24+
flex-direction: column;
25+
align-items: flex-start;
1626
justify-content: center;
27+
`
28+
29+
export const AddressContainer = styled.div`
30+
display: flex;
31+
flex-direction: column;
32+
align-items: flex-start;
33+
justify-content: flex-start;
1734
width: 100%;
35+
height: 100%;
1836
`
1937

2038
export const AddressScrollContainer = styled.div`
@@ -23,24 +41,61 @@ export const AddressScrollContainer = styled.div`
2341
align-items: center;
2442
justify-content: flex-start;
2543
width: 100%;
44+
max-height: 240px;
2645
padding-top: 8px;
2746
padding-left: 10px;
2847
padding-right: 10px;
2948
overflow-y: scroll;
3049
overflow-x: hidden;
3150
position: relative;
32-
max-height: 104px;
3351
box-sizing: border-box;
3452
`
3553

54+
export const SiteOriginTitle = styled.span`
55+
font-family: Poppins;
56+
font-style: normal;
57+
font-size: 14px;
58+
line-height: 20px;
59+
letter-spacing: 0.01em;
60+
color: ${(p) => p.theme.color.text02};
61+
margin-bottom: 2px;
62+
`
63+
3664
export const AccountsTitle = styled.span`
3765
font-family: Poppins;
3866
font-style: normal;
3967
font-size: 12px;
4068
line-height: 18px;
4169
letter-spacing: 0.01em;
42-
margin-bottom: 12px;
4370
color: ${(p) => p.theme.color.text01};
44-
opacity: 0.7;
45-
margin-top: 20px;
71+
`
72+
73+
export const FavIcon = styled.img`
74+
width: 48px;
75+
height: 48px;
76+
border-radius: 5px;
77+
background-color: ${(p) => p.theme.palette.grey200};
78+
margin-left: 12px;
79+
margin-right: 12px;
80+
`
81+
82+
export const NewAccountButton = styled(WalletButton)`
83+
display: flex;
84+
cursor: pointer;
85+
outline: none;
86+
border: none;
87+
background: none;
88+
padding: 0px;
89+
margin: 0px;
90+
font-family: Poppins;
91+
font-size: 12px;
92+
line-height: 18px;
93+
font-weight: 600;
94+
margin-bottom: 8px;
95+
margin-left: 12px;
96+
color: ${(p) => p.theme.color.interactive05};
97+
@media (prefers-color-scheme: dark) {
98+
color: ${(p) => p.theme.palette.blurple300};
99+
}
100+
letter-spacing: 0.01em;
46101
`

0 commit comments

Comments
 (0)