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

feat: Safe Apps landing page #3764

Merged
merged 24 commits into from
May 12, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
a08403b
Added SafeAppLandingPage component
DaniSomoza Apr 6, 2022
ff52d5e
removed track events in SafeAppLandingPage
DaniSomoza Apr 6, 2022
13253af
Fixed available chains label styles
DaniSomoza Apr 6, 2022
3fb0430
Added unit tests to SafeAppLandingPage component
DaniSomoza Apr 6, 2022
2797e83
Added 100% coverage to SafeAppLandingPage unit tests
DaniSomoza Apr 7, 2022
bc4b93e
added minor fixes in the comments
DaniSomoza Apr 8, 2022
145c135
Splitted JSX in small pieces in the share safe app page
DaniSomoza Apr 8, 2022
02c12b8
using useAsync custom hook to fetch the manifest
DaniSomoza Apr 8, 2022
a78d1e6
updated the redirect condition in the SafeAppLandingPage component
DaniSomoza Apr 11, 2022
2e3cdf1
Merge branch 'dev' into safe-app-landing-page
DaniSomoza Apr 11, 2022
91c5c0a
Added minor improvements in tests and useAsync
DaniSomoza Apr 12, 2022
783d269
Splitted components in different files
DaniSomoza Apr 18, 2022
fa7ced8
SafeAppLandingPage as a arrow function
DaniSomoza Apr 18, 2022
1d28cf2
added safe app logo fallback svg and hidden unavailable chains
DaniSomoza Apr 21, 2022
1530116
updated connect wallet use case
DaniSomoza Apr 21, 2022
88de8ab
removed margin when a chain label is hidden
DaniSomoza Apr 21, 2022
3b5a107
feat: Share Safe App button (#3782)
DaniSomoza Apr 26, 2022
4a3bbe4
support redirect query param on safe-creation (#3790)
mmv08 Apr 26, 2022
a65d8b8
Merge branch 'dev' of https://github.com/gnosis/safe-react into safe-…
yagopv Apr 28, 2022
5fa8991
feat: New safe app card design (#3804)
DaniSomoza May 2, 2022
ac53456
Merge branch 'dev' into safe-app-landing-page
DaniSomoza May 4, 2022
4a69c2e
fixed minor typo in AppList tests
DaniSomoza May 4, 2022
217065f
feat: Allow selecting a compatible Safe when opening a shared Safe Ap…
DaniSomoza May 10, 2022
a69e1f0
Merge branch 'dev' into safe-app-landing-page
DaniSomoza May 11, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/assets/icons/demo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
103 changes: 28 additions & 75 deletions src/components/App/index.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,10 @@
import { useContext } from 'react'
import { makeStyles } from '@material-ui/core/styles'
import { SnackbarProvider } from 'notistack'
import { useSelector } from 'react-redux'
import styled from 'styled-components'

import AlertIcon from 'src/assets/icons/alert.svg'
import CheckIcon from 'src/assets/icons/check.svg'
import ErrorIcon from 'src/assets/icons/error.svg'
import InfoIcon from 'src/assets/icons/info.svg'
import AppLayout from 'src/components/AppLayout'
import { SafeListSidebar, SafeListSidebarContext } from 'src/components/SafeListSidebar'
import CookiesBanner from 'src/components/CookiesBanner'
import Notifier from 'src/components/Notifier'
import Img from 'src/components/layout/Img'
import { currentSafeWithNames } from 'src/logic/safe/store/selectors'
import { currentCurrencySelector } from 'src/logic/currencyValues/store/selectors'
import Modal from 'src/components/Modal'
Expand All @@ -25,32 +17,14 @@ import { useSidebarItems } from 'src/components/AppLayout/Sidebar/useSidebarItem
import useAddressBookSync from 'src/logic/addressBook/hooks/useAddressBookSync'
import { useCurrentSafeAddressSync } from 'src/logic/currentSession/hooks/useCurrentSafeAddressSync'

const notificationStyles = {
success: {
background: '#fff',
},
error: {
background: '#ffe6ea',
},
warning: {
background: '#fff3e2',
},
info: {
background: '#fff',
},
}

const Frame = styled.div`
display: flex;
flex-direction: column;
flex: 1 1 auto;
max-width: 100%;
`

const useStyles = makeStyles(notificationStyles)

const App: React.FC = ({ children }) => {
const classes = useStyles()
const { toggleSidebar } = useContext(SafeListSidebarContext)
const { name: safeName, totalFiatBalance: currentSafeBalance } = useSelector(currentSafeWithNames)
const { safeActionsState, onShow, onHide, showSendFunds, hideSendFunds } = useSafeActions()
Expand All @@ -70,58 +44,37 @@ const App: React.FC = ({ children }) => {

return (
<Frame>
<SnackbarProvider
anchorOrigin={{ vertical: 'top', horizontal: 'right' }}
classes={{
variantSuccess: classes.success,
variantError: classes.error,
variantWarning: classes.warning,
variantInfo: classes.info,
}}
iconVariant={{
error: <Img alt="Error" src={ErrorIcon} />,
info: <Img alt="Info" src={InfoIcon} />,
success: <Img alt="Success" src={CheckIcon} />,
warning: <Img alt="Warning" src={AlertIcon} />,
}}
maxSnack={5}
<AppLayout
sidebarItems={sidebarItems}
safeAddress={safeAddress}
safeName={safeName}
balance={balance}
granted={granted}
onToggleSafeList={toggleSidebar}
onReceiveClick={onReceiveShow}
onNewTransactionClick={() => showSendFunds('')}
>
<>
<Notifier />

<AppLayout
sidebarItems={sidebarItems}
safeAddress={safeAddress}
safeName={safeName}
balance={balance}
granted={granted}
onToggleSafeList={toggleSidebar}
onReceiveClick={onReceiveShow}
onNewTransactionClick={() => showSendFunds('')}
>
{children}
</AppLayout>
{children}
</AppLayout>

<SendModal
activeScreenType="chooseTxType"
isOpen={sendFunds.isOpen}
onClose={hideSendFunds}
selectedToken={sendFunds.selectedToken}
/>
<SendModal
activeScreenType="chooseTxType"
isOpen={sendFunds.isOpen}
onClose={hideSendFunds}
selectedToken={sendFunds.selectedToken}
/>

{safeAddress && (
<Modal
description="Receive Tokens Form"
handleClose={onReceiveHide}
open={safeActionsState.showReceive}
paperClassName="receive-modal"
title="Receive Tokens"
>
<ReceiveModal onClose={onReceiveHide} safeAddress={safeAddress} safeName={safeName} />
</Modal>
)}
</>
</SnackbarProvider>
{safeAddress && (
<Modal
description="Receive Tokens Form"
handleClose={onReceiveHide}
open={safeActionsState.showReceive}
paperClassName="receive-modal"
title="Receive Tokens"
>
<ReceiveModal onClose={onReceiveHide} safeAddress={safeAddress} safeName={safeName} />
</Modal>
)}
<CookiesBanner />
</Frame>
)
Expand Down
2 changes: 2 additions & 0 deletions src/components/AppLayout/Header/components/Layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ const Layout = ({ classes, providerDetails, providerInfo }) => {
</div>
)}

<Divider />
<Provider
info={providerInfo}
open={open}
Expand All @@ -129,6 +130,7 @@ const Layout = ({ classes, providerDetails, providerInfo }) => {
)
}
/>
<Divider />

<NetworkSelector open={openNetworks} toggle={toggleNetworks} clickAway={clickAwayNetworks} />
</Row>
Expand Down
3 changes: 0 additions & 3 deletions src/components/AppLayout/Header/components/Provider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import ExpandMore from '@material-ui/icons/ExpandMore'
import * as React from 'react'

import Col from 'src/components/layout/Col'
import Divider from 'src/components/layout/Divider'
import { screenSm, sm } from 'src/theme/variables'

const styles = () => ({
Expand Down Expand Up @@ -50,14 +49,12 @@ class Provider extends React.Component<any> {
return (
<>
<div className={classes.root} ref={this.myRef}>
<Divider />
<Col className={classes.provider} end="sm" middle="xs" onClick={toggle}>
{info}
<IconButton className={classes.expand} disableRipple>
{open ? <ExpandLess /> : <ExpandMore />}
</IconButton>
</Col>
<Divider />
</div>
{render(this.myRef)}
</>
Expand Down
31 changes: 17 additions & 14 deletions src/components/AppLayout/index.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { useCallback, useState } from 'react'
import styled, { keyframes } from 'styled-components'
import { useLocation, matchPath } from 'react-router-dom'
import { useLocation, matchPath, useRouteMatch } from 'react-router-dom'

import { ListItemType } from 'src/components/List'

import Header from './Header'
import Footer from './Footer'
import Sidebar from './Sidebar'
import { MobileNotSupported } from './MobileNotSupported'
import { SAFE_ROUTES, WELCOME_ROUTE } from 'src/routes/routes'
import { SAFE_APP_LANDING_PAGE_ROUTE, SAFE_ROUTES, WELCOME_ROUTE } from 'src/routes/routes'
import useDarkMode from 'src/logic/hooks/useDarkMode'
import { screenSm } from 'src/theme/variables'

Expand Down Expand Up @@ -143,6 +143,7 @@ const Layout: React.FC<Props> = ({
path: [SAFE_ROUTES.SETTINGS, WELCOME_ROUTE],
})

const showSideBar = !useRouteMatch({ path: SAFE_APP_LANDING_PAGE_ROUTE })
const onSidebarClick = useCallback(
(e: React.MouseEvent): void => {
e.stopPropagation()
Expand All @@ -157,18 +158,20 @@ const Layout: React.FC<Props> = ({
<Header />
</HeaderWrapper>
<BodyWrapper>
<SidebarWrapper data-testid="sidebar" $expanded={expanded} onClick={onSidebarClick}>
<Sidebar
items={sidebarItems}
safeAddress={safeAddress}
safeName={safeName}
balance={balance}
granted={granted}
onToggleSafeList={onToggleSafeList}
onReceiveClick={onReceiveClick}
onNewTransactionClick={onNewTransactionClick}
/>
</SidebarWrapper>
{showSideBar && (
<SidebarWrapper data-testid="sidebar" $expanded={expanded} onClick={onSidebarClick}>
<Sidebar
items={sidebarItems}
safeAddress={safeAddress}
safeName={safeName}
balance={balance}
granted={granted}
onToggleSafeList={onToggleSafeList}
onReceiveClick={onReceiveClick}
onNewTransactionClick={onNewTransactionClick}
/>
</SidebarWrapper>
)}
<ContentWrapper>
<div>{children}</div>
{hasFooter && <Footer />}
Expand Down
61 changes: 61 additions & 0 deletions src/components/Providers/SnackbarProvider.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { ReactNode } from 'react'
import { SnackbarProvider } from 'notistack'
import { makeStyles } from '@material-ui/core/styles'

import Img from 'src/components/layout/Img'
import AlertIcon from 'src/assets/icons/alert.svg'
import CheckIcon from 'src/assets/icons/check.svg'
import ErrorIcon from 'src/assets/icons/error.svg'
import InfoIcon from 'src/assets/icons/info.svg'
import Notifier from 'src/components/Notifier'

type SnackBarProviderProps = {
children: ReactNode
}

const notificationStyles = {
success: {
background: '#fff',
},
error: {
background: '#ffe6ea',
},
warning: {
background: '#fff3e2',
},
info: {
background: '#fff',
},
}

const useStyles = makeStyles(notificationStyles)

const CustomSnackBarProvider = ({ children }: SnackBarProviderProps): React.ReactElement => {
const classes = useStyles()

return (
<SnackbarProvider
anchorOrigin={{ vertical: 'top', horizontal: 'right' }}
classes={{
variantSuccess: classes.success,
variantError: classes.error,
variantWarning: classes.warning,
variantInfo: classes.info,
}}
iconVariant={{
error: <Img alt="Error" src={ErrorIcon} />,
info: <Img alt="Info" src={InfoIcon} />,
success: <Img alt="Success" src={CheckIcon} />,
warning: <Img alt="Warning" src={AlertIcon} />,
}}
maxSnack={5}
>
<>
{children}
<Notifier />
</>
</SnackbarProvider>
)
}

export default CustomSnackBarProvider
5 changes: 4 additions & 1 deletion src/components/Providers/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { ThemeProvider } from 'styled-components'
import { Store } from 'redux'
import { History } from 'history'
import { theme } from '@gnosis.pm/safe-react-components'
import SnackbarProvider from './SnackbarProvider'

declare type Theme = typeof theme

Expand All @@ -22,7 +23,9 @@ function Providers({ children, store, styledTheme, muiTheme, history }: Provider
<ThemeProvider theme={styledTheme}>
<Provider store={store}>
<MuiThemeProvider theme={muiTheme}>
<Router history={history}>{children}</Router>
<SnackbarProvider>
<Router history={history}>{children}</Router>
</SnackbarProvider>
</MuiThemeProvider>
</Provider>
</ThemeProvider>
Expand Down
Loading