diff --git a/public/images/common/recovery.svg b/public/images/common/recovery.svg new file mode 100644 index 0000000000..70e4d13a9e --- /dev/null +++ b/public/images/common/recovery.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/components/dashboard/Recovery/index.tsx b/src/components/dashboard/Recovery/index.tsx new file mode 100644 index 0000000000..ec5e5faa8d --- /dev/null +++ b/src/components/dashboard/Recovery/index.tsx @@ -0,0 +1,48 @@ +import { Box, Button, Card, Chip, Grid, Typography } from '@mui/material' +import type { ReactElement } from 'react' + +import RecoveryLogo from '@/public/images/common/recovery.svg' +import { WidgetBody, WidgetContainer } from '@/components/dashboard/styled' +import { useDarkMode } from '@/hooks/useDarkMode' + +import css from './styles.module.css' + +export function Recovery(): ReactElement { + const isDarkMode = useDarkMode() + + const onClick = () => { + // TODO: Open enable recovery flow + } + + return ( + + + New in {'Safe{Wallet}'} + + + + + + + + + + + + Introducing account recovery{' '} + + + + + Ensure that you never lose access to your funds by choosing a guardian to recover your account. + + + + + + + + ) +} diff --git a/src/components/dashboard/Recovery/styles.module.css b/src/components/dashboard/Recovery/styles.module.css new file mode 100644 index 0000000000..df21b43216 --- /dev/null +++ b/src/components/dashboard/Recovery/styles.module.css @@ -0,0 +1,32 @@ +.label { + font-weight: 700; + margin-bottom: var(--space-2); +} + +.card { + padding: var(--space-4); + height: inherit; +} + +.grid { + display: flex; + align-items: center; + height: inherit; + gap: var(--space-3); +} + +.wrapper { + display: flex; + align-items: center; + gap: var(--space-1); +} + +.title { + font-weight: 700; + display: inline; +} + +.chip { + border-radius: 4px; + font-size: 12px; +} diff --git a/src/components/dashboard/Relaying/index.tsx b/src/components/dashboard/Relaying/index.tsx deleted file mode 100644 index 345b42b651..0000000000 --- a/src/components/dashboard/Relaying/index.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { WidgetBody, WidgetContainer } from '@/components/dashboard/styled' -import { Box, Card, Divider, Skeleton, Stack, SvgIcon, Typography } from '@mui/material' -import { MAX_HOUR_RELAYS, useRelaysBySafe } from '@/hooks/useRemainingRelays' -import { OVERVIEW_EVENTS } from '@/services/analytics' -import Track from '@/components/common/Track' -import InfoIcon from '@/public/images/notifications/info.svg' -import GasStationIcon from '@/public/images/common/gas-station.svg' -import ExternalLink from '@/components/common/ExternalLink' -import classnames from 'classnames' -import css from './styles.module.css' -import { HelpCenterArticle } from '@/config/constants' -import { useCurrentChain } from '@/hooks/useChains' -import { SPONSOR_LOGOS } from '@/components/tx/SponsoredBy' - -const Relaying = () => { - const chain = useCurrentChain() - const [relays, relaysError] = useRelaysBySafe() - - const limit = relays?.limit || MAX_HOUR_RELAYS - - return ( - - - New in {'Safe{Wallet}'} - - - - - - - - - - - Gas fees sponsored by - - {chain?.chainName} - - {chain?.chainName} - - - - Benefit from a gasless experience powered by Gelato and Safe. Experience gasless UX for the next - month! - - - Read more - - - - - - Transactions per hour - - {relays !== undefined ? ( - - - {relaysError ? ( - {limit} per hour - ) : ( - - {relays.remaining} of {limit} - - )} - - ) : ( - - )} - - - - - ) -} - -export default Relaying diff --git a/src/components/dashboard/Relaying/styles.module.css b/src/components/dashboard/Relaying/styles.module.css deleted file mode 100644 index cc02616d25..0000000000 --- a/src/components/dashboard/Relaying/styles.module.css +++ /dev/null @@ -1,33 +0,0 @@ -.relayingChip { - padding: var(--space-1); - border-radius: 6px; - height: 30px; - background-color: var(--color-secondary-light); - color: var(--color-static-main); - display: flex; - align-items: center; - gap: var(--space-1); -} - -.relayingChip.unavailable { - background-color: var(--color-error-light); -} - -.chipSkeleton { - height: 30px; - width: 80px; -} - -.icon { - padding: 4px; - border-radius: 6px; - border: 1.3px solid var(--color-text-primary); - width: 34px; - height: 34px; - margin-right: 12px; -} - -.gcLogo { - width: 16px; - height: 16px; -} diff --git a/src/components/dashboard/index.tsx b/src/components/dashboard/index.tsx index 497aed2b7e..6d30bb0bac 100644 --- a/src/components/dashboard/index.tsx +++ b/src/components/dashboard/index.tsx @@ -7,14 +7,14 @@ import SafeAppsDashboardSection from '@/components/dashboard/SafeAppsDashboardSe import GovernanceSection from '@/components/dashboard/GovernanceSection/GovernanceSection' import CreationDialog from '@/components/dashboard/CreationDialog' import { useRouter } from 'next/router' -import Relaying from '@/components/dashboard/Relaying' +import { Recovery } from './Recovery' import { FEATURES } from '@/utils/chains' import { useHasFeature } from '@/hooks/useChains' import { CREATION_MODAL_QUERY_PARM } from '../new-safe/create/logic' const Dashboard = (): ReactElement => { const router = useRouter() - const supportsRelaying = useHasFeature(FEATURES.RELAYING) + const supportsRecovery = useHasFeature(FEATURES.RECOVERY) const { [CREATION_MODAL_QUERY_PARM]: showCreationModal = '' } = router.query return ( @@ -28,13 +28,13 @@ const Dashboard = (): ReactElement => { - - + + - {supportsRelaying ? ( + {supportsRecovery ? ( - + ) : null} diff --git a/src/hooks/__tests__/useLoadRecovery.test.ts b/src/hooks/__tests__/useLoadRecovery.test.ts index fb77e655c7..f4b693b873 100644 --- a/src/hooks/__tests__/useLoadRecovery.test.ts +++ b/src/hooks/__tests__/useLoadRecovery.test.ts @@ -127,6 +127,12 @@ describe('useLoadRecovery', () => { txNonce, queueNonce, queue: [ + { + ...transactionsAdded[0], + timestamp: 69, + validFrom: BigNumber.from(69).add(txCooldown), + expiresAt: null, + }, { ...transactionsAdded[1], timestamp: 420,