import { useCallback, useMemo } from 'react' import { shallowEqual, useDispatch, useSelector } from 'react-redux' import { Token } from '@uniswap/sdk-core' import { AppDispatch, AppState } from '../index' import { SerializedToken, updateUserDarkMode, } from './actions' import { useActiveWeb3React } from '../../hooks/web3' function deserializeToken(serializedToken: SerializedToken): Token { return new Token( serializedToken.chainId, serializedToken.address, serializedToken.decimals, serializedToken.symbol, serializedToken.name ) } export function useIsDarkMode(): boolean { const { userDarkMode, matchesDarkMode } = useSelector< AppState, { userDarkMode: boolean | null; matchesDarkMode: boolean } >( ({ user: { matchesDarkMode, userDarkMode } }) => ({ userDarkMode, matchesDarkMode, }), shallowEqual ) return userDarkMode === null ? matchesDarkMode : userDarkMode } export function useDarkModeManager(): [boolean, () => void] { const dispatch = useDispatch() const darkMode = useIsDarkMode() const toggleSetDarkMode = useCallback(() => { dispatch(updateUserDarkMode({ userDarkMode: !darkMode })) }, [darkMode, dispatch]) return [darkMode, toggleSetDarkMode] } export function useUserAddedTokens(): Token[] { const { chainId } = useActiveWeb3React() const serializedTokensMap = useSelector(({ user: { tokens } }) => tokens) return useMemo(() => { if (!chainId) return [] return Object.values(serializedTokensMap?.[chainId] ?? {}).map(deserializeToken) }, [serializedTokensMap, chainId]) }