Commit 12344f74 authored by Noah Zinsmeister's avatar Noah Zinsmeister Committed by GitHub

add localstorage support (#374)

* add localstorage support

* remove connect arrow

* invert rates to start
parent 12ab73d6
...@@ -5,7 +5,7 @@ import styled from 'styled-components' ...@@ -5,7 +5,7 @@ import styled from 'styled-components'
import { transparentize, darken } from 'polished' import { transparentize, darken } from 'polished'
import { useBodyKeyDown } from '../../hooks' import { useBodyKeyDown } from '../../hooks'
import { useBetaMessageManager } from '../../contexts/Application' import { useBetaMessageManager } from '../../contexts/LocalStorage'
const tabOrder = [ const tabOrder = [
{ {
......
...@@ -5,7 +5,7 @@ import { useWeb3Context, Connectors } from 'web3-react' ...@@ -5,7 +5,7 @@ import { useWeb3Context, Connectors } from 'web3-react'
import { darken, transparentize } from 'polished' import { darken, transparentize } from 'polished'
import Jazzicon from 'jazzicon' import Jazzicon from 'jazzicon'
import { ethers } from 'ethers' import { ethers } from 'ethers'
import { Activity, ArrowRight } from 'react-feather' import { Activity } from 'react-feather'
import { shortenAddress } from '../../utils' import { shortenAddress } from '../../utils'
import { useENSName } from '../../hooks' import { useENSName } from '../../hooks'
...@@ -91,13 +91,6 @@ const NetworkIcon = styled(Activity)` ...@@ -91,13 +91,6 @@ const NetworkIcon = styled(Activity)`
height: 16px; height: 16px;
` `
const ArrowIcon = styled(ArrowRight)`
margin-left: 0.25rem;
margin-right: 0.5rem;
width: 16px;
height: 16px;
`
const SpinnerWrapper = styled(Spinner)` const SpinnerWrapper = styled(Spinner)`
margin: 0 0.25rem 0 0.25rem; margin: 0 0.25rem 0 0.25rem;
` `
...@@ -251,7 +244,6 @@ export default function Web3Status() { ...@@ -251,7 +244,6 @@ export default function Web3Status() {
return ( return (
<Web3StatusConnect onClick={onClick}> <Web3StatusConnect onClick={onClick}>
<Text>{t('Connect')}</Text> <Text>{t('Connect')}</Text>
<ArrowIcon />
</Web3StatusConnect> </Web3StatusConnect>
) )
} else { } else {
......
...@@ -2,10 +2,8 @@ import React, { createContext, useContext, useReducer, useMemo, useCallback, use ...@@ -2,10 +2,8 @@ import React, { createContext, useContext, useReducer, useMemo, useCallback, use
import { useWeb3Context } from 'web3-react' import { useWeb3Context } from 'web3-react'
import { safeAccess } from '../utils' import { safeAccess } from '../utils'
const SHOW_BETA_MESSAGE = 'SHOW_BETA_MESSAGE'
const BLOCK_NUMBERS = 'BLOCK_NUMBERS' const BLOCK_NUMBERS = 'BLOCK_NUMBERS'
const DISMISS_BETA_MESSAGE = 'DISMISS_BETA_MESSAGE'
const UPDATE_BLOCK_NUMBER = 'UPDATE_BLOCK_NUMBER' const UPDATE_BLOCK_NUMBER = 'UPDATE_BLOCK_NUMBER'
const ApplicationContext = createContext() const ApplicationContext = createContext()
...@@ -16,12 +14,6 @@ function useApplicationContext() { ...@@ -16,12 +14,6 @@ function useApplicationContext() {
function reducer(state, { type, payload }) { function reducer(state, { type, payload }) {
switch (type) { switch (type) {
case DISMISS_BETA_MESSAGE: {
return {
...state,
[SHOW_BETA_MESSAGE]: false
}
}
case UPDATE_BLOCK_NUMBER: { case UPDATE_BLOCK_NUMBER: {
const { networkId, blockNumber } = payload const { networkId, blockNumber } = payload
return { return {
...@@ -40,25 +32,15 @@ function reducer(state, { type, payload }) { ...@@ -40,25 +32,15 @@ function reducer(state, { type, payload }) {
export default function Provider({ children }) { export default function Provider({ children }) {
const [state, dispatch] = useReducer(reducer, { const [state, dispatch] = useReducer(reducer, {
[SHOW_BETA_MESSAGE]: true,
[BLOCK_NUMBERS]: {} [BLOCK_NUMBERS]: {}
}) })
const dismissBetaMessage = useCallback(() => {
dispatch({ type: DISMISS_BETA_MESSAGE })
}, [])
const updateBlockNumber = useCallback((networkId, blockNumber) => { const updateBlockNumber = useCallback((networkId, blockNumber) => {
dispatch({ type: UPDATE_BLOCK_NUMBER, payload: { networkId, blockNumber } }) dispatch({ type: UPDATE_BLOCK_NUMBER, payload: { networkId, blockNumber } })
}, []) }, [])
return ( return (
<ApplicationContext.Provider <ApplicationContext.Provider value={useMemo(() => [state, { updateBlockNumber }], [state, updateBlockNumber])}>
value={useMemo(() => [state, { dismissBetaMessage, updateBlockNumber }], [
state,
dismissBetaMessage,
updateBlockNumber
])}
>
{children} {children}
</ApplicationContext.Provider> </ApplicationContext.Provider>
) )
...@@ -101,12 +83,6 @@ export function Updater() { ...@@ -101,12 +83,6 @@ export function Updater() {
return null return null
} }
export function useBetaMessageManager() {
const [state, { dismissBetaMessage }] = useApplicationContext()
return [safeAccess(state, [SHOW_BETA_MESSAGE]), dismissBetaMessage]
}
export function useBlockNumber() { export function useBlockNumber() {
const { networkId } = useWeb3Context() const { networkId } = useWeb3Context()
......
import React, { createContext, useContext, useReducer, useMemo, useCallback, useEffect } from 'react'
const UNISWAP = 'UNISWAP'
const VERSION = 'VERSION'
const CURRENT_VERSION = 0
const LAST_SAVED = 'LAST_SAVED'
const BETA_MESSAGE_DISMISSED = 'BETA_MESSAGE_DISMISSED'
const UPDATABLE_KEYS = [BETA_MESSAGE_DISMISSED]
const UPDATE_KEY = 'UPDATE_KEY'
const LocalStorageContext = createContext()
function useLocalStorageContext() {
return useContext(LocalStorageContext)
}
function reducer(state, { type, payload }) {
switch (type) {
case UPDATE_KEY: {
const { key, value } = payload
if (!UPDATABLE_KEYS.some(k => k === key)) {
throw Error(`Unexpected key in LocalStorageContext reducer: '${key}'.`)
} else {
return {
...state,
[key]: value
}
}
}
default: {
throw Error(`Unexpected action type in LocalStorageContext reducer: '${type}'.`)
}
}
}
function init() {
const defaultLocalStorage = {
[VERSION]: CURRENT_VERSION,
[BETA_MESSAGE_DISMISSED]: false
}
try {
const parsed = JSON.parse(window.localStorage.getItem(UNISWAP))
if (parsed[VERSION] !== CURRENT_VERSION) {
// this is where we could run migration logic
return defaultLocalStorage
} else {
return parsed
}
} catch {
return defaultLocalStorage
}
}
export default function Provider({ children }) {
const [state, dispatch] = useReducer(reducer, undefined, init)
const updateKey = useCallback((key, value) => {
dispatch({ type: UPDATE_KEY, payload: { key, value } })
}, [])
return (
<LocalStorageContext.Provider value={useMemo(() => [state, { updateKey }], [state, updateKey])}>
{children}
</LocalStorageContext.Provider>
)
}
export function Updater() {
const [state] = useLocalStorageContext()
useEffect(() => {
window.localStorage.setItem(UNISWAP, JSON.stringify({ ...state, [LAST_SAVED]: Math.floor(Date.now() / 1000) }))
})
return null
}
export function useBetaMessageManager() {
const [state, { updateKey }] = useLocalStorageContext()
const dismissBetaMessage = useCallback(() => {
updateKey(BETA_MESSAGE_DISMISSED, true)
}, [updateKey])
return [!state[BETA_MESSAGE_DISMISSED], dismissBetaMessage]
}
...@@ -4,6 +4,7 @@ import ReactGA from 'react-ga' ...@@ -4,6 +4,7 @@ import ReactGA from 'react-ga'
import Web3Provider, { Connectors } from 'web3-react' import Web3Provider, { Connectors } from 'web3-react'
import ThemeProvider, { GlobalStyle } from './theme' import ThemeProvider, { GlobalStyle } from './theme'
import LocalStorageContextProvider, { Updater as LocalStorageContextUpdater } from './contexts/LocalStorage'
import ApplicationContextProvider, { Updater as ApplicationContextUpdater } from './contexts/Application' import ApplicationContextProvider, { Updater as ApplicationContextUpdater } from './contexts/Application'
import TransactionContextProvider, { Updater as TransactionContextUpdater } from './contexts/Transactions' import TransactionContextProvider, { Updater as TransactionContextUpdater } from './contexts/Transactions'
import TokensContextProvider from './contexts/Tokens' import TokensContextProvider from './contexts/Tokens'
...@@ -29,21 +30,24 @@ const connectors = { Injected, Network } ...@@ -29,21 +30,24 @@ const connectors = { Injected, Network }
function ContextProviders({ children }) { function ContextProviders({ children }) {
return ( return (
<ApplicationContextProvider> <LocalStorageContextProvider>
<TransactionContextProvider> <ApplicationContextProvider>
<TokensContextProvider> <TransactionContextProvider>
<BalancesContextProvider> <TokensContextProvider>
<AllowancesContextProvider>{children}</AllowancesContextProvider> <BalancesContextProvider>
</BalancesContextProvider> <AllowancesContextProvider>{children}</AllowancesContextProvider>
</TokensContextProvider> </BalancesContextProvider>
</TransactionContextProvider> </TokensContextProvider>
</ApplicationContextProvider> </TransactionContextProvider>
</ApplicationContextProvider>
</LocalStorageContextProvider>
) )
} }
function Updaters() { function Updaters() {
return ( return (
<> <>
<LocalStorageContextUpdater />
<ApplicationContextUpdater /> <ApplicationContextUpdater />
<TransactionContextUpdater /> <TransactionContextUpdater />
</> </>
......
...@@ -760,13 +760,13 @@ export default function Swap({ initialCurrency }) { ...@@ -760,13 +760,13 @@ export default function Swap({ initialCurrency }) {
{inverted ? ( {inverted ? (
<span> <span>
{exchangeRate {exchangeRate
? `1 ${outputSymbol} = ${amountFormatter(exchangeRateInverted, 18, 4, false)} ${inputSymbol}` ? `1 ${inputSymbol} = ${amountFormatter(exchangeRate, 18, 4, false)} ${outputSymbol}`
: ' - '} : ' - '}
</span> </span>
) : ( ) : (
<span> <span>
{exchangeRate {exchangeRate
? `1 ${inputSymbol} = ${amountFormatter(exchangeRate, 18, 4, false)} ${outputSymbol}` ? `1 ${outputSymbol} = ${amountFormatter(exchangeRateInverted, 18, 4, false)} ${inputSymbol}`
: ' - '} : ' - '}
</span> </span>
)} )}
......
...@@ -731,13 +731,13 @@ export default function Swap({ initialCurrency }) { ...@@ -731,13 +731,13 @@ export default function Swap({ initialCurrency }) {
{inverted ? ( {inverted ? (
<span> <span>
{exchangeRate {exchangeRate
? `1 ${outputSymbol} = ${amountFormatter(exchangeRateInverted, 18, 4, false)} ${inputSymbol}` ? `1 ${inputSymbol} = ${amountFormatter(exchangeRate, 18, 4, false)} ${outputSymbol}`
: ' - '} : ' - '}
</span> </span>
) : ( ) : (
<span> <span>
{exchangeRate {exchangeRate
? `1 ${inputSymbol} = ${amountFormatter(exchangeRate, 18, 4, false)} ${outputSymbol}` ? `1 ${outputSymbol} = ${amountFormatter(exchangeRateInverted, 18, 4, false)} ${inputSymbol}`
: ' - '} : ' - '}
</span> </span>
)} )}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment