Skip to content

Commit 59bd344

Browse files
committed
Add Safenet styles to MultiAccountItem
1 parent 83b21db commit 59bd344

File tree

3 files changed

+101
-60
lines changed

3 files changed

+101
-60
lines changed

apps/web/src/features/myAccounts/components/AccountItems/MultiAccountItem.tsx

Lines changed: 78 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,62 @@
1+
import ChainIndicator from '@/components/common/ChainIndicator'
2+
import FiatValue from '@/components/common/FiatValue'
3+
import SafeIcon from '@/components/common/SafeIcon'
4+
import MultiAccountContextMenu from '@/components/sidebar/SafeListContextMenu/MultiAccountContextMenu'
5+
import { AppRoutes } from '@/config/routes'
16
import { selectUndeployedSafes } from '@/features/counterfactual/store/undeployedSafesSlice'
7+
import { isPredictedSafeProps } from '@/features/counterfactual/utils'
28
import NetworkLogosList from '@/features/multichain/components/NetworkLogosList'
3-
import { showNotification } from '@/store/notificationsSlice'
9+
import { getSafeSetups, getSharedSetup, hasMultiChainAddNetworkFeature } from '@/features/multichain/utils/utils'
410
import SingleAccountItem from '@/features/myAccounts/components/AccountItems/SingleAccountItem'
5-
import type { SafeOverview } from '@safe-global/safe-gateway-typescript-sdk'
6-
import { useCallback, useMemo, useState } from 'react'
11+
import { type SafeItem } from '@/features/myAccounts/hooks/useAllSafes'
12+
import { type MultiChainSafeItem } from '@/features/myAccounts/hooks/useAllSafesGrouped'
13+
import { getComparator } from '@/features/myAccounts/utils/utils'
14+
import useHasSafenetFeature from '@/features/safenet/hooks/useHasSafenetFeature'
15+
import useSafeAddress from '@/hooks/useSafeAddress'
16+
import useWallet from '@/hooks/wallets/useWallet'
17+
import BookmarkIcon from '@/public/images/apps/bookmark.svg'
18+
import BookmarkedIcon from '@/public/images/apps/bookmarked.svg'
19+
import SafenetLogo from '@/public/images/safenet/logo-safenet.svg'
20+
import { OVERVIEW_EVENTS, OVERVIEW_LABELS, PIN_SAFE_LABELS, trackEvent } from '@/services/analytics'
21+
import { useAppDispatch, useAppSelector } from '@/store'
22+
import { addOrUpdateSafe, pinSafe, selectAllAddedSafes, unpinSafe } from '@/store/addedSafesSlice'
23+
import { useGetMultipleSafeOverviewsQuery } from '@/store/api/gateway'
24+
import { selectChains } from '@/store/chainsSlice'
25+
import { showNotification } from '@/store/notificationsSlice'
26+
import { selectOrderByPreference } from '@/store/orderByPreferenceSlice'
27+
import { defaultSafeInfo } from '@/store/safeInfoSlice'
28+
import { useGetSafenetAccountQuery } from '@/store/safenet'
29+
import { selectCurrency } from '@/store/settingsSlice'
30+
import { sameAddress } from '@/utils/addresses'
31+
import { shortenAddress } from '@/utils/formatters'
732
import {
8-
ListItemButton,
9-
Box,
10-
Typography,
11-
Skeleton,
1233
Accordion,
1334
AccordionDetails,
1435
AccordionSummary,
36+
Box,
1537
Divider,
16-
Tooltip,
17-
SvgIcon,
1838
IconButton,
39+
ListItemButton,
40+
Skeleton,
41+
SvgIcon,
42+
Tooltip,
43+
Typography,
1944
} from '@mui/material'
20-
import SafeIcon from '@/components/common/SafeIcon'
21-
import { OVERVIEW_EVENTS, OVERVIEW_LABELS, PIN_SAFE_LABELS, trackEvent } from '@/services/analytics'
22-
import { AppRoutes } from '@/config/routes'
23-
import { useAppDispatch, useAppSelector } from '@/store'
24-
import css from './styles.module.css'
25-
import useSafeAddress from '@/hooks/useSafeAddress'
26-
import { sameAddress } from '@/utils/addresses'
45+
import type { SafeOverview } from '@safe-global/safe-gateway-typescript-sdk'
2746
import classnames from 'classnames'
2847
import { useRouter } from 'next/router'
29-
import FiatValue from '@/components/common/FiatValue'
30-
import { type MultiChainSafeItem } from '@/features/myAccounts/hooks/useAllSafesGrouped'
31-
import { shortenAddress } from '@/utils/formatters'
32-
import { type SafeItem } from '@/features/myAccounts/hooks/useAllSafes'
33-
import { getSafeSetups, getSharedSetup, hasMultiChainAddNetworkFeature } from '@/features/multichain/utils/utils'
48+
import { useCallback, useMemo, useState } from 'react'
3449
import { AddNetworkButton } from '../AddNetworkButton'
35-
import { isPredictedSafeProps } from '@/features/counterfactual/utils'
36-
import ChainIndicator from '@/components/common/ChainIndicator'
37-
import MultiAccountContextMenu from '@/components/sidebar/SafeListContextMenu/MultiAccountContextMenu'
38-
import { useGetMultipleSafeOverviewsQuery } from '@/store/api/gateway'
39-
import useWallet from '@/hooks/wallets/useWallet'
40-
import { selectCurrency } from '@/store/settingsSlice'
41-
import { selectChains } from '@/store/chainsSlice'
42-
import BookmarkIcon from '@/public/images/apps/bookmark.svg'
43-
import BookmarkedIcon from '@/public/images/apps/bookmarked.svg'
44-
import { addOrUpdateSafe, pinSafe, selectAllAddedSafes, unpinSafe } from '@/store/addedSafesSlice'
45-
import { defaultSafeInfo } from '@/store/safeInfoSlice'
46-
import { selectOrderByPreference } from '@/store/orderByPreferenceSlice'
47-
import { getComparator } from '@/features/myAccounts/utils/utils'
48-
import dynamic from 'next/dynamic'
49-
50-
const GradientBoxSafenet = dynamic(() => import('@/features/safenet/components/GradientBoxSafenet'))
50+
import css from './styles.module.css'
5151

5252
type MultiAccountItemProps = {
5353
multiSafeAccountItem: MultiChainSafeItem
5454
safeOverviews?: SafeOverview[]
5555
onLinkClick?: () => void
56-
isSafenetEnabled?: boolean
56+
hasSafenetFeature?: boolean
5757
}
5858

59-
const MultichainIndicator = ({ safes }: { safes: SafeItem[] }) => {
59+
const MultichainIndicator = ({ safes, showHasSafenet = false }: { safes: SafeItem[]; showHasSafenet?: boolean }) => {
6060
return (
6161
<Tooltip
6262
title={
@@ -72,7 +72,7 @@ const MultichainIndicator = ({ safes }: { safes: SafeItem[] }) => {
7272
arrow
7373
>
7474
<Box className={css.multiChains}>
75-
<NetworkLogosList networks={safes} showHasMore />
75+
<NetworkLogosList networks={safes} showHasMore showHasSafenet={showHasSafenet} />
7676
</Box>
7777
</Tooltip>
7878
)
@@ -127,10 +127,26 @@ function useMultiAccountItemData(multiSafeAccountItem: MultiChainSafeItem) {
127127

128128
const deployedChainIds = useMemo(() => sortedSafes.map((safe) => safe.chainId), [sortedSafes])
129129

130+
const hasSafenetFeature = useHasSafenetFeature()
131+
const { data: safenetConfig } = useGetSafenetAccountQuery({ safeAddress: address }, { skip: !hasSafenetFeature })
132+
133+
const usedSafenetChainIds = useMemo(
134+
() => (safenetConfig ? safenetConfig.safes.map((safe) => safe.chainId.toString()) : []),
135+
[safenetConfig],
136+
)
137+
const safenetSafes = useMemo(
138+
() => (safenetConfig ? sortedSafes.filter((safe) => usedSafenetChainIds.includes(safe.chainId)) : []),
139+
[safenetConfig, sortedSafes, usedSafenetChainIds],
140+
)
141+
const nonSafenetSafes = useMemo(
142+
() => (safenetConfig ? sortedSafes.filter((safe) => !usedSafenetChainIds.includes(safe.chainId)) : []),
143+
[safenetConfig, sortedSafes, usedSafenetChainIds],
144+
)
145+
130146
return {
131147
address,
132148
name,
133-
sortedSafes,
149+
sortedSafes: safenetConfig ? nonSafenetSafes : sortedSafes,
134150
safeOverviews,
135151
sharedSetup,
136152
totalFiatValue,
@@ -140,6 +156,7 @@ function useMultiAccountItemData(multiSafeAccountItem: MultiChainSafeItem) {
140156
isReadOnly,
141157
isWelcomePage,
142158
deployedChainIds,
159+
safenetSafes,
143160
}
144161
}
145162

@@ -217,7 +234,7 @@ function usePinActions(
217234
return { addToPinnedList, removeFromPinnedList }
218235
}
219236

220-
const MultiAccountItem = ({ onLinkClick, multiSafeAccountItem, isSafenetEnabled }: MultiAccountItemProps) => {
237+
const MultiAccountItem = ({ onLinkClick, multiSafeAccountItem }: MultiAccountItemProps) => {
221238
const {
222239
address,
223240
name,
@@ -231,6 +248,7 @@ const MultiAccountItem = ({ onLinkClick, multiSafeAccountItem, isSafenetEnabled
231248
isReadOnly,
232249
isWelcomePage,
233250
deployedChainIds,
251+
safenetSafes,
234252
} = useMultiAccountItemData(multiSafeAccountItem)
235253
const { addToPinnedList, removeFromPinnedList } = usePinActions(address, name, sortedSafes, safeOverviews)
236254

@@ -246,7 +264,7 @@ const MultiAccountItem = ({ onLinkClick, multiSafeAccountItem, isSafenetEnabled
246264
})
247265
}
248266

249-
const listItem = (
267+
return (
250268
<ListItemButton
251269
data-testid="safe-list-item"
252270
selected={isCurrentSafe}
@@ -283,7 +301,7 @@ const MultiAccountItem = ({ onLinkClick, multiSafeAccountItem, isSafenetEnabled
283301
{shortenAddress(address)}
284302
</Typography>
285303
</Typography>
286-
<MultichainIndicator safes={sortedSafes} />
304+
<MultichainIndicator safes={sortedSafes} showHasSafenet={safenetSafes.length > 0} />
287305
<Typography
288306
data-testid="group-balance"
289307
variant="body2"
@@ -325,6 +343,22 @@ const MultiAccountItem = ({ onLinkClick, multiSafeAccountItem, isSafenetEnabled
325343
/>
326344
</AccordionSummary>
327345
<AccordionDetails sx={{ padding: '0px 12px' }}>
346+
{safenetSafes.length > 0 && (
347+
<Box className={css.safenetList} data-testid="safenet-subacounts-container">
348+
<Box className={css.safenetListHeader}>
349+
<SafenetLogo height="12" />
350+
</Box>
351+
{safenetSafes.map((safeItem) => (
352+
<SingleAccountItem
353+
onLinkClick={onLinkClick}
354+
safeItem={safeItem}
355+
key={`${safeItem.chainId}:${safeItem.address}`}
356+
isMultiChainItem
357+
isSafenetItem
358+
/>
359+
))}
360+
</Box>
361+
)}
328362
<Box data-testid="subacounts-container">
329363
{sortedSafes.map((safeItem) => (
330364
<SingleAccountItem
@@ -359,11 +393,6 @@ const MultiAccountItem = ({ onLinkClick, multiSafeAccountItem, isSafenetEnabled
359393
</Accordion>
360394
</ListItemButton>
361395
)
362-
return isSafenetEnabled ? (
363-
<GradientBoxSafenet className={css.safenetListItem}>{listItem}</GradientBoxSafenet>
364-
) : (
365-
listItem
366-
)
367396
}
368397

369398
export default MultiAccountItem

apps/web/src/features/myAccounts/components/AccountItems/styles.module.css

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,12 +142,27 @@
142142
}
143143
}
144144

145-
.safenetListItem {
145+
.safenetList {
146+
border: 1px solid var(--color-border-light);
147+
border-radius: var(--space-1);
146148
margin-bottom: 12px;
149+
flex-wrap: wrap;
150+
overflow: hidden;
147151
}
148152

149-
.safenetListItem .listItem {
153+
.safenetListHeader {
154+
background: var(--color-border-light);
155+
padding: 4px var(--space-1);
156+
}
157+
158+
.safenetListHeader > svg > path {
159+
fill: black;
160+
}
161+
162+
.safenetList > .listItem {
150163
border: none;
151-
border-radius-left-top: 0;
152-
border-radius-right-top: 0;
164+
border-top: 1px solid var(--color-border-light);
165+
border-radius: 0;
166+
margin-bottom: 0;
167+
flex-wrap: wrap;
153168
}

apps/web/src/features/myAccounts/components/SafesList/index.tsx

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import MultiAccountItem from '@/features/myAccounts/components/AccountItems/Mult
33
import SingleAccountItem from '@/features/myAccounts/components/AccountItems/SingleAccountItem'
44
import type { SafeItem } from '@/features/myAccounts/hooks/useAllSafes'
55
import type { MultiChainSafeItem } from '@/features/myAccounts/hooks/useAllSafesGrouped'
6-
import useHasSafenetFeature from '@/features/safenet/hooks/useHasSafenetFeature'
76
import { Collapse } from '@mui/material'
87
import { TransitionGroup } from 'react-transition-group'
98

@@ -13,17 +12,15 @@ type SafeListProps = {
1312
useTransitions?: boolean
1413
}
1514

16-
const renderSafeItem = (item: SafeItem | MultiChainSafeItem, onLinkClick?: () => void, hasSafenetFeature?: boolean) => {
15+
const renderSafeItem = (item: SafeItem | MultiChainSafeItem, onLinkClick?: () => void) => {
1716
return isMultiChainSafeItem(item) ? (
18-
<MultiAccountItem onLinkClick={onLinkClick} multiSafeAccountItem={item} isSafenetEnabled={hasSafenetFeature} />
17+
<MultiAccountItem onLinkClick={onLinkClick} multiSafeAccountItem={item} />
1918
) : (
2019
<SingleAccountItem onLinkClick={onLinkClick} safeItem={item} />
2120
)
2221
}
2322

2423
const SafesList = ({ safes, onLinkClick, useTransitions = true }: SafeListProps) => {
25-
const hasSafenetFeature = useHasSafenetFeature()
26-
2724
if (!safes || safes.length === 0) {
2825
return null
2926
}
@@ -32,14 +29,14 @@ const SafesList = ({ safes, onLinkClick, useTransitions = true }: SafeListProps)
3229
<TransitionGroup>
3330
{safes.map((item) => (
3431
<Collapse key={item.address} timeout="auto">
35-
{renderSafeItem(item, onLinkClick, hasSafenetFeature)}
32+
{renderSafeItem(item, onLinkClick)}
3633
</Collapse>
3734
))}
3835
</TransitionGroup>
3936
) : (
4037
<>
4138
{safes.map((item) => (
42-
<div key={item.address}>{renderSafeItem(item, onLinkClick, hasSafenetFeature)}</div>
39+
<div key={item.address}>{renderSafeItem(item, onLinkClick)}</div>
4340
))}
4441
</>
4542
)

0 commit comments

Comments
 (0)