From 8eab78974b26dbd20ce7049a36a876b81f554567 Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Mon, 31 Jan 2022 10:04:18 -0800 Subject: [PATCH 01/77] Update acceptance criteria with metrics line --- .github/ISSUE_TEMPLATE/general_issue.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/general_issue.md b/.github/ISSUE_TEMPLATE/general_issue.md index 257572287de..5f8a35e1d48 100644 --- a/.github/ISSUE_TEMPLATE/general_issue.md +++ b/.github/ISSUE_TEMPLATE/general_issue.md @@ -18,6 +18,7 @@ Describe the task. What does this aim to solve? ### **Acceptance Criteria** +- Check with product on metrics - Cases to satisfy - XYZ should work - Etc. From 4b7f20335bb7eb9301cf6973f23e15196e729514 Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Mon, 7 Feb 2022 02:42:30 -0800 Subject: [PATCH 02/77] Remove hardcoded theme on iOS --- ios/MetaMask/Info.plist | 2 -- 1 file changed, 2 deletions(-) diff --git a/ios/MetaMask/Info.plist b/ios/MetaMask/Info.plist index 17628f3edbd..ec485d8553d 100644 --- a/ios/MetaMask/Info.plist +++ b/ios/MetaMask/Info.plist @@ -112,8 +112,6 @@ UIInterfaceOrientationPortrait - UIUserInterfaceStyle - Light UIViewControllerBasedStatusBarAppearance branch_key From b9f6322dc1c2c4958b1781299d0bf22bd4d66fb8 Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Mon, 7 Feb 2022 03:28:32 -0800 Subject: [PATCH 03/77] Set up theme foundation --- app/actions/user/index.js | 7 ++++ app/components/Nav/App/index.js | 13 ++++--- app/reducers/user/index.js | 8 +++++ app/store/index.js | 2 +- app/util/theme/colors/base-colors.ts | 51 ++++++++++++++++++++++++++++ app/util/theme/colors/dark.ts | 35 +++++++++++++++++++ app/util/theme/colors/index.ts | 4 +++ app/util/theme/colors/light.ts | 35 +++++++++++++++++++ app/util/theme/index.ts | 42 +++++++++++++++++++++++ app/util/theme/models.ts | 14 ++++++++ ios/MetaMask/Info.plist | 4 ++- ios/Podfile.lock | 4 +-- 12 files changed, 208 insertions(+), 11 deletions(-) create mode 100644 app/util/theme/colors/base-colors.ts create mode 100644 app/util/theme/colors/dark.ts create mode 100644 app/util/theme/colors/index.ts create mode 100644 app/util/theme/colors/light.ts create mode 100644 app/util/theme/index.ts create mode 100644 app/util/theme/models.ts diff --git a/app/actions/user/index.js b/app/actions/user/index.js index a42ecebac20..084720d0100 100644 --- a/app/actions/user/index.js +++ b/app/actions/user/index.js @@ -83,6 +83,13 @@ export function logOut() { }; } +export function setAppTheme(theme) { + return { + type: 'SET_APP_THEME', + payload: { theme }, + }; +} + /** * Temporary action to control auth flow * diff --git a/app/components/Nav/App/index.js b/app/components/Nav/App/index.js index fe19be99f27..29ee81e32cd 100644 --- a/app/components/Nav/App/index.js +++ b/app/components/Nav/App/index.js @@ -1,6 +1,6 @@ import React, { useCallback, useEffect, useRef, useMemo, useState } from 'react'; import { NavigationContainer, CommonActions } from '@react-navigation/native'; -import { Animated, StyleSheet, View, Platform } from 'react-native'; +import { Animated, Platform } from 'react-native'; import { createStackNavigator } from '@react-navigation/stack'; import AsyncStorage from '@react-native-community/async-storage'; import Login from '../../Views/Login'; @@ -34,10 +34,7 @@ import { getVersion } from 'react-native-device-info'; import { checkedAuth } from '../../../actions/user'; import { setCurrentRoute } from '../../../actions/navigation'; import { findRouteNameFromNavigatorState } from '../../../util/general'; - -const styles = StyleSheet.create({ - fill: { flex: 1 }, -}); +import { useAppTheme, ThemeContext } from '../../../util/theme'; const Stack = createStackNavigator(); /** @@ -253,10 +250,12 @@ const App = ({ userLoggedIn }) => { return null; }; + const theme = useAppTheme(); + return ( // do not render unless a route is defined (route && ( - + { @@ -281,7 +280,7 @@ const App = ({ userLoggedIn }) => { {renderSplash()} - + )) || null ); diff --git a/app/reducers/user/index.js b/app/reducers/user/index.js index e6f42568fee..d05bc0e226e 100644 --- a/app/reducers/user/index.js +++ b/app/reducers/user/index.js @@ -1,3 +1,5 @@ +import { AppThemeNames } from '../../util/theme/models'; + const initialState = { loadingMsg: '', loadingSet: false, @@ -10,6 +12,7 @@ const initialState = { userLoggedIn: false, isAuthChecked: false, initialScreen: '', + appTheme: AppThemeNames.Light, }; const userReducer = (state = initialState, action) => { @@ -96,6 +99,11 @@ const userReducer = (state = initialState, action) => { ...state, nftDetectionDismissed: true, }; + case 'SET_APP_THEME': + return { + ...state, + appTheme: action.payload.theme, + }; default: return state; } diff --git a/app/store/index.js b/app/store/index.js index 47c62c669f9..3ad8dbfeea3 100644 --- a/app/store/index.js +++ b/app/store/index.js @@ -87,7 +87,7 @@ const persistTransform = createTransform( const persistUserTransform = createTransform( (inboundState) => { - const { initialScreen, isAuthChecked, ...state } = inboundState; + const { initialScreen, isAuthChecked, appTheme, ...state } = inboundState; // Reconstruct data to persist return state; }, diff --git a/app/util/theme/colors/base-colors.ts b/app/util/theme/colors/base-colors.ts new file mode 100644 index 00000000000..6773f1a4a53 --- /dev/null +++ b/app/util/theme/colors/base-colors.ts @@ -0,0 +1,51 @@ +import { Colors } from '../models'; + +const colors: Colors = { + white: '#ffffff', + overlay: 'rgba(0,0,0, 0.7)', + grey000: '#f2f3f4', + grey100: '#d6d9dc', + grey200: '#bbc0c5', + grey300: '#9fa6ae', + grey400: '#848c96', + grey500: '#6a737d', + grey600: '#5b5d67', + grey700: '#3c3f42', + grey800: '#24272a', + grey900: '#141618', + red000: '#fcf2f3', + red100: '#f7d5d8', + red200: '#f1b9be', + red300: '#e88f97', + red400: '#e06470', + red500: '#d73a49', + red600: '#b92534', + red700: '#8e1d28', + red800: '#64141c', + red900: '#3a0c10', + blue000: '#eaf6ff', + blue100: '#a7d9fe', + blue200: '#75c4fd', + blue500: '#037dd6', + blue600: '#0260a4', + blue700: '#024272', + green100: '#e6f9ea', + green200: '#afecbd', + green300: '#86e29b', + green400: '#28a745', + green500: '#28a745', + green600: '#1e7e34', + yellow000: '#fffdf8', + yellow100: '#fefcde', + yellow200: '#fff2c5', + yellow300: '#ffeaa3', + yellow400: '#ffdf70', + yellow500: '#ffd33d', + yellow600: '#ffc70a', + orange000: '#fef5ef', + orange300: '#faa66c', + orange500: '#f66a0a', + transparent: 'transparent', +}; + +export default colors; diff --git a/app/util/theme/colors/dark.ts b/app/util/theme/colors/dark.ts new file mode 100644 index 00000000000..173e12f4bed --- /dev/null +++ b/app/util/theme/colors/dark.ts @@ -0,0 +1,35 @@ +import { Colors } from '../models'; +import baseColors from './base-colors'; + +const colors: Colors = { + textDefault: baseColors.white, + textAlternative: baseColors.grey100, + backgroundDefault: baseColors.grey900, + backgroundAlternative: baseColors.grey800, + navbarBackground: baseColors.grey900, + borderDefault: baseColors.grey400, + muted: baseColors.grey700, + overlay: baseColors.overlay, + primary: baseColors.blue500, + onPrimary: baseColors.white, + info: baseColors.blue000, + onInfo: baseColors.blue500, + error: baseColors.red000, + onError: baseColors.red500, + success: baseColors.green100, + onSuccess: baseColors.green500, + warning: baseColors.yellow000, + onWarning: baseColors.yellow600, + inverse: baseColors.grey800, + onInverse: baseColors.white, + alert: 'rgba(0,0,0,.75)', + onAlert: baseColors.white, + // UI escape hatches for grey colors with no general purpose + ui4: baseColors.grey500, + onUi4: baseColors.white, + shadowColor: baseColors.gray900, + // needs auditing + transparent: 'transparent', +}; + +export default colors; diff --git a/app/util/theme/colors/index.ts b/app/util/theme/colors/index.ts new file mode 100644 index 00000000000..c510fa1f8e8 --- /dev/null +++ b/app/util/theme/colors/index.ts @@ -0,0 +1,4 @@ +import lightTheme from './light'; +import darkTheme from './dark'; + +export default { lightTheme, darkTheme }; diff --git a/app/util/theme/colors/light.ts b/app/util/theme/colors/light.ts new file mode 100644 index 00000000000..6421b96d6fb --- /dev/null +++ b/app/util/theme/colors/light.ts @@ -0,0 +1,35 @@ +import { Colors } from '../models'; +import baseColors from './base-colors'; + +const colors: Colors = { + textDefault: baseColors.grey800, + textAlternative: baseColors.grey600, + backgroundDefault: baseColors.white, + backgroundAlternative: baseColors.grey000, + navbarBackground: baseColors.white, + borderDefault: baseColors.grey100, + muted: baseColors.grey100, + overlay: baseColors.overlay, + primary: baseColors.blue500, + onPrimary: baseColors.white, + info: baseColors.blue000, + onInfo: baseColors.blue500, + error: baseColors.red000, + onError: baseColors.red500, + success: baseColors.green100, + onSuccess: baseColors.green500, + warning: baseColors.yellow000, + onWarning: baseColors.yellow600, + inverse: baseColors.grey800, + onInverse: baseColors.white, + alert: 'rgba(0,0,0,.75)', + onAlert: baseColors.white, + // UI escape hatches for grey colors with no general purpose + ui4: baseColors.grey500, + onUi4: baseColors.white, + shadowColor: baseColors.gray900, + // needs auditing + transparent: 'transparent', +}; + +export default colors; diff --git a/app/util/theme/index.ts b/app/util/theme/index.ts new file mode 100644 index 00000000000..443af3d9b4a --- /dev/null +++ b/app/util/theme/index.ts @@ -0,0 +1,42 @@ +import React, { useContext } from 'react'; +import { useColorScheme, StatusBar } from 'react-native'; +import { Colors, AppThemeNames, Theme } from './models'; +import colorTheme from './colors'; +// import { useSelector } from 'react-redux'; + +export const ThemeContext = React.createContext(undefined); + +/* eslint-disable import/prefer-default-export, no-case-declarations */ +export const useAppTheme = (): Theme => { + const osThemeName = useColorScheme(); + // const appTheme: AppThemeNames = useSelector((state: any) => state.user.appTheme); + const appTheme = AppThemeNames.Dark; + let colors: Colors; + + switch (appTheme) { + case AppThemeNames.OS: + const isDarkTheme = osThemeName === 'dark'; + colors = isDarkTheme ? colorTheme.darkTheme : colorTheme.lightTheme; + StatusBar.setBarStyle('default', true); + break; + case AppThemeNames.Light: + colors = colorTheme.lightTheme; + StatusBar.setBarStyle('dark-content', true); + break; + case AppThemeNames.Dark: + colors = colorTheme.darkTheme; + StatusBar.setBarStyle('light-content', true); + break; + default: + // Default uses light theme + colors = colorTheme.lightTheme; + StatusBar.setBarStyle('dark-content', true); + } + + return { colors }; +}; + +export const useAppThemeFromContext = (): Theme => { + const theme = useContext(ThemeContext); + return theme; +}; diff --git a/app/util/theme/models.ts b/app/util/theme/models.ts new file mode 100644 index 00000000000..31a08289f6f --- /dev/null +++ b/app/util/theme/models.ts @@ -0,0 +1,14 @@ +export interface Colors { + [key: string]: string; +} + +export interface Theme { + colors: Colors; +} + +export enum AppThemeNames { + OS = 'os', + Light = 'light', + Dark = 'dark', + Playful = 'playful', +} diff --git a/ios/MetaMask/Info.plist b/ios/MetaMask/Info.plist index ec485d8553d..d26aabc200b 100644 --- a/ios/MetaMask/Info.plist +++ b/ios/MetaMask/Info.plist @@ -112,8 +112,10 @@ UIInterfaceOrientationPortrait + UIUserInterfaceStyle + Light UIViewControllerBasedStatusBarAppearance - + branch_key $(MM_BRANCH_KEY_LIVE) fox_code diff --git a/ios/Podfile.lock b/ios/Podfile.lock index cb9fa094fe3..637e1fd9a3f 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -748,7 +748,7 @@ SPEC CHECKSUMS: Branch: 6a281514287f99d707615ac62c2cca69e0213df0 BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872 CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 - DoubleConversion: cde416483dac037923206447da6e1454df403714 + DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662 FBLazyVector: de148e8310b8b878db304ceea2fec13f2c02e3a0 FBReactNativeSpec: 6192956c9e346013d5f1809ba049af720b11c6a4 Flipper: b1fddf9a17c32097b2b4c806ad158b2f36bb2692 @@ -761,7 +761,7 @@ SPEC CHECKSUMS: Flipper-RSocket: d9d9ade67cbecf6ac10730304bf5607266dd2541 FlipperKit: aec2d931adeee48a07bab1ea8bcc8a6bb87dfce4 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 - glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3 + glog: 5337263514dd6f09803962437687240c5dc39aa4 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 lottie-ios: a50d5c0160425cd4b01b852bb9578963e6d92d31 lottie-react-native: 7ca15c46249b61e3f9ffcf114cb4123e907a2156 From 6eee9891839ad9432e2f1c3ac6e626709073a3d2 Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Mon, 7 Feb 2022 10:34:23 -0800 Subject: [PATCH 04/77] Add theme toggle to react native dev menu --- app/components/Nav/App/index.js | 17 +++++++++++++++-- app/util/theme/index.ts | 15 ++++++++------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/app/components/Nav/App/index.js b/app/components/Nav/App/index.js index 29ee81e32cd..2f26d46fe03 100644 --- a/app/components/Nav/App/index.js +++ b/app/components/Nav/App/index.js @@ -1,6 +1,6 @@ import React, { useCallback, useEffect, useRef, useMemo, useState } from 'react'; import { NavigationContainer, CommonActions } from '@react-navigation/native'; -import { Animated, Platform } from 'react-native'; +import { Animated, Platform, DevSettings } from 'react-native'; import { createStackNavigator } from '@react-navigation/stack'; import AsyncStorage from '@react-native-community/async-storage'; import Login from '../../Views/Login'; @@ -31,10 +31,11 @@ import Analytics from '../../../core/Analytics'; import { connect, useSelector, useDispatch } from 'react-redux'; import { EXISTING_USER, CURRENT_APP_VERSION, LAST_APP_VERSION } from '../../../constants/storage'; import { getVersion } from 'react-native-device-info'; -import { checkedAuth } from '../../../actions/user'; +import { checkedAuth, setAppTheme } from '../../../actions/user'; import { setCurrentRoute } from '../../../actions/navigation'; import { findRouteNameFromNavigatorState } from '../../../util/general'; import { useAppTheme, ThemeContext } from '../../../util/theme'; +import { AppThemeNames } from '../../../util/theme/models'; const Stack = createStackNavigator(); /** @@ -250,7 +251,19 @@ const App = ({ userLoggedIn }) => { return null; }; + /** + * Temporary React Native dev menu to toggle theme between light and dark mode + */ + const appTheme = useSelector((state) => state.user.appTheme); const theme = useAppTheme(); + useEffect(() => { + const newAppTheme = appTheme === AppThemeNames.Light ? AppThemeNames.Dark : AppThemeNames.Light; + if (__DEV__) { + DevSettings.addMenuItem('Toggle Theme', () => { + dispatch(setAppTheme(newAppTheme)); + }); + } + }, [appTheme, dispatch]); return ( // do not render unless a route is defined diff --git a/app/util/theme/index.ts b/app/util/theme/index.ts index 443af3d9b4a..7e14ad3425f 100644 --- a/app/util/theme/index.ts +++ b/app/util/theme/index.ts @@ -2,22 +2,23 @@ import React, { useContext } from 'react'; import { useColorScheme, StatusBar } from 'react-native'; import { Colors, AppThemeNames, Theme } from './models'; import colorTheme from './colors'; -// import { useSelector } from 'react-redux'; +import { useSelector } from 'react-redux'; export const ThemeContext = React.createContext(undefined); -/* eslint-disable import/prefer-default-export, no-case-declarations */ +/* eslint-disable import/prefer-default-export */ export const useAppTheme = (): Theme => { const osThemeName = useColorScheme(); - // const appTheme: AppThemeNames = useSelector((state: any) => state.user.appTheme); - const appTheme = AppThemeNames.Dark; + const appTheme: AppThemeNames = useSelector((state: any) => state.user.appTheme); let colors: Colors; switch (appTheme) { case AppThemeNames.OS: - const isDarkTheme = osThemeName === 'dark'; - colors = isDarkTheme ? colorTheme.darkTheme : colorTheme.lightTheme; - StatusBar.setBarStyle('default', true); + { + const isDarkTheme = osThemeName === 'dark'; + colors = isDarkTheme ? colorTheme.darkTheme : colorTheme.lightTheme; + StatusBar.setBarStyle('default', true); + } break; case AppThemeNames.Light: colors = colorTheme.lightTheme; From e4949a12e76831e613b18f5fb5bf561ec9415199 Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Mon, 7 Feb 2022 10:52:14 -0800 Subject: [PATCH 05/77] Add theme toggle to react native dev menu --- app/reducers/user/index.js | 2 +- app/util/theme/index.ts | 7 ++----- app/util/theme/models.ts | 1 - 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/app/reducers/user/index.js b/app/reducers/user/index.js index d05bc0e226e..c6be250ed76 100644 --- a/app/reducers/user/index.js +++ b/app/reducers/user/index.js @@ -12,7 +12,7 @@ const initialState = { userLoggedIn: false, isAuthChecked: false, initialScreen: '', - appTheme: AppThemeNames.Light, + appTheme: AppThemeNames.OS, }; const userReducer = (state = initialState, action) => { diff --git a/app/util/theme/index.ts b/app/util/theme/index.ts index 7e14ad3425f..cb334a36b79 100644 --- a/app/util/theme/index.ts +++ b/app/util/theme/index.ts @@ -14,11 +14,8 @@ export const useAppTheme = (): Theme => { switch (appTheme) { case AppThemeNames.OS: - { - const isDarkTheme = osThemeName === 'dark'; - colors = isDarkTheme ? colorTheme.darkTheme : colorTheme.lightTheme; - StatusBar.setBarStyle('default', true); - } + colors = osThemeName === 'dark' ? colorTheme.darkTheme : colorTheme.lightTheme; + StatusBar.setBarStyle('default', true); break; case AppThemeNames.Light: colors = colorTheme.lightTheme; diff --git a/app/util/theme/models.ts b/app/util/theme/models.ts index 31a08289f6f..4c68ddc9d4e 100644 --- a/app/util/theme/models.ts +++ b/app/util/theme/models.ts @@ -10,5 +10,4 @@ export enum AppThemeNames { OS = 'os', Light = 'light', Dark = 'dark', - Playful = 'playful', } From cc5642903788ef2851f8dc8e2eba662d76ce9b38 Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Mon, 7 Feb 2022 14:56:48 -0800 Subject: [PATCH 06/77] Fix inital theme toggle --- app/components/Nav/App/index.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/components/Nav/App/index.js b/app/components/Nav/App/index.js index 2f26d46fe03..c893d087c32 100644 --- a/app/components/Nav/App/index.js +++ b/app/components/Nav/App/index.js @@ -257,7 +257,10 @@ const App = ({ userLoggedIn }) => { const appTheme = useSelector((state) => state.user.appTheme); const theme = useAppTheme(); useEffect(() => { - const newAppTheme = appTheme === AppThemeNames.Light ? AppThemeNames.Dark : AppThemeNames.Light; + const newAppTheme = + appTheme === AppThemeNames.Light || appTheme === AppThemeNames.OS + ? AppThemeNames.Dark + : AppThemeNames.Light; if (__DEV__) { DevSettings.addMenuItem('Toggle Theme', () => { dispatch(setAppTheme(newAppTheme)); From f3be3dd97020c8cede67cd35e9cc6ea5f00b70bf Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Mon, 7 Feb 2022 18:46:25 -0800 Subject: [PATCH 07/77] Begin hooking up onboarding with dark mode --- app/components/UI/Navbar/index.js | 58 ++++++++++++++----- .../UI/OnboardingScreenWithBg/index.js | 58 ++++++++++--------- .../UI/StyledButton/index.android.js | 3 + app/components/UI/StyledButton/index.ios.js | 3 + .../Views/AccountBackupStep1/index.js | 17 ++++-- .../Views/AccountBackupStep1B/index.js | 11 +++- app/components/Views/ChoosePassword/index.js | 13 ++++- app/components/Views/ImportFromSeed/index.js | 17 +++++- .../Views/ManualBackupStep1/index.js | 16 ++++- .../Views/ManualBackupStep2/index.js | 15 ++++- .../Views/ManualBackupStep3/index.js | 16 ++++- app/components/Views/Onboarding/index.js | 23 ++++++-- .../Views/OnboardingCarousel/index.js | 16 ++++- 13 files changed, 197 insertions(+), 69 deletions(-) diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index 9748efb4479..4f1762142f6 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -36,10 +36,6 @@ const trackEventWithParameters = (event, params) => { }; const styles = StyleSheet.create({ - headerStyle: { - shadowColor: colors.transparent, - elevation: 0, - }, metamaskName: { width: 122, height: 15, @@ -495,19 +491,27 @@ export function getModalNavbarOptions(title) { * * @returns {Object} - Corresponding navbar options containing headerTitle, headerTitle and headerTitle */ -export function getOnboardingNavbarOptions(navigation, route, { headerLeft } = {}) { +export function getOnboardingNavbarOptions(route, { headerLeft } = {}, themeColors) { const headerLeftHide = headerLeft || route.params?.headerLeft; - - return { + const innerStyles = StyleSheet.create({ headerStyle: { shadowColor: colors.transparent, elevation: 0, - backgroundColor: colors.white, + backgroundColor: themeColors.backgroundDefault, borderBottomWidth: 0, }, + metamaskName: { + width: 122, + height: 15, + tintColor: themeColors.textDefault, + }, + }); + + return { + headerStyle: innerStyles.headerStyle, headerTitle: () => ( - + ), headerBackTitle: strings('navigation.back'), @@ -521,16 +525,28 @@ export function getOnboardingNavbarOptions(navigation, route, { headerLeft } = { * * @returns {Object} - Corresponding navbar options containing headerTitle */ -export function getTransparentOnboardingNavbarOptions() { +export function getTransparentOnboardingNavbarOptions(themeColors) { + const innerStyles = StyleSheet.create({ + headerStyle: { + shadowColor: colors.transparent, + elevation: 0, + backgroundColor: themeColors.backgroundDefault, + }, + metamaskName: { + width: 122, + height: 15, + tintColor: themeColors.textDefault, + }, + }); return { headerTitle: () => ( - + ), headerLeft: () => , headerRight: () => , - headerStyle: styles.headerStyle, + headerStyle: innerStyles.headerStyle, }; } @@ -539,16 +555,28 @@ export function getTransparentOnboardingNavbarOptions() { * * @returns {Object} - Corresponding navbar options containing headerTitle and a back button */ -export function getTransparentBackOnboardingNavbarOptions() { +export function getTransparentBackOnboardingNavbarOptions(themeColors) { + const innerStyles = StyleSheet.create({ + headerStyle: { + shadowColor: colors.transparent, + elevation: 0, + backgroundColor: themeColors.backgroundDefault, + }, + metamaskName: { + width: 122, + height: 15, + tintColor: themeColors.textDefault, + }, + }); return { headerTitle: () => ( - + ), headerBackTitle: strings('navigation.back'), headerRight: () => , - headerStyle: styles.headerStyle, + headerStyle: innerStyles.headerStyle, }; } diff --git a/app/components/UI/OnboardingScreenWithBg/index.js b/app/components/UI/OnboardingScreenWithBg/index.js index 7b2e24d45f6..84007046cb9 100644 --- a/app/components/UI/OnboardingScreenWithBg/index.js +++ b/app/components/UI/OnboardingScreenWithBg/index.js @@ -1,27 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { StyleSheet, ImageBackground, View } from 'react-native'; -import { colors } from '../../../styles/common'; - -const styles = StyleSheet.create({ - flex: { - flex: 1, - backgroundColor: colors.white, - }, - wrapper: { - top: 0, - bottom: 0, - left: 0, - right: 0, - position: 'absolute', - borderTopWidth: 0, - borderColor: colors.white, - backgroundColor: colors.white, - flex: 1, - width: null, - height: null, - }, -}); +import { useAppThemeFromContext } from '../../../util/theme'; const images = { a: require('../../../images/welcome-bg1.jpg'), // eslint-disable-line @@ -31,13 +11,35 @@ const images = { carousel: null, }; -const OnboardingScreenWithBg = (props) => ( - - - {props.children} - - -); +const OnboardingScreenWithBg = (props) => { + const { colors } = useAppThemeFromContext(); + + const styles = StyleSheet.create({ + flex: { + flex: 1, + backgroundColor: colors.backgroundDefault, + }, + wrapper: { + top: 0, + bottom: 0, + left: 0, + right: 0, + position: 'absolute', + borderTopWidth: 0, + flex: 1, + width: null, + height: null, + }, + }); + + return ( + + + {props.children} + + + ); +}; OnboardingScreenWithBg.propTypes = { /** diff --git a/app/components/UI/StyledButton/index.android.js b/app/components/UI/StyledButton/index.android.js index 4d90b09e718..6f2c0460f08 100644 --- a/app/components/UI/StyledButton/index.android.js +++ b/app/components/UI/StyledButton/index.android.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { Text, TouchableNativeFeedback, View, ViewPropTypes } from 'react-native'; import coalesceNonElementChildren from 'react-native-button/coalesceNonElementChildren'; import getStyles from './styledButtonStyles'; +import { ThemeContext } from '../../../util/theme'; /** * UI component that wraps StyledButton @@ -113,3 +114,5 @@ export default class StyledButton extends PureComponent { ); }; } + +StyledButton.contextType = ThemeContext; diff --git a/app/components/UI/StyledButton/index.ios.js b/app/components/UI/StyledButton/index.ios.js index 9ac6142e1b5..75311425bde 100644 --- a/app/components/UI/StyledButton/index.ios.js +++ b/app/components/UI/StyledButton/index.ios.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { ViewPropTypes, Text } from 'react-native'; import Button from 'react-native-button'; import getStyles from './styledButtonStyles'; +import { ThemeContext } from '../../../util/theme'; /** * UI component that renders a styled button @@ -82,3 +83,5 @@ export default class StyledButton extends PureComponent { ); }; } + +StyledButton.contextType = ThemeContext; diff --git a/app/components/Views/AccountBackupStep1/index.js b/app/components/Views/AccountBackupStep1/index.js index 63f5fcdddb8..1db17942127 100644 --- a/app/components/Views/AccountBackupStep1/index.js +++ b/app/components/Views/AccountBackupStep1/index.js @@ -28,6 +28,7 @@ import { connect } from 'react-redux'; import setOnboardingWizardStep from '../../../actions/wizard'; import AnalyticsV2 from '../../../util/analyticsV2'; import DefaultPreference from 'react-native-default-preference'; +import { useAppThemeFromContext } from '../../../util/theme'; const styles = StyleSheet.create({ mainWrapper: { @@ -115,10 +116,20 @@ const styles = StyleSheet.create({ * the backup seed phrase flow */ const AccountBackupStep1 = (props) => { + const { navigation, route } = props; const [showRemindLaterModal, setRemindLaterModal] = useState(false); const [showWhatIsSeedphraseModal, setWhatIsSeedphraseModal] = useState(false); const [skipCheckbox, setToggleSkipCheckbox] = useState(false); const [hasFunds, setHasFunds] = useState(false); + const { colors } = useAppThemeFromContext(); + + useEffect(() => { + navigation.setOptions({ + // eslint-disable-next-line react/display-name + ...getOnboardingNavbarOptions(route, { headerLeft: () => }, colors), + gesturesEnabled: false, + }); + }, [navigation, route, colors]); useEffect( () => { @@ -273,12 +284,6 @@ AccountBackupStep1.propTypes = { setOnboardingWizardStep: PropTypes.func, }; -AccountBackupStep1.navigationOptions = ({ navigation, route }) => ({ - // eslint-disable-next-line react/display-name - ...getOnboardingNavbarOptions(navigation, route, { headerLeft: () => }), - gesturesEnabled: false, -}); - const mapDispatchToProps = (dispatch) => ({ setOnboardingWizardStep: (step) => dispatch(setOnboardingWizardStep(step)), }); diff --git a/app/components/Views/AccountBackupStep1B/index.js b/app/components/Views/AccountBackupStep1B/index.js index 1a7db62b088..9dbe033f03c 100644 --- a/app/components/Views/AccountBackupStep1B/index.js +++ b/app/components/Views/AccountBackupStep1B/index.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import { ScrollView, TouchableOpacity, @@ -23,6 +23,7 @@ import SeedphraseModal from '../../UI/SeedphraseModal'; import { getOnboardingNavbarOptions } from '../../UI/Navbar'; import { CHOOSE_PASSWORD_STEPS } from '../../../constants/onboarding'; import AnalyticsV2 from '../../../util/analyticsV2'; +import { useAppThemeFromContext } from '../../../util/theme'; const explain_backup_seedphrase = require('../../../images/explain-backup-seedphrase.png'); // eslint-disable-line @@ -202,8 +203,14 @@ const styles = StyleSheet.create({ * the backup seed phrase flow */ const AccountBackupStep1B = (props) => { + const { navigation, route } = props; const [showWhySecureWalletModal, setWhySecureWalletModal] = useState(false); const [showWhatIsSeedphraseModal, setWhatIsSeedphraseModal] = useState(false); + const { colors } = useAppThemeFromContext(); + + useEffect(() => { + navigation.setOptions(getOnboardingNavbarOptions(route, {}, colors)); + }, [navigation, route, colors]); const goNext = () => { props.navigation.navigate('ManualBackupStep1', { ...props.route.params }); @@ -348,6 +355,4 @@ AccountBackupStep1B.propTypes = { route: PropTypes.object, }; -AccountBackupStep1B.navigationOptions = ({ navigation, route }) => getOnboardingNavbarOptions(navigation, route); - export default AccountBackupStep1B; diff --git a/app/components/Views/ChoosePassword/index.js b/app/components/Views/ChoosePassword/index.js index c50527838ef..3e950ccc2e0 100644 --- a/app/components/Views/ChoosePassword/index.js +++ b/app/components/Views/ChoosePassword/index.js @@ -44,6 +44,7 @@ import { getPasswordStrengthWord, passwordRequirementsMet, MIN_PASSWORD_LENGTH } import { CHOOSE_PASSWORD_STEPS } from '../../../constants/onboarding'; import AnalyticsV2 from '../../../util/analyticsV2'; +import { ThemeContext } from '../../../util/theme'; const styles = StyleSheet.create({ mainWrapper: { @@ -212,8 +213,6 @@ const IOS_DENY_BIOMETRIC_ERROR = 'The user name or passphrase you entered is not * View where users can set their password for the first time */ class ChoosePassword extends PureComponent { - static navigationOptions = ({ navigation, route }) => getOnboardingNavbarOptions(navigation, route); - static propTypes = { /** * The navigator object @@ -268,7 +267,14 @@ class ChoosePassword extends PureComponent { // Flag to know if password in keyring was set or not keyringControllerPasswordSet = false; + updateNavBar = () => { + const { route, navigation } = this.props; + const { colors } = this.context; + navigation.setOptions(getOnboardingNavbarOptions(route, {}, colors)); + }; + async componentDidMount() { + this.updateNavBar(); const biometryType = await SecureKeychain.getSupportedBiometryType(); if (biometryType) { this.setState({ biometryType: Device.isAndroid() ? 'biometrics' : biometryType, biometryChoice: true }); @@ -281,6 +287,7 @@ class ChoosePassword extends PureComponent { } componentDidUpdate(prevProps, prevState) { + this.updateNavBar(); const prevLoading = prevState.loading; const { loading } = this.state; const { navigation } = this.props; @@ -701,6 +708,8 @@ class ChoosePassword extends PureComponent { } } +ChoosePassword.contextType = ThemeContext; + const mapStateToProps = (state) => ({ selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress, }); diff --git a/app/components/Views/ImportFromSeed/index.js b/app/components/Views/ImportFromSeed/index.js index 9451699975f..f5f46e1708c 100644 --- a/app/components/Views/ImportFromSeed/index.js +++ b/app/components/Views/ImportFromSeed/index.js @@ -50,6 +50,7 @@ import importAdditionalAccounts from '../../../util/importAdditionalAccounts'; import AnalyticsV2 from '../../../util/analyticsV2'; import DefaultPreference from 'react-native-default-preference'; import Clipboard from '@react-native-clipboard/clipboard'; +import { ThemeContext } from '../../../util/theme'; const styles = StyleSheet.create({ mainWrapper: { @@ -185,8 +186,6 @@ const PASSCODE_NOT_SET_ERROR = 'Error: Passcode not set.'; * using a seed phrase */ class ImportFromSeed extends PureComponent { - static navigationOptions = ({ navigation, route }) => getOnboardingNavbarOptions(navigation, route); - static propTypes = { /** * The navigator object @@ -212,6 +211,7 @@ class ImportFromSeed extends PureComponent { */ setOnboardingWizardStep: PropTypes.func, logIn: PropTypes.func, + route: PropTypes.func, }; state = { @@ -232,7 +232,14 @@ class ImportFromSeed extends PureComponent { passwordInput = React.createRef(); confirmPasswordInput = React.createRef(); + updateNavBar = () => { + const { route, navigation } = this.props; + const { colors } = this.context; + navigation.setOptions(getOnboardingNavbarOptions(route, {}, colors)); + }; + async componentDidMount() { + this.updateNavBar(); const biometryType = await SecureKeychain.getSupportedBiometryType(); if (biometryType) { let enabled = true; @@ -248,6 +255,10 @@ class ImportFromSeed extends PureComponent { }, 100); } + componentDidUpdate = () => { + this.updateNavBar(); + }; + onPressImport = async () => { const { loading, seed, password, confirmPassword } = this.state; @@ -641,6 +652,8 @@ class ImportFromSeed extends PureComponent { } } +ImportFromSeed.contextType = ThemeContext; + const mapDispatchToProps = (dispatch) => ({ setLockTime: (time) => dispatch(setLockTime(time)), setOnboardingWizardStep: (step) => dispatch(setOnboardingWizardStep(step)), diff --git a/app/components/Views/ManualBackupStep1/index.js b/app/components/Views/ManualBackupStep1/index.js index aee704c8e96..0d0e917e160 100644 --- a/app/components/Views/ManualBackupStep1/index.js +++ b/app/components/Views/ManualBackupStep1/index.js @@ -31,6 +31,7 @@ import { WRONG_PASSWORD_ERROR, } from '../../../constants/onboarding'; import AnalyticsV2 from '../../../util/analyticsV2'; +import { ThemeContext } from '../../../util/theme'; const styles = StyleSheet.create({ mainWrapper: { @@ -216,8 +217,6 @@ const styles = StyleSheet.create({ * the backup seed phrase flow */ export default class ManualBackupStep1 extends PureComponent { - static navigationOptions = ({ navigation, route }) => getOnboardingNavbarOptions(navigation, route); - static propTypes = { /** /* navigation object required to push and pop other views @@ -240,7 +239,14 @@ export default class ManualBackupStep1 extends PureComponent { view: SEED_PHRASE, }; + updateNavBar = () => { + const { route, navigation } = this.props; + const { colors } = this.context; + navigation.setOptions(getOnboardingNavbarOptions(route, {}, colors)); + }; + async componentDidMount() { + this.updateNavBar(); this.words = this.props.route.params?.words ?? []; if (!this.words.length) { @@ -259,6 +265,10 @@ export default class ManualBackupStep1 extends PureComponent { InteractionManager.runAfterInteractions(() => PreventScreenshot.forbid()); } + componentDidUpdate = () => { + this.updateNavBar(); + }; + onPasswordChange = (password) => { this.setState({ password }); }; @@ -425,3 +435,5 @@ export default class ManualBackupStep1 extends PureComponent { ); } } + +ManualBackupStep1.contextType = ThemeContext; diff --git a/app/components/Views/ManualBackupStep2/index.js b/app/components/Views/ManualBackupStep2/index.js index 020810438dd..a6bc5a0a0b4 100644 --- a/app/components/Views/ManualBackupStep2/index.js +++ b/app/components/Views/ManualBackupStep2/index.js @@ -11,6 +11,7 @@ import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; import Device from '../../../util/device'; import { getOnboardingNavbarOptions } from '../../UI/Navbar'; import AnalyticsV2 from '../../../util/analyticsV2'; +import { ThemeContext } from '../../../util/theme'; const styles = StyleSheet.create({ mainWrapper: { @@ -150,8 +151,6 @@ const styles = StyleSheet.create({ * the backup seed phrase flow */ class ManualBackupStep2 extends PureComponent { - static navigationOptions = ({ navigation, route }) => getOnboardingNavbarOptions(navigation, route); - static propTypes = { /** /* navigation object required to push and pop other views @@ -187,6 +186,12 @@ class ManualBackupStep2 extends PureComponent { currentStep: 2, }; + updateNavBar = () => { + const { route, navigation } = this.props; + const { colors } = this.context; + navigation.setOptions(getOnboardingNavbarOptions(route, {}, colors)); + }; + componentDidMount = () => { const { route } = this.props; const words = route.params?.words ?? []; @@ -198,6 +203,10 @@ class ManualBackupStep2 extends PureComponent { ); }; + componentDidUpdate = () => { + this.updateNavBar(); + }; + createWordsDictionary = () => { const dict = {}; this.words.forEach((word, i) => { @@ -374,6 +383,8 @@ class ManualBackupStep2 extends PureComponent { }; } +ManualBackupStep2.contextType = ThemeContext; + const mapDispatchToProps = (dispatch) => ({ seedphraseBackedUp: () => dispatch(seedphraseBackedUp()), }); diff --git a/app/components/Views/ManualBackupStep3/index.js b/app/components/Views/ManualBackupStep3/index.js index d26adb0db9e..754d7f7285f 100644 --- a/app/components/Views/ManualBackupStep3/index.js +++ b/app/components/Views/ManualBackupStep3/index.js @@ -26,6 +26,7 @@ import { getTransparentOnboardingNavbarOptions } from '../../UI/Navbar'; import { ONBOARDING_WIZARD, SEED_PHRASE_HINTS } from '../../../constants/storage'; import AnalyticsV2 from '../../../util/analyticsV2'; import DefaultPreference from 'react-native-default-preference'; +import { ThemeContext } from '../../../util/theme'; const styles = StyleSheet.create({ mainWrapper: { @@ -84,8 +85,6 @@ const HARDWARE_BACK_PRESS = 'hardwareBackPress'; * the backup seed phrase flow */ class ManualBackupStep3 extends PureComponent { - static navigationOptions = ({ navigation }) => getTransparentOnboardingNavbarOptions(navigation); - constructor(props) { super(props); this.steps = props.route.params?.steps; @@ -108,11 +107,18 @@ class ManualBackupStep3 extends PureComponent { route: PropTypes.object, }; + updateNavBar = () => { + const { navigation } = this.props; + const { colors } = this.context; + navigation.setOptions(getTransparentOnboardingNavbarOptions(colors)); + }; + componentWillUnmount = () => { BackHandler.removeEventListener(HARDWARE_BACK_PRESS, hardwareBackPress); }; componentDidMount = async () => { + this.updateNavBar(); const currentSeedphraseHints = await AsyncStorage.getItem(SEED_PHRASE_HINTS); const parsedHints = currentSeedphraseHints && JSON.parse(currentSeedphraseHints); const manualBackup = parsedHints?.manualBackup; @@ -125,6 +131,10 @@ class ManualBackupStep3 extends PureComponent { BackHandler.addEventListener(HARDWARE_BACK_PRESS, hardwareBackPress); }; + componentDidUpdate = () => { + this.updateNavBar(); + }; + toggleHint = () => { this.setState((state) => ({ showHint: !state.showHint })); }; @@ -233,6 +243,8 @@ class ManualBackupStep3 extends PureComponent { } } +ManualBackupStep3.contextType = ThemeContext; + const mapDispatchToProps = (dispatch) => ({ showAlert: (config) => dispatch(showAlert(config)), }); diff --git a/app/components/Views/Onboarding/index.js b/app/components/Views/Onboarding/index.js index 6049ece11bb..d7d83f37d87 100644 --- a/app/components/Views/Onboarding/index.js +++ b/app/components/Views/Onboarding/index.js @@ -37,6 +37,7 @@ import { PREVIOUS_SCREEN, ONBOARDING } from '../../../constants/navigation'; import { EXISTING_USER, METRICS_OPT_IN } from '../../../constants/storage'; import AnalyticsV2 from '../../../util/analyticsV2'; import DefaultPreference from 'react-native-default-preference'; +import { ThemeContext } from '../../../util/theme'; const PUB_KEY = process.env.MM_PUBNUB_PUB_KEY; @@ -131,11 +132,6 @@ const styles = StyleSheet.create({ * View that is displayed to first time (new) users */ class Onboarding extends PureComponent { - static navigationOptions = ({ navigation, route }) => - route.params?.delete - ? getTransparentOnboardingNavbarOptions(navigation) - : getTransparentBackOnboardingNavbarOptions(navigation); - static propTypes = { /** * The navigator object @@ -217,7 +213,18 @@ class Onboarding extends PureComponent { BackHandler.addEventListener('hardwareBackPress', hardwareBackPress); }; + updateNavBar = () => { + const { route, navigation } = this.props; + const { colors } = this.context; + navigation.setOptions( + route.params?.delete + ? getTransparentOnboardingNavbarOptions(colors) + : getTransparentBackOnboardingNavbarOptions(colors) + ); + }; + componentDidMount() { + this.updateNavBar(); this.mounted = true; this.checkIfExistingUser(); InteractionManager.runAfterInteractions(() => { @@ -239,6 +246,10 @@ class Onboarding extends PureComponent { InteractionManager.runAfterInteractions(PreventScreenshot.allow); } + componentDidUpdate = () => { + this.updateNavBar(); + }; + async checkIfExistingUser() { const existingUser = await AsyncStorage.getItem(EXISTING_USER); if (existingUser !== null) { @@ -492,6 +503,8 @@ class Onboarding extends PureComponent { } } +Onboarding.contextType = ThemeContext; + const mapStateToProps = (state) => ({ accounts: state.engine.backgroundState.AccountTrackerController.accounts, passwordSet: state.user.passwordSet, diff --git a/app/components/Views/OnboardingCarousel/index.js b/app/components/Views/OnboardingCarousel/index.js index 2fc5c9753e3..58f73912a8e 100644 --- a/app/components/Views/OnboardingCarousel/index.js +++ b/app/components/Views/OnboardingCarousel/index.js @@ -14,6 +14,7 @@ import { connect } from 'react-redux'; import AnalyticsV2, { ANALYTICS_EVENTS_V2 } from '../../../util/analyticsV2'; import DefaultPreference from 'react-native-default-preference'; import { METRICS_OPT_IN } from '../../../constants/storage'; +import { ThemeContext } from '../../../util/theme'; const IMAGE_3_RATIO = 215 / 315; const IMAGE_2_RATIO = 222 / 239; @@ -110,8 +111,6 @@ const carousel_images = [onboarding_carousel_1, onboarding_carousel_2, onboardin * View that is displayed to first time (new) users */ class OnboardingCarousel extends PureComponent { - static navigationOptions = ({ navigation }) => getTransparentOnboardingNavbarOptions(navigation); - static propTypes = { /** * The navigator object @@ -152,12 +151,23 @@ class OnboardingCarousel extends PureComponent { }); }; + updateNavBar = () => { + const { colors } = this.context; + this.props.navigation.setOptions(getTransparentOnboardingNavbarOptions(colors)); + }; + componentDidMount = () => { + this.updateNavBar(); this.trackEvent(ANALYTICS_EVENTS_V2.ONBOARDING_WELCOME_MESSAGE_VIEWED); }; + componentDidUpdate = () => { + this.updateNavBar(); + }; + render() { const { currentTab } = this.state; + return ( @@ -219,6 +229,8 @@ class OnboardingCarousel extends PureComponent { } } +OnboardingCarousel.contextType = ThemeContext; + const mapDispatchToProps = (dispatch) => ({ saveOnboardingEvent: (...eventArgs) => dispatch(saveOnboardingEvent(eventArgs)), }); From 0f65795f62cff102eb9db480165fe83010b4be30 Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Mon, 7 Feb 2022 23:52:20 -0800 Subject: [PATCH 08/77] Change default theme mode --- app/components/Nav/App/index.js | 5 +---- app/reducers/user/index.js | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/components/Nav/App/index.js b/app/components/Nav/App/index.js index c893d087c32..2f26d46fe03 100644 --- a/app/components/Nav/App/index.js +++ b/app/components/Nav/App/index.js @@ -257,10 +257,7 @@ const App = ({ userLoggedIn }) => { const appTheme = useSelector((state) => state.user.appTheme); const theme = useAppTheme(); useEffect(() => { - const newAppTheme = - appTheme === AppThemeNames.Light || appTheme === AppThemeNames.OS - ? AppThemeNames.Dark - : AppThemeNames.Light; + const newAppTheme = appTheme === AppThemeNames.Light ? AppThemeNames.Dark : AppThemeNames.Light; if (__DEV__) { DevSettings.addMenuItem('Toggle Theme', () => { dispatch(setAppTheme(newAppTheme)); diff --git a/app/reducers/user/index.js b/app/reducers/user/index.js index c6be250ed76..d05bc0e226e 100644 --- a/app/reducers/user/index.js +++ b/app/reducers/user/index.js @@ -12,7 +12,7 @@ const initialState = { userLoggedIn: false, isAuthChecked: false, initialScreen: '', - appTheme: AppThemeNames.OS, + appTheme: AppThemeNames.Light, }; const userReducer = (state = initialState, action) => { From 5219ac25cc44f9ac348e3549da9c44f357421cdb Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Mon, 7 Feb 2022 23:53:48 -0800 Subject: [PATCH 09/77] Change default theme mode --- app/components/Nav/App/index.js | 5 +---- app/reducers/user/index.js | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/components/Nav/App/index.js b/app/components/Nav/App/index.js index c893d087c32..2f26d46fe03 100644 --- a/app/components/Nav/App/index.js +++ b/app/components/Nav/App/index.js @@ -257,10 +257,7 @@ const App = ({ userLoggedIn }) => { const appTheme = useSelector((state) => state.user.appTheme); const theme = useAppTheme(); useEffect(() => { - const newAppTheme = - appTheme === AppThemeNames.Light || appTheme === AppThemeNames.OS - ? AppThemeNames.Dark - : AppThemeNames.Light; + const newAppTheme = appTheme === AppThemeNames.Light ? AppThemeNames.Dark : AppThemeNames.Light; if (__DEV__) { DevSettings.addMenuItem('Toggle Theme', () => { dispatch(setAppTheme(newAppTheme)); diff --git a/app/reducers/user/index.js b/app/reducers/user/index.js index c6be250ed76..d05bc0e226e 100644 --- a/app/reducers/user/index.js +++ b/app/reducers/user/index.js @@ -12,7 +12,7 @@ const initialState = { userLoggedIn: false, isAuthChecked: false, initialScreen: '', - appTheme: AppThemeNames.OS, + appTheme: AppThemeNames.Light, }; const userReducer = (state = initialState, action) => { From 3c3b0283af450060a876e8d59fa4b14c72125b0f Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Tue, 8 Feb 2022 11:19:01 -0800 Subject: [PATCH 10/77] Begin introducing dark mode to settings --- app/components/UI/Navbar/index.js | 91 ++++++++++++++----- app/components/Views/ResetPassword/index.js | 16 +++- .../Views/RevealPrivateCredential/index.js | 26 +++++- .../Views/Settings/AdvancedSettings/index.js | 19 +++- .../Views/Settings/AppInformation/index.js | 17 +++- .../Settings/Contacts/ContactForm/index.js | 24 ++++- .../Views/Settings/Contacts/index.js | 23 +++-- .../Settings/ExperimentalSettings/index.tsx | 28 ++++-- .../Views/Settings/GeneralSettings/index.js | 19 +++- .../NetworksSettings/NetworkSettings/index.js | 19 +++- .../Views/Settings/NetworksSettings/index.js | 22 ++++- .../Views/Settings/SecuritySettings/index.js | 19 +++- app/components/Views/Settings/index.js | 22 ++++- .../Views/WalletConnectSessions/index.js | 27 +++++- 14 files changed, 297 insertions(+), 75 deletions(-) diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index 9748efb4479..e591bbbd31f 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -158,22 +158,31 @@ export default function getNavbarOptions(title, disableNetwork = false, drawerRe * @param {Object} navigation - Navigation object required to push new views * @returns {Object} - Corresponding navbar options containing title and headerTitleStyle */ -export function getNavigationOptionsTitle(title, navigation, isFullScreenModal) { +export function getNavigationOptionsTitle(title, navigation, isFullScreenModal, themeColors) { + const innerStyles = StyleSheet.create({ + headerTitleStyle: { + fontSize: 20, + color: themeColors.textDefault, + ...fontStyles.normal, + }, + headerIcon: { + color: themeColors.primary, + }, + headerStyle: { + backgroundColor: themeColors.backgroundDefault, + }, + }); function navigationPop() { navigation.pop(); } return { title, - headerTitleStyle: { - fontSize: 20, - color: colors.fontPrimary, - ...fontStyles.normal, - }, - headerTintColor: colors.blue, + headerTitleStyle: innerStyles.headerTitleStyle, + headerTintColor: themeColors.primary, headerRight: () => isFullScreenModal ? ( - + ) : null, headerLeft: () => @@ -182,10 +191,11 @@ export function getNavigationOptionsTitle(title, navigation, isFullScreenModal) ), + headerStyle: innerStyles.headerStyle, }; } @@ -197,7 +207,25 @@ export function getNavigationOptionsTitle(title, navigation, isFullScreenModal) * @param {Object} navigation - Navigation object required to push new views * @returns {Object} - Corresponding navbar options */ -export function getEditableOptions(title, navigation, route) { +export function getEditableOptions(title, navigation, route, themeColors) { + const innerStyles = StyleSheet.create({ + headerTitleStyle: { + fontSize: 20, + color: themeColors.textDefault, + ...fontStyles.normal, + }, + headerIcon: { + color: themeColors.primary, + }, + headerButtonText: { + color: themeColors.primary, + fontSize: 14, + ...fontStyles.normal, + }, + headerStyle: { + backgroundColor: themeColors.backgroundDefault, + }, + }); function navigationPop() { navigation.pop(); } @@ -206,31 +234,28 @@ export function getEditableOptions(title, navigation, route) { const addMode = route.params?.mode === 'add'; return { title, - headerTitleStyle: { - fontSize: 20, - color: colors.fontPrimary, - ...fontStyles.normal, - }, - headerTintColor: colors.blue, + headerTitleStyle: innerStyles.headerTitleStyle, + headerTintColor: themeColors.primary, headerLeft: () => ( ), headerRight: () => !addMode ? ( - + {editMode ? strings('address_book.edit') : strings('address_book.cancel')} ) : ( ), + headerStyle: innerStyles.headerStyle, }; } @@ -586,26 +611,42 @@ export function getOptinMetricsNavbarOptions() { * * @returns {Object} - Corresponding navbar options containing headerTitle, headerTitle and headerTitle */ -export function getClosableNavigationOptions(title, backButtonText, navigation) { +export function getClosableNavigationOptions(title, backButtonText, navigation, themeColors) { + const innerStyles = StyleSheet.create({ + headerButtonText: { + color: themeColors.primary, + fontSize: 14, + ...fontStyles.normal, + }, + headerIcon: { + color: themeColors.primary, + }, + headerStyle: { + backgroundColor: themeColors.backgroundDefault, + }, + headerTitleStyle: { + fontSize: 20, + ...fontStyles.normal, + color: themeColors.textDefault, + }, + }); function navigationPop() { navigation.pop(); } return { title, - headerTitleStyle: { - fontSize: 20, - ...fontStyles.normal, - }, + headerTitleStyle: innerStyles.headerTitleStyle, headerLeft: () => Device.isIos() ? ( - {backButtonText} + {backButtonText} ) : ( - + ), + headerStyle: innerStyles.headerStyle, }; } diff --git a/app/components/Views/ResetPassword/index.js b/app/components/Views/ResetPassword/index.js index 1dbf0e17ca8..669821eaafd 100644 --- a/app/components/Views/ResetPassword/index.js +++ b/app/components/Views/ResetPassword/index.js @@ -38,6 +38,7 @@ import { EXISTING_USER, TRUE, BIOMETRY_CHOICE_DISABLED } from '../../../constant import { getPasswordStrengthWord, passwordRequirementsMet } from '../../../util/password'; import NotificationManager from '../../../core/NotificationManager'; import { syncPrefs } from '../../../util/sync'; +import { ThemeContext } from '../../../util/theme'; const styles = StyleSheet.create({ mainWrapper: { @@ -252,9 +253,6 @@ const CONFIRM_PASSWORD = 'confirm_password'; * View where users can set their password for the first time */ class ResetPassword extends PureComponent { - static navigationOptions = ({ navigation }) => - getNavigationOptionsTitle(strings('password_reset.change_password'), navigation); - static propTypes = { /** * The navigator object @@ -300,7 +298,16 @@ class ResetPassword extends PureComponent { confirmPasswordInput = React.createRef(); + updateNavBar = () => { + const { navigation } = this.props; + const { colors } = this.context; + navigation.setOptions( + getNavigationOptionsTitle(strings('password_reset.change_password'), navigation, false, colors) + ); + }; + async componentDidMount() { + this.updateNavBar(); const biometryType = await SecureKeychain.getSupportedBiometryType(); const state = { view: CONFIRM_PASSWORD }; @@ -319,6 +326,7 @@ class ResetPassword extends PureComponent { } componentDidUpdate(prevProps, prevState) { + this.updateNavBar(); const prevLoading = prevState.loading; const { loading } = this.state; const { navigation } = this.props; @@ -777,6 +785,8 @@ class ResetPassword extends PureComponent { } } +ResetPassword.contextType = ThemeContext; + const mapStateToProps = (state) => ({ selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress, }); diff --git a/app/components/Views/RevealPrivateCredential/index.js b/app/components/Views/RevealPrivateCredential/index.js index 3d766b15453..1b69dda9845 100644 --- a/app/components/Views/RevealPrivateCredential/index.js +++ b/app/components/Views/RevealPrivateCredential/index.js @@ -26,6 +26,7 @@ import DefaultTabBar from 'react-native-scrollable-tab-view/DefaultTabBar'; import PreventScreenshot from '../../../core/PreventScreenshot'; import { BIOMETRY_CHOICE } from '../../../constants/storage'; import ClipboardManager from '../../../core/ClipboardManager'; +import { ThemeContext } from '../../../util/theme'; const styles = StyleSheet.create({ wrapper: { @@ -141,11 +142,6 @@ class RevealPrivateCredential extends PureComponent { warningIncorrectPassword: '', }; - static navigationOptions = ({ navigation, route }) => - getNavigationOptionsTitle( - strings(`reveal_credential.${route.params?.privateCredentialName ?? ''}_title`), - navigation - ); static propTypes = { /** /* navigation object required to push new views @@ -177,7 +173,21 @@ class RevealPrivateCredential extends PureComponent { route: PropTypes.object, }; + updateNavBar = () => { + const { navigation, route } = this.props; + const { colors } = this.context; + navigation.setOptions( + getNavigationOptionsTitle( + strings(`reveal_credential.${route.params?.privateCredentialName ?? ''}_title`), + navigation, + false, + colors + ) + ); + }; + async componentDidMount() { + this.updateNavBar(); // Try to use biometrics to unloc // (if available) const biometryType = await SecureKeychain.getSupportedBiometryType(); @@ -197,6 +207,10 @@ class RevealPrivateCredential extends PureComponent { }); } + componentDidUpdate = () => { + this.updateNavBar(); + }; + componentWillUnmount = () => { InteractionManager.runAfterInteractions(() => { PreventScreenshot.allow(); @@ -366,6 +380,8 @@ class RevealPrivateCredential extends PureComponent { }; } +RevealPrivateCredential.contextType = ThemeContext; + const mapStateToProps = (state) => ({ selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress, passwordSet: state.user.passwordSet, diff --git a/app/components/Views/Settings/AdvancedSettings/index.js b/app/components/Views/Settings/AdvancedSettings/index.js index 5ff2fb9f7a2..34886264c72 100644 --- a/app/components/Views/Settings/AdvancedSettings/index.js +++ b/app/components/Views/Settings/AdvancedSettings/index.js @@ -20,6 +20,7 @@ import ipfsGateways from '../../../../util/ipfs-gateways.json'; import SelectComponent from '../../../UI/SelectComponent'; import { timeoutFetch } from '../../../../util/general'; import Device from '../../../../util/device'; +import { ThemeContext } from '../../../../util/theme'; const HASH_TO_TEST = 'Qmaisz6NMhDB51cCvNWa1GMS7LU1pAxdF4Ld6Ft9kZEP2a'; const HASH_STRING = 'Hello from IPFS Gateway Checker'; @@ -124,9 +125,6 @@ class AdvancedSettings extends PureComponent { fullState: PropTypes.object, }; - static navigationOptions = ({ navigation }) => - getNavigationOptionsTitle(strings('app_settings.advanced_title'), navigation); - state = { resetModalVisible: false, inputWidth: Device.isAndroid() ? '99%' : undefined, @@ -134,7 +132,16 @@ class AdvancedSettings extends PureComponent { gotAvailableGateways: false, }; + updateNavBar = () => { + const { navigation } = this.props; + const { colors } = this.context; + navigation.setOptions( + getNavigationOptionsTitle(strings('app_settings.advanced_title'), navigation, false, colors) + ); + }; + componentDidMount = async () => { + this.updateNavBar(); await this.handleAvailableIpfsGateways(); this.mounted = true; // Workaround https://github.com/facebook/react-native/issues/9958 @@ -144,6 +151,10 @@ class AdvancedSettings extends PureComponent { }, 100); }; + componentDidUpdate = () => { + this.updateNavBar(); + }; + componentWillUnmount = () => { this.mounted = false; }; @@ -326,6 +337,8 @@ class AdvancedSettings extends PureComponent { }; } +AdvancedSettings.contextType = ThemeContext; + const mapStateToProps = (state) => ({ ipfsGateway: state.engine.backgroundState.PreferencesController.ipfsGateway, showHexData: state.settings.showHexData, diff --git a/app/components/Views/Settings/AppInformation/index.js b/app/components/Views/Settings/AppInformation/index.js index 2588612dd06..a2a9139a416 100644 --- a/app/components/Views/Settings/AppInformation/index.js +++ b/app/components/Views/Settings/AppInformation/index.js @@ -15,6 +15,7 @@ import PropTypes from 'prop-types'; import { strings } from '../../../../../locales/i18n'; import { getNavigationOptionsTitle } from '../../../UI/Navbar'; import AppConstants from '../../../../core/AppConstants'; +import { ThemeContext } from '../../../../util/theme'; const styles = StyleSheet.create({ wrapper: { @@ -73,9 +74,6 @@ const foxImage = require('../../../../images/fox.png'); // eslint-disable-line i * View that contains app information */ export default class AppInformation extends PureComponent { - static navigationOptions = ({ navigation }) => - getNavigationOptionsTitle(strings('app_settings.info_title'), navigation); - static propTypes = { /** /* navigation object required to push new views @@ -87,13 +85,24 @@ export default class AppInformation extends PureComponent { appInfo: '', }; + updateNavBar = () => { + const { navigation } = this.props; + const { colors } = this.context; + navigation.setOptions(getNavigationOptionsTitle(strings('app_settings.info_title'), navigation, false, colors)); + }; + componentDidMount = async () => { + this.updateNavBar(); const appName = await getApplicationName(); const appVersion = await getVersion(); const buildNumber = await getBuildNumber(); this.setState({ appInfo: `${appName} v${appVersion} (${buildNumber})` }); }; + componentDidUpdate = () => { + this.updateNavBar(); + }; + goTo = (url, title) => { InteractionManager.runAfterInteractions(() => { this.props.navigation.navigate('Webview', { @@ -171,3 +180,5 @@ export default class AppInformation extends PureComponent { ); } + +AppInformation.contextType = ThemeContext; diff --git a/app/components/Views/Settings/Contacts/ContactForm/index.js b/app/components/Views/Settings/Contacts/ContactForm/index.js index 27788ff4bc8..1553f31fa09 100644 --- a/app/components/Views/Settings/Contacts/ContactForm/index.js +++ b/app/components/Views/Settings/Contacts/ContactForm/index.js @@ -14,6 +14,7 @@ import { isENS, renderShortAddress } from '../../../../../util/address'; import ErrorMessage from '../../../SendFlow/ErrorMessage'; import AntIcon from 'react-native-vector-icons/AntDesign'; import ActionSheet from 'react-native-actionsheet'; +import { ThemeContext } from '../../../../../util/theme'; const styles = StyleSheet.create({ wrapper: { @@ -92,9 +93,6 @@ const EDIT = 'edit'; * View that contains app information */ class ContactForm extends PureComponent { - static navigationOptions = ({ navigation, route }) => - getEditableOptions(strings(`address_book.${route.params?.mode ?? ADD}_contact_title`), navigation, route); - static propTypes = { /** * Object that represents the navigator @@ -134,9 +132,23 @@ class ContactForm extends PureComponent { addressInput = React.createRef(); memoInput = React.createRef(); + updateNavBar = () => { + const { navigation, route } = this.props; + const { colors } = this.context; + navigation.setOptions( + getEditableOptions( + strings(`address_book.${route.params?.mode ?? ADD}_contact_title`), + navigation, + route, + colors + ) + ); + }; + componentDidMount = () => { const { mode } = this.state; const { navigation } = this.props; + this.updateNavBar(); // Workaround https://github.com/facebook/react-native/issues/9958 this.state.inputWidth && setTimeout(() => { @@ -152,6 +164,10 @@ class ContactForm extends PureComponent { } }; + componentDidUpdate = () => { + this.updateNavBar(); + }; + onEdit = () => { const { navigation } = this.props; const { editable } = this.state; @@ -374,6 +390,8 @@ class ContactForm extends PureComponent { }; } +ContactForm.contextType = ThemeContext; + const mapStateToProps = (state) => ({ addressBook: state.engine.backgroundState.AddressBookController.addressBook, identities: state.engine.backgroundState.PreferencesController.identities, diff --git a/app/components/Views/Settings/Contacts/index.js b/app/components/Views/Settings/Contacts/index.js index f6e4562a4b7..d44dbb91109 100644 --- a/app/components/Views/Settings/Contacts/index.js +++ b/app/components/Views/Settings/Contacts/index.js @@ -9,6 +9,7 @@ import AddressList from '../../SendFlow/AddressList'; import StyledButton from '../../../UI/StyledButton'; import Engine from '../../../../core/Engine'; import ActionSheet from 'react-native-actionsheet'; +import { ThemeContext } from '../../../../util/theme'; const styles = StyleSheet.create({ wrapper: { @@ -28,9 +29,6 @@ const ADD = 'add'; * View that contains app information */ class Contacts extends PureComponent { - static navigationOptions = ({ navigation }) => - getNavigationOptionsTitle(strings('app_settings.contacts_title'), navigation); - static propTypes = { /** * Map representing the address book @@ -53,7 +51,20 @@ class Contacts extends PureComponent { actionSheet; contactAddressToRemove; + updateNavBar = () => { + const { navigation } = this.props; + const { colors } = this.context; + navigation.setOptions( + getNavigationOptionsTitle(strings('app_settings.contacts_title'), navigation, false, colors) + ); + }; + + componentDidMount = () => { + this.updateNavBar(); + }; + componentDidUpdate = (prevProps) => { + this.updateNavBar(); const { network } = this.props; if ( prevProps.addressBook && @@ -96,10 +107,6 @@ class Contacts extends PureComponent { this.props.navigation.navigate('ContactForm', { mode: ADD }); }; - goToEditContact = () => { - this.props.navigation.navigate('ContactsEdit'); - }; - createActionSheetRef = (ref) => { this.actionSheet = ref; }; @@ -136,6 +143,8 @@ class Contacts extends PureComponent { }; } +Contacts.contextType = ThemeContext; + const mapStateToProps = (state) => ({ addressBook: state.engine.backgroundState.AddressBookController.addressBook, network: state.engine.backgroundState.NetworkController.network, diff --git a/app/components/Views/Settings/ExperimentalSettings/index.tsx b/app/components/Views/Settings/ExperimentalSettings/index.tsx index abaeab01606..1b1de546e30 100644 --- a/app/components/Views/Settings/ExperimentalSettings/index.tsx +++ b/app/components/Views/Settings/ExperimentalSettings/index.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useEffect } from 'react'; import { StyleSheet, Text, ScrollView, View, Switch, InteractionManager } from 'react-native'; import StyledButton from '../../../UI/StyledButton'; -import { colors, fontStyles } from '../../../../styles/common'; +import { colors as importedColors, fontStyles } from '../../../../styles/common'; import { getNavigationOptionsTitle } from '../../../UI/Navbar'; import { strings } from '../../../../../locales/i18n'; import Device from '../../../../util/device'; @@ -9,23 +9,24 @@ import Engine from '../../../../core/Engine'; import { useSelector } from 'react-redux'; import { MAINNET } from '../../../../constants/network'; import AnalyticsV2 from '../../../../util/analyticsV2'; +import { useAppThemeFromContext } from '../../../../util/theme'; const styles = StyleSheet.create({ wrapper: { - backgroundColor: colors.white, + backgroundColor: importedColors.white, flex: 1, padding: 24, paddingBottom: 48, }, title: { ...(fontStyles.normal as any), - color: colors.fontPrimary, + color: importedColors.fontPrimary, fontSize: 20, lineHeight: 20, }, desc: { ...(fontStyles.normal as any), - color: colors.grey500, + color: importedColors.grey500, fontSize: 14, lineHeight: 20, marginTop: 12, @@ -65,14 +66,21 @@ const ExperimentalSettings = ({ navigation, route }: Props) => { ); const chainId = useSelector((state: any) => state.engine.backgroundState.NetworkController.provider.chainId); + const { colors } = useAppThemeFromContext(); + useEffect( () => { navigation.setOptions( - getNavigationOptionsTitle(strings('app_settings.experimental_title'), navigation, isFullScreenModal) + getNavigationOptionsTitle( + strings('app_settings.experimental_title'), + navigation, + isFullScreenModal, + colors + ) ); }, // eslint-disable-next-line react-hooks/exhaustive-deps - [] + [colors] ); const goToWalletConnectSessions = useCallback(() => { @@ -104,8 +112,12 @@ const ExperimentalSettings = ({ navigation, route }: Props) => { diff --git a/app/components/Views/Settings/GeneralSettings/index.js b/app/components/Views/Settings/GeneralSettings/index.js index d337cc80304..6539c85e8a0 100644 --- a/app/components/Views/Settings/GeneralSettings/index.js +++ b/app/components/Views/Settings/GeneralSettings/index.js @@ -19,6 +19,7 @@ import PickComponent from '../../PickComponent'; import { toDataUrl } from '../../../../util/blockies.js'; import Device from '../../../../util/device'; import Jazzicon from 'react-native-jazzicon'; +import { ThemeContext } from '../../../../util/theme'; const diameter = 40; const spacing = 8; @@ -163,9 +164,6 @@ class Settings extends PureComponent { setHideZeroBalanceTokens: PropTypes.func, }; - static navigationOptions = ({ navigation }) => - getNavigationOptionsTitle(strings('app_settings.general_title'), navigation); - state = { currentLanguage: I18n.locale.substr(0, 2), languages: {}, @@ -195,7 +193,16 @@ class Settings extends PureComponent { this.props.setHideZeroBalanceTokens(toggleHideZeroBalanceTokens); }; + updateNavBar = () => { + const { navigation } = this.props; + const { colors } = this.context; + navigation.setOptions( + getNavigationOptionsTitle(strings('app_settings.general_title'), navigation, false, colors) + ); + }; + componentDidMount = () => { + this.updateNavBar(); const languages = getLanguages(); this.setState({ languages }); this.languageOptions = Object.keys(languages).map((key) => ({ value: key, label: languages[key], key })); @@ -209,6 +216,10 @@ class Settings extends PureComponent { ]; }; + componentDidUpdate = () => { + this.updateNavBar(); + }; + render() { const { currentCurrency, @@ -317,6 +328,8 @@ class Settings extends PureComponent { } } +Settings.contextType = ThemeContext; + const mapStateToProps = (state) => ({ currentCurrency: state.engine.backgroundState.CurrencyRateController.currentCurrency, searchEngine: state.settings.searchEngine, diff --git a/app/components/Views/Settings/NetworksSettings/NetworkSettings/index.js b/app/components/Views/Settings/NetworksSettings/NetworkSettings/index.js index f735dc292f8..934cea9714c 100644 --- a/app/components/Views/Settings/NetworksSettings/NetworkSettings/index.js +++ b/app/components/Views/Settings/NetworksSettings/NetworkSettings/index.js @@ -18,6 +18,7 @@ import Logger from '../../../../../util/Logger'; import { isPrefixedFormattedHexString } from '../../../../../util/number'; import AppConstants from '../../../../../core/AppConstants'; import AnalyticsV2 from '../../../../../util/analyticsV2'; +import { ThemeContext } from '../../../../../util/theme'; const styles = StyleSheet.create({ wrapper: { @@ -102,9 +103,6 @@ class NetworkSettings extends PureComponent { route: PropTypes.object, }; - static navigationOptions = ({ navigation }) => - getNavigationOptionsTitle(strings('app_settings.networks_title'), navigation); - state = { rpcUrl: undefined, blockExplorerUrl: undefined, @@ -129,7 +127,16 @@ class NetworkSettings extends PureComponent { getOtherNetworks = () => allNetworks.slice(1); + updateNavBar = () => { + const { navigation } = this.props; + const { colors } = this.context; + navigation.setOptions( + getNavigationOptionsTitle(strings('app_settings.networks_title'), navigation, false, colors) + ); + }; + componentDidMount = () => { + this.updateNavBar(); const { route, frequentRpcList } = this.props; const network = route.params?.network; let blockExplorerUrl, chainId, nickname, ticker, editable, rpcUrl; @@ -164,6 +171,10 @@ class NetworkSettings extends PureComponent { }, 100); }; + componentDidUpdate = () => { + this.updateNavBar(); + }; + /** * Attempts to convert the given chainId to a decimal string, for display * purposes. @@ -571,6 +582,8 @@ class NetworkSettings extends PureComponent { } } +NetworkSettings.contextType = ThemeContext; + const mapStateToProps = (state) => ({ frequentRpcList: state.engine.backgroundState.PreferencesController.frequentRpcList, }); diff --git a/app/components/Views/Settings/NetworksSettings/index.js b/app/components/Views/Settings/NetworksSettings/index.js index b82aafab1b7..89985b56f74 100644 --- a/app/components/Views/Settings/NetworksSettings/index.js +++ b/app/components/Views/Settings/NetworksSettings/index.js @@ -10,6 +10,7 @@ import Networks, { getAllNetworks } from '../../../../util/networks'; import StyledButton from '../../../UI/StyledButton'; import Engine from '../../../../core/Engine'; import { MAINNET, RPC } from '../../../../constants/network'; +import { ThemeContext } from '../../../../util/theme'; const styles = StyleSheet.create({ wrapper: { @@ -81,11 +82,24 @@ class NetworksSettings extends PureComponent { actionSheet = null; networkToRemove = null; - static navigationOptions = ({ navigation }) => - getNavigationOptionsTitle(strings('app_settings.networks_title'), navigation); - state = {}; + updateNavBar = () => { + const { navigation } = this.props; + const { colors } = this.context; + navigation.setOptions( + getNavigationOptionsTitle(strings('app_settings.networks_title'), navigation, false, colors) + ); + }; + + componentDidMount = () => { + this.updateNavBar(); + }; + + componentDidUpdate = () => { + this.updateNavBar(); + }; + getOtherNetworks = () => getAllNetworks().slice(1); onPress = (network) => { @@ -225,6 +239,8 @@ class NetworksSettings extends PureComponent { } } +NetworksSettings.contextType = ThemeContext; + const mapStateToProps = (state) => ({ provider: state.engine.backgroundState.NetworkController.provider, frequentRpcList: state.engine.backgroundState.PreferencesController.frequentRpcList, diff --git a/app/components/Views/Settings/SecuritySettings/index.js b/app/components/Views/Settings/SecuritySettings/index.js index 9a17d0df356..54e20a61349 100644 --- a/app/components/Views/Settings/SecuritySettings/index.js +++ b/app/components/Views/Settings/SecuritySettings/index.js @@ -47,6 +47,7 @@ import Icon from 'react-native-vector-icons/FontAwesome'; import HintModal from '../../../UI/HintModal'; import AnalyticsV2, { trackErrorAsAnalytics } from '../../../../util/analyticsV2'; import SeedPhraseVideo from '../../../UI/SeedPhraseVideo'; +import { ThemeContext } from '../../../../util/theme'; const isIos = Device.isIos(); @@ -251,9 +252,6 @@ class Settings extends PureComponent { type: PropTypes.string, }; - static navigationOptions = ({ navigation }) => - getNavigationOptionsTitle(strings('app_settings.security_title'), navigation); - state = { approvalModalVisible: false, biometryChoice: null, @@ -311,7 +309,16 @@ class Settings extends PureComponent { scrollView = undefined; + updateNavBar = () => { + const { navigation } = this.props; + const { colors } = this.context; + navigation.setOptions( + getNavigationOptionsTitle(strings('app_settings.security_title'), navigation, false, colors) + ); + }; + componentDidMount = async () => { + this.updateNavBar(); const biometryType = await SecureKeychain.getSupportedBiometryType(); const analyticsEnabled = Analytics.getEnabled(); const currentSeedphraseHints = await AsyncStorage.getItem(SEED_PHRASE_HINTS); @@ -344,6 +351,10 @@ class Settings extends PureComponent { if (this.props.route?.params?.scrollToBottom) this.scrollView?.scrollToEnd({ animated: true }); }; + componentDidUpdate = async () => { + this.updateNavBar(); + }; + onSingInWithBiometrics = async (enabled) => { this.setState({ loading: true }, async () => { let credentials; @@ -886,6 +897,8 @@ class Settings extends PureComponent { }; } +Settings.contextType = ThemeContext; + const mapStateToProps = (state) => ({ approvedHosts: state.privacy.approvedHosts, browserHistory: state.browser.history, diff --git a/app/components/Views/Settings/index.js b/app/components/Views/Settings/index.js index 3e60f84ef84..d96ba97ccb5 100644 --- a/app/components/Views/Settings/index.js +++ b/app/components/Views/Settings/index.js @@ -8,6 +8,7 @@ import { strings } from '../../../../locales/i18n'; import Analytics from '../../../core/Analytics'; import { ANALYTICS_EVENT_OPTS } from '../../../util/analytics'; import { connect } from 'react-redux'; +import { ThemeContext } from '../../../util/theme'; const styles = StyleSheet.create({ wrapper: { @@ -22,9 +23,6 @@ const styles = StyleSheet.create({ * Main view for app configurations */ class Settings extends PureComponent { - static navigationOptions = ({ navigation }) => - getClosableNavigationOptions(strings('app_settings.title'), strings('navigation.close'), navigation); - static propTypes = { /** /* navigation object required to push new views @@ -37,6 +35,22 @@ class Settings extends PureComponent { seedphraseBackedUp: PropTypes.bool, }; + updateNavBar = () => { + const { navigation } = this.props; + const { colors } = this.context; + navigation.setOptions( + getClosableNavigationOptions(strings('app_settings.title'), strings('navigation.close'), navigation, colors) + ); + }; + + componentDidMount = () => { + this.updateNavBar(); + }; + + componentDidUpdate = () => { + this.updateNavBar(); + }; + onPressGeneral = () => { InteractionManager.runAfterInteractions(() => Analytics.trackEvent(ANALYTICS_EVENT_OPTS.SETTINGS_GENERAL)); this.props.navigation.navigate('GeneralSettings'); @@ -113,6 +127,8 @@ class Settings extends PureComponent { }; } +Settings.contextType = ThemeContext; + const mapStateToProps = (state) => ({ seedphraseBackedUp: state.user.seedphraseBackedUp, }); diff --git a/app/components/Views/WalletConnectSessions/index.js b/app/components/Views/WalletConnectSessions/index.js index 64a8464c00c..848d0ef3975 100644 --- a/app/components/Views/WalletConnectSessions/index.js +++ b/app/components/Views/WalletConnectSessions/index.js @@ -9,6 +9,8 @@ import ActionSheet from 'react-native-actionsheet'; import WalletConnect from '../../../core/WalletConnect'; import Logger from '../../../util/Logger'; import { WALLETCONNECT_SESSIONS } from '../../../constants/storage'; +import { ThemeContext } from '../../../util/theme'; +import PropTypes from 'prop-types'; const styles = StyleSheet.create({ wrapper: { @@ -64,9 +66,6 @@ const styles = StyleSheet.create({ * View that displays all the active WalletConnect Sessions */ export default class WalletConnectSessions extends PureComponent { - static navigationOptions = ({ navigation }) => - getNavigationOptionsTitle(strings(`experimental_settings.wallet_connect_dapps`), navigation); - state = { sessions: [], }; @@ -75,10 +74,23 @@ export default class WalletConnectSessions extends PureComponent { sessionToRemove = null; + updateNavBar = () => { + const { navigation } = this.props; + const { colors } = this.context; + navigation.setOptions( + getNavigationOptionsTitle(strings('experimental_settings.wallet_connect_dapps'), navigation, false, colors) + ); + }; + componentDidMount() { + this.updateNavBar(); this.loadSessions(); } + componentDidUpdate = () => { + this.updateNavBar(); + }; + loadSessions = async () => { let sessions = []; const sessionData = await AsyncStorage.getItem(WALLETCONNECT_SESSIONS); @@ -167,3 +179,12 @@ export default class WalletConnectSessions extends PureComponent { ); }; } + +WalletConnectSessions.contextType = ThemeContext; + +WalletConnectSessions.propTypes = { + /** + * Navigation object + */ + navigation: PropTypes.object, +}; From 3a50876a3dd9169bd106b3dba70f29182dcfbc59 Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Tue, 8 Feb 2022 15:43:27 -0800 Subject: [PATCH 11/77] Add context type to login screen --- app/components/Views/Login/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/components/Views/Login/index.js b/app/components/Views/Login/index.js index 78faf1244d3..1a8a449a1e7 100644 --- a/app/components/Views/Login/index.js +++ b/app/components/Views/Login/index.js @@ -47,6 +47,7 @@ import Icon from 'react-native-vector-icons/FontAwesome'; import { trackErrorAsAnalytics } from '../../../util/analyticsV2'; import { tlc, toLowerCaseEquals } from '../../../util/general'; import DefaultPreference from 'react-native-default-preference'; +import { ThemeContext } from '../../../util/theme'; const deviceHeight = Device.getDeviceHeight(); const breakPoint = deviceHeight < 700; @@ -653,6 +654,8 @@ class Login extends PureComponent { ); } +Login.contextType = ThemeContext; + const mapStateToProps = (state) => ({ selectedAddress: state.engine.backgroundState.PreferencesController?.selectedAddress, initialScreen: state.user.initialScreen, From 7bcab3b1621df3d205a0a072e8a9b2286dbc2b17 Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Tue, 8 Feb 2022 19:34:02 -0800 Subject: [PATCH 12/77] Begin introducing dark theme to send flow --- app/components/UI/Navbar/index.js | 17 +++++++++++++--- app/components/UI/NavbarTitle/index.js | 3 +++ app/components/Views/SendFlow/Amount/index.js | 20 +++++++++++++++++-- .../Views/SendFlow/Confirm/index.js | 17 ++++++++++++++-- app/components/Views/SendFlow/SendTo/index.js | 16 +++++++++++++-- 5 files changed, 64 insertions(+), 9 deletions(-) diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index 9748efb4479..07790875136 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -372,7 +372,17 @@ export function getApproveNavbar(title) { * @param {string} title - Title in string format * @returns {Object} - Corresponding navbar options containing title and headerTitleStyle */ -export function getSendFlowTitle(title, navigation, route) { +export function getSendFlowTitle(title, navigation, route, themeColors) { + const innerStyles = StyleSheet.create({ + headerButtonText: { + color: themeColors.primary, + fontSize: 14, + ...fontStyles.normal, + }, + headerStyle: { + backgroundColor: themeColors.backgroundDefault, + }, + }); const rightAction = () => { const providerType = route.params?.providerType ?? ''; trackEventWithParameters(ANALYTICS_EVENT_OPTS.SEND_FLOW_CANCEL, { @@ -392,18 +402,19 @@ export function getSendFlowTitle(title, navigation, route) { headerRight: () => ( // eslint-disable-next-line react/jsx-no-bind - {strings('transaction.cancel')} + {strings('transaction.cancel')} ), headerLeft: () => canGoBack ? ( // eslint-disable-next-line react/jsx-no-bind - {strings('transaction.back')} + {strings('transaction.back')} ) : ( ), + headerStyle: innerStyles.headerStyle, }; } diff --git a/app/components/UI/NavbarTitle/index.js b/app/components/UI/NavbarTitle/index.js index a58a65dc9ad..898a99e4a92 100644 --- a/app/components/UI/NavbarTitle/index.js +++ b/app/components/UI/NavbarTitle/index.js @@ -7,6 +7,7 @@ import Networks from '../../../util/networks'; import { toggleNetworkModal } from '../../../actions/modals'; import { strings } from '../../../../locales/i18n'; import Device from '../../../util/device'; +import { ThemeContext } from '../../../util/theme'; const styles = StyleSheet.create({ wrapper: { @@ -124,6 +125,8 @@ class NavbarTitle extends PureComponent { }; } +NavbarTitle.contextType = ThemeContext; + const mapStateToProps = (state) => ({ network: state.engine.backgroundState.NetworkController, }); diff --git a/app/components/Views/SendFlow/Amount/index.js b/app/components/Views/SendFlow/Amount/index.js index 2f7be127e60..649b10e9fb1 100644 --- a/app/components/Views/SendFlow/Amount/index.js +++ b/app/components/Views/SendFlow/Amount/index.js @@ -59,6 +59,7 @@ import { decGWEIToHexWEI } from '../../../../util/conversions'; import AppConstants from '../../../../core/AppConstants'; import { collectibleContractsSelector, collectiblesSelector } from '../../../../reducers/collectibles'; import { gte } from '../../../../util/lodash'; +import { ThemeContext } from '../../../../util/theme'; const { hexToBN, BNToHex } = util; @@ -293,8 +294,6 @@ const styles = StyleSheet.create({ * View that wraps the wraps the "Send" screen */ class Amount extends PureComponent { - static navigationOptions = ({ navigation, route }) => getSendFlowTitle('send.amount', navigation, route); - static propTypes = { /** * Map of accounts to information objects including balances @@ -328,6 +327,10 @@ class Amount extends PureComponent { * Object that represents the navigator */ navigation: PropTypes.object, + /** + * Object that contains navigation props + */ + route: PropTypes.object, /** * A string that represents the selected address */ @@ -397,6 +400,12 @@ class Amount extends PureComponent { tokens = []; collectibles = []; + updateNavBar = () => { + const { navigation, route } = this.props; + const { colors } = this.context; + navigation.setOptions(getSendFlowTitle('send.amount', navigation, route, colors)); + }; + componentDidMount = async () => { const { tokens, @@ -408,6 +417,7 @@ class Amount extends PureComponent { isPaymentRequest, } = this.props; // For analytics + this.updateNavBar(); navigation.setParams({ providerType, isPaymentRequest }); this.tokens = [getEther(ticker), ...tokens]; @@ -451,6 +461,10 @@ class Amount extends PureComponent { }); }; + componentDidUpdate = () => { + this.updateNavBar(); + }; + /** * Method to validate collectible ownership. * @@ -1085,6 +1099,8 @@ class Amount extends PureComponent { }; } +Amount.contextType = ThemeContext; + const mapStateToProps = (state, ownProps) => ({ accounts: state.engine.backgroundState.AccountTrackerController.accounts, contractBalances: state.engine.backgroundState.TokenBalancesController.contractBalances, diff --git a/app/components/Views/SendFlow/Confirm/index.js b/app/components/Views/SendFlow/Confirm/index.js index ed12d6618e8..c29d43ed281 100644 --- a/app/components/Views/SendFlow/Confirm/index.js +++ b/app/components/Views/SendFlow/Confirm/index.js @@ -62,6 +62,7 @@ import EditGasFee1559 from '../../../UI/EditGasFee1559'; import EditGasFeeLegacy from '../../../UI/EditGasFeeLegacy'; import CustomNonce from '../../../UI/CustomNonce'; import AppConstants from '../../../../core/AppConstants'; +import { ThemeContext } from '../../../../util/theme'; const EDIT = 'edit'; const EDIT_NONCE = 'edit_nonce'; @@ -222,13 +223,15 @@ const styles = StyleSheet.create({ * View that wraps the wraps the "Send" screen */ class Confirm extends PureComponent { - static navigationOptions = ({ navigation, route }) => getSendFlowTitle('send.confirm', navigation, route); - static propTypes = { /** * Object that represents the navigator */ navigation: PropTypes.object, + /** + * Object that contains navigation props + */ + route: PropTypes.object, /** * Map of accounts to information objects including balances */ @@ -417,12 +420,19 @@ class Confirm extends PureComponent { toggleWarningModal = () => this.setState((state) => ({ warningModalVisible: !state.warningModalVisible })); + updateNavBar = () => { + const { navigation, route } = this.props; + const { colors } = this.context; + navigation.setOptions(getSendFlowTitle('send.confirm', navigation, route, colors)); + }; + componentWillUnmount = () => { const { GasFeeController } = Engine.context; GasFeeController.stopPolling(this.state.pollToken); }; componentDidMount = async () => { + this.updateNavBar(); this.getGasLimit(); const { GasFeeController } = Engine.context; @@ -447,6 +457,7 @@ class Confirm extends PureComponent { contractBalances, selectedAsset, } = this.props; + this.updateNavBar(); const { errorMessage, fromSelectedAddress } = this.state; const valueChanged = prevProps.transactionState.transaction.value !== value; @@ -1353,6 +1364,8 @@ class Confirm extends PureComponent { }; } +Confirm.contextType = ThemeContext; + const mapStateToProps = (state) => ({ accounts: state.engine.backgroundState.AccountTrackerController.accounts, addressBook: state.engine.backgroundState.AddressBookController?.addressBook, diff --git a/app/components/Views/SendFlow/SendTo/index.js b/app/components/Views/SendFlow/SendTo/index.js index 5ae2a3b1617..473c2f18101 100644 --- a/app/components/Views/SendFlow/SendTo/index.js +++ b/app/components/Views/SendFlow/SendTo/index.js @@ -31,6 +31,7 @@ import Icon from 'react-native-vector-icons/FontAwesome'; import { collectConfusables, hasZeroWidthPoints } from '../../../../util/validators'; import { SafeAreaView } from 'react-native-safe-area-context'; import addRecent from '../../../../actions/recents'; +import { ThemeContext } from '../../../../util/theme'; const { hexToBN } = util; const styles = StyleSheet.create({ @@ -166,8 +167,6 @@ const dummy = () => true; * View that wraps the wraps the "Send" screen */ class SendFlow extends PureComponent { - static navigationOptions = ({ navigation, route }) => getSendFlowTitle('send.send_to', navigation, route); - static propTypes = { /** * Map of accounts to information objects including balances @@ -248,6 +247,12 @@ class SendFlow extends PureComponent { inputWidth: { width: '99%' }, }; + updateNavBar = () => { + const { navigation, route } = this.props; + const { colors } = this.context; + navigation.setOptions(getSendFlowTitle('send.send_to', navigation, route, colors)); + }; + componentDidMount = async () => { const { addressBook, @@ -261,6 +266,7 @@ class SendFlow extends PureComponent { isPaymentRequest, } = this.props; const { fromAccountName } = this.state; + this.updateNavBar(); // For analytics navigation.setParams({ providerType, isPaymentRequest }); const networkAddressBook = addressBook[network] || {}; @@ -288,6 +294,10 @@ class SendFlow extends PureComponent { } }; + componentDidUpdate = () => { + this.updateNavBar(); + }; + toggleFromAccountModal = () => { const { fromAccountModalVisible } = this.state; this.setState({ fromAccountModalVisible: !fromAccountModalVisible }); @@ -707,6 +717,8 @@ class SendFlow extends PureComponent { }; } +SendFlow.contextType = ThemeContext; + const mapStateToProps = (state) => ({ accounts: state.engine.backgroundState.AccountTrackerController.accounts, addressBook: state.engine.backgroundState.AddressBookController.addressBook, From 1bb3bbf83cd0f47796371eb2826186342737b9f8 Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Tue, 8 Feb 2022 19:58:57 -0800 Subject: [PATCH 13/77] Introduce dark mode to swaps --- app/components/UI/Navbar/index.js | 37 ++++++++++++++++++++++----- app/components/UI/Swaps/QuotesView.js | 11 +++++--- app/components/UI/Swaps/index.js | 8 ++++-- 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index 9748efb4479..7fc2043b46e 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -862,7 +862,17 @@ export function getTransakWebviewNavbar(navigation, route, onPop) { }; } -export function getSwapsAmountNavbar(navigation, route) { +export function getSwapsAmountNavbar(navigation, route, themeColors) { + const innerStyles = StyleSheet.create({ + headerButtonText: { + color: themeColors.primary, + fontSize: 14, + ...fontStyles.normal, + }, + headerStyle: { + backgroundColor: themeColors.backgroundDefault, + }, + }); const title = route.params?.title ?? 'Swap'; return { headerTitle: () => , @@ -870,12 +880,26 @@ export function getSwapsAmountNavbar(navigation, route) { headerRight: () => ( // eslint-disable-next-line react/jsx-no-bind navigation.dangerouslyGetParent()?.pop()} style={styles.closeButton}> - {strings('navigation.cancel')} + {strings('navigation.cancel')} ), + headerStyle: innerStyles.headerStyle, }; } -export function getSwapsQuotesNavbar(navigation, route) { +export function getSwapsQuotesNavbar(navigation, route, themeColors) { + const innerStyles = StyleSheet.create({ + headerButtonText: { + color: themeColors.primary, + fontSize: 14, + ...fontStyles.normal, + }, + headerIcon: { + color: themeColors.primary, + }, + headerStyle: { + backgroundColor: themeColors.backgroundDefault, + }, + }); const title = route.params?.title ?? 'Swap'; const leftActionText = route.params?.leftAction ?? strings('navigation.back'); @@ -915,19 +939,20 @@ export function getSwapsQuotesNavbar(navigation, route) { Device.isAndroid() ? ( // eslint-disable-next-line react/jsx-no-bind - + ) : ( // eslint-disable-next-line react/jsx-no-bind - {leftActionText} + {leftActionText} ), headerRight: () => ( // eslint-disable-next-line react/jsx-no-bind - {strings('navigation.cancel')} + {strings('navigation.cancel')} ), + headerStyle: innerStyles.headerStyle, }; } diff --git a/app/components/UI/Swaps/QuotesView.js b/app/components/UI/Swaps/QuotesView.js index 7fdc47d13fd..3298d3e387c 100644 --- a/app/components/UI/Swaps/QuotesView.js +++ b/app/components/UI/Swaps/QuotesView.js @@ -56,6 +56,7 @@ import { swapsTokensSelector } from '../../../reducers/swaps'; import { decGWEIToHexWEI } from '../../../util/conversions'; import FadeAnimationView from '../FadeAnimationView'; import Logger from '../../../util/Logger'; +import { useAppThemeFromContext } from '../../../util/theme'; const POLLING_INTERVAL = 30000; const SLIPPAGE_BUCKETS = { @@ -309,8 +310,10 @@ function SwapsQuotesView({ usedCustomGas, }) { const navigation = useNavigation(); - const route = useRoute(); /* Get params from navigation */ + const route = useRoute(); + + const { colors } = useAppThemeFromContext(); const { sourceTokenAddress, destinationTokenAddress, sourceAmount, slippage, tokens } = useMemo( () => getQuotesNavigationsParams(route), @@ -356,6 +359,10 @@ function SwapsQuotesView({ const [isSaving] = useState(false); const [isInFetch, setIsInFetch] = useState(false); + useEffect(() => { + navigation.setOptions(getSwapsQuotesNavbar(navigation, route, colors)); + }, [navigation, route, colors]); + const hasConversionRate = useMemo( () => Boolean(destinationToken) && @@ -1679,8 +1686,6 @@ function SwapsQuotesView({ ); } -SwapsQuotesView.navigationOptions = ({ navigation, route }) => getSwapsQuotesNavbar(navigation, route); - SwapsQuotesView.propTypes = { swapsTokens: PropTypes.arrayOf(PropTypes.object), /** diff --git a/app/components/UI/Swaps/index.js b/app/components/UI/Swaps/index.js index 3f94c3e20a6..965ffae1179 100644 --- a/app/components/UI/Swaps/index.js +++ b/app/components/UI/Swaps/index.js @@ -53,6 +53,7 @@ import InfoModal from './components/InfoModal'; import { toLowerCaseEquals } from '../../../util/general'; import { AlertType } from '../../Base/Alert'; import { isZero, gte } from '../../../util/lodash'; +import { useAppThemeFromContext } from '../../../util/theme'; const styles = StyleSheet.create({ screen: { @@ -159,6 +160,7 @@ function SwapsAmountView({ }) { const navigation = useNavigation(); const route = useRoute(); + const { colors } = useAppThemeFromContext(); const explorer = useBlockExplorer(provider, frequentRpcList); const initialSource = route.params?.sourceToken ?? SWAPS_NATIVE_ADDRESS; @@ -185,6 +187,10 @@ function SwapsAmountView({ const [isTokenVerificationModalVisisble, toggleTokenVerificationModal, , hideTokenVerificationModal] = useModalHandler(false); + useEffect(() => { + navigation.setOptions(getSwapsAmountNavbar(navigation, route, colors)); + }, [navigation, route, colors]); + useEffect(() => { (async () => { try { @@ -725,8 +731,6 @@ function SwapsAmountView({ ); } -SwapsAmountView.navigationOptions = ({ navigation, route }) => getSwapsAmountNavbar(navigation, route); - SwapsAmountView.propTypes = { swapsTokens: PropTypes.arrayOf(PropTypes.object), swapsControllerTokens: PropTypes.arrayOf(PropTypes.object), From e89be7acb753dade11657e401111a9124eecc83d Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Tue, 8 Feb 2022 20:57:30 -0800 Subject: [PATCH 14/77] Introduce dark mode to buy and receive screens --- .../FiatOrders/PaymentMethodApplePay/index.js | 44 ++--- .../PaymentMethodSelector/index.android.js | 25 ++- .../PaymentMethodSelector/index.ios.js | 25 ++- .../UI/FiatOrders/TransakWebView/index.js | 43 +++-- app/components/UI/Navbar/index.js | 159 +++++++++++++----- app/components/UI/PaymentRequest/index.js | 16 +- .../UI/PaymentRequestSuccess/index.js | 20 ++- app/components/UI/ReceiveRequest/index.js | 3 + .../Views/GasEducationCarousel/index.js | 8 +- app/components/Views/SimpleWebview/index.js | 16 +- 10 files changed, 262 insertions(+), 97 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index 50cb883496a..02a9f1ed41f 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -32,6 +32,7 @@ import StyledButton from '../../StyledButton'; import { colors, fontStyles } from '../../../../styles/common'; import { protectWalletModalVisible } from '../../../../actions/user'; import { addFiatOrder, fiatOrdersCountrySelector, setFiatOrdersCountry } from '../../../../reducers/fiatOrders'; +import { useAppThemeFromContext } from '../../../../util/theme'; //* styles and components */ @@ -195,6 +196,7 @@ function PaymentMethodApplePay({ : amountWithPeriod, [amountWithPeriod] ); + const { colors } = useAppThemeFromContext(); const handleWyreTerms = useWyreTerms(navigation); const wyreCurrencies = useMemo(() => [`${selectedCurrency}ETH`, `USD${selectedCurrency}`], [selectedCurrency]); @@ -329,6 +331,29 @@ function PaymentMethodApplePay({ [selectedCurrency] ); + useEffect(() => { + navigation.setOptions( + getPaymentMethodApplePayNavbar( + navigation, + () => { + InteractionManager.runAfterInteractions(() => { + AnalyticsV2.trackEvent(AnalyticsV2.ANALYTICS_EVENTS.ONRAMP_PURCHASE_EXITED, { + payment_rails: PAYMENT_RAILS.APPLE_PAY, + payment_category: PAYMENT_CATEGORY.CARD_PAYMENT, + 'on-ramp_provider': FIAT_ORDER_PROVIDERS.WYRE_APPLE_PAY, + }); + }); + }, + () => { + InteractionManager.runAfterInteractions(() => { + AnalyticsV2.trackEvent(AnalyticsV2.ANALYTICS_EVENTS.ONRAMP_CLOSED); + }); + }, + colors + ) + ); + }, [navigation, colors]); + useEffect(() => { setAmount('0'); }, [selectedCurrency]); @@ -498,25 +523,6 @@ PaymentMethodApplePay.propTypes = { protectWalletModalVisible: PropTypes.func, }; -PaymentMethodApplePay.navigationOptions = ({ navigation }) => - getPaymentMethodApplePayNavbar( - navigation, - () => { - InteractionManager.runAfterInteractions(() => { - AnalyticsV2.trackEvent(AnalyticsV2.ANALYTICS_EVENTS.ONRAMP_PURCHASE_EXITED, { - payment_rails: PAYMENT_RAILS.APPLE_PAY, - payment_category: PAYMENT_CATEGORY.CARD_PAYMENT, - 'on-ramp_provider': FIAT_ORDER_PROVIDERS.WYRE_APPLE_PAY, - }); - }); - }, - () => { - InteractionManager.runAfterInteractions(() => { - AnalyticsV2.trackEvent(AnalyticsV2.ANALYTICS_EVENTS.ONRAMP_CLOSED); - }); - } - ); - const mapStateToProps = (state) => ({ lockTime: state.settings.lockTime, selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress, diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js b/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js index d7fb61bbe26..18add459452 100644 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js @@ -1,4 +1,4 @@ -import React, { useCallback } from 'react'; +import React, { useCallback, useEffect } from 'react'; import { InteractionManager } from 'react-native'; import PropTypes from 'prop-types'; import { useNavigation } from '@react-navigation/native'; @@ -17,6 +17,7 @@ import Title from '../components/Title'; import TransakPaymentMethod from './transak'; import { setGasEducationCarouselSeen } from '../../../../actions/user'; +import { useAppThemeFromContext } from '../../../../util/theme'; function PaymentMethodSelectorView({ selectedAddress, @@ -26,6 +27,21 @@ function PaymentMethodSelectorView({ }) { const navigation = useNavigation(); const transakURL = useTransakFlowURL(selectedAddress); + const { colors } = useAppThemeFromContext(); + + useEffect(() => { + navigation.setOptions( + getPaymentSelectorMethodNavbar( + navigation, + () => { + InteractionManager.runAfterInteractions(() => { + AnalyticsV2.trackEvent(AnalyticsV2.ANALYTICS_EVENTS.ONRAMP_CLOSED); + }); + }, + colors + ) + ); + }, [navigation, colors]); const onPressTransak = useCallback(() => { const goToTransakFlow = () => @@ -69,13 +85,6 @@ PaymentMethodSelectorView.propTypes = { setGasEducationCarouselSeen: PropTypes.func, }; -PaymentMethodSelectorView.navigationOptions = ({ navigation }) => - getPaymentSelectorMethodNavbar(navigation, () => { - InteractionManager.runAfterInteractions(() => { - AnalyticsV2.trackEvent(AnalyticsV2.ANALYTICS_EVENTS.ONRAMP_CLOSED); - }); - }); - const mapStateToProps = (state) => ({ selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress, gasEducationCarouselSeen: state.user.gasEducationCarouselSeen, diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js b/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js index 7fd4f342774..12b1d5ee89e 100644 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js @@ -1,4 +1,4 @@ -import React, { useCallback } from 'react'; +import React, { useCallback, useEffect } from 'react'; import { InteractionManager } from 'react-native'; import PropTypes from 'prop-types'; import { useNavigation } from '@react-navigation/native'; @@ -23,6 +23,7 @@ import SubHeader from '../components/SubHeader'; import TransakPaymentMethod from './transak'; import WyreApplePayPaymentMethod from './wyreApplePay'; import { setGasEducationCarouselSeen } from '../../../../actions/user'; +import { useAppThemeFromContext } from '../../../../util/theme'; function PaymentMethodSelectorView({ selectedAddress, @@ -33,6 +34,21 @@ function PaymentMethodSelectorView({ }) { const navigation = useNavigation(); const transakURL = useTransakFlowURL(selectedAddress); + const { colors } = useAppThemeFromContext(); + + useEffect(() => { + navigation.setOptions( + getPaymentSelectorMethodNavbar( + navigation, + () => { + InteractionManager.runAfterInteractions(() => { + AnalyticsV2.trackEvent(AnalyticsV2.ANALYTICS_EVENTS.ONRAMP_CLOSED); + }); + }, + colors + ) + ); + }, [navigation, colors]); const onPressWyreApplePay = useCallback(() => { const goToApplePay = () => navigation.navigate('PaymentMethodApplePay'); @@ -117,13 +133,6 @@ PaymentMethodSelectorView.propTypes = { setGasEducationCarouselSeen: PropTypes.func, }; -PaymentMethodSelectorView.navigationOptions = ({ navigation }) => - getPaymentSelectorMethodNavbar(navigation, () => { - InteractionManager.runAfterInteractions(() => { - AnalyticsV2.trackEvent(AnalyticsV2.ANALYTICS_EVENTS.ONRAMP_CLOSED); - }); - }); - const mapStateToProps = (state) => ({ selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress, network: state.engine.backgroundState.NetworkController.network, diff --git a/app/components/UI/FiatOrders/TransakWebView/index.js b/app/components/UI/FiatOrders/TransakWebView/index.js index 4b5b1dbb15f..29701747772 100644 --- a/app/components/UI/FiatOrders/TransakWebView/index.js +++ b/app/components/UI/FiatOrders/TransakWebView/index.js @@ -14,19 +14,9 @@ import { protectWalletModalVisible } from '../../../../actions/user'; import { addFiatOrder } from '../../../../reducers/fiatOrders'; import AnalyticsV2 from '../../../../util/analyticsV2'; import { FIAT_ORDER_PROVIDERS, PAYMENT_CATEGORY, PAYMENT_RAILS } from '../../../../constants/on-ramp'; +import { ThemeContext } from '../../../../util/theme'; class TransakWebView extends PureComponent { - static navigationOptions = ({ navigation, route }) => - getTransakWebviewNavbar(navigation, route, () => { - InteractionManager.runAfterInteractions(() => { - AnalyticsV2.trackEvent(AnalyticsV2.ANALYTICS_EVENTS.ONRAMP_PURCHASE_EXITED, { - payment_rails: PAYMENT_RAILS.MULTIPLE, - payment_category: PAYMENT_CATEGORY.MULTIPLE, - 'on-ramp_provider': FIAT_ORDER_PROVIDERS.TRANSAK, - }); - }); - }); - static propTypes = { navigation: PropTypes.object, /** @@ -47,6 +37,35 @@ class TransakWebView extends PureComponent { route: PropTypes.object, }; + updateNavBar = () => { + const { navigation, route } = this.props; + const { colors } = this.context; + navigation.setOptions( + getTransakWebviewNavbar( + navigation, + route, + () => { + InteractionManager.runAfterInteractions(() => { + AnalyticsV2.trackEvent(AnalyticsV2.ANALYTICS_EVENTS.ONRAMP_PURCHASE_EXITED, { + payment_rails: PAYMENT_RAILS.MULTIPLE, + payment_category: PAYMENT_CATEGORY.MULTIPLE, + 'on-ramp_provider': FIAT_ORDER_PROVIDERS.TRANSAK, + }); + }); + }, + colors + ) + ); + }; + + componentDidMount = () => { + this.updateNavBar(); + }; + + componentDidUpdate = () => { + this.updateNavBar(); + }; + handleNavigationStateChange = async (navState) => { if (navState.url.indexOf(AppConstants.FIAT_ORDERS.TRANSAK_REDIRECT_URL) > -1) { const order = handleTransakRedirect(navState.url, this.props.network); @@ -87,6 +106,8 @@ class TransakWebView extends PureComponent { } } +TransakWebView.contextType = ThemeContext; + const mapStateToProps = (state) => ({ network: state.engine.backgroundState.NetworkController.network, }); diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index 9748efb4479..39895788e72 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -107,13 +107,13 @@ const styles = StyleSheet.create({ metamaskNameWrapper: { marginLeft: Device.isAndroid() ? 20 : 0, }, - centeredTitle: { - fontSize: 20, - color: colors.fontPrimary, - textAlign: 'center', - ...fontStyles.normal, - alignItems: 'center', - }, + // centeredTitle: { + // fontSize: 20, + // color: colors.fontPrimary, + // textAlign: 'center', + // ...fontStyles.normal, + // alignItems: 'center', + // }, }); const metamask_name = require('../../../images/metamask-name.png'); // eslint-disable-line @@ -242,16 +242,26 @@ export function getEditableOptions(title, navigation, route) { * @param {Object} navigation - Navigation object required to push new views * @returns {Object} - Corresponding navbar options containing title, headerLeft and headerRight */ -export function getPaymentRequestOptionsTitle(title, navigation, route) { +export function getPaymentRequestOptionsTitle(title, navigation, route, themeColors) { const goBack = route.params?.dispatch; - return { - title, + const innerStyles = StyleSheet.create({ headerTitleStyle: { fontSize: 20, - color: colors.fontPrimary, + color: themeColors.textDefault, ...fontStyles.normal, }, - headerTintColor: colors.blue, + headerIcon: { + color: themeColors.primary, + }, + headerStyle: { + backgroundColor: themeColors.backgroundDefault, + }, + }); + + return { + title, + headerTitleStyle: innerStyles.headerTitleStyle, + headerTintColor: themeColors.primary, headerLeft: () => goBack ? ( // eslint-disable-next-line react/jsx-no-bind @@ -263,7 +273,7 @@ export function getPaymentRequestOptionsTitle(title, navigation, route) { ) : ( @@ -272,9 +282,10 @@ export function getPaymentRequestOptionsTitle(title, navigation, route) { headerRight: () => ( // eslint-disable-next-line react/jsx-no-bind navigation.pop()} style={styles.closeButton}> - + ), + headerStyle: innerStyles.headerStyle, }; } @@ -284,16 +295,23 @@ export function getPaymentRequestOptionsTitle(title, navigation, route) { * * @returns {Object} - Corresponding navbar options containing title, and headerRight */ -export function getPaymentRequestSuccessOptionsTitle(navigation) { - return { +export function getPaymentRequestSuccessOptionsTitle(navigation, themeColors) { + const innerStyles = StyleSheet.create({ headerStyle: { shadowColor: colors.transparent, elevation: 0, - backgroundColor: colors.white, + backgroundColor: themeColors.backgroundDefault, borderBottomWidth: 0, }, + headerIcon: { + color: themeColors.primary, + }, + }); + + return { + headerStyle: innerStyles.headerStyle, title: null, - headerTintColor: colors.blue, + headerTintColor: themeColors.primary, headerLeft: () => , headerRight: () => ( - + ), }; @@ -730,39 +748,71 @@ export function getNetworkNavbarOptions(title, translate, navigation) { * * @returns {Object} - Corresponding navbar options containing headerTitle and headerTitle */ -export function getWebviewNavbar(navigation, route) { +export function getWebviewNavbar(navigation, route, themeColors) { + const innerStyles = StyleSheet.create({ + headerTitleStyle: { + fontSize: 20, + color: themeColors.textDefault, + textAlign: 'center', + ...fontStyles.normal, + alignItems: 'center', + }, + headerStyle: { + backgroundColor: themeColors.backgroundDefault, + }, + headerIcon: { + color: themeColors.primary, + }, + }); + const title = route.params?.title ?? ''; const share = route.params?.dispatch; return { - headerTitle: () => {title}, + headerTitle: () => {title}, headerLeft: () => Device.isAndroid() ? ( // eslint-disable-next-line react/jsx-no-bind navigation.pop()} style={styles.backButton}> - + ) : ( // eslint-disable-next-line react/jsx-no-bind navigation.pop()} style={styles.backButton}> - + ), headerRight: () => Device.isAndroid() ? ( - + ) : ( - + ), + headerStyle: innerStyles.headerStyle, }; } -export function getPaymentSelectorMethodNavbar(navigation, onPop) { +export function getPaymentSelectorMethodNavbar(navigation, onPop, themeColors) { + const innerStyles = StyleSheet.create({ + headerButtonText: { + color: themeColors.primary, + }, + headerTitleStyle: { + fontSize: 20, + color: themeColors.textDefault, + textAlign: 'center', + ...fontStyles.normal, + alignItems: 'center', + }, + headerStyle: { + backgroundColor: themeColors.backgroundDefault, + }, + }); return { - headerTitle: () => {strings('fiat_on_ramp.purchase_method')}, + headerTitle: () => {strings('fiat_on_ramp.purchase_method')}, headerLeft: () => , headerRight: () => ( // eslint-disable-next-line react/jsx-no-bind @@ -773,20 +823,33 @@ export function getPaymentSelectorMethodNavbar(navigation, onPop) { }} style={styles.closeButton} > - {strings('navigation.cancel')} + {strings('navigation.cancel')} ), + headerStyle: innerStyles.headerStyle, }; } -export function getPaymentMethodApplePayNavbar(navigation, onPop, onExit) { - return { - title: strings('fiat_on_ramp.amount_to_buy'), +export function getPaymentMethodApplePayNavbar(navigation, onPop, onExit, themeColors) { + const innerStyles = StyleSheet.create({ headerTitleStyle: { fontSize: 20, - color: colors.fontPrimary, + color: themeColors.textDefault, ...fontStyles.normal, }, + headerStyle: { + backgroundColor: themeColors.backgroundDefault, + }, + headerButtonText: { + color: themeColors.primary, + }, + headerIcon: { + color: themeColors.primary, + }, + }); + return { + title: strings('fiat_on_ramp.amount_to_buy'), + headerTitleStyle: innerStyles.headerTitleStyle, headerRight: () => ( // eslint-disable-next-line react/jsx-no-bind - {strings('navigation.cancel')} + {strings('navigation.cancel')} ), headerLeft: () => @@ -809,7 +872,7 @@ export function getPaymentMethodApplePayNavbar(navigation, onPop, onExit) { }} style={styles.backButton} > - + ) : ( // eslint-disable-next-line react/jsx-no-bind @@ -820,21 +883,32 @@ export function getPaymentMethodApplePayNavbar(navigation, onPop, onExit) { }} style={styles.closeButton} > - {strings('navigation.back')} + {strings('navigation.back')} ), + headerStyle: innerStyles.headerStyle, }; } -export function getTransakWebviewNavbar(navigation, route, onPop) { - const title = route.params?.title ?? ''; - return { - title, +export function getTransakWebviewNavbar(navigation, route, onPop, themeColors) { + const innerStyles = StyleSheet.create({ headerTitleStyle: { fontSize: 20, - color: colors.fontPrimary, + color: themeColors.textDefault, ...fontStyles.normal, }, + headerStyle: { + backgroundColor: themeColors.backgroundDefault, + }, + headerIcon: { + color: themeColors.primary, + }, + }); + + const title = route.params?.title ?? ''; + return { + title, + headerTitleStyle: innerStyles.headerTitleStyle, headerLeft: () => Device.isAndroid() ? ( // eslint-disable-next-line react/jsx-no-bind @@ -845,7 +919,7 @@ export function getTransakWebviewNavbar(navigation, route, onPop) { }} style={styles.backButton} > - + ) : ( // eslint-disable-next-line react/jsx-no-bind @@ -856,9 +930,10 @@ export function getTransakWebviewNavbar(navigation, route, onPop) { }} style={styles.backButton} > - + ), + headerStyle: innerStyles.headerStyle, }; } diff --git a/app/components/UI/PaymentRequest/index.js b/app/components/UI/PaymentRequest/index.js index 5e2579dbb98..c288f78b230 100644 --- a/app/components/UI/PaymentRequest/index.js +++ b/app/components/UI/PaymentRequest/index.js @@ -41,6 +41,7 @@ import { getTicker } from '../../../util/transactions'; import { toLowerCaseEquals } from '../../../util/general'; import { getTokenListArray } from '../../../reducers/tokens'; import { utils as ethersUtils } from 'ethers'; +import { ThemeContext } from '../../../util/theme'; const KEYBOARD_OFFSET = 120; const styles = StyleSheet.create({ @@ -223,9 +224,6 @@ const MODE_AMOUNT = 'amount'; * View to generate a payment request link */ class PaymentRequest extends PureComponent { - static navigationOptions = ({ navigation, route }) => - getPaymentRequestOptionsTitle(strings('payment_request.title'), navigation, route); - static propTypes = { /** * Object that represents the navigator @@ -289,11 +287,20 @@ class PaymentRequest extends PureComponent { inputWidth: { width: '99%' }, }; + updateNavBar = () => { + const { navigation, route } = this.props; + const { colors } = this.context; + navigation.setOptions( + getPaymentRequestOptionsTitle(strings('payment_request.title'), navigation, route, colors) + ); + }; + /** * Set chainId, internalPrimaryCurrency and receiveAssets, if there is an asset set to this payment request chose it automatically, to state */ componentDidMount = () => { const { primaryCurrency, route, tokenList } = this.props; + this.updateNavBar(); const receiveAsset = route?.params?.receiveAsset; this.setState({ internalPrimaryCurrency: primaryCurrency, @@ -308,6 +315,7 @@ class PaymentRequest extends PureComponent { }; componentDidUpdate = () => { + this.updateNavBar(); InteractionManager.runAfterInteractions(() => { this.amountInput.current && this.amountInput.current.focus(); }); @@ -697,6 +705,8 @@ class PaymentRequest extends PureComponent { } } +PaymentRequest.contextType = ThemeContext; + const mapStateToProps = (state) => ({ conversionRate: state.engine.backgroundState.CurrencyRateController.conversionRate, currentCurrency: state.engine.backgroundState.CurrencyRateController.currentCurrency, diff --git a/app/components/UI/PaymentRequestSuccess/index.js b/app/components/UI/PaymentRequestSuccess/index.js index 2693362610f..c9fd3f88ad5 100644 --- a/app/components/UI/PaymentRequestSuccess/index.js +++ b/app/components/UI/PaymentRequestSuccess/index.js @@ -27,6 +27,7 @@ import Device from '../../../util/device'; import { strings } from '../../../../locales/i18n'; import { protectWalletModalVisible } from '../../../actions/user'; import ClipboardManager from '../../../core/ClipboardManager'; +import { ThemeContext } from '../../../util/theme'; const isIos = Device.isIos(); @@ -155,9 +156,11 @@ const styles = StyleSheet.create({ * View to interact with a previously generated payment request link */ class PaymentRequestSuccess extends PureComponent { - static navigationOptions = ({ navigation }) => getPaymentRequestSuccessOptionsTitle(navigation); - static propTypes = { + /** + * Navigation object + */ + navigation: PropTypes.object, /** * Object that represents the current route info like params passed to it */ @@ -180,11 +183,18 @@ class PaymentRequestSuccess extends PureComponent { qrModalVisible: false, }; + updateNavBar = () => { + const { navigation } = this.props; + const { colors } = this.context; + navigation.setOptions(getPaymentRequestSuccessOptionsTitle(navigation, colors)); + }; + /** * Sets payment request link, amount and symbol of the asset to state */ componentDidMount = () => { const { route } = this.props; + this.updateNavBar(); const link = route?.params?.link ?? ''; const qrLink = route?.params?.qrLink ?? ''; const amount = route?.params?.amount ?? ''; @@ -192,6 +202,10 @@ class PaymentRequestSuccess extends PureComponent { this.setState({ link, qrLink, amount, symbol }); }; + componentDidUpdate = () => { + this.updateNavBar(); + }; + componentWillUnmount = () => { this.props.protectWalletModalVisible(); }; @@ -338,6 +352,8 @@ class PaymentRequestSuccess extends PureComponent { } } +PaymentRequestSuccess.contextType = ThemeContext; + const mapDispatchToProps = (dispatch) => ({ showAlert: (config) => dispatch(showAlert(config)), protectWalletModalVisible: () => dispatch(protectWalletModalVisible()), diff --git a/app/components/UI/ReceiveRequest/index.js b/app/components/UI/ReceiveRequest/index.js index 6c5a79addb9..fa4986e3dd1 100644 --- a/app/components/UI/ReceiveRequest/index.js +++ b/app/components/UI/ReceiveRequest/index.js @@ -28,6 +28,7 @@ import EthereumAddress from '../EthereumAddress'; import GlobalAlert from '../GlobalAlert'; import StyledButton from '../StyledButton'; import ClipboardManager from '../../../core/ClipboardManager'; +import { ThemeContext } from '../../../util/theme'; const styles = StyleSheet.create({ wrapper: { @@ -300,6 +301,8 @@ class ReceiveRequest extends PureComponent { } } +ReceiveRequest.contextType = ThemeContext; + const mapStateToProps = (state) => ({ network: state.engine.backgroundState.NetworkController.network, selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress, diff --git a/app/components/Views/GasEducationCarousel/index.js b/app/components/Views/GasEducationCarousel/index.js index 450e0becaa2..0cafe341909 100644 --- a/app/components/Views/GasEducationCarousel/index.js +++ b/app/components/Views/GasEducationCarousel/index.js @@ -12,6 +12,7 @@ import Text from '../../Base/Text'; import { getBasicGasEstimates, getRenderableFiatGasFee } from '../../../util/custom-gas'; import { connect } from 'react-redux'; import Device from '../../../util/device'; +import { useAppThemeFromContext } from '../../../util/theme'; const IMAGE_3_RATIO = 281 / 354; const IMAGE_2_RATIO = 353 / 416; @@ -115,6 +116,11 @@ const carousel_images = [gas_education_carousel_1, gas_education_carousel_2, gas const GasEducationCarousel = ({ navigation, route, conversionRate, currentCurrency }) => { const [currentTab, setCurrentTab] = useState(1); const [gasFiat, setGasFiat] = useState(null); + const { colors } = useAppThemeFromContext(); + + useEffect(() => { + navigation.setOptions(getTransparentOnboardingNavbarOptions(colors)); + }, [navigation, colors]); useEffect(() => { const setGasEstimates = async () => { @@ -261,8 +267,6 @@ const GasEducationCarousel = ({ navigation, route, conversionRate, currentCurren ); }; -GasEducationCarousel.navigationOptions = ({ navigation }) => getTransparentOnboardingNavbarOptions(navigation); - GasEducationCarousel.propTypes = { /** * The navigator object diff --git a/app/components/Views/SimpleWebview/index.js b/app/components/Views/SimpleWebview/index.js index 0bc151f5588..c6767ad6797 100644 --- a/app/components/Views/SimpleWebview/index.js +++ b/app/components/Views/SimpleWebview/index.js @@ -6,10 +6,9 @@ import { getWebviewNavbar } from '../../UI/Navbar'; import Share from 'react-native-share'; // eslint-disable-line import/default import Logger from '../../../util/Logger'; import { baseStyles } from '../../../styles/common'; +import { ThemeContext } from '../../../util/theme'; export default class SimpleWebview extends PureComponent { - static navigationOptions = ({ navigation, route }) => getWebviewNavbar(navigation, route); - static propTypes = { /** * react-navigation object used to switch between screens @@ -21,11 +20,22 @@ export default class SimpleWebview extends PureComponent { route: PropTypes.object, }; + updateNavBar = () => { + const { navigation, route } = this.props; + const { colors } = this.context; + navigation.setOptions(getWebviewNavbar(navigation, route, colors)); + }; + componentDidMount = () => { const { navigation } = this.props; + this.updateNavBar(); navigation && navigation.setParams({ dispatch: this.share }); }; + componentDidUpdate = () => { + this.updateNavBar(); + }; + share = () => { const { route } = this.props; const url = route.params?.url; @@ -49,3 +59,5 @@ export default class SimpleWebview extends PureComponent { } } } + +SimpleWebview.contextType = ThemeContext; From 0cf88d98ab2689d26a2196e5b194c37bdf22dc10 Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Tue, 8 Feb 2022 23:28:16 -0800 Subject: [PATCH 15/77] Introduce dark mode to asset screens --- app/components/UI/Navbar/index.js | 13 ++++++-- app/components/Views/AddAsset/index.js | 31 ++++++++++++++----- app/components/Views/Asset/index.js | 12 +++++-- app/components/Views/Collectible/index.js | 18 +++++++++-- app/components/Views/CollectibleView/index.js | 18 +++++++++-- 5 files changed, 77 insertions(+), 15 deletions(-) diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index 9748efb4479..eb686e8b011 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -708,7 +708,15 @@ export function getWalletNavbarOptions(title, navigation, drawerRef) { * @param {Object} navigation - Navigation object required to push new views * @returns {Object} - Corresponding navbar options containing headerTitle and headerTitle */ -export function getNetworkNavbarOptions(title, translate, navigation) { +export function getNetworkNavbarOptions(title, translate, navigation, themeColors) { + const innerStyles = StyleSheet.create({ + headerStyle: { + backgroundColor: themeColors.backgroundDefault, + }, + headerIcon: { + color: themeColors.primary, + }, + }); return { headerTitle: () => , headerLeft: () => ( @@ -717,11 +725,12 @@ export function getNetworkNavbarOptions(title, translate, navigation) { ), headerRight: () => , + headerStyle: innerStyles.headerStyle, }; } diff --git a/app/components/Views/AddAsset/index.js b/app/components/Views/AddAsset/index.js index 8cde9e1ff1d..704487e691f 100644 --- a/app/components/Views/AddAsset/index.js +++ b/app/components/Views/AddAsset/index.js @@ -13,6 +13,7 @@ import { getNetworkNavbarOptions } from '../../UI/Navbar'; import { NetworksChainId } from '@metamask/controllers'; import CollectibleDetectionModal from '../../UI/CollectibleDetectionModal'; import { isMainNet } from '../../../util/networks'; +import { ThemeContext } from '../../../util/theme'; const styles = StyleSheet.create({ wrapper: { @@ -41,13 +42,6 @@ const styles = StyleSheet.create({ * PureComponent that provides ability to add assets. */ class AddAsset extends PureComponent { - static navigationOptions = ({ navigation, route }) => - getNetworkNavbarOptions( - `add_asset.${route.params.assetType === 'token' ? 'title' : 'title_nft'}`, - true, - navigation - ); - state = { address: '', symbol: '', @@ -74,6 +68,27 @@ class AddAsset extends PureComponent { useCollectibleDetection: PropTypes.bool, }; + updateNavBar = () => { + const { navigation, route } = this.props; + const { colors } = this.context; + navigation.setOptions( + getNetworkNavbarOptions( + `add_asset.${route.params.assetType === 'token' ? 'title' : 'title_nft'}`, + true, + navigation, + colors + ) + ); + }; + + componentDidMount = () => { + this.updateNavBar(); + }; + + componentDidUpdate = () => { + this.updateNavBar(); + }; + renderTabBar() { return ( ({ chainId: state.engine.backgroundState.NetworkController.provider.chainId, useCollectibleDetection: state.engine.backgroundState.PreferencesController.useCollectibleDetection, diff --git a/app/components/Views/Asset/index.js b/app/components/Views/Asset/index.js index 0752c990ab6..a4dc9c9dbc8 100644 --- a/app/components/Views/Asset/index.js +++ b/app/components/Views/Asset/index.js @@ -12,6 +12,7 @@ import Engine from '../../../core/Engine'; import { safeToChecksumAddress } from '../../../util/address'; import { addAccountTimeFlagFilter } from '../../../util/transactions'; import { toLowerCaseEquals } from '../../../util/general'; +import { ThemeContext } from '../../../util/theme'; const styles = StyleSheet.create({ wrapper: { @@ -97,10 +98,14 @@ class Asset extends PureComponent { navSymbol = undefined; navAddress = undefined; - static navigationOptions = ({ navigation, route }) => - getNetworkNavbarOptions(route.params?.symbol ?? '', false, navigation); + updateNavBar = () => { + const { navigation, route } = this.props; + const { colors } = this.context; + navigation.setOptions(getNetworkNavbarOptions(route.params?.symbol ?? '', false, navigation, colors)); + }; componentDidMount() { + this.updateNavBar(); InteractionManager.runAfterInteractions(() => { this.normalizeTransactions(); this.mounted = true; @@ -115,6 +120,7 @@ class Asset extends PureComponent { } componentDidUpdate(prevProps) { + this.updateNavBar(); if (prevProps.chainId !== this.props.chainId || prevProps.selectedAddress !== this.props.selectedAddress) { this.showLoaderAndNormalize(); } else { @@ -318,6 +324,8 @@ class Asset extends PureComponent { }; } +Asset.contextType = ThemeContext; + const mapStateToProps = (state) => ({ swapsTransactions: state.engine.backgroundState.TransactionController.swapsTransactions || {}, conversionRate: state.engine.backgroundState.CurrencyRateController.conversionRate, diff --git a/app/components/Views/Collectible/index.js b/app/components/Views/Collectible/index.js index af0752d47c1..1b3581c4c7c 100644 --- a/app/components/Views/Collectible/index.js +++ b/app/components/Views/Collectible/index.js @@ -12,6 +12,7 @@ import CollectibleContractInformation from '../../UI/CollectibleContractInformat import { toggleCollectibleContractModal } from '../../../actions/modals'; import { toLowerCaseEquals } from '../../../util/general'; import { collectiblesSelector } from '../../../reducers/collectibles'; +import { ThemeContext } from '../../../util/theme'; const styles = StyleSheet.create({ wrapper: { @@ -55,8 +56,19 @@ class Collectible extends PureComponent { collectibles: [], }; - static navigationOptions = ({ navigation, route }) => - getNetworkNavbarOptions(route.params?.name ?? '', false, navigation); + updateNavBar = () => { + const { navigation, route } = this.props; + const { colors } = this.context; + getNetworkNavbarOptions(route.params?.name ?? '', false, navigation, colors); + }; + + componentDidMount = () => { + this.updateNavBar(); + }; + + componentDidUpdate = () => { + this.updateNavBar(); + }; onRefresh = async () => { this.setState({ refreshing: true }); @@ -133,6 +145,8 @@ class Collectible extends PureComponent { }; } +Collectible.contextType = ThemeContext; + const mapStateToProps = (state) => ({ collectibles: collectiblesSelector(state), collectibleContractModalVisible: state.modals.collectibleContractModalVisible, diff --git a/app/components/Views/CollectibleView/index.js b/app/components/Views/CollectibleView/index.js index 4416531e68d..aed07936659 100644 --- a/app/components/Views/CollectibleView/index.js +++ b/app/components/Views/CollectibleView/index.js @@ -9,6 +9,7 @@ import { colors, fontStyles } from '../../../styles/common'; import { connect } from 'react-redux'; import collectiblesTransferInformation from '../../../util/collectibles-transfer'; import { newAssetTransaction } from '../../../actions/transaction'; +import { ThemeContext } from '../../../util/theme'; const styles = StyleSheet.create({ root: { @@ -55,8 +56,19 @@ class CollectibleView extends PureComponent { route: PropTypes.object, }; - static navigationOptions = ({ navigation, route }) => - getNetworkNavbarOptions(route.params?.contractName ?? '', false, navigation); + updateNavBar = () => { + const { navigation, route } = this.props; + const { colors } = this.context; + getNetworkNavbarOptions(route.params?.contractName ?? '', false, navigation, colors); + }; + + componentDidMount = () => { + this.updateNavBar(); + }; + + componentDidUpdate = () => { + this.updateNavBar(); + }; onSend = async () => { const { @@ -103,6 +115,8 @@ class CollectibleView extends PureComponent { } } +CollectibleView.contextType = ThemeContext; + const mapDispatchToProps = (dispatch) => ({ newAssetTransaction: (selectedAsset) => dispatch(newAssetTransaction(selectedAsset)), }); From c60e9810608f238427c65e7eb06abe457985035d Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Tue, 8 Feb 2022 23:45:18 -0800 Subject: [PATCH 16/77] Introduce dark mode to drawer and related screens --- app/components/UI/Navbar/index.js | 47 +++++++++++++++++----- app/components/Views/ActivityView/index.js | 6 ++- app/components/Views/Browser/index.js | 8 ++-- app/components/Views/Wallet/index.tsx | 9 ++++- 4 files changed, 53 insertions(+), 17 deletions(-) diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index 9748efb4479..0073f19c433 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -79,9 +79,6 @@ const styles = StyleSheet.create({ paddingRight: Device.isAndroid() ? 22 : 18, marginTop: 5, }, - infoIcon: { - color: colors.blue, - }, closeButtonText: { color: colors.blue, fontSize: 14, @@ -128,7 +125,16 @@ const metamask_fox = require('../../../images/fox.png'); // eslint-disable-line * @param {bool} disableNetwork - Boolean that specifies if the network can be changed, defaults to false * @returns {Object} - Corresponding navbar options containing headerTitle, headerLeft, headerTruncatedBackTitle and headerRight */ -export default function getNavbarOptions(title, disableNetwork = false, drawerRef) { +export default function getNavbarOptions(title, disableNetwork = false, drawerRef, themeColors) { + const innerStyles = StyleSheet.create({ + headerStyle: { + backgroundColor: themeColors.backgroundDefault, + }, + headerIcon: { + color: themeColors.primary, + }, + }); + function onPress() { Keyboard.dismiss(); drawerRef.current?.showDrawer?.(); @@ -142,11 +148,12 @@ export default function getNavbarOptions(title, disableNetwork = false, drawerRe ), headerRight: () => , + headerStyle: innerStyles.headerStyle, }; } @@ -415,7 +422,16 @@ export function getSendFlowTitle(title, navigation, route) { * @param {Object} navigation - Navigation object required to push new views * @returns {Object} - Corresponding navbar options containing headerTitle, headerLeft and headerRight */ -export function getBrowserViewNavbarOptions(navigation, route, drawerRef) { +export function getBrowserViewNavbarOptions(navigation, route, drawerRef, themeColors) { + const innerStyles = StyleSheet.create({ + headerStyle: { + backgroundColor: themeColors.backgroundDefault, + }, + headerIcon: { + color: themeColors.primary, + }, + }); + const url = route.params?.url ?? ''; let host = null; let isHttps = false; @@ -452,7 +468,7 @@ export function getBrowserViewNavbarOptions(navigation, route, drawerRef) { ), @@ -472,6 +488,7 @@ export function getBrowserViewNavbarOptions(navigation, route, drawerRef) { ), + headerStyle: innerStyles.headerStyle, }; } @@ -627,7 +644,16 @@ export function getOfflineModalNavbar() { * * @returns {Object} - Corresponding navbar options containing headerTitle, headerTitle and headerTitle */ -export function getWalletNavbarOptions(title, navigation, drawerRef) { +export function getWalletNavbarOptions(title, navigation, drawerRef, themeColors) { + const innerStyles = StyleSheet.create({ + headerStyle: { + backgroundColor: themeColors.backgroundDefault, + }, + headerIcon: { + color: themeColors.primary, + }, + }); + const onScanSuccess = (data, content) => { if (data.private_key) { Alert.alert( @@ -684,7 +710,7 @@ export function getWalletNavbarOptions(title, navigation, drawerRef) { ), @@ -694,9 +720,10 @@ export function getWalletNavbarOptions(title, navigation, drawerRef) { // eslint-disable-next-line onPress={openQRScanner} > - + ), + headerStyle: innerStyles.headerStyle, }; } diff --git a/app/components/Views/ActivityView/index.js b/app/components/Views/ActivityView/index.js index a93fe25d87e..5c21b8970f6 100644 --- a/app/components/Views/ActivityView/index.js +++ b/app/components/Views/ActivityView/index.js @@ -12,6 +12,7 @@ import { strings } from '../../../../locales/i18n'; import FiatOrdersView from '../FiatOrdersView'; import ErrorBoundary from '../ErrorBoundary'; import { DrawerContext } from '../../Nav/Main/MainNavigator'; +import { useAppThemeFromContext } from '../../../util/theme'; const styles = StyleSheet.create({ wrapper: { @@ -21,15 +22,16 @@ const styles = StyleSheet.create({ function ActivityView({ hasOrders }) { const { drawerRef } = useContext(DrawerContext); + const { colors } = useAppThemeFromContext(); const navigation = useNavigation(); useEffect( () => { const title = hasOrders ?? false ? 'activity_view.title' : 'transactions_view.title'; - navigation.setOptions(getNavbarOptions(title, false, drawerRef)); + navigation.setOptions(getNavbarOptions(title, false, drawerRef, colors)); }, /* eslint-disable-next-line */ - [navigation, hasOrders] + [navigation, hasOrders, colors] ); return ( diff --git a/app/components/Views/Browser/index.js b/app/components/Views/Browser/index.js index c38968877df..b17cd7d71e0 100644 --- a/app/components/Views/Browser/index.js +++ b/app/components/Views/Browser/index.js @@ -12,6 +12,7 @@ import BrowserTab from '../BrowserTab'; import AppConstants from '../../../core/AppConstants'; import { baseStyles } from '../../../styles/common'; import { DrawerContext } from '../../Nav/Main/MainNavigator'; +import { useAppThemeFromContext } from '../../../util/theme'; const margin = 16; const THUMB_WIDTH = Dimensions.get('window').width / 2 - margin * 2; @@ -35,13 +36,14 @@ const Browser = (props) => { } = props; const { drawerRef } = useContext(DrawerContext); const previousTabs = useRef(null); + const { colors } = useAppThemeFromContext(); useEffect( () => { - navigation.setOptions(getBrowserViewNavbarOptions(navigation, route, drawerRef)); + navigation.setOptions(getBrowserViewNavbarOptions(navigation, route, drawerRef, colors)); }, /* eslint-disable-next-line */ - [navigation, route] + [navigation, route, colors] ); const newTab = (url) => { @@ -264,8 +266,6 @@ const mapDispatchToProps = (dispatch) => ({ updateTab: (id, url) => dispatch(updateTab(id, url)), }); -Browser.contextType = DrawerContext; - Browser.propTypes = { /** * react-navigation object used to switch between screens diff --git a/app/components/Views/Wallet/index.tsx b/app/components/Views/Wallet/index.tsx index ea1347da503..a9eaa32a919 100644 --- a/app/components/Views/Wallet/index.tsx +++ b/app/components/Views/Wallet/index.tsx @@ -17,6 +17,7 @@ import { getTicker } from '../../../util/transactions'; import OnboardingWizard from '../../UI/OnboardingWizard'; import ErrorBoundary from '../ErrorBoundary'; import { DrawerContext } from '../../Nav/Main/MainNavigator'; +import { useAppThemeFromContext } from '../../../util/theme'; const styles = StyleSheet.create({ wrapper: { @@ -89,9 +90,10 @@ const Wallet = ({ navigation }: any) => { */ const wizardStep = useSelector((state: any) => state.wizard.step); + const { colors: themeColors } = useAppThemeFromContext(); + useEffect( () => { - navigation.setOptions(getWalletNavbarOptions('wallet.title', navigation, drawerRef)); requestAnimationFrame(async () => { const { TokenDetectionController, CollectibleDetectionController, AccountTrackerController } = Engine.context as any; @@ -104,6 +106,11 @@ const Wallet = ({ navigation }: any) => { [navigation] ); + useEffect(() => { + navigation.setOptions(getWalletNavbarOptions('wallet.title', navigation, drawerRef, themeColors)); + /* eslint-disable-next-line */ + }, [navigation, themeColors]); + const onRefresh = useCallback(async () => { requestAnimationFrame(async () => { setRefreshing(true); From d3c73e23f1290f0e4cbe53e2974bf58439462c86 Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Wed, 9 Feb 2022 17:55:07 -0800 Subject: [PATCH 17/77] Import design tokens library --- app/util/theme/colors/base-colors.ts | 51 ---------------------------- app/util/theme/colors/dark.ts | 35 ------------------- app/util/theme/colors/index.ts | 4 --- app/util/theme/colors/light.ts | 35 ------------------- app/util/theme/index.ts | 10 +++--- app/util/theme/models.ts | 5 ++- package.json | 1 + yarn.lock | 5 +++ 8 files changed, 13 insertions(+), 133 deletions(-) delete mode 100644 app/util/theme/colors/base-colors.ts delete mode 100644 app/util/theme/colors/dark.ts delete mode 100644 app/util/theme/colors/index.ts delete mode 100644 app/util/theme/colors/light.ts diff --git a/app/util/theme/colors/base-colors.ts b/app/util/theme/colors/base-colors.ts deleted file mode 100644 index 6773f1a4a53..00000000000 --- a/app/util/theme/colors/base-colors.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Colors } from '../models'; - -const colors: Colors = { - white: '#ffffff', - overlay: 'rgba(0,0,0, 0.7)', - grey000: '#f2f3f4', - grey100: '#d6d9dc', - grey200: '#bbc0c5', - grey300: '#9fa6ae', - grey400: '#848c96', - grey500: '#6a737d', - grey600: '#5b5d67', - grey700: '#3c3f42', - grey800: '#24272a', - grey900: '#141618', - red000: '#fcf2f3', - red100: '#f7d5d8', - red200: '#f1b9be', - red300: '#e88f97', - red400: '#e06470', - red500: '#d73a49', - red600: '#b92534', - red700: '#8e1d28', - red800: '#64141c', - red900: '#3a0c10', - blue000: '#eaf6ff', - blue100: '#a7d9fe', - blue200: '#75c4fd', - blue500: '#037dd6', - blue600: '#0260a4', - blue700: '#024272', - green100: '#e6f9ea', - green200: '#afecbd', - green300: '#86e29b', - green400: '#28a745', - green500: '#28a745', - green600: '#1e7e34', - yellow000: '#fffdf8', - yellow100: '#fefcde', - yellow200: '#fff2c5', - yellow300: '#ffeaa3', - yellow400: '#ffdf70', - yellow500: '#ffd33d', - yellow600: '#ffc70a', - orange000: '#fef5ef', - orange300: '#faa66c', - orange500: '#f66a0a', - transparent: 'transparent', -}; - -export default colors; diff --git a/app/util/theme/colors/dark.ts b/app/util/theme/colors/dark.ts deleted file mode 100644 index 173e12f4bed..00000000000 --- a/app/util/theme/colors/dark.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Colors } from '../models'; -import baseColors from './base-colors'; - -const colors: Colors = { - textDefault: baseColors.white, - textAlternative: baseColors.grey100, - backgroundDefault: baseColors.grey900, - backgroundAlternative: baseColors.grey800, - navbarBackground: baseColors.grey900, - borderDefault: baseColors.grey400, - muted: baseColors.grey700, - overlay: baseColors.overlay, - primary: baseColors.blue500, - onPrimary: baseColors.white, - info: baseColors.blue000, - onInfo: baseColors.blue500, - error: baseColors.red000, - onError: baseColors.red500, - success: baseColors.green100, - onSuccess: baseColors.green500, - warning: baseColors.yellow000, - onWarning: baseColors.yellow600, - inverse: baseColors.grey800, - onInverse: baseColors.white, - alert: 'rgba(0,0,0,.75)', - onAlert: baseColors.white, - // UI escape hatches for grey colors with no general purpose - ui4: baseColors.grey500, - onUi4: baseColors.white, - shadowColor: baseColors.gray900, - // needs auditing - transparent: 'transparent', -}; - -export default colors; diff --git a/app/util/theme/colors/index.ts b/app/util/theme/colors/index.ts deleted file mode 100644 index c510fa1f8e8..00000000000 --- a/app/util/theme/colors/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import lightTheme from './light'; -import darkTheme from './dark'; - -export default { lightTheme, darkTheme }; diff --git a/app/util/theme/colors/light.ts b/app/util/theme/colors/light.ts deleted file mode 100644 index 6421b96d6fb..00000000000 --- a/app/util/theme/colors/light.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Colors } from '../models'; -import baseColors from './base-colors'; - -const colors: Colors = { - textDefault: baseColors.grey800, - textAlternative: baseColors.grey600, - backgroundDefault: baseColors.white, - backgroundAlternative: baseColors.grey000, - navbarBackground: baseColors.white, - borderDefault: baseColors.grey100, - muted: baseColors.grey100, - overlay: baseColors.overlay, - primary: baseColors.blue500, - onPrimary: baseColors.white, - info: baseColors.blue000, - onInfo: baseColors.blue500, - error: baseColors.red000, - onError: baseColors.red500, - success: baseColors.green100, - onSuccess: baseColors.green500, - warning: baseColors.yellow000, - onWarning: baseColors.yellow600, - inverse: baseColors.grey800, - onInverse: baseColors.white, - alert: 'rgba(0,0,0,.75)', - onAlert: baseColors.white, - // UI escape hatches for grey colors with no general purpose - ui4: baseColors.grey500, - onUi4: baseColors.white, - shadowColor: baseColors.gray900, - // needs auditing - transparent: 'transparent', -}; - -export default colors; diff --git a/app/util/theme/index.ts b/app/util/theme/index.ts index cb334a36b79..78d2410d593 100644 --- a/app/util/theme/index.ts +++ b/app/util/theme/index.ts @@ -1,8 +1,8 @@ import React, { useContext } from 'react'; import { useColorScheme, StatusBar } from 'react-native'; import { Colors, AppThemeNames, Theme } from './models'; -import colorTheme from './colors'; import { useSelector } from 'react-redux'; +import { colors as colorTheme } from '@metamask/design-tokens'; export const ThemeContext = React.createContext(undefined); @@ -14,20 +14,20 @@ export const useAppTheme = (): Theme => { switch (appTheme) { case AppThemeNames.OS: - colors = osThemeName === 'dark' ? colorTheme.darkTheme : colorTheme.lightTheme; + colors = osThemeName === 'dark' ? colorTheme.dark : colorTheme.light; StatusBar.setBarStyle('default', true); break; case AppThemeNames.Light: - colors = colorTheme.lightTheme; + colors = colorTheme.light; StatusBar.setBarStyle('dark-content', true); break; case AppThemeNames.Dark: - colors = colorTheme.darkTheme; + colors = colorTheme.dark; StatusBar.setBarStyle('light-content', true); break; default: // Default uses light theme - colors = colorTheme.lightTheme; + colors = colorTheme.light; StatusBar.setBarStyle('dark-content', true); } diff --git a/app/util/theme/models.ts b/app/util/theme/models.ts index 4c68ddc9d4e..267bb9c717f 100644 --- a/app/util/theme/models.ts +++ b/app/util/theme/models.ts @@ -1,6 +1,5 @@ -export interface Colors { - [key: string]: string; -} +// TODO: This should probably be defined from @metamask/design-token library +export type Colors = any; export interface Theme { colors: Colors; diff --git a/package.json b/package.json index 22009db9acf..2485259408c 100644 --- a/package.json +++ b/package.json @@ -98,6 +98,7 @@ "@exodus/react-native-payments": "git+https://github.com/MetaMask/react-native-payments.git#dbc8cbbed570892d2fea5e3d183bf243e062c1e5", "@metamask/contract-metadata": "^1.30.0", "@metamask/controllers": "^22.0.0", + "@metamask/design-tokens": "^1.0.0", "@metamask/etherscan-link": "^2.0.0", "@metamask/swaps-controller": "^6.3.0", "@react-native-clipboard/clipboard": "^1.8.4", diff --git a/yarn.lock b/yarn.lock index 915adbb94b7..9da199917cf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2234,6 +2234,11 @@ web3 "^0.20.7" web3-provider-engine "^16.0.3" +"@metamask/design-tokens@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@metamask/design-tokens/-/design-tokens-1.0.0.tgz#49f0321767f651085b45a5a02114a2529843b24d" + integrity sha512-ZpJwygJwdmbBlku+mubqrdlItz1SO2V6Dnfh/3zhOXUK2sxNSM13b8wZRy/3Zz2AZhLpNg7d0AEw1wmKKopFfw== + "@metamask/eslint-config-typescript@^7.0.0": version "7.0.1" resolved "https://registry.yarnpkg.com/@metamask/eslint-config-typescript/-/eslint-config-typescript-7.0.1.tgz#e013f7f0505741b9321cab21351136f651abbba6" From 728a0034e9cc6d8cac49b29aa2e1d0260c34469b Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Wed, 9 Feb 2022 18:11:05 -0800 Subject: [PATCH 18/77] Update carousel with theme colors --- app/components/UI/Navbar/index.js | 12 +- .../UI/OnboardingScreenWithBg/index.js | 2 +- .../Views/OnboardingCarousel/index.js | 159 +++++++++--------- 3 files changed, 88 insertions(+), 85 deletions(-) diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index 4f1762142f6..c80e6cbe131 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -497,13 +497,13 @@ export function getOnboardingNavbarOptions(route, { headerLeft } = {}, themeColo headerStyle: { shadowColor: colors.transparent, elevation: 0, - backgroundColor: themeColors.backgroundDefault, + backgroundColor: themeColors.background.default, borderBottomWidth: 0, }, metamaskName: { width: 122, height: 15, - tintColor: themeColors.textDefault, + tintColor: themeColors.text.default, }, }); @@ -530,12 +530,12 @@ export function getTransparentOnboardingNavbarOptions(themeColors) { headerStyle: { shadowColor: colors.transparent, elevation: 0, - backgroundColor: themeColors.backgroundDefault, + backgroundColor: themeColors.background.default, }, metamaskName: { width: 122, height: 15, - tintColor: themeColors.textDefault, + tintColor: themeColors.text.default, }, }); return { @@ -560,12 +560,12 @@ export function getTransparentBackOnboardingNavbarOptions(themeColors) { headerStyle: { shadowColor: colors.transparent, elevation: 0, - backgroundColor: themeColors.backgroundDefault, + backgroundColor: themeColors.background.default, }, metamaskName: { width: 122, height: 15, - tintColor: themeColors.textDefault, + tintColor: themeColors.text.default, }, }); return { diff --git a/app/components/UI/OnboardingScreenWithBg/index.js b/app/components/UI/OnboardingScreenWithBg/index.js index 84007046cb9..4dab4489c65 100644 --- a/app/components/UI/OnboardingScreenWithBg/index.js +++ b/app/components/UI/OnboardingScreenWithBg/index.js @@ -17,7 +17,7 @@ const OnboardingScreenWithBg = (props) => { const styles = StyleSheet.create({ flex: { flex: 1, - backgroundColor: colors.backgroundDefault, + backgroundColor: colors.background.default, }, wrapper: { top: 0, diff --git a/app/components/Views/OnboardingCarousel/index.js b/app/components/Views/OnboardingCarousel/index.js index 58f73912a8e..3321befa9e6 100644 --- a/app/components/Views/OnboardingCarousel/index.js +++ b/app/components/Views/OnboardingCarousel/index.js @@ -2,7 +2,7 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; import { Text, View, ScrollView, StyleSheet, Image, Dimensions, InteractionManager } from 'react-native'; import StyledButton from '../../UI/StyledButton'; -import { colors, fontStyles, baseStyles } from '../../../styles/common'; +import { fontStyles, baseStyles } from '../../../styles/common'; import { strings } from '../../../../locales/i18n'; import FadeOutOverlay from '../../UI/FadeOutOverlay'; import ScrollableTabView from 'react-native-scrollable-tab-view'; @@ -23,83 +23,84 @@ const DEVICE_WIDTH = Dimensions.get('window').width; const IMG_PADDING = Device.isIphoneX() ? 100 : Device.isIphone5S() ? 180 : 220; -const styles = StyleSheet.create({ - scroll: { - flexGrow: 1, - }, - wrapper: { - paddingVertical: 30, - flex: 1, - }, - title: { - fontSize: 24, - marginBottom: 12, - color: colors.fontPrimary, - justifyContent: 'center', - textAlign: 'center', - ...fontStyles.bold, - }, - subtitle: { - fontSize: 14, - lineHeight: 19, - marginTop: 12, - marginBottom: 25, - color: colors.grey500, - justifyContent: 'center', - textAlign: 'center', - ...fontStyles.normal, - }, - ctas: { - paddingHorizontal: 40, - paddingBottom: Device.isIphoneX() ? 40 : 20, - flexDirection: 'column', - }, - ctaWrapper: { - justifyContent: 'flex-end', - }, - carouselImage: {}, - // eslint-disable-next-line react-native/no-unused-styles - carouselImage1: { - marginTop: 30, - width: DEVICE_WIDTH - IMG_PADDING, - height: (DEVICE_WIDTH - IMG_PADDING) * IMAGE_1_RATIO, - }, - // eslint-disable-next-line react-native/no-unused-styles - carouselImage2: { - width: DEVICE_WIDTH - IMG_PADDING, - height: (DEVICE_WIDTH - IMG_PADDING) * IMAGE_2_RATIO, - }, - // eslint-disable-next-line react-native/no-unused-styles - carouselImage3: { - width: DEVICE_WIDTH - 60, - height: (DEVICE_WIDTH - 60) * IMAGE_3_RATIO, - }, - carouselImageWrapper: { - flex: 1, - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'center', - }, - circle: { - width: 8, - height: 8, - borderRadius: 8 / 2, - backgroundColor: colors.grey500, - opacity: 0.4, - marginHorizontal: 8, - }, - solidCircle: { - opacity: 1, - }, - progessContainer: { - flexDirection: 'row', - alignSelf: 'center', - marginVertical: 36, - }, - tab: { - marginHorizontal: 30, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + scroll: { + flexGrow: 1, + }, + wrapper: { + paddingVertical: 30, + flex: 1, + }, + title: { + fontSize: 24, + marginBottom: 12, + color: colors.text.default, + justifyContent: 'center', + textAlign: 'center', + ...fontStyles.bold, + }, + subtitle: { + fontSize: 14, + lineHeight: 19, + marginTop: 12, + marginBottom: 25, + color: colors.text.alternative, + justifyContent: 'center', + textAlign: 'center', + ...fontStyles.normal, + }, + ctas: { + paddingHorizontal: 40, + paddingBottom: Device.isIphoneX() ? 40 : 20, + flexDirection: 'column', + }, + ctaWrapper: { + justifyContent: 'flex-end', + }, + carouselImage: {}, + // eslint-disable-next-line react-native/no-unused-styles + carouselImage1: { + marginTop: 30, + width: DEVICE_WIDTH - IMG_PADDING, + height: (DEVICE_WIDTH - IMG_PADDING) * IMAGE_1_RATIO, + }, + // eslint-disable-next-line react-native/no-unused-styles + carouselImage2: { + width: DEVICE_WIDTH - IMG_PADDING, + height: (DEVICE_WIDTH - IMG_PADDING) * IMAGE_2_RATIO, + }, + // eslint-disable-next-line react-native/no-unused-styles + carouselImage3: { + width: DEVICE_WIDTH - 60, + height: (DEVICE_WIDTH - 60) * IMAGE_3_RATIO, + }, + carouselImageWrapper: { + flex: 1, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + }, + circle: { + width: 8, + height: 8, + borderRadius: 8 / 2, + backgroundColor: colors.text.alternative, + opacity: 0.4, + marginHorizontal: 8, + }, + solidCircle: { + opacity: 1, + }, + progessContainer: { + flexDirection: 'row', + alignSelf: 'center', + marginVertical: 36, + }, + tab: { + marginHorizontal: 30, + }, + }); const onboarding_carousel_1 = require('../../../images/onboarding-carousel-1.png'); // eslint-disable-line const onboarding_carousel_2 = require('../../../images/onboarding-carousel-2.png'); // eslint-disable-line @@ -167,6 +168,8 @@ class OnboardingCarousel extends PureComponent { render() { const { currentTab } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); return ( From ee55a65c532594853c399a893a802da903c60615 Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Wed, 9 Feb 2022 23:11:35 -0800 Subject: [PATCH 19/77] Use theme colors in onboarding flow --- .eslintrc.js | 2 +- .../UI/ActionModal/ActionContent/index.js | 74 +-- app/components/UI/Navbar/index.js | 17 +- app/components/UI/OptinMetrics/index.js | 200 ++++--- .../UI/SkipAccountSecurityModal/index.js | 181 +++--- app/components/UI/StyledButton/index.ios.js | 3 +- .../UI/StyledButton/styledButtonStyles.js | 249 +++++---- .../Views/AccountBackupStep1/index.js | 164 +++--- .../Views/AccountBackupStep1B/index.js | 330 +++++------ app/components/Views/ChoosePassword/index.js | 342 ++++++------ app/components/Views/ImportFromSeed/index.js | 277 ++++----- app/components/Views/Login/index.js | 524 +++++++++--------- .../Views/ManualBackupStep1/index.js | 430 +++++++------- .../Views/ManualBackupStep2/index.js | 296 +++++----- .../Views/ManualBackupStep3/index.js | 102 ++-- app/components/Views/Onboarding/index.js | 209 +++---- 16 files changed, 1770 insertions(+), 1630 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 3abaf112e37..68200c09a3c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -119,7 +119,7 @@ module.exports = { 'eslint-comments/no-unused-disable': 0, 'react-native/no-color-literals': 2, 'react-native/no-inline-styles': 2, - 'react-native/no-unused-styles': 2, + 'react-native/no-unused-styles': 0, 'react-native/split-platform-components': 2, 'react/jsx-boolean-value': 2, 'react/jsx-key': 1, diff --git a/app/components/UI/ActionModal/ActionContent/index.js b/app/components/UI/ActionModal/ActionContent/index.js index 06f9f79202d..b4eef67ac0d 100644 --- a/app/components/UI/ActionModal/ActionContent/index.js +++ b/app/components/UI/ActionModal/ActionContent/index.js @@ -1,44 +1,45 @@ import React from 'react'; import PropTypes from 'prop-types'; import { StyleSheet, View } from 'react-native'; -import { colors } from '../../../../styles/common'; import StyledButton from '../../StyledButton'; import { strings } from '../../../../../locales/i18n'; +import { useAppThemeFromContext } from '../../../../util/theme'; -const styles = StyleSheet.create({ - viewWrapper: { - flexDirection: 'column', - justifyContent: 'center', - alignItems: 'center', - marginHorizontal: 24, - }, - viewContainer: { - width: '100%', - backgroundColor: colors.white, - borderRadius: 10, - }, - actionHorizontalContainer: { - flexDirection: 'row', - padding: 16, - borderTopWidth: 1, - borderTopColor: colors.grey200, - }, - actionVerticalContainer: { - flexDirection: 'column', - paddingHorizontal: 16, - paddingVertical: 8, - }, - childrenContainer: { - flexDirection: 'row', - alignItems: 'center', - }, - button: { - margin: 8, - }, - buttonHorizontal: { - flex: 1, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + viewWrapper: { + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + marginHorizontal: 24, + }, + viewContainer: { + width: '100%', + backgroundColor: colors.background.default, + borderRadius: 10, + }, + actionHorizontalContainer: { + flexDirection: 'row', + padding: 16, + borderTopWidth: 1, + borderTopColor: colors.grey200, + }, + actionVerticalContainer: { + flexDirection: 'column', + paddingHorizontal: 16, + paddingVertical: 8, + }, + childrenContainer: { + flexDirection: 'row', + alignItems: 'center', + }, + button: { + margin: 8, + }, + buttonHorizontal: { + flex: 1, + }, + }); /** * View that renders the content of an action modal @@ -65,6 +66,9 @@ export default function ActionContent({ childrenContainerStyle, verticalButtons, }) { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ( diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index c80e6cbe131..fe3b74a2c64 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -586,15 +586,24 @@ export function getTransparentBackOnboardingNavbarOptions(themeColors) { * * @returns {Object} - Corresponding navbar options containing headerLeft */ -export function getOptinMetricsNavbarOptions() { - return { +export function getOptinMetricsNavbarOptions(themeColors) { + const innerStyles = StyleSheet.create({ headerStyle: { shadowColor: colors.transparent, elevation: 0, - backgroundColor: colors.white, + backgroundColor: themeColors.background.default, borderBottomWidth: 0, height: 100, }, + metamaskName: { + width: 122, + height: 15, + tintColor: themeColors.text.default, + }, + }); + + return { + headerStyle: innerStyles.headerStyle, title: null, headerLeft: () => ( @@ -602,7 +611,7 @@ export function getOptinMetricsNavbarOptions() { - + ), diff --git a/app/components/UI/OptinMetrics/index.js b/app/components/UI/OptinMetrics/index.js index 181c88183fa..900abf167ac 100644 --- a/app/components/UI/OptinMetrics/index.js +++ b/app/components/UI/OptinMetrics/index.js @@ -11,7 +11,7 @@ import { InteractionManager, } from 'react-native'; import PropTypes from 'prop-types'; -import { baseStyles, fontStyles, colors } from '../../../styles/common'; +import { baseStyles, fontStyles } from '../../../styles/common'; import Entypo from 'react-native-vector-icons/Entypo'; import { getOptinMetricsNavbarOptions } from '../Navbar'; import { strings } from '../../../../locales/i18n'; @@ -24,79 +24,79 @@ import { ONBOARDING_WIZARD, METRICS_OPT_IN, DENIED, AGREED } from '../../../cons import AppConstants from '../../../core/AppConstants'; import AnalyticsV2 from '../../../util/analyticsV2'; import DefaultPreference from 'react-native-default-preference'; +import { ThemeContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - root: { - ...baseStyles.flexGrow, - backgroundColor: colors.white, - }, - checkIcon: { - color: colors.green500, - }, - crossIcon: { - color: colors.red, - }, - icon: { - marginRight: 5, - }, - action: { - flex: 0, - flexDirection: 'row', - paddingVertical: 10, - alignItems: 'center', - }, - title: { - ...fontStyles.bold, - color: colors.black, - fontSize: 22, - }, - description: { - ...fontStyles.normal, - color: colors.black, - flex: 1, - }, - content: { - ...fontStyles.normal, - fontSize: 14, - color: colors.black, - paddingVertical: 10, - }, - wrapper: { - marginHorizontal: 20, - }, - privacyPolicy: { - ...fontStyles.normal, - fontSize: 14, - color: colors.grey400, - marginTop: 10, - }, - link: { - textDecorationLine: 'underline', - }, - actionContainer: { - marginTop: 10, - flex: 0, - flexDirection: 'row', - padding: 16, - bottom: 0, - }, - button: { - flex: 1, - }, - cancel: { - marginRight: 8, - }, - confirm: { - marginLeft: 8, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + root: { + ...baseStyles.flexGrow, + backgroundColor: colors.background.default, + }, + checkIcon: { + color: colors.success.default, + }, + crossIcon: { + color: colors.error.default, + }, + icon: { + marginRight: 5, + }, + action: { + flex: 0, + flexDirection: 'row', + paddingVertical: 10, + alignItems: 'center', + }, + title: { + ...fontStyles.bold, + color: colors.text.default, + fontSize: 22, + }, + description: { + ...fontStyles.normal, + color: colors.text.default, + flex: 1, + }, + content: { + ...fontStyles.normal, + fontSize: 14, + color: colors.text.default, + paddingVertical: 10, + }, + wrapper: { + marginHorizontal: 20, + }, + privacyPolicy: { + ...fontStyles.normal, + fontSize: 14, + color: colors.text.muted, + marginTop: 10, + }, + link: { + textDecorationLine: 'underline', + }, + actionContainer: { + marginTop: 10, + flex: 0, + flexDirection: 'row', + padding: 16, + bottom: 0, + }, + button: { + flex: 1, + }, + cancel: { + marginRight: 8, + }, + confirm: { + marginLeft: 8, + }, + }); /** * View that is displayed in the flow to agree to metrics */ class OptinMetrics extends PureComponent { - static navigationOptions = () => getOptinMetricsNavbarOptions(); - static propTypes = { /** /* navigation object required to push and pop other views @@ -125,11 +125,22 @@ class OptinMetrics extends PureComponent { description: strings(`privacy_policy.action_description_${value}`), })); + updateNavBar = () => { + const { navigation } = this.props; + const { colors } = this.context; + navigation.setOptions(getOptinMetricsNavbarOptions(colors)); + }; + componentDidMount() { + this.updateNavBar(); Analytics.enable(); BackHandler.addEventListener('hardwareBackPress', this.handleBackPress); } + componentDidUpdate = () => { + this.updateNavBar(); + }; + componentWillUnmount() { BackHandler.removeEventListener('hardwareBackPress', this.handleBackPress); } @@ -166,16 +177,21 @@ class OptinMetrics extends PureComponent { * @param {object} - Object containing action and description to be rendered * @param {number} i - Index key */ - renderAction = ({ action, description }, i) => ( - - {action === 0 ? ( - - ) : ( - - )} - {description} - - ); + renderAction = ({ action, description }, i) => { + const { colors } = this.context; + const styles = createStyles(colors); + + return ( + + {action === 0 ? ( + + ) : ( + + )} + {description} + + ); + }; /** * Track the event of opt in or opt out. @@ -243,17 +259,25 @@ class OptinMetrics extends PureComponent { * * @returns - Touchable opacity object to render with privacy policy information */ - renderPrivacyPolicy = () => ( - - - {strings('privacy_policy.description') + ' '} - {strings('privacy_policy.here')} - {strings('unit.point')} - - - ); + renderPrivacyPolicy = () => { + const { colors } = this.context; + const styles = createStyles(colors); + + return ( + + + {strings('privacy_policy.description') + ' '} + {strings('privacy_policy.here')} + {strings('unit.point')} + + + ); + }; render() { + const { colors } = this.context; + const styles = createStyles(colors); + return ( @@ -289,6 +313,8 @@ class OptinMetrics extends PureComponent { } } +OptinMetrics.contextType = ThemeContext; + const mapStateToProps = (state) => ({ events: state.onboarding.events, }); diff --git a/app/components/UI/SkipAccountSecurityModal/index.js b/app/components/UI/SkipAccountSecurityModal/index.js index f52564497ca..7b5c10cf530 100644 --- a/app/components/UI/SkipAccountSecurityModal/index.js +++ b/app/components/UI/SkipAccountSecurityModal/index.js @@ -7,94 +7,107 @@ import { strings } from '../../../../locales/i18n'; import CheckBox from '@react-native-community/checkbox'; import FeatherIcon from 'react-native-vector-icons/Feather'; import PropTypes from 'prop-types'; -import { colors, fontStyles } from '../../../styles/common'; +import { fontStyles } from '../../../styles/common'; +import { useAppThemeFromContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - imageWarning: { - alignSelf: 'center', - color: colors.red, - }, - modalNoBorder: { - borderTopWidth: 0, - }, - skipTitle: { - fontSize: 24, - marginTop: 12, - marginBottom: 16, - color: colors.fontPrimary, - textAlign: 'center', - ...fontStyles.bold, - }, - skipModalContainer: { - flex: 1, - margin: 24, - flexDirection: 'column', - }, - skipModalXButton: { - flex: 1, - alignItems: 'flex-end', - }, - skipModalXIcon: { - fontSize: 16, - }, - skipModalActionButtons: { - flexDirection: 'row', - alignItems: 'flex-start', - }, - skipModalCheckbox: { - height: 18, - width: 18, - marginRight: 12, - marginTop: 3, - }, - skipModalText: { - flex: 1, - ...fontStyles.normal, - lineHeight: 20, - fontSize: 14, - paddingHorizontal: 10, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + imageWarning: { + alignSelf: 'center', + color: colors.error.default, + }, + modalNoBorder: { + borderTopWidth: 0, + }, + skipTitle: { + fontSize: 24, + marginTop: 12, + marginBottom: 16, + color: colors.text.default, + textAlign: 'center', + ...fontStyles.bold, + }, + skipModalContainer: { + flex: 1, + margin: 24, + flexDirection: 'column', + }, + skipModalXButton: { + flex: 1, + alignItems: 'flex-end', + }, + skipModalXIcon: { + fontSize: 16, + }, + skipModalActionButtons: { + flexDirection: 'row', + alignItems: 'flex-start', + }, + skipModalCheckbox: { + height: 18, + width: 18, + marginRight: 12, + marginTop: 3, + }, + skipModalText: { + flex: 1, + ...fontStyles.normal, + lineHeight: 20, + fontSize: 14, + paddingHorizontal: 10, + color: colors.text.default, + }, + }); -const SkipAccountSecurityModal = ({ modalVisible, onConfirm, onCancel, onPress, toggleSkipCheckbox, skipCheckbox }) => ( - - - - - - - {strings('account_backup_step_1.skip_title')} - - { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ( + + + + + + - - {strings('account_backup_step_1.skip_check')} - + {strings('account_backup_step_1.skip_title')} + + + + {strings('account_backup_step_1.skip_check')} + + - - -); + + ); +}; const propTypes = { modalVisible: PropTypes.bool.isRequired, diff --git a/app/components/UI/StyledButton/index.ios.js b/app/components/UI/StyledButton/index.ios.js index 75311425bde..eff2925d988 100644 --- a/app/components/UI/StyledButton/index.ios.js +++ b/app/components/UI/StyledButton/index.ios.js @@ -65,7 +65,8 @@ export default class StyledButton extends PureComponent { render = () => { const { type, onPress, onPressOut, style, children, disabled, styleDisabled, testID, disabledContainerStyle } = this.props; - const { fontStyle, containerStyle } = getStyles(type); + const { colors } = this.context; + const { fontStyle, containerStyle } = getStyles(type, colors); return ( + + + {this.state.loading ? ( + + ) : ( + strings('login.login_button') + )} + + + + + {strings('login.go_back')} + + - - - - - - ); + + + + + ); + }; } Login.contextType = ThemeContext; diff --git a/app/components/Views/ManualBackupStep1/index.js b/app/components/Views/ManualBackupStep1/index.js index 0d0e917e160..d5589c7e2fe 100644 --- a/app/components/Views/ManualBackupStep1/index.js +++ b/app/components/Views/ManualBackupStep1/index.js @@ -11,7 +11,7 @@ import { TouchableOpacity, } from 'react-native'; import PropTypes from 'prop-types'; -import { colors, fontStyles, baseStyles } from '../../../styles/common'; +import { fontStyles, baseStyles } from '../../../styles/common'; import StyledButton from '../../UI/StyledButton'; import OnboardingProgress from '../../UI/OnboardingProgress'; import { strings } from '../../../../locales/i18n'; @@ -33,184 +33,185 @@ import { import AnalyticsV2 from '../../../util/analyticsV2'; import { ThemeContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - mainWrapper: { - backgroundColor: colors.white, - flex: 1, - }, - wrapper: { - flex: 1, - paddingHorizontal: 32, - }, - onBoardingWrapper: { - paddingHorizontal: 20, - }, - loader: { - backgroundColor: colors.white, - flex: 1, - minHeight: 300, - justifyContent: 'center', - alignItems: 'center', - }, - action: { - fontSize: 18, - marginVertical: 16, - color: colors.fontPrimary, - justifyContent: 'center', - textAlign: 'center', - ...fontStyles.bold, - }, - infoWrapper: { - marginBottom: 16, - justifyContent: 'center', - }, - info: { - fontSize: 14, - color: colors.fontPrimary, - textAlign: 'center', - ...fontStyles.normal, - paddingHorizontal: 6, - }, - seedPhraseConcealer: { - position: 'absolute', - width: '100%', - height: '100%', - backgroundColor: colors.grey700, - opacity: 0.7, - alignItems: 'center', - borderRadius: 8, - paddingHorizontal: 24, - paddingVertical: 45, - }, - touchableOpacity: { - position: 'absolute', - width: '100%', - height: '100%', - borderRadius: 8, - }, - blurView: { - position: 'absolute', - top: 0, - left: 0, - bottom: 0, - right: 0, - borderRadius: 8, - }, - icon: { - width: 24, - height: 24, - color: colors.white, - textAlign: 'center', - marginBottom: 32, - }, - reveal: { - fontSize: Device.isMediumDevice() ? 13 : 16, - ...fontStyles.bold, - color: colors.white, - lineHeight: 22, - marginBottom: 8, - textAlign: 'center', - }, - watching: { - fontSize: Device.isMediumDevice() ? 10 : 12, - color: colors.white, - lineHeight: 17, - marginBottom: 32, - textAlign: 'center', - }, - viewButtonContainer: { - width: 155, - padding: 12, - }, - seedPhraseWrapper: { - backgroundColor: colors.white, - borderRadius: 8, - flexDirection: 'row', - borderColor: colors.grey100, - borderWidth: 1, - marginBottom: 64, - minHeight: 275, - }, - wordColumn: { - flex: 1, - alignItems: 'center', - paddingHorizontal: Device.isMediumDevice() ? 18 : 24, - paddingVertical: 18, - justifyContent: 'space-between', - }, - wordWrapper: { - flexDirection: 'row', - }, - word: { - paddingHorizontal: 8, - paddingVertical: 6, - fontSize: 14, - color: colors.fontPrimary, - backgroundColor: colors.white, - borderColor: colors.blue, - borderWidth: 1, - borderRadius: 13, - textAlign: 'center', - textAlignVertical: 'center', - lineHeight: 14, - flex: 1, - }, - confirmPasswordWrapper: { - flex: 1, - padding: 30, - paddingTop: 0, - }, - passwordRequiredContent: { - marginBottom: 20, - }, - content: { - alignItems: 'flex-start', - }, - title: { - fontSize: 32, - marginTop: 20, - marginBottom: 10, - color: colors.fontPrimary, - justifyContent: 'center', - textAlign: 'left', - ...fontStyles.normal, - }, - text: { - marginBottom: 10, - marginTop: 20, - justifyContent: 'center', - }, - label: { - fontSize: 16, - lineHeight: 23, - color: colors.fontPrimary, - textAlign: 'left', - ...fontStyles.normal, - }, - buttonWrapper: { - flex: 1, - marginTop: 20, - justifyContent: 'flex-end', - }, - input: { - borderWidth: 2, - borderRadius: 5, - width: '100%', - borderColor: colors.grey000, - padding: 10, - height: 40, - }, - warningMessageText: { - paddingVertical: 10, - color: colors.red, - ...fontStyles.normal, - }, - keyboardAvoidingView: { - flex: 1, - flexDirection: 'row', - alignSelf: 'center', - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + mainWrapper: { + backgroundColor: colors.background.default, + flex: 1, + }, + wrapper: { + flex: 1, + paddingHorizontal: 32, + }, + onBoardingWrapper: { + paddingHorizontal: 20, + }, + loader: { + backgroundColor: colors.background.default, + flex: 1, + minHeight: 300, + justifyContent: 'center', + alignItems: 'center', + }, + action: { + fontSize: 18, + marginVertical: 16, + color: colors.text.default, + justifyContent: 'center', + textAlign: 'center', + ...fontStyles.bold, + }, + infoWrapper: { + marginBottom: 16, + justifyContent: 'center', + }, + info: { + fontSize: 14, + color: colors.text.default, + textAlign: 'center', + ...fontStyles.normal, + paddingHorizontal: 6, + }, + seedPhraseConcealer: { + position: 'absolute', + width: '100%', + height: '100%', + backgroundColor: colors.grey700, + opacity: 0.7, + alignItems: 'center', + borderRadius: 8, + paddingHorizontal: 24, + paddingVertical: 45, + }, + touchableOpacity: { + position: 'absolute', + width: '100%', + height: '100%', + borderRadius: 8, + }, + blurView: { + position: 'absolute', + top: 0, + left: 0, + bottom: 0, + right: 0, + borderRadius: 8, + }, + icon: { + width: 24, + height: 24, + color: colors.white, + textAlign: 'center', + marginBottom: 32, + }, + reveal: { + fontSize: Device.isMediumDevice() ? 13 : 16, + ...fontStyles.bold, + color: colors.white, + lineHeight: 22, + marginBottom: 8, + textAlign: 'center', + }, + watching: { + fontSize: Device.isMediumDevice() ? 10 : 12, + color: colors.white, + lineHeight: 17, + marginBottom: 32, + textAlign: 'center', + }, + viewButtonContainer: { + width: 155, + padding: 12, + }, + seedPhraseWrapper: { + backgroundColor: colors.white, + borderRadius: 8, + flexDirection: 'row', + borderColor: colors.grey100, + borderWidth: 1, + marginBottom: 64, + minHeight: 275, + }, + wordColumn: { + flex: 1, + alignItems: 'center', + paddingHorizontal: Device.isMediumDevice() ? 18 : 24, + paddingVertical: 18, + justifyContent: 'space-between', + }, + wordWrapper: { + flexDirection: 'row', + }, + word: { + paddingHorizontal: 8, + paddingVertical: 6, + fontSize: 14, + color: colors.text.default, + backgroundColor: colors.background.default, + borderColor: colors.primary.default, + borderWidth: 1, + borderRadius: 13, + textAlign: 'center', + textAlignVertical: 'center', + lineHeight: 14, + flex: 1, + }, + confirmPasswordWrapper: { + flex: 1, + padding: 30, + paddingTop: 0, + }, + passwordRequiredContent: { + marginBottom: 20, + }, + content: { + alignItems: 'flex-start', + }, + title: { + fontSize: 32, + marginTop: 20, + marginBottom: 10, + color: colors.text.default, + justifyContent: 'center', + textAlign: 'left', + ...fontStyles.normal, + }, + text: { + marginBottom: 10, + marginTop: 20, + justifyContent: 'center', + }, + label: { + fontSize: 16, + lineHeight: 23, + color: colors.text.default, + textAlign: 'left', + ...fontStyles.normal, + }, + buttonWrapper: { + flex: 1, + marginTop: 20, + justifyContent: 'flex-end', + }, + input: { + borderWidth: 2, + borderRadius: 5, + width: '100%', + borderColor: colors.grey000, + padding: 10, + height: 40, + }, + warningMessageText: { + paddingVertical: 10, + color: colors.error.default, + ...fontStyles.normal, + }, + keyboardAvoidingView: { + flex: 1, + flexDirection: 'row', + alignSelf: 'center', + }, + }); /** * View that's shown during the second step of @@ -313,37 +314,50 @@ export default class ManualBackupStep1 extends PureComponent { this.tryUnlockWithPassword(password); }; - renderLoader = () => ( - - - - ); + renderLoader = () => { + const { colors } = this.context; + const styles = createStyles(colors); + + return ( + + + + ); + }; - renderSeedPhraseConcealer = () => ( - - - - - - {strings('manual_backup_step_1.reveal')} - {strings('manual_backup_step_1.watching')} - - - {strings('manual_backup_step_1.view')} - + renderSeedPhraseConcealer = () => { + const { colors } = this.context; + const styles = createStyles(colors); + + return ( + + + + + + {strings('manual_backup_step_1.reveal')} + {strings('manual_backup_step_1.watching')} + + + {strings('manual_backup_step_1.view')} + + - - - - ); + + + ); + }; renderConfirmPassword() { const { warningIncorrectPassword } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + return ( @@ -386,6 +400,9 @@ export default class ManualBackupStep1 extends PureComponent { const words = this.words || []; const wordLength = words.length; const half = wordLength / 2 || 6; + const { colors } = this.context; + const styles = createStyles(colors); + return ( diff --git a/app/components/Views/ManualBackupStep2/index.js b/app/components/Views/ManualBackupStep2/index.js index a6bc5a0a0b4..821bad7c818 100644 --- a/app/components/Views/ManualBackupStep2/index.js +++ b/app/components/Views/ManualBackupStep2/index.js @@ -2,7 +2,7 @@ import React, { PureComponent } from 'react'; import { InteractionManager, Alert, Text, TouchableOpacity, View, SafeAreaView, StyleSheet } from 'react-native'; import PropTypes from 'prop-types'; import OnboardingProgress from '../../UI/OnboardingProgress'; -import { colors, fontStyles } from '../../../styles/common'; +import { fontStyles } from '../../../styles/common'; import ActionView from '../../UI/ActionView'; import { strings } from '../../../../locales/i18n'; import { connect } from 'react-redux'; @@ -13,138 +13,139 @@ import { getOnboardingNavbarOptions } from '../../UI/Navbar'; import AnalyticsV2 from '../../../util/analyticsV2'; import { ThemeContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - mainWrapper: { - backgroundColor: colors.white, - flex: 1, - }, - wrapper: { - flex: 1, - paddingHorizontal: 32, - }, - onBoardingWrapper: { - paddingHorizontal: 20, - }, - action: { - fontSize: 18, - marginBottom: 16, - color: colors.fontPrimary, - justifyContent: 'center', - textAlign: 'center', - ...fontStyles.bold, - }, - infoWrapper: { - marginBottom: 16, - justifyContent: 'center', - }, - info: { - fontSize: 16, - color: colors.fontPrimary, - textAlign: 'center', - ...fontStyles.normal, - paddingHorizontal: 6, - }, - seedPhraseWrapper: { - backgroundColor: colors.white, - borderRadius: 8, - flexDirection: 'row', - justifyContent: 'space-between', - borderColor: colors.grey100, - borderWidth: 1, - marginBottom: 24, - }, - seedPhraseWrapperComplete: { - borderColor: colors.green500, - }, - seedPhraseWrapperError: { - borderColor: colors.red, - }, - colLeft: { - paddingTop: 18, - paddingLeft: 27, - paddingBottom: 4, - alignItems: 'flex-start', - }, - colRight: { - paddingTop: 18, - paddingRight: 27, - paddingBottom: 4, - alignItems: 'flex-end', - }, - wordBoxWrapper: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - marginBottom: 14, - }, - wordWrapper: { - paddingHorizontal: 8, - paddingVertical: 6, - width: Device.isMediumDevice() ? 75 : 95, - backgroundColor: colors.white, - borderColor: colors.grey050, - borderWidth: 1, - borderRadius: 34, - borderStyle: 'dashed', - marginLeft: 4, - }, - word: { - fontSize: 14, - color: colors.fontPrimary, - lineHeight: 14, - textAlign: 'center', - }, - selectableWord: { - paddingHorizontal: 8, - paddingVertical: 6, - color: colors.fontPrimary, - width: 95, - backgroundColor: colors.white, - borderColor: colors.blue, - borderWidth: 1, - marginBottom: 6, - borderRadius: 13, - textAlign: 'center', - }, - selectableWordText: { - textAlign: 'center', - fontSize: 14, - lineHeight: 14, - color: colors.black, - }, - words: { - flexDirection: 'row', - flexWrap: 'wrap', - justifyContent: Device.isMediumDevice() ? 'space-around' : 'space-between', - }, - successRow: { - flexDirection: 'row', - justifyContent: 'center', - alignItems: 'center', - }, - successText: { - fontSize: 12, - color: colors.green500, - marginLeft: 4, - }, - selectedWord: { - backgroundColor: colors.grey400, - borderWidth: 1, - borderColor: colors.grey400, - }, - selectedWordText: { - color: colors.white, - }, - currentWord: { - borderWidth: 1, - borderColor: colors.blue, - }, - confirmedWord: { - borderWidth: 1, - borderColor: colors.blue, - borderStyle: 'solid', - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + mainWrapper: { + backgroundColor: colors.background.default, + flex: 1, + }, + wrapper: { + flex: 1, + paddingHorizontal: 32, + }, + onBoardingWrapper: { + paddingHorizontal: 20, + }, + action: { + fontSize: 18, + marginBottom: 16, + color: colors.text.default, + justifyContent: 'center', + textAlign: 'center', + ...fontStyles.bold, + }, + infoWrapper: { + marginBottom: 16, + justifyContent: 'center', + }, + info: { + fontSize: 16, + color: colors.text.default, + textAlign: 'center', + ...fontStyles.normal, + paddingHorizontal: 6, + }, + seedPhraseWrapper: { + backgroundColor: colors.background.default, + borderRadius: 8, + flexDirection: 'row', + justifyContent: 'space-between', + borderColor: colors.grey100, + borderWidth: 1, + marginBottom: 24, + }, + seedPhraseWrapperComplete: { + borderColor: colors.green500, + }, + seedPhraseWrapperError: { + borderColor: colors.error.default, + }, + colLeft: { + paddingTop: 18, + paddingLeft: 27, + paddingBottom: 4, + alignItems: 'flex-start', + }, + colRight: { + paddingTop: 18, + paddingRight: 27, + paddingBottom: 4, + alignItems: 'flex-end', + }, + wordBoxWrapper: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: 14, + }, + wordWrapper: { + paddingHorizontal: 8, + paddingVertical: 6, + width: Device.isMediumDevice() ? 75 : 95, + backgroundColor: colors.background.default, + borderColor: colors.grey050, + borderWidth: 1, + borderRadius: 34, + borderStyle: 'dashed', + marginLeft: 4, + }, + word: { + fontSize: 14, + color: colors.text.default, + lineHeight: 14, + textAlign: 'center', + }, + selectableWord: { + paddingHorizontal: 8, + paddingVertical: 6, + color: colors.text.default, + width: 95, + backgroundColor: colors.background.default, + borderColor: colors.primary.default, + borderWidth: 1, + marginBottom: 6, + borderRadius: 13, + textAlign: 'center', + }, + selectableWordText: { + textAlign: 'center', + fontSize: 14, + lineHeight: 14, + color: colors.text.default, + }, + words: { + flexDirection: 'row', + flexWrap: 'wrap', + justifyContent: Device.isMediumDevice() ? 'space-around' : 'space-between', + }, + successRow: { + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + }, + successText: { + fontSize: 12, + color: colors.success.default, + marginLeft: 4, + }, + selectedWord: { + backgroundColor: colors.grey400, + borderWidth: 1, + borderColor: colors.grey400, + }, + selectedWordText: { + color: colors.white, + }, + currentWord: { + borderWidth: 1, + borderColor: colors.primary.default, + }, + confirmedWord: { + borderWidth: 1, + borderColor: colors.primary.default, + borderStyle: 'solid', + }, + }); /** * View that's shown during the fifth step of @@ -286,6 +287,9 @@ class ManualBackupStep2 extends PureComponent { renderWords = () => { const { wordsDict } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + return ( {Object.keys(wordsDict).map((key, i) => this.renderWordSelectableBox(key, i))} @@ -293,15 +297,23 @@ class ManualBackupStep2 extends PureComponent { ); }; - renderSuccess = () => ( - - - {strings('manual_backup_step_2.success')} - - ); + renderSuccess = () => { + const { colors } = this.context; + const styles = createStyles(colors); + + return ( + + + {strings('manual_backup_step_2.success')} + + ); + }; renderWordBox = (word, i) => { const { currentIndex, confirmedWords } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + return ( {i + 1}. @@ -326,6 +338,9 @@ class ManualBackupStep2 extends PureComponent { const { wordsDict } = this.state; const [word] = key.split(','); const selected = wordsDict[key].currentPosition !== undefined; + const { colors } = this.context; + const styles = createStyles(colors); + return ( diff --git a/app/components/Views/ManualBackupStep3/index.js b/app/components/Views/ManualBackupStep3/index.js index 754d7f7285f..e7c13f48542 100644 --- a/app/components/Views/ManualBackupStep3/index.js +++ b/app/components/Views/ManualBackupStep3/index.js @@ -11,7 +11,7 @@ import { } from 'react-native'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; -import { colors, fontStyles } from '../../../styles/common'; +import { fontStyles } from '../../../styles/common'; import Emoji from 'react-native-emoji'; import AsyncStorage from '@react-native-community/async-storage'; import OnboardingProgress from '../../UI/OnboardingProgress'; @@ -28,54 +28,55 @@ import AnalyticsV2 from '../../../util/analyticsV2'; import DefaultPreference from 'react-native-default-preference'; import { ThemeContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - mainWrapper: { - backgroundColor: colors.white, - flex: 1, - }, - actionView: { - paddingTop: 40, - }, - wrapper: { - flex: 1, - paddingHorizontal: 50, - }, - onBoardingWrapper: { - paddingHorizontal: 20, - }, - congratulations: { - fontSize: Device.isMediumDevice() ? 28 : 32, - marginBottom: 12, - color: colors.fontPrimary, - justifyContent: 'center', - textAlign: 'center', - ...fontStyles.bold, - }, - baseText: { - fontSize: 16, - color: colors.fontPrimary, - textAlign: 'center', - ...fontStyles.normal, - }, - successText: { - marginBottom: 32, - }, - hintText: { - marginBottom: 26, - color: colors.blue, - }, - learnText: { - color: colors.blue, - }, - recoverText: { - marginBottom: 26, - }, - emoji: { - textAlign: 'center', - fontSize: 65, - marginBottom: 16, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + mainWrapper: { + backgroundColor: colors.background.default, + flex: 1, + }, + actionView: { + paddingTop: 40, + }, + wrapper: { + flex: 1, + paddingHorizontal: 50, + }, + onBoardingWrapper: { + paddingHorizontal: 20, + }, + congratulations: { + fontSize: Device.isMediumDevice() ? 28 : 32, + marginBottom: 12, + color: colors.text.default, + justifyContent: 'center', + textAlign: 'center', + ...fontStyles.bold, + }, + baseText: { + fontSize: 16, + color: colors.text.default, + textAlign: 'center', + ...fontStyles.normal, + }, + successText: { + marginBottom: 32, + }, + hintText: { + marginBottom: 26, + color: colors.primary.default, + }, + learnText: { + color: colors.primary.default, + }, + recoverText: { + marginBottom: 26, + }, + emoji: { + textAlign: 'center', + fontSize: 65, + marginBottom: 16, + }, + }); const hardwareBackPress = () => ({}); const HARDWARE_BACK_PRESS = 'hardwareBackPress'; @@ -199,6 +200,9 @@ class ManualBackupStep3 extends PureComponent { }; render() { + const { colors } = this.context; + const styles = createStyles(colors); + return ( diff --git a/app/components/Views/Onboarding/index.js b/app/components/Views/Onboarding/index.js index d7d83f37d87..c378a47fb86 100644 --- a/app/components/Views/Onboarding/index.js +++ b/app/components/Views/Onboarding/index.js @@ -13,7 +13,7 @@ import { } from 'react-native'; import AsyncStorage from '@react-native-community/async-storage'; import StyledButton from '../../UI/StyledButton'; -import { colors, fontStyles, baseStyles } from '../../../styles/common'; +import { fontStyles, baseStyles } from '../../../styles/common'; import OnboardingScreenWithBg from '../../UI/OnboardingScreenWithBg'; import { strings } from '../../../../locales/i18n'; import Button from 'react-native-button'; @@ -41,92 +41,93 @@ import { ThemeContext } from '../../../util/theme'; const PUB_KEY = process.env.MM_PUBNUB_PUB_KEY; -const styles = StyleSheet.create({ - scroll: { - flex: 1, - }, - wrapper: { - flex: 1, - alignItems: 'center', - paddingVertical: 30, - }, - foxWrapper: { - width: Device.isIos() ? 90 : 45, - height: Device.isIos() ? 90 : 45, - marginVertical: 20, - }, - image: { - alignSelf: 'center', - width: Device.isIos() ? 90 : 45, - height: Device.isIos() ? 90 : 45, - }, - termsAndConditions: { - paddingBottom: 30, - }, - title: { - fontSize: 24, - color: colors.fontPrimary, - ...fontStyles.bold, - textAlign: 'center', - }, - ctas: { - flex: 1, - position: 'relative', - }, - footer: { - marginTop: -20, - marginBottom: 20, - }, - login: { - fontSize: 18, - color: colors.blue, - ...fontStyles.normal, - }, - buttonDescription: { - ...fontStyles.normal, - fontSize: 14, - textAlign: 'center', - marginBottom: 16, - color: colors.fontPrimary, - lineHeight: 20, - }, - importWrapper: { - marginVertical: 24, - }, - createWrapper: { - flex: 1, - justifyContent: 'flex-end', - marginBottom: 24, - }, - buttonWrapper: { - marginBottom: 16, - }, - loader: { - marginTop: 180, - justifyContent: 'center', - textAlign: 'center', - }, - loadingText: { - marginTop: 30, - fontSize: 14, - textAlign: 'center', - color: colors.fontPrimary, - ...fontStyles.normal, - }, - modalTypeView: { - position: 'absolute', - bottom: 0, - paddingBottom: Device.isIphoneX() ? 20 : 10, - left: 0, - right: 0, - backgroundColor: colors.transparent, - }, - notificationContainer: { - flex: 0.1, - flexDirection: 'row', - alignItems: 'flex-end', - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + scroll: { + flex: 1, + }, + wrapper: { + flex: 1, + alignItems: 'center', + paddingVertical: 30, + }, + foxWrapper: { + width: Device.isIos() ? 90 : 45, + height: Device.isIos() ? 90 : 45, + marginVertical: 20, + }, + image: { + alignSelf: 'center', + width: Device.isIos() ? 90 : 45, + height: Device.isIos() ? 90 : 45, + }, + termsAndConditions: { + paddingBottom: 30, + }, + title: { + fontSize: 24, + color: colors.text.default, + ...fontStyles.bold, + textAlign: 'center', + }, + ctas: { + flex: 1, + position: 'relative', + }, + footer: { + marginTop: -20, + marginBottom: 20, + }, + login: { + fontSize: 18, + color: colors.primary.default, + ...fontStyles.normal, + }, + buttonDescription: { + ...fontStyles.normal, + fontSize: 14, + textAlign: 'center', + marginBottom: 16, + color: colors.text.default, + lineHeight: 20, + }, + importWrapper: { + marginVertical: 24, + }, + createWrapper: { + flex: 1, + justifyContent: 'flex-end', + marginBottom: 24, + }, + buttonWrapper: { + marginBottom: 16, + }, + loader: { + marginTop: 180, + justifyContent: 'center', + textAlign: 'center', + }, + loadingText: { + marginTop: 30, + fontSize: 14, + textAlign: 'center', + color: colors.text.default, + ...fontStyles.normal, + }, + modalTypeView: { + position: 'absolute', + bottom: 0, + paddingBottom: Device.isIphoneX() ? 20 : 10, + left: 0, + right: 0, + backgroundColor: colors.transparent, + }, + notificationContainer: { + flex: 0.1, + flexDirection: 'row', + alignItems: 'flex-end', + }, + }); /** * View that is displayed to first time (new) users @@ -379,16 +380,24 @@ class Onboarding extends PureComponent { this.setState({ warningModalVisible: !warningModalVisible }); }; - renderLoader = () => ( - - - - {this.props.loadingMsg} + renderLoader = () => { + const { colors } = this.context; + const styles = createStyles(colors); + + return ( + + + + {this.props.loadingMsg} + - - ); + ); + }; renderContent() { + const { colors } = this.context; + const styles = createStyles(colors); + return ( @@ -421,12 +430,7 @@ class Onboarding extends PureComponent { )} - + {strings('onboarding.start_exploring_now')} @@ -436,6 +440,9 @@ class Onboarding extends PureComponent { } handleSimpleNotification = () => { + const { colors } = this.context; + const styles = createStyles(colors); + if (!this.props.route.params?.delete) return; return ( From b54c9aaebd0ea54b6b5999c2b16837bb9fd9edba Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Wed, 9 Feb 2022 23:55:49 -0800 Subject: [PATCH 20/77] Update general with theme colors --- .eslintrc.js | 2 +- app/components/UI/Navbar/index.js | 26 +- app/components/UI/SelectComponent/index.js | 247 ++++++++++-------- app/components/UI/SettingsDrawer/index.js | 141 +++++----- app/components/Views/PickComponent/index.js | 82 +++--- .../Views/Settings/GeneralSettings/index.js | 165 ++++++------ app/components/Views/Settings/index.js | 21 +- 7 files changed, 364 insertions(+), 320 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 3abaf112e37..68200c09a3c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -119,7 +119,7 @@ module.exports = { 'eslint-comments/no-unused-disable': 0, 'react-native/no-color-literals': 2, 'react-native/no-inline-styles': 2, - 'react-native/no-unused-styles': 2, + 'react-native/no-unused-styles': 0, 'react-native/split-platform-components': 2, 'react/jsx-boolean-value': 2, 'react/jsx-key': 1, diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index e591bbbd31f..fcac49fe6e7 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -162,14 +162,14 @@ export function getNavigationOptionsTitle(title, navigation, isFullScreenModal, const innerStyles = StyleSheet.create({ headerTitleStyle: { fontSize: 20, - color: themeColors.textDefault, + color: themeColors.text.default, ...fontStyles.normal, }, headerIcon: { - color: themeColors.primary, + color: themeColors.primary.default, }, headerStyle: { - backgroundColor: themeColors.backgroundDefault, + backgroundColor: themeColors.background.default, }, }); function navigationPop() { @@ -178,7 +178,7 @@ export function getNavigationOptionsTitle(title, navigation, isFullScreenModal, return { title, headerTitleStyle: innerStyles.headerTitleStyle, - headerTintColor: themeColors.primary, + headerTintColor: themeColors.primary.default, headerRight: () => isFullScreenModal ? ( @@ -211,19 +211,19 @@ export function getEditableOptions(title, navigation, route, themeColors) { const innerStyles = StyleSheet.create({ headerTitleStyle: { fontSize: 20, - color: themeColors.textDefault, + color: themeColors.text.default, ...fontStyles.normal, }, headerIcon: { - color: themeColors.primary, + color: themeColors.primary.default, }, headerButtonText: { - color: themeColors.primary, + color: themeColors.primary.default, fontSize: 14, ...fontStyles.normal, }, headerStyle: { - backgroundColor: themeColors.backgroundDefault, + backgroundColor: themeColors.background.default, }, }); function navigationPop() { @@ -235,7 +235,7 @@ export function getEditableOptions(title, navigation, route, themeColors) { return { title, headerTitleStyle: innerStyles.headerTitleStyle, - headerTintColor: themeColors.primary, + headerTintColor: themeColors.primary.default, headerLeft: () => ( + StyleSheet.create({ + dropdown: { + flexDirection: 'row', + }, + iconDropdown: { + marginTop: 7, + height: 25, + justifyContent: 'flex-end', + textAlign: 'right', + marginRight: 10, + }, + selectedOption: { + flex: 1, + alignSelf: 'flex-start', + color: colors.text.default, + fontSize: 14, + paddingHorizontal: 15, + paddingTop: 10, + paddingBottom: 10, + ...fontStyles.normal, + }, + accesoryBar: { + width: '100%', + paddingTop: 5, + height: 50, + borderBottomColor: colors.grey100, + borderBottomWidth: 1, + }, + label: { + textAlign: 'center', + flex: 1, + paddingVertical: 10, + fontSize: 17, + ...fontStyles.bold, + color: colors.text.default, + }, + modal: { + margin: 0, + width: '100%', + padding: 60, + }, + modalView: { + backgroundColor: colors.background.default, + justifyContent: 'center', + alignItems: 'center', + borderRadius: 10, + }, + list: { + width: '100%', + }, + optionButton: { + paddingHorizontal: 15, + paddingVertical: 5, + flexDirection: 'row', + height: ROW_HEIGHT, + }, + optionLabel: { + paddingVertical: 10, + flex: 1, + fontSize: 14, + ...fontStyles.normal, + color: colors.text.default, + }, + icon: { + paddingHorizontal: 10, + marginTop: 5, + }, + listWrapper: { + flex: 1, + paddingBottom: 10, + }, + }); export default class SelectComponent extends PureComponent { static propTypes = { @@ -168,52 +172,69 @@ export default class SelectComponent extends PureComponent { ); - renderIOS = () => ( - - - - - {this.getSelectedValue()} - - - - - - - - {this.props.label} + renderIOS = () => { + const { colors } = this.context; + const styles = createStyles(colors); + + return ( + + + + + {this.getSelectedValue()} + + - - - {this.props.options.map((option) => ( - this.onValueChange(option.value)} - style={styles.optionButton} - key={option.key} - > - - {option.label} - - {this.props.selectedValue === option.value ? ( - - ) : null} - - ))} + + + + + {this.props.label} - - - - - ); + + + {this.props.options.map((option) => ( + this.onValueChange(option.value)} + style={styles.optionButton} + key={option.key} + > + + {option.label} + + {this.props.selectedValue === option.value ? ( + + ) : null} + + ))} + + + + + + ); + }; render = () => ( {Device.isAndroid() ? this.renderAndroid() : this.renderIOS()} ); } + +SelectComponent.contextType = ThemeContext; diff --git a/app/components/UI/SettingsDrawer/index.js b/app/components/UI/SettingsDrawer/index.js index 8159af70d05..cd3e96d9ce8 100644 --- a/app/components/UI/SettingsDrawer/index.js +++ b/app/components/UI/SettingsDrawer/index.js @@ -1,59 +1,61 @@ import React from 'react'; import { Text, View, StyleSheet, TouchableOpacity } from 'react-native'; import PropTypes from 'prop-types'; -import { colors, fontStyles } from '../../../styles/common'; +import { fontStyles } from '../../../styles/common'; import Icon from 'react-native-vector-icons/FontAwesome'; import SettingsNotification from '../SettingsNotification'; import { strings } from '../../../../locales/i18n'; +import { useAppThemeFromContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - root: { - backgroundColor: colors.white, - borderBottomColor: colors.grey000, - borderBottomWidth: 1, - flexDirection: 'row', - minHeight: 100, - paddingVertical: 18, - }, - content: { - flex: 1, - }, - title: { - ...fontStyles.normal, - color: colors.fontPrimary, - fontSize: 20, - marginBottom: 8, - }, - description: { - ...fontStyles.normal, - color: colors.grey500, - fontSize: 14, - lineHeight: 20, - paddingRight: 8, - }, - action: { - flex: 0, - paddingHorizontal: 16, - }, - icon: { - bottom: 8, - color: colors.grey400, - left: 4, - position: 'relative', - }, - noBorder: { - borderBottomWidth: 0, - }, - warning: { - alignSelf: 'flex-start', - marginTop: 20, - }, - menuItemWarningText: { - color: colors.red, - fontSize: 12, - ...fontStyles.normal, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + root: { + backgroundColor: colors.background.default, + borderBottomColor: colors.border.muted, + borderBottomWidth: 1, + flexDirection: 'row', + minHeight: 100, + paddingVertical: 18, + }, + content: { + flex: 1, + }, + title: { + ...fontStyles.normal, + color: colors.text.default, + fontSize: 20, + marginBottom: 8, + }, + description: { + ...fontStyles.normal, + color: colors.text.alternative, + fontSize: 14, + lineHeight: 20, + paddingRight: 8, + }, + action: { + flex: 0, + paddingHorizontal: 16, + }, + icon: { + bottom: 8, + color: colors.text.alternative, + left: 4, + position: 'relative', + }, + noBorder: { + borderBottomWidth: 0, + }, + warning: { + alignSelf: 'flex-start', + marginTop: 20, + }, + menuItemWarningText: { + color: colors.error.default, + fontSize: 12, + ...fontStyles.normal, + }, + }); const propTypes = { title: PropTypes.string, @@ -79,26 +81,31 @@ const defaultProps = { onPress: undefined, }; -const SettingsDrawer = ({ title, description, noBorder, onPress, warning }) => ( - - - - {title} - {description} - - {warning ? ( - - {strings('drawer.settings_warning')} - - ) : null} +const SettingsDrawer = ({ title, description, noBorder, onPress, warning }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ( + + + + {title} + {description} + + {warning ? ( + + {strings('drawer.settings_warning')} + + ) : null} + + + + - - - - - -); + + ); +}; SettingsDrawer.propTypes = propTypes; SettingsDrawer.defaultProps = defaultProps; diff --git a/app/components/Views/PickComponent/index.js b/app/components/Views/PickComponent/index.js index 6590246fc00..af2af8f67a4 100644 --- a/app/components/Views/PickComponent/index.js +++ b/app/components/Views/PickComponent/index.js @@ -1,44 +1,47 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; import { StyleSheet, View, Text, TouchableOpacity } from 'react-native'; -import { baseStyles, colors, fontStyles } from '../../../styles/common'; +import { baseStyles, fontStyles } from '../../../styles/common'; +import { ThemeContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - root: { - ...baseStyles.flexGrow, - flexDirection: 'row', - }, - circle: { - width: 12, - height: 12, - borderRadius: 12 / 2, - backgroundColor: colors.white, - opacity: 1, - margin: 2, - borderWidth: 2, - borderColor: colors.grey300, - marginRight: 6, - }, - option: { - flex: 1, - }, - touchableOption: { - flex: 1, - flexDirection: 'row', - }, - optionText: { - ...fontStyles.normal, - }, - selectedCircle: { - width: 12, - height: 12, - borderRadius: 12 / 2, - backgroundColor: colors.blue, - opacity: 1, - margin: 2, - marginRight: 6, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + root: { + ...baseStyles.flexGrow, + flexDirection: 'row', + }, + circle: { + width: 12, + height: 12, + borderRadius: 12 / 2, + backgroundColor: colors.background.default, + opacity: 1, + margin: 2, + borderWidth: 2, + borderColor: colors.border.default, + marginRight: 6, + }, + option: { + flex: 1, + }, + touchableOption: { + flex: 1, + flexDirection: 'row', + }, + optionText: { + ...fontStyles.normal, + color: colors.text.default, + }, + selectedCircle: { + width: 12, + height: 12, + borderRadius: 12 / 2, + backgroundColor: colors.primary.default, + opacity: 1, + margin: 2, + marginRight: 6, + }, + }); /** * Componets that allows to select clicking two options @@ -83,6 +86,9 @@ export default class PickComponent extends PureComponent { render = () => { const { selectedValue, valueFirst, valueSecond, textFirst, textSecond } = this.props; + const { colors } = this.context; + const styles = createStyles(colors); + return ( @@ -101,3 +107,5 @@ export default class PickComponent extends PureComponent { ); }; } + +PickComponent.contextType = ThemeContext; diff --git a/app/components/Views/Settings/GeneralSettings/index.js b/app/components/Views/Settings/GeneralSettings/index.js index 6539c85e8a0..c5f336a5e36 100644 --- a/app/components/Views/Settings/GeneralSettings/index.js +++ b/app/components/Views/Settings/GeneralSettings/index.js @@ -7,7 +7,7 @@ import Engine from '../../../../core/Engine'; import I18n, { strings, getLanguages, setLocale } from '../../../../../locales/i18n'; import SelectComponent from '../../../UI/SelectComponent'; import infuraCurrencies from '../../../../util/infura-conversion.json'; -import { colors, fontStyles } from '../../../../styles/common'; +import { fontStyles } from '../../../../styles/common'; import { getNavigationOptionsTitle } from '../../../UI/Navbar'; import { setSearchEngine, @@ -34,84 +34,86 @@ const infuraCurrencyOptions = sortedCurrencies.map(({ quote: { code, name } }) = value: code, })); -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - flex: 1, - padding: 24, - zIndex: 99999999999999, - }, - title: { - ...fontStyles.normal, - color: colors.fontPrimary, - fontSize: 20, - lineHeight: 20, - }, - desc: { - ...fontStyles.normal, - color: colors.grey500, - fontSize: 14, - lineHeight: 20, - marginTop: 12, - }, - marginTop: { - marginTop: 18, - }, - picker: { - borderColor: colors.grey200, - borderRadius: 5, - borderWidth: 2, - marginTop: 16, - }, - simplePicker: { - marginTop: 16, - }, - setting: { - marginTop: 50, - }, - firstSetting: { - marginTop: 0, - }, - inner: { - paddingBottom: 48, - }, - identicon_container: { - marginVertical: 16, - display: 'flex', - flexDirection: 'row', - }, - identicon_row: { - width: '50%', - alignItems: 'center', - flexDirection: 'row', - }, - identicon_type: { - ...fontStyles.bold, - fontSize: 14, - marginHorizontal: 10, - }, - blockie: { - height: diameter, - width: diameter, - borderRadius: diameter / 2, - }, - border: { - height: diameter + spacing, - width: diameter + spacing, - borderRadius: (diameter + spacing) / 2, - backgroundColor: colors.white, - borderWidth: 2, - borderColor: colors.white, - alignItems: 'center', - justifyContent: 'center', - }, - selected: { - borderColor: colors.blue, - }, - selected_text: { - color: colors.black, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + padding: 24, + zIndex: 99999999999999, + }, + title: { + ...fontStyles.normal, + color: colors.text.default, + fontSize: 20, + lineHeight: 20, + }, + desc: { + ...fontStyles.normal, + color: colors.text.alternative, + fontSize: 14, + lineHeight: 20, + marginTop: 12, + }, + marginTop: { + marginTop: 18, + }, + picker: { + borderColor: colors.border.default, + borderRadius: 5, + borderWidth: 2, + marginTop: 16, + }, + simplePicker: { + marginTop: 16, + }, + setting: { + marginTop: 50, + }, + firstSetting: { + marginTop: 0, + }, + inner: { + paddingBottom: 48, + }, + identicon_container: { + marginVertical: 16, + display: 'flex', + flexDirection: 'row', + }, + identicon_row: { + width: '50%', + alignItems: 'center', + flexDirection: 'row', + }, + identicon_type: { + ...fontStyles.bold, + fontSize: 14, + marginHorizontal: 10, + color: colors.text.default, + }, + blockie: { + height: diameter, + width: diameter, + borderRadius: diameter / 2, + }, + border: { + height: diameter + spacing, + width: diameter + spacing, + borderRadius: (diameter + spacing) / 2, + backgroundColor: colors.background.default, + borderWidth: 2, + borderColor: colors.background.default, + alignItems: 'center', + justifyContent: 'center', + }, + selected: { + borderColor: colors.primary.default, + }, + selected_text: { + color: colors.text.default, + }, + }); /** * Main view for general app configurations @@ -229,6 +231,9 @@ class Settings extends PureComponent { selectedAddress, hideZeroBalanceTokens, } = this.props; + const { colors } = this.context; + const styles = createStyles(colors); + return ( @@ -295,7 +300,7 @@ class Settings extends PureComponent { diff --git a/app/components/Views/Settings/index.js b/app/components/Views/Settings/index.js index d96ba97ccb5..22849834dcd 100644 --- a/app/components/Views/Settings/index.js +++ b/app/components/Views/Settings/index.js @@ -2,7 +2,6 @@ import PropTypes from 'prop-types'; import React, { PureComponent } from 'react'; import { StyleSheet, ScrollView, InteractionManager } from 'react-native'; import SettingsDrawer from '../../UI/SettingsDrawer'; -import { colors } from '../../../styles/common'; import { getClosableNavigationOptions } from '../../UI/Navbar'; import { strings } from '../../../../locales/i18n'; import Analytics from '../../../core/Analytics'; @@ -10,14 +9,15 @@ import { ANALYTICS_EVENT_OPTS } from '../../../util/analytics'; import { connect } from 'react-redux'; import { ThemeContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - flex: 1, - paddingLeft: 18, - zIndex: 99999999999999, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + paddingLeft: 18, + zIndex: 99999999999999, + }, + }); /** * Main view for app configurations @@ -88,6 +88,9 @@ class Settings extends PureComponent { render = () => { const { seedphraseBackedUp } = this.props; + const { colors } = this.context; + const styles = createStyles(colors); + return ( Date: Thu, 10 Feb 2022 00:03:11 -0800 Subject: [PATCH 21/77] Update privacy with theme colors --- app/components/UI/SelectComponent/index.js | 2 +- .../Views/Settings/SecuritySettings/index.js | 250 ++++++++++-------- 2 files changed, 137 insertions(+), 115 deletions(-) diff --git a/app/components/UI/SelectComponent/index.js b/app/components/UI/SelectComponent/index.js index fa17f971833..f6c60f20cdd 100644 --- a/app/components/UI/SelectComponent/index.js +++ b/app/components/UI/SelectComponent/index.js @@ -38,7 +38,7 @@ const createStyles = (colors) => width: '100%', paddingTop: 5, height: 50, - borderBottomColor: colors.grey100, + borderBottomColor: colors.border.muted, borderBottomWidth: 1, }, label: { diff --git a/app/components/Views/Settings/SecuritySettings/index.js b/app/components/Views/Settings/SecuritySettings/index.js index 54e20a61349..1354a59b6c0 100644 --- a/app/components/Views/Settings/SecuritySettings/index.js +++ b/app/components/Views/Settings/SecuritySettings/index.js @@ -22,7 +22,7 @@ import StyledButton from '../../../UI/StyledButton'; import SettingsNotification from '../../../UI/SettingsNotification'; import { clearHistory } from '../../../../actions/browser'; import { clearHosts, setPrivacyMode, setThirdPartyApiMode } from '../../../../actions/privacy'; -import { colors, fontStyles } from '../../../../styles/common'; +import { fontStyles } from '../../../../styles/common'; import Logger from '../../../../util/Logger'; import Device from '../../../../util/device'; import { getNavigationOptionsTitle } from '../../../UI/Navbar'; @@ -47,117 +47,127 @@ import Icon from 'react-native-vector-icons/FontAwesome'; import HintModal from '../../../UI/HintModal'; import AnalyticsV2, { trackErrorAsAnalytics } from '../../../../util/analyticsV2'; import SeedPhraseVideo from '../../../UI/SeedPhraseVideo'; -import { ThemeContext } from '../../../../util/theme'; +import { ThemeContext, useAppThemeFromContext } from '../../../../util/theme'; const isIos = Device.isIos(); -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - flex: 1, - padding: 24, - paddingBottom: 48, - }, - title: { - ...fontStyles.normal, - color: colors.fontPrimary, - fontSize: 20, - lineHeight: 20, - }, - bump: { - marginBottom: 10, - }, - heading: { - fontSize: 24, - lineHeight: 30, - marginBottom: 24, - }, - desc: { - ...fontStyles.normal, - color: colors.grey500, - fontSize: 14, - lineHeight: 20, - marginTop: 12, - }, - switchElement: { - marginTop: 18, - }, - setting: { - marginTop: 50, - }, - firstSetting: { - marginTop: 0, - }, - modalView: { - alignItems: 'center', - flex: 1, - flexDirection: 'column', - justifyContent: 'center', - padding: 20, - }, - modalText: { - ...fontStyles.normal, - fontSize: 18, - textAlign: 'center', - }, - modalTitle: { - ...fontStyles.bold, - fontSize: 22, - textAlign: 'center', - marginBottom: 20, - }, - confirm: { - marginTop: 18, - }, - protect: { - flexDirection: 'row', - justifyContent: 'space-between', - }, - col: { - width: '48%', - }, - inner: { - paddingBottom: 112, - }, - picker: { - borderColor: colors.grey200, - borderRadius: 5, - borderWidth: 2, - marginTop: 16, - }, - loader: { - flex: 1, - alignItems: 'center', - justifyContent: 'center', - }, - warningText: { - color: colors.black, - fontSize: 12, - flex: 1, - ...fontStyles.normal, - }, - warningTextRed: { - color: colors.red, - }, - warningTextGreen: { - color: colors.black, - }, - warningBold: { - ...fontStyles.bold, - color: colors.blue, - }, - viewHint: { - padding: 5, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + padding: 24, + paddingBottom: 48, + }, + title: { + ...fontStyles.normal, + color: colors.text.default, + fontSize: 20, + lineHeight: 20, + }, + bump: { + marginBottom: 10, + }, + heading: { + fontSize: 24, + lineHeight: 30, + marginBottom: 24, + }, + desc: { + ...fontStyles.normal, + color: colors.text.alternative, + fontSize: 14, + lineHeight: 20, + marginTop: 12, + }, + switchElement: { + marginTop: 18, + }, + setting: { + marginTop: 50, + }, + firstSetting: { + marginTop: 0, + }, + modalView: { + alignItems: 'center', + flex: 1, + flexDirection: 'column', + justifyContent: 'center', + padding: 20, + }, + modalText: { + ...fontStyles.normal, + fontSize: 18, + textAlign: 'center', + }, + modalTitle: { + ...fontStyles.bold, + fontSize: 22, + textAlign: 'center', + marginBottom: 20, + }, + confirm: { + marginTop: 18, + }, + protect: { + flexDirection: 'row', + justifyContent: 'space-between', + }, + col: { + width: '48%', + }, + inner: { + paddingBottom: 112, + }, + picker: { + borderColor: colors.border.default, + borderRadius: 5, + borderWidth: 2, + marginTop: 16, + }, + loader: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + }, + warningText: { + color: colors.text.default, + fontSize: 12, + flex: 1, + ...fontStyles.normal, + }, + warningTextRed: { + color: colors.error.default, + }, + warningTextGreen: { + color: colors.text.default, + }, + warningBold: { + ...fontStyles.bold, + color: colors.primary.default, + }, + viewHint: { + padding: 5, + }, + }); -const Heading = ({ children, first }) => ( - - {children} - -); +const Heading = ({ children, first }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ( + + {children} + + ); +}; -const WarningIcon = () => ; +const WarningIcon = () => { + const { colors } = useAppThemeFromContext(); + + return ; +}; Heading.propTypes = { children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]), @@ -598,6 +608,8 @@ class Settings extends PureComponent { } = this.state; const { accounts, identities, selectedAddress } = this.props; const account = { address: selectedAddress, ...identities[selectedAddress], ...accounts[selectedAddress] }; + const { colors } = this.context; + const styles = createStyles(colors); if (loading) return ( @@ -703,7 +715,7 @@ class Settings extends PureComponent { @@ -720,7 +732,7 @@ class Settings extends PureComponent { @@ -782,7 +794,9 @@ class Settings extends PureComponent { @@ -794,7 +808,9 @@ class Settings extends PureComponent { @@ -807,7 +823,9 @@ class Settings extends PureComponent { @@ -867,7 +885,9 @@ class Settings extends PureComponent { value={openSeaEnabled} onValueChange={this.toggleOpenSeaApi} trackColor={ - Device.isIos() ? { true: colors.blue, false: colors.grey000 } : null + Device.isIos() + ? { true: colors.primary.default, false: colors.grey000 } + : null } ios_backgroundColor={colors.grey000} /> @@ -881,7 +901,9 @@ class Settings extends PureComponent { value={useCollectibleDetection} onValueChange={this.toggleNftAutodetect} trackColor={ - Device.isIos() ? { true: colors.blue, false: colors.grey000 } : null + Device.isIos() + ? { true: colors.primary.default, false: colors.grey000 } + : null } ios_backgroundColor={colors.grey000} disabled={!openSeaEnabled} From a41e20a03c9afe60da9b11ee8322217dae623102 Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Thu, 10 Feb 2022 00:14:42 -0800 Subject: [PATCH 22/77] Update advanced with theme colors --- .../Views/Settings/AdvancedSettings/index.js | 134 +++++++++--------- 1 file changed, 69 insertions(+), 65 deletions(-) diff --git a/app/components/Views/Settings/AdvancedSettings/index.js b/app/components/Views/Settings/AdvancedSettings/index.js index 34886264c72..9cc37f57e7a 100644 --- a/app/components/Views/Settings/AdvancedSettings/index.js +++ b/app/components/Views/Settings/AdvancedSettings/index.js @@ -6,7 +6,7 @@ import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view import ActionModal from '../../../UI/ActionModal'; import Engine from '../../../../core/Engine'; import StyledButton from '../../../UI/StyledButton'; -import { colors, fontStyles, baseStyles } from '../../../../styles/common'; +import { fontStyles, baseStyles } from '../../../../styles/common'; import { getNavigationOptionsTitle } from '../../../UI/Navbar'; import { setShowCustomNonce, setShowHexData } from '../../../../actions/settings'; import { strings } from '../../../../../locales/i18n'; @@ -25,70 +25,71 @@ import { ThemeContext } from '../../../../util/theme'; const HASH_TO_TEST = 'Qmaisz6NMhDB51cCvNWa1GMS7LU1pAxdF4Ld6Ft9kZEP2a'; const HASH_STRING = 'Hello from IPFS Gateway Checker'; -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - flex: 1, - padding: 24, - paddingBottom: 48, - }, - title: { - ...fontStyles.normal, - color: colors.fontPrimary, - fontSize: 20, - lineHeight: 20, - }, - desc: { - ...fontStyles.normal, - color: colors.grey500, - fontSize: 14, - lineHeight: 20, - marginTop: 12, - }, - marginTop: { - marginTop: 18, - }, - setting: { - marginTop: 50, - }, - firstSetting: { - marginTop: 0, - }, - modalView: { - alignItems: 'center', - flex: 1, - flexDirection: 'column', - justifyContent: 'center', - padding: 20, - }, - modalText: { - ...fontStyles.normal, - fontSize: 16, - textAlign: 'center', - color: colors.black, - }, - modalTitle: { - ...fontStyles.bold, - fontSize: 24, - textAlign: 'center', - marginBottom: 20, - color: colors.black, - }, - picker: { - borderColor: colors.grey200, - borderRadius: 5, - borderWidth: 2, - marginTop: 16, - }, - inner: { - paddingBottom: 48, - }, - ipfsGatewayLoadingWrapper: { - height: 37, - alignItems: 'center', - justifyContent: 'center', - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + padding: 24, + paddingBottom: 48, + }, + title: { + ...fontStyles.normal, + color: colors.text.default, + fontSize: 20, + lineHeight: 20, + }, + desc: { + ...fontStyles.normal, + color: colors.text.alternative, + fontSize: 14, + lineHeight: 20, + marginTop: 12, + }, + marginTop: { + marginTop: 18, + }, + setting: { + marginTop: 50, + }, + firstSetting: { + marginTop: 0, + }, + modalView: { + alignItems: 'center', + flex: 1, + flexDirection: 'column', + justifyContent: 'center', + padding: 20, + }, + modalText: { + ...fontStyles.normal, + fontSize: 16, + textAlign: 'center', + color: colors.text.default, + }, + modalTitle: { + ...fontStyles.bold, + fontSize: 24, + textAlign: 'center', + marginBottom: 20, + color: colors.text.default, + }, + picker: { + borderColor: colors.border.default, + borderRadius: 5, + borderWidth: 2, + marginTop: 16, + }, + inner: { + paddingBottom: 48, + }, + ipfsGatewayLoadingWrapper: { + height: 37, + alignItems: 'center', + justifyContent: 'center', + }, + }); /** * Main view for app configurations @@ -244,6 +245,9 @@ class AdvancedSettings extends PureComponent { render = () => { const { showHexData, showCustomNonce, setShowHexData, setShowCustomNonce, ipfsGateway } = this.props; const { resetModalVisible, onlineIpfsGateways } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + return ( From ae8baca19fc820dc861882b262f7b37f548623ae Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Thu, 10 Feb 2022 00:25:02 -0800 Subject: [PATCH 23/77] Add dark mode to contacts --- .../Views/SendFlow/AddressList/index.js | 109 +++++++----- .../Settings/Contacts/ContactForm/index.js | 159 ++++++++++-------- .../Views/Settings/Contacts/index.js | 25 +-- 3 files changed, 162 insertions(+), 131 deletions(-) diff --git a/app/components/Views/SendFlow/AddressList/index.js b/app/components/Views/SendFlow/AddressList/index.js index 7fc7483298f..665063323bc 100644 --- a/app/components/Views/SendFlow/AddressList/index.js +++ b/app/components/Views/SendFlow/AddressList/index.js @@ -1,58 +1,67 @@ import React, { PureComponent } from 'react'; import { StyleSheet, View, Text, TouchableOpacity, ScrollView } from 'react-native'; -import { colors, fontStyles } from '../../../../styles/common'; +import { fontStyles } from '../../../../styles/common'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import Fuse from 'fuse.js'; import { strings } from '../../../../../locales/i18n'; import AddressElement from '../AddressElement'; +import { ThemeContext, useAppThemeFromContext } from '../../../../util/theme'; -const styles = StyleSheet.create({ - root: { - flex: 1, - backgroundColor: colors.white, - }, - messageText: { - ...fontStyles.normal, - color: colors.blue, - fontSize: 16, - textAlign: 'center', - }, - messageLeft: { - textAlign: 'left', - }, - myAccountsWrapper: { - flexGrow: 1, - }, - myAccountsTouchable: { - borderBottomWidth: 1, - borderBottomColor: colors.grey050, - padding: 16, - }, - labelElementWrapper: { - backgroundColor: colors.grey000, - flexDirection: 'row', - alignItems: 'center', - borderBottomWidth: 1, - borderBottomColor: colors.grey050, - padding: 8, - }, - labelElementInitialText: { - textTransform: 'uppercase', - }, - labelElementText: { - ...fontStyles.normal, - fontSize: 12, - marginHorizontal: 8, - color: colors.grey600, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + root: { + flex: 1, + backgroundColor: colors.background.default, + }, + messageText: { + ...fontStyles.normal, + color: colors.primary.default, + fontSize: 16, + textAlign: 'center', + }, + messageLeft: { + textAlign: 'left', + }, + myAccountsWrapper: { + flexGrow: 1, + }, + myAccountsTouchable: { + borderBottomWidth: 1, + borderBottomColor: colors.grey050, + padding: 16, + }, + labelElementWrapper: { + backgroundColor: colors.grey000, + flexDirection: 'row', + alignItems: 'center', + borderBottomWidth: 1, + borderBottomColor: colors.grey050, + padding: 8, + }, + labelElementInitialText: { + textTransform: 'uppercase', + }, + labelElementText: { + ...fontStyles.normal, + fontSize: 12, + marginHorizontal: 8, + color: colors.text.alternative, + }, + }); + +const LabelElement = (label) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); -const LabelElement = (label) => ( - - 1 ? {} : styles.labelElementInitialText]}>{label} - -); + return ( + + 1 ? {} : styles.labelElementInitialText]}> + {label} + + + ); +}; /** * View that wraps the wraps the "Send" screen @@ -173,6 +182,9 @@ class AddressList extends PureComponent { renderMyAccounts = () => { const { identities, onAccountPress, inputSearch, onAccountLongPress } = this.props; const { myAccountsOpened } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + if (inputSearch) return; return !myAccountsOpened ? ( { const { contactElements } = this.state; const { onlyRenderAddressBook } = this.props; + const { colors } = this.context; + const styles = createStyles(colors); + return ( @@ -250,6 +265,8 @@ class AddressList extends PureComponent { }; } +AddressList.contextType = ThemeContext; + const mapStateToProps = (state) => ({ recents: state.recents, addressBook: state.engine.backgroundState.AddressBookController.addressBook, diff --git a/app/components/Views/Settings/Contacts/ContactForm/index.js b/app/components/Views/Settings/Contacts/ContactForm/index.js index 1553f31fa09..343b6172d46 100644 --- a/app/components/Views/Settings/Contacts/ContactForm/index.js +++ b/app/components/Views/Settings/Contacts/ContactForm/index.js @@ -1,6 +1,6 @@ import React, { PureComponent } from 'react'; import { Platform, SafeAreaView, StyleSheet, TextInput, View, Text, TouchableOpacity } from 'react-native'; -import { colors, fontStyles } from '../../../../../styles/common'; +import { fontStyles } from '../../../../../styles/common'; import PropTypes from 'prop-types'; import { getEditableOptions } from '../../../../UI/Navbar'; import StyledButton from '../../../../UI/StyledButton'; @@ -16,75 +16,78 @@ import AntIcon from 'react-native-vector-icons/AntDesign'; import ActionSheet from 'react-native-actionsheet'; import { ThemeContext } from '../../../../../util/theme'; -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - flex: 1, - flexDirection: 'column', - }, - scrollWrapper: { - flex: 1, - paddingVertical: 12, - }, - input: { - ...fontStyles.normal, - flex: 1, - fontSize: 12, - borderColor: colors.grey200, - borderRadius: 5, - borderWidth: 2, - padding: 10, - flexDirection: 'row', - alignItems: 'center', - }, - resolvedInput: { - ...fontStyles.normal, - fontSize: 10, - }, - informationWrapper: { - flex: 1, - paddingHorizontal: 24, - }, - label: { - fontSize: 14, - paddingVertical: 12, - color: colors.fontPrimary, - ...fontStyles.bold, - }, - buttonsWrapper: { - marginVertical: 12, - flexDirection: 'row', - alignSelf: 'flex-end', - }, - buttonsContainer: { - flex: 1, - flexDirection: 'column', - alignSelf: 'flex-end', - }, - scanIcon: { - flexDirection: 'column', - alignItems: 'center', - }, - iconWrapper: { - alignItems: 'flex-end', - }, - textInput: { - ...fontStyles.normal, - padding: 0, - paddingRight: 8, - color: colors.black, - }, - inputWrapper: { - flex: 1, - flexDirection: 'column', - }, - textInputDisaled: { - borderColor: colors.transparent, - }, - actionButton: { - marginVertical: 4, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + flexDirection: 'column', + }, + scrollWrapper: { + flex: 1, + paddingVertical: 12, + }, + input: { + ...fontStyles.normal, + flex: 1, + fontSize: 12, + borderColor: colors.border.default, + borderRadius: 5, + borderWidth: 2, + padding: 10, + flexDirection: 'row', + alignItems: 'center', + color: colors.text.default, + }, + resolvedInput: { + ...fontStyles.normal, + fontSize: 10, + color: colors.text.default, + }, + informationWrapper: { + flex: 1, + paddingHorizontal: 24, + }, + label: { + fontSize: 14, + paddingVertical: 12, + color: colors.text.default, + ...fontStyles.bold, + }, + buttonsWrapper: { + marginVertical: 12, + flexDirection: 'row', + alignSelf: 'flex-end', + }, + buttonsContainer: { + flex: 1, + flexDirection: 'column', + alignSelf: 'flex-end', + }, + scanIcon: { + flexDirection: 'column', + alignItems: 'center', + }, + iconWrapper: { + alignItems: 'flex-end', + }, + textInput: { + ...fontStyles.normal, + padding: 0, + paddingRight: 8, + color: colors.text.default, + }, + inputWrapper: { + flex: 1, + flexDirection: 'column', + }, + textInputDisaled: { + borderColor: colors.transparent, + }, + actionButton: { + marginVertical: 4, + }, + }); const ADD = 'add'; const EDIT = 'edit'; @@ -271,6 +274,9 @@ class ContactForm extends PureComponent { render = () => { const { address, addressError, toEnsName, name, mode, addressReady, memo, editable, inputWidth } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + return ( @@ -282,7 +288,7 @@ class ContactForm extends PureComponent { autoCorrect={false} onChangeText={this.onChangeName} placeholder={strings('address_book.nickname')} - placeholderTextColor={colors.grey100} + placeholderTextColor={colors.text.muted} spellCheck={false} numberOfLines={1} style={[ @@ -304,7 +310,7 @@ class ContactForm extends PureComponent { autoCorrect={false} onChangeText={this.onChangeAddress} placeholder={strings('address_book.add_input_placeholder')} - placeholderTextColor={colors.grey100} + placeholderTextColor={colors.text.muted} spellCheck={false} numberOfLines={1} style={[styles.textInput, inputWidth ? { width: inputWidth } : {}]} @@ -318,7 +324,12 @@ class ContactForm extends PureComponent { {editable && ( - + )} @@ -333,7 +344,7 @@ class ContactForm extends PureComponent { autoCorrect={false} onChangeText={this.onChangeMemo} placeholder={strings('address_book.memo')} - placeholderTextColor={colors.grey100} + placeholderTextColor={colors.text.muted} spellCheck={false} numberOfLines={1} style={[styles.textInput, inputWidth ? { width: inputWidth } : {}]} diff --git a/app/components/Views/Settings/Contacts/index.js b/app/components/Views/Settings/Contacts/index.js index d44dbb91109..535558da5aa 100644 --- a/app/components/Views/Settings/Contacts/index.js +++ b/app/components/Views/Settings/Contacts/index.js @@ -1,6 +1,5 @@ import React, { PureComponent } from 'react'; import { SafeAreaView, StyleSheet } from 'react-native'; -import { colors } from '../../../../styles/common'; import PropTypes from 'prop-types'; import { strings } from '../../../../../locales/i18n'; import { getNavigationOptionsTitle } from '../../../UI/Navbar'; @@ -11,16 +10,17 @@ import Engine from '../../../../core/Engine'; import ActionSheet from 'react-native-actionsheet'; import { ThemeContext } from '../../../../util/theme'; -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - flex: 1, - }, - addContact: { - marginHorizontal: 24, - marginBottom: 16, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + }, + addContact: { + marginHorizontal: 24, + marginBottom: 16, + }, + }); const EDIT = 'edit'; const ADD = 'add'; @@ -113,6 +113,9 @@ class Contacts extends PureComponent { render = () => { const { reloadAddressList } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + return ( Date: Thu, 10 Feb 2022 00:32:22 -0800 Subject: [PATCH 24/77] Add dark mode to networks --- .../NetworksSettings/NetworkSettings/index.js | 138 +++++++++--------- .../Views/Settings/NetworksSettings/index.js | 101 +++++++------ 2 files changed, 128 insertions(+), 111 deletions(-) diff --git a/app/components/Views/Settings/NetworksSettings/NetworkSettings/index.js b/app/components/Views/Settings/NetworksSettings/NetworkSettings/index.js index 934cea9714c..ab5356cae36 100644 --- a/app/components/Views/Settings/NetworksSettings/NetworkSettings/index.js +++ b/app/components/Views/Settings/NetworksSettings/NetworkSettings/index.js @@ -2,7 +2,7 @@ import PropTypes from 'prop-types'; import React, { PureComponent } from 'react'; import { StyleSheet, Text, View, TextInput, SafeAreaView } from 'react-native'; import { connect } from 'react-redux'; -import { colors, fontStyles } from '../../../../../styles/common'; +import { fontStyles } from '../../../../../styles/common'; import { getNavigationOptionsTitle } from '../../../../UI/Navbar'; import { strings } from '../../../../../../locales/i18n'; import Networks, { isprivateConnection, getAllNetworks, isSafeChainId } from '../../../../../util/networks'; @@ -20,67 +20,68 @@ import AppConstants from '../../../../../core/AppConstants'; import AnalyticsV2 from '../../../../../util/analyticsV2'; import { ThemeContext } from '../../../../../util/theme'; -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - flex: 1, - flexDirection: 'column', - }, - informationWrapper: { - flex: 1, - paddingHorizontal: 24, - }, - scrollWrapper: { - flex: 1, - paddingVertical: 12, - }, - input: { - ...fontStyles.normal, - borderColor: colors.grey200, - borderRadius: 5, - borderWidth: 2, - padding: 10, - }, - warningText: { - ...fontStyles.normal, - color: colors.red, - marginTop: 4, - paddingLeft: 2, - paddingRight: 4, - }, - warningContainer: { - marginTop: 4, - flexGrow: 1, - flexShrink: 1, - }, - label: { - fontSize: 14, - paddingVertical: 12, - color: colors.fontPrimary, - ...fontStyles.bold, - }, - title: { - fontSize: 20, - paddingVertical: 12, - color: colors.fontPrimary, - ...fontStyles.bold, - }, - desc: { - fontSize: 14, - color: colors.fontPrimary, - ...fontStyles.normal, - }, - buttonsWrapper: { - marginVertical: 12, - flexDirection: 'row', - alignSelf: 'flex-end', - }, - buttonsContainer: { - flex: 1, - flexDirection: 'column', - alignSelf: 'flex-end', - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + flexDirection: 'column', + }, + informationWrapper: { + flex: 1, + paddingHorizontal: 24, + }, + scrollWrapper: { + flex: 1, + paddingVertical: 12, + }, + input: { + ...fontStyles.normal, + borderColor: colors.border.default, + borderRadius: 5, + borderWidth: 2, + padding: 10, + }, + warningText: { + ...fontStyles.normal, + color: colors.error.default, + marginTop: 4, + paddingLeft: 2, + paddingRight: 4, + }, + warningContainer: { + marginTop: 4, + flexGrow: 1, + flexShrink: 1, + }, + label: { + fontSize: 14, + paddingVertical: 12, + color: colors.text.default, + ...fontStyles.bold, + }, + title: { + fontSize: 20, + paddingVertical: 12, + color: colors.text.default, + ...fontStyles.bold, + }, + desc: { + fontSize: 14, + color: colors.text.default, + ...fontStyles.normal, + }, + buttonsWrapper: { + marginVertical: 12, + flexDirection: 'row', + alignSelf: 'flex-end', + }, + buttonsContainer: { + flex: 1, + flexDirection: 'column', + alignSelf: 'flex-end', + }, + }); const allNetworks = getAllNetworks(); const allNetworksblockExplorerUrl = `https://api.infura.io/v1/jsonrpc/`; @@ -462,6 +463,9 @@ class NetworkSettings extends PureComponent { enableAction, inputWidth, } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + return ( @@ -482,7 +486,7 @@ class NetworkSettings extends PureComponent { editable={editable} onChangeText={this.onNicknameChange} placeholder={strings('app_settings.network_name_placeholder')} - placeholderTextColor={colors.grey100} + placeholderTextColor={colors.text.muted} onSubmitEditing={this.jumpToRpcURL} testID={'input-network-name'} /> @@ -498,7 +502,7 @@ class NetworkSettings extends PureComponent { onChangeText={this.onRpcUrlChange} onBlur={this.validateRpcUrl} placeholder={strings('app_settings.network_rpc_placeholder')} - placeholderTextColor={colors.grey100} + placeholderTextColor={colors.text.muted} onSubmitEditing={this.jumpToChainId} testID={'input-rpc-url'} /> @@ -519,7 +523,7 @@ class NetworkSettings extends PureComponent { onChangeText={this.onChainIDChange} onBlur={this.validateChainId} placeholder={strings('app_settings.network_chain_id_placeholder')} - placeholderTextColor={colors.grey100} + placeholderTextColor={colors.text.muted} onSubmitEditing={this.jumpToSymbol} keyboardType={'numbers-and-punctuation'} testID={'input-chain-id'} @@ -540,7 +544,7 @@ class NetworkSettings extends PureComponent { editable={editable} onChangeText={this.onTickerChange} placeholder={strings('app_settings.network_symbol_placeholder')} - placeholderTextColor={colors.grey100} + placeholderTextColor={colors.text.muted} onSubmitEditing={this.jumpBlockExplorerURL} testID={'input-network-symbol'} /> @@ -555,7 +559,7 @@ class NetworkSettings extends PureComponent { editable={editable} onChangeText={this.onBlockExplorerUrlChange} placeholder={strings('app_settings.network_block_explorer_placeholder')} - placeholderTextColor={colors.grey100} + placeholderTextColor={colors.text.muted} onSubmitEditing={this.addRpcUrl} /> diff --git a/app/components/Views/Settings/NetworksSettings/index.js b/app/components/Views/Settings/NetworksSettings/index.js index 89985b56f74..d099aa567de 100644 --- a/app/components/Views/Settings/NetworksSettings/index.js +++ b/app/components/Views/Settings/NetworksSettings/index.js @@ -3,7 +3,7 @@ import React, { PureComponent } from 'react'; import { StyleSheet, Text, ScrollView, TouchableOpacity, View } from 'react-native'; import { connect } from 'react-redux'; import ActionSheet from 'react-native-actionsheet'; -import { colors, fontStyles } from '../../../../styles/common'; +import { fontStyles } from '../../../../styles/common'; import { getNavigationOptionsTitle } from '../../../UI/Navbar'; import { strings } from '../../../../../locales/i18n'; import Networks, { getAllNetworks } from '../../../../util/networks'; @@ -12,49 +12,50 @@ import Engine from '../../../../core/Engine'; import { MAINNET, RPC } from '../../../../constants/network'; import { ThemeContext } from '../../../../util/theme'; -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - flex: 1, - paddingVertical: 12, - paddingHorizontal: 24, - marginBottom: 24, - }, - networkIcon: { - width: 15, - height: 15, - borderRadius: 100, - marginTop: 2, - marginRight: 16, - }, - otherNetworkIcon: { - width: 15, - height: 15, - borderRadius: 100, - marginTop: 2, - backgroundColor: colors.grey100, - }, - network: { - flex: 1, - flexDirection: 'row', - paddingVertical: 12, - }, - networkWrapper: { - flex: 0, - flexDirection: 'row', - }, - networkLabel: { - fontSize: 16, - color: colors.fontPrimary, - ...fontStyles.normal, - }, - sectionLabel: { - fontSize: 14, - paddingVertical: 12, - color: colors.fontPrimary, - ...fontStyles.bold, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + paddingVertical: 12, + paddingHorizontal: 24, + paddingBottom: 36, + }, + networkIcon: { + width: 15, + height: 15, + borderRadius: 100, + marginTop: 2, + marginRight: 16, + }, + otherNetworkIcon: { + width: 15, + height: 15, + borderRadius: 100, + marginTop: 2, + backgroundColor: colors.text.muted, + }, + network: { + flex: 1, + flexDirection: 'row', + paddingVertical: 12, + }, + networkWrapper: { + flex: 0, + flexDirection: 'row', + }, + networkLabel: { + fontSize: 16, + color: colors.text.default, + ...fontStyles.normal, + }, + sectionLabel: { + fontSize: 14, + paddingVertical: 12, + color: colors.text.default, + ...fontStyles.bold, + }, + }); /** * Main view for app configurations @@ -144,6 +145,9 @@ class NetworksSettings extends PureComponent { onActionSheetPress = (index) => (index === 0 ? this.removeNetwork() : null); networkElement(name, color, i, network, isCustomRPC) { + const { colors } = this.context; + const styles = createStyles(colors); + return ( { const { frequentRpcList } = this.props; + const { colors } = this.context; + const styles = createStyles(colors); + if (frequentRpcList.length > 0) { return ( @@ -191,6 +198,9 @@ class NetworksSettings extends PureComponent { renderMainnet() { const { color: mainnetColor, name: mainnetName } = Networks.mainnet; + const { colors } = this.context; + const styles = createStyles(colors); + return ( From 1c7010d60bab7f63eb581578b3b66d4ae17cfed5 Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Thu, 10 Feb 2022 00:44:05 -0800 Subject: [PATCH 25/77] Add dark mode to experimental --- .../Settings/ExperimentalSettings/index.tsx | 72 +++++----- .../Views/WalletConnectSessions/index.js | 127 ++++++++++-------- 2 files changed, 108 insertions(+), 91 deletions(-) diff --git a/app/components/Views/Settings/ExperimentalSettings/index.tsx b/app/components/Views/Settings/ExperimentalSettings/index.tsx index 1b1de546e30..1c9044c4e1c 100644 --- a/app/components/Views/Settings/ExperimentalSettings/index.tsx +++ b/app/components/Views/Settings/ExperimentalSettings/index.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useEffect } from 'react'; import { StyleSheet, Text, ScrollView, View, Switch, InteractionManager } from 'react-native'; import StyledButton from '../../../UI/StyledButton'; -import { colors as importedColors, fontStyles } from '../../../../styles/common'; +import { fontStyles } from '../../../../styles/common'; import { getNavigationOptionsTitle } from '../../../UI/Navbar'; import { strings } from '../../../../../locales/i18n'; import Device from '../../../../util/device'; @@ -11,36 +11,37 @@ import { MAINNET } from '../../../../constants/network'; import AnalyticsV2 from '../../../../util/analyticsV2'; import { useAppThemeFromContext } from '../../../../util/theme'; -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: importedColors.white, - flex: 1, - padding: 24, - paddingBottom: 48, - }, - title: { - ...(fontStyles.normal as any), - color: importedColors.fontPrimary, - fontSize: 20, - lineHeight: 20, - }, - desc: { - ...(fontStyles.normal as any), - color: importedColors.grey500, - fontSize: 14, - lineHeight: 20, - marginTop: 12, - }, - setting: { - marginVertical: 18, - }, - clearHistoryConfirm: { - marginTop: 18, - }, - switchElement: { - marginTop: 18, - }, -}); +const createStyles = (colors: any) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + padding: 24, + paddingBottom: 48, + }, + title: { + ...(fontStyles.normal as any), + color: colors.text.default, + fontSize: 20, + lineHeight: 20, + }, + desc: { + ...(fontStyles.normal as any), + color: colors.text.alternative, + fontSize: 14, + lineHeight: 20, + marginTop: 12, + }, + setting: { + marginVertical: 18, + }, + clearHistoryConfirm: { + marginTop: 18, + }, + switchElement: { + marginTop: 18, + }, + }); interface Props { /** @@ -67,6 +68,7 @@ const ExperimentalSettings = ({ navigation, route }: Props) => { const chainId = useSelector((state: any) => state.engine.backgroundState.NetworkController.provider.chainId); const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); useEffect( () => { @@ -113,16 +115,14 @@ const ExperimentalSettings = ({ navigation, route }: Props) => { value={isTokenDetectionEnabled} onValueChange={toggleTokenDetection} trackColor={ - Device.isIos() - ? { true: importedColors.blue, false: importedColors.grey000 } - : undefined + Device.isIos() ? { true: colors.primary.default, false: colors.grey000 } : undefined } - ios_backgroundColor={importedColors.grey000} + ios_backgroundColor={colors.grey000} /> ) : null, - [isTokenDetectionEnabled, toggleTokenDetection, isMainnet] + [isTokenDetectionEnabled, toggleTokenDetection, isMainnet, colors, styles] ); return ( diff --git a/app/components/Views/WalletConnectSessions/index.js b/app/components/Views/WalletConnectSessions/index.js index 848d0ef3975..cad6e4832c1 100644 --- a/app/components/Views/WalletConnectSessions/index.js +++ b/app/components/Views/WalletConnectSessions/index.js @@ -1,6 +1,6 @@ import React, { PureComponent } from 'react'; import { Alert, ScrollView, SafeAreaView, StyleSheet, View, Text, TouchableOpacity } from 'react-native'; -import { colors, fontStyles } from '../../../styles/common'; +import { fontStyles } from '../../../styles/common'; import { strings } from '../../../../locales/i18n'; import { getNavigationOptionsTitle } from '../../UI/Navbar'; import WebsiteIcon from '../../UI/WebsiteIcon'; @@ -12,55 +12,59 @@ import { WALLETCONNECT_SESSIONS } from '../../../constants/storage'; import { ThemeContext } from '../../../util/theme'; import PropTypes from 'prop-types'; -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - flex: 1, - }, - scrollviewContent: { - paddingTop: 20, - }, - websiteIcon: { - width: 44, - height: 44, - }, - row: { - flexDirection: 'row', - paddingVertical: 10, - paddingHorizontal: 20, - borderBottomColor: colors.grey000, - borderBottomWidth: 1, - }, - info: { - marginLeft: 20, - flex: 1, - }, - name: { - ...fontStyles.bold, - fontSize: 16, - marginBottom: 10, - }, - desc: { - marginBottom: 10, - ...fontStyles.normal, - fontSize: 12, - }, - url: { - marginBottom: 10, - ...fontStyles.normal, - fontSize: 12, - color: colors.fontSecondary, - }, - emptyWrapper: { - flex: 1, - justifyContent: 'center', - alignItems: 'center', - }, - emptyText: { - ...fontStyles.normal, - fontSize: 16, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + }, + scrollviewContent: { + paddingTop: 20, + }, + websiteIcon: { + width: 44, + height: 44, + }, + row: { + flexDirection: 'row', + paddingVertical: 10, + paddingHorizontal: 20, + borderBottomColor: colors.grey000, + borderBottomWidth: 1, + }, + info: { + marginLeft: 20, + flex: 1, + }, + name: { + ...fontStyles.bold, + fontSize: 16, + marginBottom: 10, + color: colors.text.default, + }, + desc: { + marginBottom: 10, + ...fontStyles.normal, + fontSize: 12, + color: colors.text.alternative, + }, + url: { + marginBottom: 10, + ...fontStyles.normal, + fontSize: 12, + color: colors.text.alternative, + }, + emptyWrapper: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, + emptyText: { + ...fontStyles.normal, + fontSize: 16, + color: colors.text.default, + }, + }); /** * View that displays all the active WalletConnect Sessions @@ -102,6 +106,9 @@ export default class WalletConnectSessions extends PureComponent { renderDesc = (meta) => { const { description } = meta; + const { colors } = this.context; + const styles = createStyles(colors); + if (description) { return {meta.description}; } @@ -134,6 +141,9 @@ export default class WalletConnectSessions extends PureComponent { renderSessions = () => { const { sessions } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + return sessions.map((session) => ( ( - - {strings('walletconnect_sessions.no_active_sessions')} - - ); + renderEmpty = () => { + const { colors } = this.context; + const styles = createStyles(colors); + + return ( + + {strings('walletconnect_sessions.no_active_sessions')} + + ); + }; render = () => { const { ready, sessions } = this.state; if (!ready) return null; + const { colors } = this.context; + const styles = createStyles(colors); return ( From f5b4a9f058821b3f679e7b9068535c9ebfd57daa Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Thu, 10 Feb 2022 00:49:27 -0800 Subject: [PATCH 26/77] Add dark mode to about --- .../Views/Settings/AppInformation/index.js | 177 +++++++++--------- 1 file changed, 92 insertions(+), 85 deletions(-) diff --git a/app/components/Views/Settings/AppInformation/index.js b/app/components/Views/Settings/AppInformation/index.js index a2a9139a416..ed97ad92326 100644 --- a/app/components/Views/Settings/AppInformation/index.js +++ b/app/components/Views/Settings/AppInformation/index.js @@ -10,63 +10,65 @@ import { TouchableOpacity, } from 'react-native'; import { getApplicationName, getVersion, getBuildNumber } from 'react-native-device-info'; -import { colors, fontStyles } from '../../../../styles/common'; +import { fontStyles } from '../../../../styles/common'; import PropTypes from 'prop-types'; import { strings } from '../../../../../locales/i18n'; import { getNavigationOptionsTitle } from '../../../UI/Navbar'; import AppConstants from '../../../../core/AppConstants'; import { ThemeContext } from '../../../../util/theme'; -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - flex: 1, - }, - wrapperContent: { - paddingLeft: 24, - paddingRight: 24, - paddingVertical: 24, - }, - title: { - fontSize: 18, - textAlign: 'left', - marginBottom: 20, - ...fontStyles.normal, - }, - link: { - fontSize: 18, - textAlign: 'left', - marginBottom: 20, - ...fontStyles.normal, - color: colors.blue, - }, - division: { - borderBottomColor: colors.grey400, - borderBottomWidth: 1, - width: '30%', - marginBottom: 20, - }, - image: { - width: 100, - height: 100, - }, - logoWrapper: { - flex: 1, - backgroundColor: colors.white, - alignItems: 'center', - justifyContent: 'center', - top: 20, - marginBottom: 40, - }, - versionInfo: { - marginTop: 20, - fontSize: 18, - textAlign: 'left', - marginBottom: 20, - color: colors.fontSecondary, - ...fontStyles.normal, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + }, + wrapperContent: { + paddingLeft: 24, + paddingRight: 24, + paddingVertical: 24, + }, + title: { + fontSize: 18, + textAlign: 'left', + marginBottom: 20, + ...fontStyles.normal, + color: colors.text.default, + }, + link: { + fontSize: 18, + textAlign: 'left', + marginBottom: 20, + ...fontStyles.normal, + color: colors.primary.default, + }, + division: { + borderBottomColor: colors.border.muted, + borderBottomWidth: 1, + width: '30%', + marginBottom: 20, + }, + image: { + width: 100, + height: 100, + }, + logoWrapper: { + flex: 1, + backgroundColor: colors.background.default, + alignItems: 'center', + justifyContent: 'center', + top: 20, + marginBottom: 40, + }, + versionInfo: { + marginTop: 20, + fontSize: 18, + textAlign: 'left', + marginBottom: 20, + color: colors.text.alternative, + ...fontStyles.normal, + }, + }); const foxImage = require('../../../../images/fox.png'); // eslint-disable-line import/no-commonjs @@ -145,40 +147,45 @@ export default class AppInformation extends PureComponent { this.goTo(url, strings('drawer.metamask_support')); }; - render = () => ( - - - - - {this.state.appInfo} - - {strings('app_information.links')} - - - {strings('app_information.privacy_policy')} - - - {strings('app_information.terms_of_use')} - - - {strings('app_information.attributions')} - - - - - - {strings('app_information.support_center')} - - - {strings('app_information.web_site')} - - - {strings('app_information.contact_us')} - - - - - ); + render = () => { + const { colors } = this.context; + const styles = createStyles(colors); + + return ( + + + + + {this.state.appInfo} + + {strings('app_information.links')} + + + {strings('app_information.privacy_policy')} + + + {strings('app_information.terms_of_use')} + + + {strings('app_information.attributions')} + + + + + + {strings('app_information.support_center')} + + + {strings('app_information.web_site')} + + + {strings('app_information.contact_us')} + + + + + ); + }; } AppInformation.contextType = ThemeContext; From b2f0475639a1b50df29de36baedd813c484aceb0 Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Thu, 10 Feb 2022 20:24:38 -0800 Subject: [PATCH 27/77] Update swap elements with theme colors --- .eslintrc.js | 2 +- app/components/Base/Alert.tsx | 82 +++-- app/components/Base/Keypad/components.js | 102 +++--- app/components/Base/ListItem.js | 159 +++++---- app/components/Base/SelectorButton.js | 40 ++- app/components/Base/Text.js | 209 +++++------ app/components/Base/Title.js | 41 ++- .../EditPermission/index.js | 175 +++++----- app/components/UI/AssetActionButton/index.js | 103 +++--- app/components/UI/Fox/index.js | 16 +- app/components/UI/Navbar/index.js | 10 +- app/components/UI/NavbarTitle/index.js | 70 ++-- app/components/UI/Swaps/QuotesView.js | 326 +++++++++--------- .../UI/Swaps/components/ActionAlert.js | 105 +++--- .../UI/Swaps/components/InfoModal.js | 85 ++--- .../components/LoadingAnimation/index.js | 137 ++++---- .../UI/Swaps/components/Onboarding.js | 82 +++-- .../UI/Swaps/components/QuotesModal.js | 207 +++++------ .../UI/Swaps/components/QuotesSummary.js | 145 ++++---- app/components/UI/Swaps/components/Ratio.js | 21 +- .../UI/Swaps/components/SlippageModal.js | 60 ++-- .../UI/Swaps/components/TokenIcon.js | 116 ++++--- .../UI/Swaps/components/TokenImportModal.js | 98 +++--- .../UI/Swaps/components/TokenSelectModal.js | 167 ++++----- app/components/UI/Swaps/index.js | 169 ++++----- 25 files changed, 1468 insertions(+), 1259 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 3abaf112e37..68200c09a3c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -119,7 +119,7 @@ module.exports = { 'eslint-comments/no-unused-disable': 0, 'react-native/no-color-literals': 2, 'react-native/no-inline-styles': 2, - 'react-native/no-unused-styles': 2, + 'react-native/no-unused-styles': 0, 'react-native/split-platform-components': 2, 'react/jsx-boolean-value': 2, 'react/jsx-key': 1, diff --git a/app/components/Base/Alert.tsx b/app/components/Base/Alert.tsx index 943dd69ea1f..b15427b694c 100644 --- a/app/components/Base/Alert.tsx +++ b/app/components/Base/Alert.tsx @@ -10,8 +10,8 @@ import { TextStyle, } from 'react-native'; import IonicIcon from 'react-native-vector-icons/Ionicons'; -import { colors } from '../../styles/common'; import CustomText from './Text'; +import { useAppThemeFromContext } from '../../util/theme'; // TODO: Convert into typescript and correctly type optionals const Text = CustomText as any; @@ -32,43 +32,47 @@ interface Props { children?: ReactNode; } -const styles = StyleSheet.create({ - base: { - paddingHorizontal: 12, - paddingVertical: 8, - borderWidth: 1, - borderRadius: 8, - flexDirection: 'row', - }, - baseSmall: { - paddingVertical: 8, - }, - info: { - backgroundColor: colors.blue100, - borderColor: colors.blue, - }, - warning: { - backgroundColor: colors.yellow100, - borderColor: colors.yellowWarningBorder, - }, - error: { - backgroundColor: colors.red000, - borderColor: colors.red, - }, - closeIcon: { - color: colors.black, - }, - baseTextStyle: { fontSize: 14, flex: 1, lineHeight: 17 }, - textInfo: { color: colors.blue }, - textWarning: { color: colors.black }, - textError: { color: colors.red }, - textIconStyle: { marginRight: 12 }, - iconWrapper: { - alignItems: 'center', - }, -}); +const createStyles = (colors: any) => + StyleSheet.create({ + base: { + paddingHorizontal: 12, + paddingVertical: 8, + borderWidth: 1, + borderRadius: 8, + flexDirection: 'row', + }, + baseSmall: { + paddingVertical: 8, + }, + info: { + backgroundColor: colors.primary.muted, + borderColor: colors.primary.default, + }, + warning: { + backgroundColor: colors.warning.muted, + borderColor: colors.warning.default, + }, + error: { + backgroundColor: colors.error.muted, + borderColor: colors.error.default, + }, + closeIcon: { + color: colors.text.default, + }, + baseTextStyle: { fontSize: 14, flex: 1, lineHeight: 17 }, + textInfo: { color: colors.primary.default }, + textWarning: { color: colors.warning.default }, + textError: { color: colors.error.default }, + textIconStyle: { marginRight: 12 }, + iconWrapper: { + alignItems: 'center', + }, + }); -const getAlertStyles: (alertType: AlertType) => [StyleProp, StyleProp] = (alertType) => { +const getAlertStyles: ( + alertType: AlertType, + styles: StyleSheet.NamedStyles +) => [StyleProp, StyleProp] = (alertType, styles) => { switch (alertType) { case AlertType.Warning: { return [styles.warning, { ...styles.textWarning, ...styles.baseTextStyle }]; @@ -85,8 +89,10 @@ const getAlertStyles: (alertType: AlertType) => [StyleProp, StyleProp const Alert = ({ type = AlertType.Info, small, renderIcon, style, onPress, onDismiss, children, ...props }: Props) => { const Wrapper: React.ComponentClass = onPress ? TouchableOpacity : View; + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); - const [wrapperStyle, textStyle] = getAlertStyles(type); + const [wrapperStyle, textStyle] = getAlertStyles(type, styles); return ( diff --git a/app/components/Base/Keypad/components.js b/app/components/Base/Keypad/components.js index ae9ac7831a3..ff181389000 100644 --- a/app/components/Base/Keypad/components.js +++ b/app/components/Base/Keypad/components.js @@ -3,53 +3,73 @@ import PropTypes from 'prop-types'; import { View, StyleSheet, TouchableOpacity } from 'react-native'; import IonicIcon from 'react-native-vector-icons/Ionicons'; import Device from '../../../util/device'; - import Text from '../Text'; -import { colors } from '../../../styles/common'; - -const styles = StyleSheet.create({ - keypad: { - paddingHorizontal: 25, - }, - keypadRow: { - flexDirection: 'row', - justifyContent: 'space-around', - }, - keypadButton: { - paddingHorizontal: 20, - paddingVertical: Device.isMediumDevice() ? (Device.isIphone5() ? 4 : 8) : 12, - flex: 1, - justifyContent: 'center', - alignItems: 'center', - }, - keypadButtonText: { - color: colors.black, - textAlign: 'center', - fontSize: 30, - }, - deleteIcon: { - fontSize: 25, - marginTop: 5, - }, -}); - -const KeypadContainer = (props) => ; -const KeypadRow = (props) => ; -const KeypadButton = ({ children, ...props }) => ( - - {children} - -); +import { useAppThemeFromContext } from '../../../util/theme'; + +const createStyles = (colors) => + StyleSheet.create({ + keypad: { + paddingHorizontal: 25, + }, + keypadRow: { + flexDirection: 'row', + justifyContent: 'space-around', + }, + keypadButton: { + paddingHorizontal: 20, + paddingVertical: Device.isMediumDevice() ? (Device.isIphone5() ? 4 : 8) : 12, + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, + keypadButtonText: { + color: colors.text.default, + textAlign: 'center', + fontSize: 30, + }, + deleteIcon: { + fontSize: 25, + marginTop: 5, + }, + }); + +const KeypadContainer = (props) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ; +}; +const KeypadRow = (props) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ; +}; +const KeypadButton = ({ children, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ( + + {children} + + ); +}; KeypadButton.propTypes = { children: PropTypes.node, }; -const KeypadDeleteButton = (props) => ( - - - -); +const KeypadDeleteButton = (props) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ( + + + + ); +}; const Keypad = KeypadContainer; Keypad.Row = KeypadRow; diff --git a/app/components/Base/ListItem.js b/app/components/Base/ListItem.js index 9474712d6af..7dafcdab532 100644 --- a/app/components/Base/ListItem.js +++ b/app/components/Base/ListItem.js @@ -1,69 +1,110 @@ import React from 'react'; import PropTypes from 'prop-types'; import { StyleSheet, View } from 'react-native'; -// import Device from '../../util/device'; -import { colors, fontStyles } from '../../styles/common'; +import { fontStyles } from '../../styles/common'; import Text from './Text'; +import { useAppThemeFromContext } from '../../util/theme'; -const styles = StyleSheet.create({ - wrapper: { - padding: 15, - // TODO(wachunei): check if this can be removed without breaking anything - // minHeight: Device.isIos() ? 55 : 100 - }, - date: { - color: colors.fontSecondary, - fontSize: 12, - marginBottom: 10, - ...fontStyles.normal, - }, - content: { - flexDirection: 'row', - alignItems: 'center', - }, - actions: { - flexDirection: 'row', - paddingTop: 10, - paddingLeft: 40, - }, - icon: { - flexDirection: 'row', - alignItems: 'center', - }, - body: { - flex: 1, - marginLeft: 15, - }, - amounts: { - flex: 0.6, - alignItems: 'flex-end', - }, - title: { - fontSize: 15, - color: colors.fontPrimary, - }, - amount: { - fontSize: 15, - color: colors.fontPrimary, - }, - fiatAmount: { - fontSize: 12, - color: colors.fontSecondary, - textTransform: 'uppercase', - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + padding: 15, + // TODO(wachunei): check if this can be removed without breaking anything + // minHeight: Device.isIos() ? 55 : 100 + }, + date: { + color: colors.text.default, + fontSize: 12, + marginBottom: 10, + ...fontStyles.normal, + }, + content: { + flexDirection: 'row', + alignItems: 'center', + }, + actions: { + flexDirection: 'row', + paddingTop: 10, + paddingLeft: 40, + }, + icon: { + flexDirection: 'row', + alignItems: 'center', + }, + body: { + flex: 1, + marginLeft: 15, + }, + amounts: { + flex: 0.6, + alignItems: 'flex-end', + }, + title: { + fontSize: 15, + color: colors.text.default, + }, + amount: { + fontSize: 15, + color: colors.text.default, + }, + fiatAmount: { + fontSize: 12, + color: colors.text.alternative, + textTransform: 'uppercase', + }, + }); -const ListItem = ({ style, ...props }) => ; +const ListItem = ({ style, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ; +}; -const ListItemDate = ({ style, ...props }) => ; -const ListItemContent = ({ style, ...props }) => ; -const ListItemActions = ({ style, ...props }) => ; -const ListItemIcon = ({ style, ...props }) => ; -const ListItemBody = ({ style, ...props }) => ; -const ListItemTitle = ({ style, ...props }) => ; -const ListItemAmounts = ({ style, ...props }) => ; -const ListItemAmount = ({ style, ...props }) => ; -const ListItemFiatAmount = ({ style, ...props }) => ; +const ListItemDate = ({ style, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ; +}; +const ListItemContent = ({ style, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ; +}; +const ListItemActions = ({ style, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ; +}; +const ListItemIcon = ({ style, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ; +}; +const ListItemBody = ({ style, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ; +}; +const ListItemTitle = ({ style, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ; +}; +const ListItemAmounts = ({ style, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ; +}; +const ListItemAmount = ({ style, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ; +}; +const ListItemFiatAmount = ({ style, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ; +}; ListItem.Date = ListItemDate; ListItem.Content = ListItemContent; diff --git a/app/components/Base/SelectorButton.js b/app/components/Base/SelectorButton.js index 1660eef818d..40f803f4833 100644 --- a/app/components/Base/SelectorButton.js +++ b/app/components/Base/SelectorButton.js @@ -2,27 +2,31 @@ import React from 'react'; import PropTypes from 'prop-types'; import { View, StyleSheet, TouchableOpacity } from 'react-native'; import Icon from 'react-native-vector-icons/FontAwesome'; -import { colors } from '../../styles/common'; +import { useAppThemeFromContext } from '../../util/theme'; -const styles = StyleSheet.create({ - container: { - backgroundColor: colors.grey000, - paddingVertical: 8, - paddingHorizontal: 10, - borderRadius: 100, - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'center', - }, - caretDown: { - textAlign: 'right', - color: colors.grey500, - marginLeft: 10, - marginRight: 5, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + container: { + backgroundColor: colors.background.alternative, + paddingVertical: 8, + paddingHorizontal: 10, + borderRadius: 100, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + }, + caretDown: { + textAlign: 'right', + color: colors.text.alternative, + marginLeft: 10, + marginRight: 5, + }, + }); function SelectorButton({ onPress, disabled, children, ...props }) { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ( diff --git a/app/components/Base/Text.js b/app/components/Base/Text.js index 2dc262e3932..4a3b689d7df 100644 --- a/app/components/Base/Text.js +++ b/app/components/Base/Text.js @@ -1,78 +1,80 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Text as RNText, StyleSheet } from 'react-native'; -import { fontStyles, colors } from '../../styles/common'; +import { fontStyles } from '../../styles/common'; +import { useAppThemeFromContext } from '../../util/theme'; -const style = StyleSheet.create({ - text: { - ...fontStyles.normal, - color: colors.grey600, - marginVertical: 2, - fontSize: 14, - }, - centered: { - textAlign: 'center', - }, - right: { - textAlign: 'right', - }, - red: { - color: colors.red, - }, - orange: { - color: colors.orange, - }, - black: { - color: colors.black, - }, - bold: fontStyles.bold, - blue: { - color: colors.blue, - }, - green: { - color: colors.green400, - }, - grey: { - color: colors.grey500, - }, - primary: { - color: colors.fontPrimary, - }, - small: { - fontSize: 12, - }, - big: { - fontSize: 16, - }, - upper: { - textTransform: 'uppercase', - }, - disclaimer: { - fontStyle: 'italic', - letterSpacing: 0.15, - }, - modal: { - color: colors.fontPrimary, - fontSize: 16, - lineHeight: 22.4, // 1.4 * fontSize - }, - infoModal: { - lineHeight: 20, - marginVertical: 6, - }, - link: { - color: colors.blue, - }, - strikethrough: { - textDecorationLine: 'line-through', - }, - underline: { - textDecorationLine: 'underline', - }, - noMargin: { - marginVertical: 0, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + text: { + ...fontStyles.normal, + color: colors.text.alternative, + marginVertical: 2, + fontSize: 14, + }, + centered: { + textAlign: 'center', + }, + right: { + textAlign: 'right', + }, + red: { + color: colors.error.default, + }, + orange: { + color: colors.orange, + }, + black: { + color: colors.text.default, + }, + bold: fontStyles.bold, + blue: { + color: colors.primary.default, + }, + green: { + color: colors.success.default, + }, + grey: { + color: colors.text.alternative, + }, + primary: { + color: colors.text.default, + }, + small: { + fontSize: 12, + }, + big: { + fontSize: 16, + }, + upper: { + textTransform: 'uppercase', + }, + disclaimer: { + fontStyle: 'italic', + letterSpacing: 0.15, + }, + modal: { + color: colors.text.default, + fontSize: 16, + lineHeight: 22.4, // 1.4 * fontSize + }, + infoModal: { + lineHeight: 20, + marginVertical: 6, + }, + link: { + color: colors.primary.default, + }, + strikethrough: { + textDecorationLine: 'line-through', + }, + underline: { + textDecorationLine: 'underline', + }, + noMargin: { + marginVertical: 0, + }, + }); const Text = ({ reset, @@ -98,36 +100,41 @@ const Text = ({ style: externalStyle, noMargin, ...props -}) => ( - -); +}) => { + const { colors } = useAppThemeFromContext(); + const style = createStyles(colors); + + return ( + + ); +}; Text.defaultProps = { reset: false, diff --git a/app/components/Base/Title.js b/app/components/Base/Title.js index d33bb5f34de..a88ce794beb 100644 --- a/app/components/Base/Title.js +++ b/app/components/Base/Title.js @@ -1,27 +1,32 @@ import React from 'react'; import PropTypes from 'prop-types'; import { StyleSheet } from 'react-native'; -import { fontStyles, colors } from '../../styles/common'; +import { fontStyles } from '../../styles/common'; import Text from './Text.js'; +import { useAppThemeFromContext } from '../../util/theme'; -const style = StyleSheet.create({ - text: { - fontSize: 18, - marginVertical: 3, - color: colors.fontPrimary, - ...fontStyles.bold, - }, - hero: { - fontSize: 22, - }, - centered: { - textAlign: 'center', - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + text: { + fontSize: 18, + marginVertical: 3, + color: colors.text.default, + ...fontStyles.bold, + }, + hero: { + fontSize: 22, + }, + centered: { + textAlign: 'center', + }, + }); -const Title = ({ centered, hero, style: externalStyle, ...props }) => ( - -); +const Title = ({ centered, hero, style: externalStyle, ...props }) => { + const { colors } = useAppThemeFromContext(); + const style = createStyles(colors); + + return ; +}; Title.defaultProps = { centered: false, diff --git a/app/components/UI/ApproveTransactionReview/EditPermission/index.js b/app/components/UI/ApproveTransactionReview/EditPermission/index.js index 5ce70af7a90..6273990d730 100644 --- a/app/components/UI/ApproveTransactionReview/EditPermission/index.js +++ b/app/components/UI/ApproveTransactionReview/EditPermission/index.js @@ -1,99 +1,102 @@ import React, { useCallback, useMemo, useState } from 'react'; import PropTypes from 'prop-types'; import { View, StyleSheet, TouchableOpacity, TextInput } from 'react-native'; -import { colors, fontStyles } from '../../../../styles/common'; +import { fontStyles } from '../../../../styles/common'; import Text from '../../../Base/Text'; import StyledButton from '../../StyledButton'; import { strings } from '../../../../../locales/i18n'; import ConnectHeader from '../../ConnectHeader'; import Device from '../../../../util/device'; import ErrorMessage from '../../../Views/SendFlow/ErrorMessage'; +import { useAppThemeFromContext } from '../../../../util/theme'; export const MINIMUM_VALUE = '1'; -const styles = StyleSheet.create({ - wrapper: { - paddingHorizontal: 24, - paddingTop: 24, - paddingBottom: Device.isIphoneX() ? 48 : 24, - backgroundColor: colors.white, - borderTopRightRadius: 20, - borderTopLeftRadius: 20, - }, - sectionExplanationText: { - ...fontStyles.normal, - fontSize: 12, - color: colors.grey500, - marginVertical: 6, - }, - option: { - flexDirection: 'row', - marginVertical: 8, - }, - errorMessageWrapper: { - marginVertical: 6, - }, - optionText: { - ...fontStyles.normal, - fontSize: 14, - lineHeight: 20, - }, - touchableOption: { - flexDirection: 'row', - }, - selectedCircle: { - width: 8, - height: 8, - borderRadius: 8 / 2, - margin: 3, - backgroundColor: colors.blue, - }, - outSelectedCircle: { - width: 18, - height: 18, - borderRadius: 18 / 2, - borderWidth: 2, - borderColor: colors.blue, - }, - circle: { - width: 18, - height: 18, - borderRadius: 18 / 2, - backgroundColor: colors.white, - opacity: 1, - borderWidth: 2, - borderColor: colors.grey200, - }, - input: { - padding: 12, - borderColor: colors.grey200, - borderRadius: 10, - borderWidth: 2, - }, - spendLimitContent: { - marginLeft: 8, - flex: 1, - }, - spendLimitTitle: { - ...fontStyles.bold, - color: colors.black, - fontSize: 14, - lineHeight: 20, - marginBottom: 8, - }, - spendLimitSubtitle: { - ...fontStyles.normal, - fontSize: 12, - lineHeight: 18, - color: colors.grey500, - }, - textBlue: { - color: colors.blue, - }, - textBlack: { - color: colors.black, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + paddingHorizontal: 24, + paddingTop: 24, + paddingBottom: Device.isIphoneX() ? 48 : 24, + backgroundColor: colors.background.default, + borderTopRightRadius: 20, + borderTopLeftRadius: 20, + }, + sectionExplanationText: { + ...fontStyles.normal, + fontSize: 12, + color: colors.text.alternative, + marginVertical: 6, + }, + option: { + flexDirection: 'row', + marginVertical: 8, + }, + errorMessageWrapper: { + marginVertical: 6, + }, + optionText: { + ...fontStyles.normal, + fontSize: 14, + lineHeight: 20, + color: colors.text.default, + }, + touchableOption: { + flexDirection: 'row', + }, + selectedCircle: { + width: 8, + height: 8, + borderRadius: 8 / 2, + margin: 3, + backgroundColor: colors.primary.default, + }, + outSelectedCircle: { + width: 18, + height: 18, + borderRadius: 18 / 2, + borderWidth: 2, + borderColor: colors.primary.default, + }, + circle: { + width: 18, + height: 18, + borderRadius: 18 / 2, + backgroundColor: colors.background.default, + opacity: 1, + borderWidth: 2, + borderColor: colors.border.default, + }, + input: { + padding: 12, + borderColor: colors.border.default, + borderRadius: 10, + borderWidth: 2, + }, + spendLimitContent: { + marginLeft: 8, + flex: 1, + }, + spendLimitTitle: { + ...fontStyles.bold, + color: colors.text.default, + fontSize: 14, + lineHeight: 20, + marginBottom: 8, + }, + spendLimitSubtitle: { + ...fontStyles.normal, + fontSize: 12, + lineHeight: 18, + color: colors.text.alternative, + }, + textBlue: { + color: colors.primary.default, + }, + textBlack: { + color: colors.text.default, + }, + }); function EditPermission({ host, @@ -109,6 +112,8 @@ function EditPermission({ toggleEditPermission, }) { const [initialState] = useState({ spendLimitUnlimitedSelected, spendLimitCustomValue }); + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); const displayErrorMessage = useMemo( () => !spendLimitUnlimitedSelected && Number(minimumSpendLimit) > spendLimitCustomValue, @@ -208,7 +213,7 @@ function EditPermission({ autoCorrect={false} onChangeText={onSpendLimitCustomValueChange} placeholder={`100 ${tokenSymbol}`} - placeholderTextColor={colors.grey100} + placeholderTextColor={colors.text.muted} spellCheck={false} style={styles.input} value={spendLimitCustomValue} diff --git a/app/components/UI/AssetActionButton/index.js b/app/components/UI/AssetActionButton/index.js index 29f3713ae1a..7986f1f4154 100644 --- a/app/components/UI/AssetActionButton/index.js +++ b/app/components/UI/AssetActionButton/index.js @@ -7,55 +7,57 @@ import FeatherIcon from 'react-native-vector-icons/Feather'; import { colors } from '../../../styles/common'; import Device from '../../../util/device'; import Text from '../../Base/Text'; +import { useAppThemeFromContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - button: { - flexShrink: 1, - marginHorizontal: 0, - justifyContent: 'center', - alignItems: 'center', - minWidth: 60, - }, - disabledButton: { - opacity: 0.5, - }, - buttonIconWrapper: { - width: 36, - height: 36, - borderRadius: 18, - paddingTop: Device.isAndroid() ? 2 : 4, - paddingLeft: 1, - justifyContent: 'center', - alignContent: 'center', - backgroundColor: colors.blue, - }, - buttonIcon: { - justifyContent: 'center', - alignContent: 'center', - textAlign: 'center', - color: colors.white, - }, - buttonText: { - marginTop: 8, - color: colors.blue, - fontSize: 14, - }, - receive: { - right: Device.isIos() ? 1 : 0, - bottom: 1, - transform: [{ rotate: '90deg' }], - }, - swapsIcon: { - right: Device.isAndroid() ? 1 : 0, - bottom: Device.isAndroid() ? 1 : 0, - }, - buyIcon: { - right: Device.isAndroid() ? 0.5 : 0, - bottom: Device.isAndroid() ? 1 : 2, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + button: { + flexShrink: 1, + marginHorizontal: 0, + justifyContent: 'center', + alignItems: 'center', + minWidth: 60, + }, + disabledButton: { + opacity: 0.5, + }, + buttonIconWrapper: { + width: 36, + height: 36, + borderRadius: 18, + paddingTop: Device.isAndroid() ? 2 : 4, + paddingLeft: 1, + justifyContent: 'center', + alignContent: 'center', + backgroundColor: colors.primary.default, + }, + buttonIcon: { + justifyContent: 'center', + alignContent: 'center', + textAlign: 'center', + color: colors.primary.inverse, + }, + buttonText: { + marginTop: 8, + color: colors.primary.default, + fontSize: 14, + }, + receive: { + right: Device.isIos() ? 1 : 0, + bottom: 1, + transform: [{ rotate: '90deg' }], + }, + swapsIcon: { + right: Device.isAndroid() ? 1 : 0, + bottom: Device.isAndroid() ? 1 : 0, + }, + buyIcon: { + right: Device.isAndroid() ? 0.5 : 0, + bottom: Device.isAndroid() ? 1 : 2, + }, + }); -function getIcon(type) { +function getIcon(type, styles) { switch (type) { case 'send': { return ; @@ -89,13 +91,18 @@ function getIcon(type) { } function AssetActionButton({ onPress, icon, label, disabled }) { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ( - {icon && (typeof icon === 'string' ? getIcon(icon) : icon)} + + {icon && (typeof icon === 'string' ? getIcon(icon, styles) : icon)} + {label} diff --git a/app/components/UI/Fox/index.js b/app/components/UI/Fox/index.js index 3af67e92c4e..64b23cdb5b3 100644 --- a/app/components/UI/Fox/index.js +++ b/app/components/UI/Fox/index.js @@ -2,14 +2,20 @@ import React, { forwardRef } from 'react'; import PropTypes from 'prop-types'; import { StyleSheet } from 'react-native'; import { WebView } from 'react-native-webview'; +import { useAppThemeFromContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - webView: { - flex: 1, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + webView: { + flex: 1, + backgroundColor: colors.background.default, + }, + }); function Fox({ style, customStyle, customContent = '', forwardedRef, ...props }) { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ( + StyleSheet.create({ + wrapper: { + alignItems: 'center', + flex: 1, + }, + network: { + flexDirection: 'row', + }, + networkName: { + fontSize: 11, + color: colors.text.alternative, + ...fontStyles.normal, + }, + networkIcon: { + width: 5, + height: 5, + borderRadius: 100, + marginRight: 5, + marginTop: Device.isIos() ? 4 : 5, + }, + title: { + fontSize: 18, + ...fontStyles.normal, + color: colors.text.default, + }, + otherNetworkIcon: { + backgroundColor: colors.transparent, + borderColor: colors.border.default, + borderWidth: 1, + }, + }); /** * UI PureComponent that renders inside the navbar @@ -90,6 +92,8 @@ class NavbarTitle extends PureComponent { const { network, title, translate } = this.props; let name = null; const color = (Networks[network.provider.type] && Networks[network.provider.type].color) || null; + const { colors } = this.context; + const styles = createStyles(colors); if (network.provider.nickname) { name = network.provider.nickname; @@ -124,6 +128,8 @@ class NavbarTitle extends PureComponent { }; } +NavbarTitle.contextType = ThemeContext; + const mapStateToProps = (state) => ({ network: state.engine.backgroundState.NetworkController, }); diff --git a/app/components/UI/Swaps/QuotesView.js b/app/components/UI/Swaps/QuotesView.js index 3298d3e387c..49498b39416 100644 --- a/app/components/UI/Swaps/QuotesView.js +++ b/app/components/UI/Swaps/QuotesView.js @@ -22,7 +22,6 @@ import { } from '../../../util/number'; import { isMainNet, isMainnetByChainId } from '../../../util/networks'; import { getErrorMessage, getFetchParams, getQuotesNavigationsParams, isSwapsNativeAsset } from './utils'; -import { colors } from '../../../styles/common'; import { strings } from '../../../../locales/i18n'; import Engine from '../../../core/Engine'; @@ -67,162 +66,171 @@ const SLIPPAGE_BUCKETS = { const DEFAULT_GAS_FEE_OPTION_LEGACY = AppConstants.GAS_OPTIONS.MEDIUM; const DEFAULT_GAS_FEE_OPTION_FEE_MARKET = AppConstants.GAS_OPTIONS.HIGH; -const styles = StyleSheet.create({ - screen: { - flexGrow: 1, - justifyContent: 'space-between', - }, - topBar: { - alignItems: 'center', - marginVertical: 12, - }, - alertBar: { - paddingHorizontal: 20, - marginVertical: 10, - width: '100%', - }, - timerWrapper: { - backgroundColor: colors.grey000, - borderRadius: 20, - marginVertical: 12, - paddingVertical: 4, - paddingHorizontal: 15, - flexDirection: 'row', - alignItems: 'center', - }, - timer: { - fontVariant: ['tabular-nums'], - }, - timerHiglight: { - color: colors.red, - }, - content: { - paddingHorizontal: 20, - alignItems: 'center', - }, - errorViewContent: { - flex: 1, - marginHorizontal: Device.isSmallDevice() ? 20 : 55, - justifyContent: 'center', - }, - errorTitle: { - fontSize: 24, - marginVertical: 10, - }, - errorText: { - fontSize: 14, - }, - sourceTokenContainer: { - flexDirection: 'row', - alignItems: 'center', - }, - tokenIcon: { - marginHorizontal: 5, - }, - tokenText: { - color: colors.grey500, - fontSize: Device.isSmallDevice() ? 16 : 18, - }, - tokenTextDestination: { - color: colors.fontPrimary, - }, - arrowDown: { - color: colors.grey100, - fontSize: Device.isSmallDevice() ? 22 : 25, - marginHorizontal: 15, - marginTop: Device.isSmallDevice() ? 2 : 4, - marginBottom: Device.isSmallDevice() ? 0 : 2, - }, - amount: { - textAlignVertical: 'center', - fontSize: Device.isSmallDevice() ? 45 : 60, - marginBottom: Device.isSmallDevice() ? 8 : 24, - }, - exchangeRate: { - flexDirection: 'row', - alignItems: 'center', - marginVertical: Device.isSmallDevice() ? 1 : 1, - }, - bottomSection: { - marginBottom: 6, - alignItems: 'stretch', - paddingHorizontal: 20, - }, - sliderButtonText: { - fontSize: 16, - color: colors.white, - }, - quotesSummary: { - marginVertical: Device.isSmallDevice() ? 12 : 24, - }, - quotesSummaryHeader: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - flexWrap: 'wrap', - }, - quotesRow: { - flexDirection: 'row', - flexWrap: 'wrap', - }, - quotesDescription: { - flex: 1, - flexWrap: 'wrap', - flexDirection: 'row', - marginRight: 3, - }, - quotesLegend: { - flexDirection: 'row', - flexWrap: 'wrap', - marginRight: 2, - alignItems: 'center', - }, - quotesFiatColumn: { - flex: 1, - marginLeft: 3, - flexWrap: 'wrap', - flexDirection: 'row', - justifyContent: 'flex-end', - }, - infoIcon: { - fontSize: 12, - margin: 3, - color: colors.blue, - }, - ctaButton: { - width: '100%', - }, - errorIcon: { - fontSize: 46, - marginVertical: 4, - color: colors.red, - }, - expiredIcon: { - color: colors.blue, - }, - disabled: { - opacity: 0.4, - }, - termsButton: { - marginTop: 10, - marginBottom: 6, - }, - gasInfoContainer: { - paddingHorizontal: 2, - }, - gasInfoIcon: { - color: colors.blue, - }, - hitSlop: { - top: 10, - left: 10, - bottom: 10, - right: 10, - }, - text: { - lineHeight: 20, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + screen: { + flexGrow: 1, + justifyContent: 'space-between', + backgroundColor: colors.background.default, + }, + container: { + backgroundColor: colors.background.default, + }, + topBar: { + alignItems: 'center', + marginVertical: 12, + }, + alertBar: { + paddingHorizontal: 20, + marginVertical: 10, + width: '100%', + }, + timerWrapper: { + backgroundColor: colors.background.alternative, + borderRadius: 20, + marginVertical: 12, + paddingVertical: 4, + paddingHorizontal: 15, + flexDirection: 'row', + alignItems: 'center', + }, + timer: { + fontVariant: ['tabular-nums'], + }, + timerHiglight: { + color: colors.error.default, + }, + content: { + paddingHorizontal: 20, + alignItems: 'center', + }, + errorViewContent: { + flex: 1, + marginHorizontal: Device.isSmallDevice() ? 20 : 55, + justifyContent: 'center', + }, + errorTitle: { + fontSize: 24, + marginVertical: 10, + }, + errorText: { + fontSize: 14, + }, + sourceTokenContainer: { + flexDirection: 'row', + alignItems: 'center', + }, + tokenIcon: { + marginHorizontal: 5, + }, + tokenText: { + color: colors.text.alternative, + fontSize: Device.isSmallDevice() ? 16 : 18, + }, + tokenTextDestination: { + color: colors.text.default, + }, + arrowDown: { + color: colors.text.muted, + fontSize: Device.isSmallDevice() ? 22 : 25, + marginHorizontal: 15, + marginTop: Device.isSmallDevice() ? 2 : 4, + marginBottom: Device.isSmallDevice() ? 0 : 2, + }, + amount: { + textAlignVertical: 'center', + fontSize: Device.isSmallDevice() ? 45 : 60, + marginBottom: Device.isSmallDevice() ? 8 : 24, + }, + exchangeRate: { + flexDirection: 'row', + alignItems: 'center', + marginVertical: Device.isSmallDevice() ? 1 : 1, + }, + bottomSection: { + marginBottom: 6, + alignItems: 'stretch', + paddingHorizontal: 20, + }, + sliderButtonText: { + fontSize: 16, + color: colors.primary.inverse, + }, + quotesSummary: { + marginVertical: Device.isSmallDevice() ? 12 : 24, + }, + quotesSummaryHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + flexWrap: 'wrap', + }, + quotesRow: { + flexDirection: 'row', + flexWrap: 'wrap', + }, + quotesDescription: { + flex: 1, + flexWrap: 'wrap', + flexDirection: 'row', + marginRight: 3, + }, + quotesLegend: { + flexDirection: 'row', + flexWrap: 'wrap', + marginRight: 2, + alignItems: 'center', + }, + quotesFiatColumn: { + flex: 1, + marginLeft: 3, + flexWrap: 'wrap', + flexDirection: 'row', + justifyContent: 'flex-end', + }, + infoIcon: { + fontSize: 12, + margin: 3, + color: colors.primary.default, + }, + ctaButton: { + width: '100%', + }, + errorIcon: { + fontSize: 46, + marginVertical: 4, + color: colors.error.default, + }, + expiredIcon: { + color: colors.primary.default, + }, + disabled: { + opacity: 0.4, + }, + termsButton: { + marginTop: 10, + marginBottom: 6, + }, + gasInfoContainer: { + paddingHorizontal: 2, + }, + gasInfoIcon: { + color: colors.primary.default, + }, + hitSlop: { + top: 10, + left: 10, + bottom: 10, + right: 10, + }, + text: { + lineHeight: 20, + color: colors.text.default, + }, + fetchingText: { + color: colors.text.default, + }, + }); async function resetAndStartPolling({ slippage, sourceToken, destinationToken, sourceAmount, walletAddress }) { if (!sourceToken || !destinationToken) { @@ -314,6 +322,7 @@ function SwapsQuotesView({ const route = useRoute(); const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); const { sourceTokenAddress, destinationTokenAddress, sourceAmount, slippage, tokens } = useMemo( () => getQuotesNavigationsParams(route), @@ -1194,6 +1203,7 @@ function SwapsQuotesView({ return ( @@ -1298,7 +1308,7 @@ function SwapsQuotesView({ {isInFetch ? ( <> - {strings('swaps.fetching_new_quotes')} + {strings('swaps.fetching_new_quotes')} ) : ( diff --git a/app/components/UI/Swaps/components/ActionAlert.js b/app/components/UI/Swaps/components/ActionAlert.js index 4c645e64c88..c16a1c45f29 100644 --- a/app/components/UI/Swaps/components/ActionAlert.js +++ b/app/components/UI/Swaps/components/ActionAlert.js @@ -2,58 +2,59 @@ import React from 'react'; import PropTypes from 'prop-types'; import { View, StyleSheet, TouchableOpacity } from 'react-native'; import MaterialIcon from 'react-native-vector-icons/MaterialIcons'; -import { colors } from '../../../../styles/common'; import Alert, { AlertType } from '../../../Base/Alert'; import Text from '../../../Base/Text'; +import { useAppThemeFromContext } from '../../../../util/theme'; const AlertTypeKeys = Object.keys(AlertType); const VERTICAL_DISPLACEMENT = 12; -const styles = StyleSheet.create({ - content: { - flex: 1, - alignItems: 'center', - }, - contentWithAction: { - marginBottom: 10, - }, - wrapper: { - flexDirection: 'column', - flex: 1, - }, - action: { - marginTop: -5, - marginBottom: -VERTICAL_DISPLACEMENT, - bottom: -VERTICAL_DISPLACEMENT, - alignItems: 'center', - }, - button: { - paddingVertical: 6, - paddingHorizontal: 12, - borderRadius: 100, - }, - warningButton: { - backgroundColor: colors.yellow, - }, - errorButton: { - backgroundColor: colors.red, - }, - errorButtonText: { - color: colors.white, - }, - infoWrapper: { - position: 'absolute', - top: 3, - right: 3, - }, - warningInfoIcon: { - color: colors.grey500, - }, - errorInfoIcon: { - color: colors.red, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + content: { + flex: 1, + alignItems: 'center', + }, + contentWithAction: { + marginBottom: 10, + }, + wrapper: { + flexDirection: 'column', + flex: 1, + }, + action: { + marginTop: -5, + marginBottom: -VERTICAL_DISPLACEMENT, + bottom: -VERTICAL_DISPLACEMENT, + alignItems: 'center', + }, + button: { + paddingVertical: 6, + paddingHorizontal: 12, + borderRadius: 100, + }, + warningButton: { + backgroundColor: colors.warning.default, + }, + errorButton: { + backgroundColor: colors.error.default, + }, + errorButtonText: { + color: colors.error.inverse, + }, + infoWrapper: { + position: 'absolute', + top: 3, + right: 3, + }, + warningInfoIcon: { + color: colors.warning.default, + }, + errorInfoIcon: { + color: colors.error.default, + }, + }); -const getButtonStyle = (type) => { +const getButtonStyle = (type, styles) => { switch (type) { case AlertType.Error: { return styles.errorButton; @@ -65,7 +66,7 @@ const getButtonStyle = (type) => { } }; -const getInfoIconStyle = (type) => { +const getInfoIconStyle = (type, styles) => { switch (type) { case AlertType.Error: { return styles.errorInfoIcon; @@ -78,8 +79,11 @@ const getInfoIconStyle = (type) => { }; function Button({ type, onPress, children }) { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ( - + {children} @@ -94,6 +98,9 @@ Button.propTypes = { }; function ActionAlert({ type, style, action, onInfoPress, onPress, children }) { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ( {(textStyle) => ( @@ -114,7 +121,7 @@ function ActionAlert({ type, style, action, onInfoPress, onPress, children }) { hitSlop={{ top: 15, right: 15, bottom: 15, left: 15 }} onPress={onInfoPress} > - + )} diff --git a/app/components/UI/Swaps/components/InfoModal.js b/app/components/UI/Swaps/components/InfoModal.js index 66d160a331d..741b7919244 100644 --- a/app/components/UI/Swaps/components/InfoModal.js +++ b/app/components/UI/Swaps/components/InfoModal.js @@ -5,50 +5,55 @@ import Modal from 'react-native-modal'; import IonicIcon from 'react-native-vector-icons/Ionicons'; import Title from '../../../Base/Title'; -import { colors } from '../../../../styles/common'; +import { useAppThemeFromContext } from '../../../../util/theme'; -const styles = StyleSheet.create({ - modalView: { - backgroundColor: colors.white, - justifyContent: 'center', - alignItems: 'center', - marginVertical: 50, - borderRadius: 10, - shadowColor: colors.black, - shadowOffset: { - width: 0, - height: 5, +const createStyles = (colors) => + StyleSheet.create({ + modalView: { + backgroundColor: colors.background.default, + justifyContent: 'center', + alignItems: 'center', + marginVertical: 50, + borderRadius: 10, + shadowColor: colors.black, + shadowOffset: { + width: 0, + height: 5, + }, + shadowOpacity: 0.36, + shadowRadius: 6.68, + elevation: 11, }, - shadowOpacity: 0.36, - shadowRadius: 6.68, - elevation: 11, - }, - modal: { - margin: 0, - width: '100%', - padding: 25, - }, - title: { - width: '100%', - paddingVertical: 15, - paddingHorizontal: 20, - paddingBottom: 5, - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - }, - closeIcon: { - color: colors.black, - }, - body: { - width: '100%', - paddingVertical: 5, - marginBottom: 15, - paddingHorizontal: 20, - }, -}); + modal: { + margin: 0, + width: '100%', + padding: 25, + }, + title: { + width: '100%', + paddingVertical: 15, + paddingHorizontal: 20, + paddingBottom: 5, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + color: colors.text.default, + }, + closeIcon: { + color: colors.text.default, + }, + body: { + width: '100%', + paddingVertical: 5, + marginBottom: 15, + paddingHorizontal: 20, + }, + }); function InfoModal({ title, body, isVisible, toggleModal, propagateSwipe }) { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ( + StyleSheet.create({ + screen: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + backgroundColor: colors.background.default, }, - shadowOpacity: 0.45, - shadowRadius: 10, - elevation: 15, - }, - aggImage: { - width: 75, - height: 30, - }, - foxContainer: { - width: STAGE_SIZE, - height: STAGE_SIZE, - }, -}); - -const customStyle = ` + content: { + width: '100%', + paddingHorizontal: 60, + marginVertical: 15, + }, + progressWrapper: { + backgroundColor: colors.background.alternative, + height: 3, + borderRadius: 3, + marginVertical: 15, + }, + progressBar: { + backgroundColor: colors.primary.default, + height: 3, + width: 3, + borderRadius: 3, + flex: 1, + }, + aggContainer: { + position: 'absolute', + backgroundColor: colors.black, + paddingHorizontal: 10, + paddingVertical: 5, + borderRadius: 20, + opacity: 0, + top: '50%', + left: '50%', + shadowOffset: { + width: 0, + height: 4, + }, + shadowOpacity: 0.45, + shadowRadius: 10, + elevation: 15, + }, + aggImage: { + width: 75, + height: 30, + }, + foxContainer: { + width: STAGE_SIZE, + height: STAGE_SIZE, + }, + text: { + color: colors.text.default, + }, + }); + +const customStyle = (colors) => ` + body { + background-color: ${colors.background.default}; + } #head { height: 35%; top: 50%; @@ -125,6 +133,9 @@ function LoadingAnimation({ finish, onAnimationEnd, aggregatorMetadata, headPan outputRange: ['0%', '100%'], }); + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + /* Animation constructions */ /* @@ -372,7 +383,7 @@ function LoadingAnimation({ finish, onAnimationEnd, aggregatorMetadata, headPan {headPan ? ( <> - + {hasStarted ? ( <> {strings('swaps.quote')}{' '} @@ -384,17 +395,27 @@ function LoadingAnimation({ finish, onAnimationEnd, aggregatorMetadata, headPan '' )} - {!hasStarted && {strings('swaps.starting')}} + {!hasStarted && ( + + {strings('swaps.starting')} + + )} {hasStarted && !hasFinished && ( - + <Title style={styles.text} centered> {strings('swaps.checking')} {metadata[currentQuoteIndex]?.title}... )} - {hasFinished && {strings('swaps.finalizing')}} + {hasFinished && ( + + {strings('swaps.finalizing')} + + )} ) : ( <> - {strings('swaps.fetching_quotes')} + + {strings('swaps.fetching_quotes')} + )} @@ -406,7 +427,7 @@ function LoadingAnimation({ finish, onAnimationEnd, aggregatorMetadata, headPan null} /> {renderLogos && diff --git a/app/components/UI/Swaps/components/Onboarding.js b/app/components/UI/Swaps/components/Onboarding.js index 1161d9471f3..6caf6cada4e 100644 --- a/app/components/UI/Swaps/components/Onboarding.js +++ b/app/components/UI/Swaps/components/Onboarding.js @@ -6,50 +6,53 @@ import { strings } from '../../../../../locales/i18n'; import Device from '../../../../util/device'; import Text from '../../../Base/Text'; import StyledButton from '../../StyledButton'; +import { useAppThemeFromContext } from '../../../../util/theme'; /* eslint-disable import/no-commonjs */ const onboardingDeviceImage = require('../../../../images/swaps_onboard_device.png'); const swapsAggregators = require('../../../../images/swaps_aggs.png'); /* eslint-enable import/no-commonjs */ -const styles = StyleSheet.create({ - screen: { - flex: 1, - paddingHorizontal: 25, - justifyContent: 'space-between', - alignItems: 'center', - }, - content: { - flex: 1, - justifyContent: 'center', - marginVertical: 14, - }, - images: { - alignItems: 'center', - }, - title: { - fontSize: Device.isSmallDevice() ? 20 : 24, - marginHorizontal: 15, - marginBottom: Device.isSmallDevice() ? 16 : 24, - }, - aggregatorsImage: { - marginVertical: 14, - width: Device.isSmallDevice() ? 230 : 300, - height: Device.isSmallDevice() ? 85 : 110, - }, - learnMore: { - marginVertical: 14, - }, - learnMoreLink: { - paddingVertical: Device.isSmallDevice() ? 4 : 8, - }, - actionButtonWrapper: { - width: '100%', - }, - actionButton: { - marginVertical: 10, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + screen: { + flex: 1, + paddingHorizontal: 25, + justifyContent: 'space-between', + alignItems: 'center', + }, + content: { + flex: 1, + justifyContent: 'center', + marginVertical: 14, + }, + images: { + alignItems: 'center', + }, + title: { + fontSize: Device.isSmallDevice() ? 20 : 24, + marginHorizontal: 15, + marginBottom: Device.isSmallDevice() ? 16 : 24, + color: colors.text.default, + }, + aggregatorsImage: { + marginVertical: 14, + width: Device.isSmallDevice() ? 230 : 300, + height: Device.isSmallDevice() ? 85 : 110, + }, + learnMore: { + marginVertical: 14, + }, + learnMoreLink: { + paddingVertical: Device.isSmallDevice() ? 4 : 8, + }, + actionButtonWrapper: { + width: '100%', + }, + actionButton: { + marginVertical: 10, + }, + }); if (Platform.OS === 'android' && UIManager.setLayoutAnimationEnabledExperimental) { UIManager.setLayoutAnimationEnabledExperimental(true); @@ -57,6 +60,9 @@ if (Platform.OS === 'android' && UIManager.setLayoutAnimationEnabledExperimental function Onboarding({ setHasOnboarded }) { const navigation = useNavigation(); + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + const handleStartSwapping = useCallback(() => { LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut); setHasOnboarded(true); diff --git a/app/components/UI/Swaps/components/QuotesModal.js b/app/components/UI/Swaps/components/QuotesModal.js index 0b055b2915d..2bf1b10e4c8 100644 --- a/app/components/UI/Swaps/components/QuotesModal.js +++ b/app/components/UI/Swaps/components/QuotesModal.js @@ -23,113 +23,114 @@ import { weiToFiat, } from '../../../../util/number'; import { getQuotesSourceMessage } from '../utils'; - -import { colors } from '../../../../styles/common'; import Text from '../../../Base/Text'; import Title from '../../../Base/Title'; import Ratio from './Ratio'; +import { useAppThemeFromContext } from '../../../../util/theme'; -const styles = StyleSheet.create({ - modalView: { - backgroundColor: colors.white, - justifyContent: 'center', - alignItems: 'center', - marginVertical: 50, - borderRadius: 10, - shadowColor: colors.black, - shadowOffset: { - width: 0, - height: 5, +const createStyles = (colors) => + StyleSheet.create({ + modalView: { + backgroundColor: colors.background.default, + justifyContent: 'center', + alignItems: 'center', + marginVertical: 50, + borderRadius: 10, + shadowColor: colors.black, + shadowOffset: { + width: 0, + height: 5, + }, + shadowOpacity: 0.36, + shadowRadius: 6.68, + elevation: 11, }, - shadowOpacity: 0.36, - shadowRadius: 6.68, - elevation: 11, - }, - modal: { - margin: 0, - width: '100%', - padding: 25, - }, - title: { - width: '100%', - paddingVertical: 15, - paddingHorizontal: 20, - paddingBottom: 5, - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - }, - titleButton: { - flexDirection: 'row', - justifyContent: 'center', - alignItems: 'center', - }, - closeIcon: { - color: colors.black, - }, - backIcon: { - color: colors.black, - marginRight: 16, - }, - detailsIcon: { - color: colors.black, - paddingHorizontal: 10, - }, - body: { - width: '100%', - paddingVertical: 5, - }, - row: { - paddingHorizontal: 20, - flexDirection: 'row', - paddingVertical: 10, - }, - quoteRow: { - borderTopWidth: 1, - borderTopColor: colors.grey100, - paddingVertical: 15, - alignItems: 'center', - }, - detailsRow: { - paddingHorizontal: 20, - borderTopWidth: 1, - borderTopColor: colors.grey100, - paddingVertical: 15, - }, - selectedQuoteRow: { - backgroundColor: colors.blue000, - }, - columnAmount: { - flex: 3, - marginRight: 5, - }, - columnFee: { - flex: 3, - marginRight: 5, - }, - columnValue: { - flex: 3, - marginRight: 5, - }, - red: { - color: colors.red, - }, - bestBadge: { - flexDirection: 'row', - }, - bestBadgeWrapper: { - paddingVertical: 0, - paddingHorizontal: 8, - backgroundColor: colors.blue, - borderRadius: 4, - }, - bestBadgeText: { - color: colors.white, - }, - transparent: { - opacity: 0, - }, -}); + modal: { + margin: 0, + width: '100%', + padding: 25, + }, + title: { + width: '100%', + paddingVertical: 15, + paddingHorizontal: 20, + paddingBottom: 5, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + color: colors.text.default, + }, + titleButton: { + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + }, + closeIcon: { + color: colors.text.default, + }, + backIcon: { + color: colors.text.default, + marginRight: 16, + }, + detailsIcon: { + color: colors.text.default, + paddingHorizontal: 10, + }, + body: { + width: '100%', + paddingVertical: 5, + }, + row: { + paddingHorizontal: 20, + flexDirection: 'row', + paddingVertical: 10, + }, + quoteRow: { + borderTopWidth: 1, + borderTopColor: colors.border.muted, + paddingVertical: 15, + alignItems: 'center', + }, + detailsRow: { + paddingHorizontal: 20, + borderTopWidth: 1, + borderTopColor: colors.border.muted, + paddingVertical: 15, + }, + selectedQuoteRow: { + backgroundColor: colors.primary.muted, + }, + columnAmount: { + flex: 3, + marginRight: 5, + }, + columnFee: { + flex: 3, + marginRight: 5, + }, + columnValue: { + flex: 3, + marginRight: 5, + }, + red: { + color: colors.error.default, + }, + bestBadge: { + flexDirection: 'row', + }, + bestBadgeWrapper: { + paddingVertical: 0, + paddingHorizontal: 8, + backgroundColor: colors.primary.default, + borderRadius: 4, + }, + bestBadgeText: { + color: colors.primary.inverse, + }, + transparent: { + opacity: 0, + }, + }); if (Platform.OS === 'android' && UIManager.setLayoutAnimationEnabledExperimental) { UIManager.setLayoutAnimationEnabledExperimental(true); @@ -151,6 +152,8 @@ function QuotesModal({ const bestOverallValue = quoteValues?.[quotes[0].aggregator]?.overallValueOfQuote ?? 0; const [displayDetails, setDisplayDetails] = useState(false); const [selectedDetailsQuoteIndex, setSelectedDetailsQuoteIndex] = useState(null); + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); // When index/quotes change we get a new selected quote in case it exists // (quotes.length can be shorter than selected index) diff --git a/app/components/UI/Swaps/components/QuotesSummary.js b/app/components/UI/Swaps/components/QuotesSummary.js index 7201df768ac..cd98d5c461b 100644 --- a/app/components/UI/Swaps/components/QuotesSummary.js +++ b/app/components/UI/Swaps/components/QuotesSummary.js @@ -1,79 +1,96 @@ import React from 'react'; import PropTypes from 'prop-types'; import { View, StyleSheet, Image } from 'react-native'; -import { colors } from '../../../../styles/common'; import Text from '../../../Base/Text'; +import { useAppThemeFromContext } from '../../../../util/theme'; // eslint-disable-next-line import/no-commonjs const piggyBank = require('../../../../images/piggybank.png'); -const styles = StyleSheet.create({ - header: { - paddingVertical: 10, - paddingHorizontal: 15, - borderWidth: 1, - borderColor: colors.blue, - borderTopRightRadius: 10, - borderTopLeftRadius: 10, - backgroundColor: colors.blue000, - }, - headerWithPiggy: { - paddingLeft: 15 + 32 + 10, - }, - piggyBar: { - position: 'absolute', - top: -1, - left: 21, - height: 0, - width: 19, - borderTopWidth: 1, - borderColor: colors.blue000, - }, - piggyBank: { - position: 'absolute', - top: -12, - left: 15, - width: 32, - height: 44, - }, - headerText: { - color: colors.blue, - }, - body: { - paddingVertical: 10, - paddingHorizontal: 15, - borderWidth: 1, - borderTopWidth: 0, - borderColor: colors.blue, - borderBottomRightRadius: 10, - borderBottomLeftRadius: 10, - }, - separator: { - height: 0, - width: '100%', - borderTopWidth: 1, - marginVertical: 6, - borderTopColor: colors.grey100, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + header: { + paddingVertical: 10, + paddingHorizontal: 15, + borderWidth: 1, + borderColor: colors.primary.default, + borderTopRightRadius: 10, + borderTopLeftRadius: 10, + backgroundColor: colors.primary.muted, + }, + headerWithPiggy: { + paddingLeft: 15 + 32 + 10, + }, + piggyBar: { + position: 'absolute', + top: -1, + left: 21, + height: 0, + width: 19, + borderTopWidth: 1, + borderColor: colors.primary.muted, + }, + piggyBank: { + position: 'absolute', + top: -12, + left: 15, + width: 32, + height: 44, + }, + headerText: { + color: colors.primary.default, + }, + body: { + paddingVertical: 10, + paddingHorizontal: 15, + borderWidth: 1, + borderTopWidth: 0, + borderColor: colors.primary.default, + borderBottomRightRadius: 10, + borderBottomLeftRadius: 10, + }, + separator: { + height: 0, + width: '100%', + borderTopWidth: 1, + marginVertical: 6, + borderTopColor: colors.border.muted, + }, + }); const QuotesSummary = (props) => ; -const Header = ({ style, savings, children, ...props }) => ( - - {savings && ( - <> - - - - )} - {children} - -); +const Header = ({ style, savings, children, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ( + + {savings && ( + <> + + + + )} + {children} + + ); +}; -const Body = ({ style, ...props }) => ; -const HeaderText = ({ style, ...props }) => ; -const Separator = ({ style }) => ; +const Body = ({ style, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ; +}; +const HeaderText = ({ style, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ; +}; +const Separator = ({ style }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ; +}; QuotesSummary.Body = Body; QuotesSummary.Header = Header; diff --git a/app/components/UI/Swaps/components/Ratio.js b/app/components/UI/Swaps/components/Ratio.js index c6edc1742bf..d2a8f51fb87 100644 --- a/app/components/UI/Swaps/components/Ratio.js +++ b/app/components/UI/Swaps/components/Ratio.js @@ -2,20 +2,23 @@ import React, { useMemo, useState } from 'react'; import PropTypes from 'prop-types'; import { StyleSheet, TouchableOpacity } from 'react-native'; import FA5Icon from 'react-native-vector-icons/FontAwesome5'; -import { colors } from '../../../../styles/common'; import { useRatio } from '../utils'; - import Text from '../../../Base/Text'; -const styles = StyleSheet.create({ - infoIcon: { - fontSize: 12, - margin: 3, - color: colors.blue, - }, -}); +import { useAppThemeFromContext } from '../../../../util/theme'; + +const createStyles = (colors) => + StyleSheet.create({ + infoIcon: { + fontSize: 12, + margin: 3, + color: colors.primary.default, + }, + }); function Ratio({ sourceAmount, sourceToken, destinationAmount, destinationToken, boldSymbol = false }) { /* Get the ratio between the assets given the selected quote*/ const [ratioAsSource, setRatioAsSource] = useState(true); + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); const [numerator, denominator] = useMemo(() => { const source = { ...sourceToken, amount: sourceAmount }; diff --git a/app/components/UI/Swaps/components/SlippageModal.js b/app/components/UI/Swaps/components/SlippageModal.js index 85e61e86ecd..b71913c2eaf 100644 --- a/app/components/UI/Swaps/components/SlippageModal.js +++ b/app/components/UI/Swaps/components/SlippageModal.js @@ -2,42 +2,46 @@ import React from 'react'; import PropTypes from 'prop-types'; import { StyleSheet, SafeAreaView, View } from 'react-native'; import Modal from 'react-native-modal'; -import { colors } from '../../../../styles/common'; import ModalDragger from '../../../Base/ModalDragger'; import Text from '../../../Base/Text'; import SlippageSlider from '../../SlippageSlider'; import { strings } from '../../../../../locales/i18n'; +import { useAppThemeFromContext } from '../../../../util/theme'; -const styles = StyleSheet.create({ - modal: { - margin: 0, - justifyContent: 'flex-end', - }, - modalView: { - backgroundColor: colors.white, - borderTopLeftRadius: 10, - borderTopRightRadius: 10, - }, - content: { - marginVertical: 14, - paddingHorizontal: 30, - }, - slippageWrapper: { - marginVertical: 10, - }, - warningTextWrapper: { - position: 'absolute', - width: '85%', - bottom: 30, - left: 10, - }, - warningText: { - color: colors.red, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + modal: { + margin: 0, + justifyContent: 'flex-end', + }, + modalView: { + backgroundColor: colors.background.default, + borderTopLeftRadius: 10, + borderTopRightRadius: 10, + }, + content: { + marginVertical: 14, + paddingHorizontal: 30, + }, + slippageWrapper: { + marginVertical: 10, + }, + warningTextWrapper: { + position: 'absolute', + width: '85%', + bottom: 30, + left: 10, + }, + warningText: { + color: colors.error.default, + }, + }); function SlippageModal({ isVisible, dismiss, onChange, slippage }) { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ( + StyleSheet.create({ + icon: { + width: REGULAR_SIZE, + height: REGULAR_SIZE, + borderRadius: REGULAR_RADIUS, + }, + iconMedium: { + width: MEDIUM_SIZE, + height: MEDIUM_SIZE, + borderRadius: MEDIUM_RADIUS, + }, + iconBig: { + width: BIG_SIZE, + height: BIG_SIZE, + borderRadius: BIG_RADIUS, + }, + iconBiggest: { + width: BIGGEST_SIZE, + height: BIGGEST_SIZE, + borderRadius: BIGGEST_RADIUS, + }, + emptyIcon: { + backgroundColor: colors.border.default, + alignItems: 'center', + justifyContent: 'center', + }, + tokenSymbol: { + fontSize: 16, + textAlign: 'center', + textAlignVertical: 'center', + color: colors.text.default, + }, + tokenSymbolMedium: { + fontSize: 22, + color: colors.text.default, + }, + tokenSymbolBig: { + fontSize: 26, + color: colors.text.default, + }, + }); -const EmptyIcon = ({ medium, big, biggest, style, ...props }) => ( - -); +const EmptyIcon = ({ medium, big, biggest, style, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ( + + ); +}; EmptyIcon.propTypes = { medium: PropTypes.bool, @@ -81,6 +90,9 @@ EmptyIcon.propTypes = { }; function TokenIcon({ symbol, icon, medium, big, biggest, style }) { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + if (symbol === 'ETH' || symbol === 'BNB') { return ( + StyleSheet.create({ + modal: { + margin: 0, + justifyContent: 'flex-end', + }, + modalView: { + backgroundColor: colors.background.default, + borderTopLeftRadius: 10, + borderTopRightRadius: 10, + }, + content: { + marginVertical: 14, + paddingHorizontal: 30, + alignItems: 'center', + }, + alertIcon: { + paddingTop: 4, + paddingRight: 8, + }, + title: { + fontSize: 24, + marginVertical: 14, + color: colors.text.default, + }, + tokenTitle: { + fontSize: 18, + textAlign: 'center', + marginVertical: 14, + color: colors.text.default, + }, + tokenAddress: { + backgroundColor: colors.background.alternative, + width: '100%', + borderRadius: 20, + marginVertical: 6, + paddingHorizontal: 8, + paddingVertical: 4, + }, + cta: { + marginTop: 10, + width: '100%', + }, + }); function TokenImportModal({ isVisible, dismiss, token, onPressImport }) { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ( ( - + )} > {(textStyle) => {strings('swaps.add_warning')}} diff --git a/app/components/UI/Swaps/components/TokenSelectModal.js b/app/components/UI/Swaps/components/TokenSelectModal.js index 396e11827bc..d21731ea64c 100644 --- a/app/components/UI/Swaps/components/TokenSelectModal.js +++ b/app/components/UI/Swaps/components/TokenSelectModal.js @@ -24,7 +24,7 @@ import { balanceToFiat, hexToBN, renderFromTokenMinimalUnit, renderFromWei, weiT import { safeToChecksumAddress } from '../../../../util/address'; import { isSwapsNativeAsset } from '../utils'; import { strings } from '../../../../../locales/i18n'; -import { colors, fontStyles } from '../../../../styles/common'; +import { fontStyles } from '../../../../styles/common'; import Text from '../../../Base/Text'; import ListItem from '../../../Base/ListItem'; @@ -37,78 +37,82 @@ import useModalHandler from '../../../Base/hooks/useModalHandler'; import TokenImportModal from './TokenImportModal'; import Analytics from '../../../../core/Analytics'; import { ANALYTICS_EVENT_OPTS } from '../../../../util/analytics'; +import { useAppThemeFromContext } from '../../../../util/theme'; -const styles = StyleSheet.create({ - modal: { - margin: 0, - justifyContent: 'flex-end', - }, - modalView: { - backgroundColor: colors.white, - borderTopLeftRadius: 10, - borderTopRightRadius: 10, - }, - inputWrapper: { - flexDirection: 'row', - alignItems: 'center', - marginHorizontal: 30, - marginVertical: 10, - paddingVertical: Device.isAndroid() ? 0 : 10, - paddingHorizontal: 5, - borderRadius: 5, - borderWidth: 1, - borderColor: colors.grey100, - }, - searchIcon: { - marginHorizontal: 8, - }, - input: { - ...fontStyles.normal, - flex: 1, - }, - modalTitle: { - marginTop: Device.isIphone5() ? 10 : 15, - marginBottom: Device.isIphone5() ? 5 : 5, - }, - resultsView: { - height: Device.isSmallDevice() ? 200 : 280, - marginTop: 10, - }, - resultRow: { - borderTopWidth: StyleSheet.hairlineWidth, - borderColor: colors.grey100, - }, - emptyList: { - marginVertical: 10, - marginHorizontal: 30, - }, - importButton: { - paddingVertical: 6, - paddingHorizontal: 10, - backgroundColor: colors.blue, - borderRadius: 100, - }, - importButtonText: { - color: colors.white, - }, - loadingIndicator: { - margin: 10, - }, - loadingTokenView: { - marginVertical: 10, - marginHorizontal: 30, - justifyContent: 'center', - alignItems: 'center', - flexDirection: 'row', - }, - footer: { - padding: 30, - }, - footerIcon: { - paddingTop: 4, - paddingRight: 8, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + modal: { + margin: 0, + justifyContent: 'flex-end', + }, + modalView: { + backgroundColor: colors.background.default, + borderTopLeftRadius: 10, + borderTopRightRadius: 10, + }, + inputWrapper: { + flexDirection: 'row', + alignItems: 'center', + marginHorizontal: 30, + marginVertical: 10, + paddingVertical: Device.isAndroid() ? 0 : 10, + paddingHorizontal: 5, + borderRadius: 5, + borderWidth: 1, + borderColor: colors.border.default, + }, + searchIcon: { + marginHorizontal: 8, + color: colors.border.default, + }, + input: { + ...fontStyles.normal, + flex: 1, + color: colors.text.default, + }, + modalTitle: { + marginTop: Device.isIphone5() ? 10 : 15, + marginBottom: Device.isIphone5() ? 5 : 5, + }, + resultsView: { + height: Device.isSmallDevice() ? 200 : 280, + marginTop: 10, + }, + resultRow: { + borderTopWidth: StyleSheet.hairlineWidth, + borderColor: colors.border.default, + }, + emptyList: { + marginVertical: 10, + marginHorizontal: 30, + }, + importButton: { + paddingVertical: 6, + paddingHorizontal: 10, + backgroundColor: colors.primary.default, + borderRadius: 100, + }, + importButtonText: { + color: colors.primary.inverse, + }, + loadingIndicator: { + margin: 10, + }, + loadingTokenView: { + marginVertical: 10, + marginHorizontal: 30, + justifyContent: 'center', + alignItems: 'center', + flexDirection: 'row', + }, + footer: { + padding: 30, + }, + footerIcon: { + paddingTop: 4, + paddingRight: 8, + }, + }); const MAX_TOKENS_RESULTS = 20; @@ -136,6 +140,8 @@ function TokenSelectModal({ const [searchString, setSearchString] = useState(''); const explorer = useBlockExplorer(provider, frequentRpcList); const [isTokenImportVisible, , showTokenImportModal, hideTokenImportModal] = useModalHandler(false); + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); const excludedAddresses = useMemo( () => excludeAddresses.filter(Boolean).map((address) => address.toLowerCase()), @@ -222,7 +228,7 @@ function TokenSelectModal({ ); }, - [balances, accounts, selectedAddress, conversionRate, currentCurrency, tokenExchangeRates, onItemPress] + [balances, accounts, selectedAddress, conversionRate, currentCurrency, tokenExchangeRates, onItemPress, styles] ); const handleSearchPress = () => searchInput?.current?.focus(); @@ -264,7 +270,7 @@ function TokenSelectModal({ ( - + )} > {(textStyle) => ( @@ -287,7 +293,7 @@ function TokenSelectModal({ ), - [explorer.isValid, explorer.name, handleBlockExplorerPress] + [explorer.isValid, explorer.name, handleBlockExplorerPress, styles, colors] ); const renderEmptyList = useMemo( @@ -296,7 +302,7 @@ function TokenSelectModal({ {strings('swaps.no_tokens_result', { searchString })} ), - [searchString] + [searchString, styles] ); const handleSearchTextChange = useCallback((text) => { @@ -333,18 +339,13 @@ function TokenSelectModal({ ref={searchInput} style={styles.input} placeholder={strings('swaps.search_token')} - placeholderTextColor={colors.grey500} + placeholderTextColor={colors.text.muted} value={searchString} onChangeText={handleSearchTextChange} /> {searchString.length > 0 && ( - + )} diff --git a/app/components/UI/Swaps/index.js b/app/components/UI/Swaps/index.js index 965ffae1179..d8e9167db07 100644 --- a/app/components/UI/Swaps/index.js +++ b/app/components/UI/Swaps/index.js @@ -33,7 +33,6 @@ import Engine from '../../../core/Engine'; import AppConstants from '../../../core/AppConstants'; import { strings } from '../../../../locales/i18n'; -import { colors } from '../../../styles/common'; import { setQuotesNavigationsParams, isSwapsNativeAsset, isDynamicToken } from './utils'; import { getSwapsAmountNavbar } from '../Navbar'; @@ -55,86 +54,89 @@ import { AlertType } from '../../Base/Alert'; import { isZero, gte } from '../../../util/lodash'; import { useAppThemeFromContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - screen: { - flexGrow: 1, - justifyContent: 'space-between', - }, - content: { - flexGrow: 1, - justifyContent: 'center', - }, - keypad: { - flexGrow: 1, - justifyContent: 'space-around', - }, - tokenButtonContainer: { - flexDirection: 'row', - justifyContent: 'center', - margin: Device.isIphone5() ? 5 : 10, - }, - amountContainer: { - alignItems: 'center', - justifyContent: 'center', - marginHorizontal: 25, - }, - amount: { - textAlignVertical: 'center', - fontSize: Device.isIphone5() ? 30 : 40, - height: Device.isIphone5() ? 40 : 50, - }, - amountInvalid: { - color: colors.red, - }, - verifyToken: { - marginHorizontal: 40, - }, - tokenAlert: { - marginTop: 10, - marginHorizontal: 30, - }, - linkText: { - color: colors.blue, - }, - horizontalRuleContainer: { - flexDirection: 'row', - paddingHorizontal: 30, - marginVertical: Device.isIphone5() ? 5 : 10, - alignItems: 'center', - }, - horizontalRule: { - flex: 1, - borderBottomWidth: StyleSheet.hairlineWidth, - height: 1, - borderBottomColor: colors.grey100, - }, - arrowDown: { - color: colors.blue, - fontSize: 25, - marginHorizontal: 15, - }, - buttonsContainer: { - marginTop: Device.isIphone5() ? 10 : 30, - marginBottom: 5, - paddingHorizontal: 30, - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - }, - column: { - flex: 1, - }, - ctaContainer: { - flexDirection: 'row', - justifyContent: 'flex-end', - }, - cta: { - paddingHorizontal: Device.isIphone5() ? 10 : 20, - }, - disabled: { - opacity: 0.4, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + container: { backgroundColor: colors.background.default }, + screen: { + flexGrow: 1, + justifyContent: 'space-between', + backgroundColor: colors.background.default, + }, + content: { + flexGrow: 1, + justifyContent: 'center', + }, + keypad: { + flexGrow: 1, + justifyContent: 'space-around', + }, + tokenButtonContainer: { + flexDirection: 'row', + justifyContent: 'center', + margin: Device.isIphone5() ? 5 : 10, + }, + amountContainer: { + alignItems: 'center', + justifyContent: 'center', + marginHorizontal: 25, + }, + amount: { + textAlignVertical: 'center', + fontSize: Device.isIphone5() ? 30 : 40, + height: Device.isIphone5() ? 40 : 50, + }, + amountInvalid: { + color: colors.error.default, + }, + verifyToken: { + marginHorizontal: 40, + }, + tokenAlert: { + marginTop: 10, + marginHorizontal: 30, + }, + linkText: { + color: colors.primary.default, + }, + horizontalRuleContainer: { + flexDirection: 'row', + paddingHorizontal: 30, + marginVertical: Device.isIphone5() ? 5 : 10, + alignItems: 'center', + }, + horizontalRule: { + flex: 1, + borderBottomWidth: StyleSheet.hairlineWidth, + height: 1, + borderBottomColor: colors.border.muted, + }, + arrowDown: { + color: colors.primary.default, + fontSize: 25, + marginHorizontal: 15, + }, + buttonsContainer: { + marginTop: Device.isIphone5() ? 10 : 30, + marginBottom: 5, + paddingHorizontal: 30, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + }, + column: { + flex: 1, + }, + ctaContainer: { + flexDirection: 'row', + justifyContent: 'flex-end', + }, + cta: { + paddingHorizontal: Device.isIphone5() ? 10 : 20, + }, + disabled: { + opacity: 0.4, + }, + }); const SWAPS_NATIVE_ADDRESS = swapsUtils.NATIVE_SWAPS_TOKEN_ADDRESS; const TOKEN_MINIMUM_SOURCES = 1; @@ -161,6 +163,7 @@ function SwapsAmountView({ const navigation = useNavigation(); const route = useRoute(); const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); const explorer = useBlockExplorer(provider, frequentRpcList); const initialSource = route.params?.sourceToken ?? SWAPS_NATIVE_ADDRESS; @@ -468,14 +471,14 @@ function SwapsAmountView({ if (!userHasOnboarded) { return ( - + ); } return ( - + Date: Thu, 10 Feb 2022 21:49:21 -0800 Subject: [PATCH 28/77] Replacing jpg with pngs (#3734) --- .../UI/OnboardingScreenWithBg/index.js | 8 ++++---- app/images/welcome-bg1.jpg | Bin 7715 -> 0 bytes app/images/welcome-bg1.png | Bin 0 -> 7823 bytes app/images/welcome-bg1@2x.jpg | Bin 19298 -> 0 bytes app/images/welcome-bg1@2x.png | Bin 0 -> 74925 bytes app/images/welcome-bg1@3x.jpg | Bin 34061 -> 0 bytes app/images/welcome-bg1@3x.png | Bin 0 -> 146378 bytes app/images/welcome-bg2.jpg | Bin 7083 -> 0 bytes app/images/welcome-bg2.png | Bin 0 -> 21265 bytes app/images/welcome-bg2@2x.jpg | Bin 17705 -> 0 bytes app/images/welcome-bg2@2x.png | Bin 0 -> 63544 bytes app/images/welcome-bg2@3x.jpg | Bin 31629 -> 0 bytes app/images/welcome-bg2@3x.png | Bin 0 -> 124170 bytes app/images/welcome-bg3.jpg | Bin 5323 -> 0 bytes app/images/welcome-bg3.png | Bin 0 -> 11781 bytes app/images/welcome-bg3@2x.jpg | Bin 14195 -> 0 bytes app/images/welcome-bg3@2x.png | Bin 0 -> 32348 bytes app/images/welcome-bg3@3x.jpg | Bin 26536 -> 0 bytes app/images/welcome-bg3@3x.png | Bin 0 -> 62247 bytes app/images/welcome-bg4.jpg | Bin 3977 -> 0 bytes app/images/welcome-bg4.png | Bin 0 -> 11892 bytes app/images/welcome-bg4@2x.jpg | Bin 11350 -> 0 bytes app/images/welcome-bg4@2x.png | Bin 0 -> 35765 bytes app/images/welcome-bg4@3x.jpg | Bin 22497 -> 0 bytes app/images/welcome-bg4@3x.png | Bin 0 -> 71823 bytes 25 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 app/images/welcome-bg1.jpg create mode 100644 app/images/welcome-bg1.png delete mode 100644 app/images/welcome-bg1@2x.jpg create mode 100644 app/images/welcome-bg1@2x.png delete mode 100644 app/images/welcome-bg1@3x.jpg create mode 100644 app/images/welcome-bg1@3x.png delete mode 100644 app/images/welcome-bg2.jpg create mode 100644 app/images/welcome-bg2.png delete mode 100644 app/images/welcome-bg2@2x.jpg create mode 100644 app/images/welcome-bg2@2x.png delete mode 100644 app/images/welcome-bg2@3x.jpg create mode 100644 app/images/welcome-bg2@3x.png delete mode 100755 app/images/welcome-bg3.jpg create mode 100644 app/images/welcome-bg3.png delete mode 100755 app/images/welcome-bg3@2x.jpg create mode 100644 app/images/welcome-bg3@2x.png delete mode 100755 app/images/welcome-bg3@3x.jpg create mode 100644 app/images/welcome-bg3@3x.png delete mode 100755 app/images/welcome-bg4.jpg create mode 100644 app/images/welcome-bg4.png delete mode 100755 app/images/welcome-bg4@2x.jpg create mode 100644 app/images/welcome-bg4@2x.png delete mode 100755 app/images/welcome-bg4@3x.jpg create mode 100644 app/images/welcome-bg4@3x.png diff --git a/app/components/UI/OnboardingScreenWithBg/index.js b/app/components/UI/OnboardingScreenWithBg/index.js index 4dab4489c65..7885bcc45de 100644 --- a/app/components/UI/OnboardingScreenWithBg/index.js +++ b/app/components/UI/OnboardingScreenWithBg/index.js @@ -4,10 +4,10 @@ import { StyleSheet, ImageBackground, View } from 'react-native'; import { useAppThemeFromContext } from '../../../util/theme'; const images = { - a: require('../../../images/welcome-bg1.jpg'), // eslint-disable-line - b: require('../../../images/welcome-bg2.jpg'), // eslint-disable-line - c: require('../../../images/welcome-bg3.jpg'), // eslint-disable-line - d: require('../../../images/welcome-bg4.jpg'), // eslint-disable-line + a: require('../../../images/welcome-bg1.png'), // eslint-disable-line + b: require('../../../images/welcome-bg2.png'), // eslint-disable-line + c: require('../../../images/welcome-bg3.png'), // eslint-disable-line + d: require('../../../images/welcome-bg4.png'), // eslint-disable-line carousel: null, }; diff --git a/app/images/welcome-bg1.jpg b/app/images/welcome-bg1.jpg deleted file mode 100644 index 76664e541b666c03236e8eb01b481b844c6a72e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7715 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 diff --git a/app/images/welcome-bg1.png b/app/images/welcome-bg1.png new file mode 100644 index 0000000000000000000000000000000000000000..e26afd0e8d9ca54ecb5a2beb66f5f350e7fc6e76 GIT binary patch literal 7823 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 Mbd4XBX* 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

k>J4D{iB>YUgn@xMNZ!Rl3$byG1L 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ͺ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 z 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 uwQZGhvvK2h>FDml!r$K7^ literal 0 HcmV?d00001 diff --git a/app/images/welcome-bg2@2x.jpg b/app/images/welcome-bg2@2x.jpg deleted file mode 100644 index be34c99c26458e565efe29f8e179c8b9e183a083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17705 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

%myrVZgM@IOcv>19QdHGSlia3EH`L%a&6Sj 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 literal 0 HcmV?d00001 diff --git a/app/images/welcome-bg2@3x.jpg b/app/images/welcome-bg2@3x.jpg deleted file mode 100644 index 877abd5628bee5b4714a556daa28177880eddf6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31629 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

;8eCS+q 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 diff --git a/app/images/welcome-bg2@3x.png b/app/images/welcome-bg2@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d6a01293b965fd784941573f747caf486be7a389 GIT binary patch literal 124170 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 F|366&$y@*c literal 0 HcmV?d00001 diff --git a/app/images/welcome-bg3.jpg b/app/images/welcome-bg3.jpg deleted file mode 100755 index 00921793c6367805a8e2045e28e450bac694d746..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5323 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 diff --git a/app/images/welcome-bg3.png b/app/images/welcome-bg3.png new file mode 100644 index 0000000000000000000000000000000000000000..0d652f093b470b4bffc1ac3367570ef34b2dda82 GIT binary patch literal 11781 zcmeHt_dAzD*a}cOH zp5fH&G6*D){^r$lT_38Q8GqMzHi)&oHJKSvCc0MnfE~$ zAJY6A{`;vI+{WI1(%`K$M6>>yrhTFr%0Ak#x60_N^}`3_qL68t$!m8LpM1qN{Uh`w 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 literal 0 HcmV?d00001 diff --git a/app/images/welcome-bg3@2x.jpg b/app/images/welcome-bg3@2x.jpg deleted file mode 100755 index 32c5120afefd16090e407e6cfdc73df3e7c66647..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14195 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 diff --git a/app/images/welcome-bg3@2x.png b/app/images/welcome-bg3@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2a439c17b698d49476755ef9f41682a123eb9d9b GIT binary patch literal 32348 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 literal 0 HcmV?d00001 diff --git a/app/images/welcome-bg3@3x.jpg b/app/images/welcome-bg3@3x.jpg deleted file mode 100755 index d447453956e73dfe691c79e1372f1356dc5ffc9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26536 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 C&#!U- diff --git a/app/images/welcome-bg3@3x.png b/app/images/welcome-bg3@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0249fe77dad88f8a28a60fef8b59aa3414e08a0c GIT binary patch literal 62247 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%0Dn>u&V(L0;bC2 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 X?}Zl|&d*`%00000NkvXXu0mjffutV; literal 0 HcmV?d00001 diff --git a/app/images/welcome-bg4.jpg b/app/images/welcome-bg4.jpg deleted file mode 100755 index a1d39d1006898cd7f6c2796e5d400bbade969b1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3977 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 J%IN8<{|7-^Qr`do literal 0 HcmV?d00001 diff --git a/app/images/welcome-bg4@2x.jpg b/app/images/welcome-bg4@2x.jpg deleted file mode 100755 index 5f0292d4a2119310fe76f4103b607eeb5263ead5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11350 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 ggZ`1B%p+r_9rqIA5_g?RsaA1 diff --git a/app/images/welcome-bg4@2x.png b/app/images/welcome-bg4@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..aaaf43d30d3444f85379edd7d09534b6c0c893b3 GIT binary patch literal 35765 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ⅈ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 literal 0 HcmV?d00001 diff --git a/app/images/welcome-bg4@3x.jpg b/app/images/welcome-bg4@3x.jpg deleted file mode 100755 index 28612b74191c99cb02eb342960c785289ac16500..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22497 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 Date: Fri, 11 Feb 2022 00:31:31 -0800 Subject: [PATCH 29/77] Update send flow with dark theme colors --- .eslintrc.js | 2 +- app/components/Base/RangeInput.js | 158 +++--- .../UI/AccountList/AccountElement/index.js | 139 ++--- app/components/UI/AccountList/index.js | 103 ++-- .../UI/ActionModal/ActionContent/index.js | 74 +-- app/components/UI/CollectibleMedia/index.js | 91 ++-- app/components/UI/CustomNonceModal/index.js | 196 ++++---- app/components/UI/EditGasFee1559/index.js | 227 +++++---- app/components/UI/EditGasFeeLegacy/index.js | 169 ++++--- app/components/UI/Navbar/index.js | 4 +- .../TransactionReviewEIP1559/index.js | 118 +++-- .../Views/SendFlow/AddressElement/index.js | 63 +-- .../Views/SendFlow/AddressInputs/index.js | 257 +++++----- .../Views/SendFlow/AddressList/index.js | 104 ++-- app/components/Views/SendFlow/Amount/index.js | 474 +++++++++--------- .../Views/SendFlow/Confirm/index.js | 300 +++++------ app/components/Views/SendFlow/SendTo/index.js | 270 +++++----- 17 files changed, 1442 insertions(+), 1307 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 3abaf112e37..68200c09a3c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -119,7 +119,7 @@ module.exports = { 'eslint-comments/no-unused-disable': 0, 'react-native/no-color-literals': 2, 'react-native/no-inline-styles': 2, - 'react-native/no-unused-styles': 2, + 'react-native/no-unused-styles': 0, 'react-native/split-platform-components': 2, 'react/jsx-boolean-value': 2, 'react/jsx-key': 1, diff --git a/app/components/Base/RangeInput.js b/app/components/Base/RangeInput.js index 7e2ff10bb7c..e8694673ea3 100644 --- a/app/components/Base/RangeInput.js +++ b/app/components/Base/RangeInput.js @@ -1,87 +1,88 @@ import React, { useCallback, useRef, useEffect, useState } from 'react'; import { View, TextInput, StyleSheet, TouchableOpacity } from 'react-native'; -import { colors } from '../../styles/common'; import FontAwesomeIcon from 'react-native-vector-icons/FontAwesome'; import Text from './Text'; import PropTypes from 'prop-types'; import BigNumber from 'bignumber.js'; +import { useAppThemeFromContext } from '../../util/theme'; -const styles = StyleSheet.create({ - labelContainer: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - marginBottom: 14, - }, - rangeInputContainer: (error) => ({ - borderColor: error ? colors.red : colors.grey200, - borderWidth: 1, - borderRadius: 6, - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - height: 42, - }), - input: (error) => ({ - height: 38, - minWidth: 10, - paddingRight: 6, - color: error ? colors.red : colors.black, - }), - buttonContainerLeft: { - marginLeft: 17, - flex: 1, - }, - buttonContainerRight: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'flex-end', - marginRight: 17, - flex: 1, - }, - button: { - borderRadius: 100, - borderWidth: 2, - borderColor: colors.blue, - height: 20, - width: 20, - alignItems: 'center', - justifyContent: 'center', - }, - buttonText: { - paddingTop: 1, - paddingLeft: 0.5, - color: colors.blue, - }, - hitSlop: { - top: 10, - left: 10, - bottom: 10, - right: 10, - }, - inputContainer: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'center', - }, - errorContainer: { - marginTop: 8, - color: colors.red, - flexDirection: 'row', - alignItems: 'center', - }, - errorIcon: { - paddingRight: 4, - color: colors.red, - }, - conversionEstimation: { - paddingLeft: 2, - marginRight: 14, - flex: 1, - textAlign: 'center', - fontSize: 11, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + labelContainer: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginBottom: 14, + }, + rangeInputContainer: (error) => ({ + borderColor: error ? colors.error.default : colors.border.default, + borderWidth: 1, + borderRadius: 6, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + height: 42, + }), + input: (error) => ({ + height: 38, + minWidth: 10, + paddingRight: 6, + color: error ? colors.error.default : colors.text.default, + }), + buttonContainerLeft: { + marginLeft: 17, + flex: 1, + }, + buttonContainerRight: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'flex-end', + marginRight: 17, + flex: 1, + }, + button: { + borderRadius: 100, + borderWidth: 2, + borderColor: colors.primary.default, + height: 20, + width: 20, + alignItems: 'center', + justifyContent: 'center', + }, + buttonText: { + paddingTop: 1, + paddingLeft: 0.5, + color: colors.primary.default, + }, + hitSlop: { + top: 10, + left: 10, + bottom: 10, + right: 10, + }, + inputContainer: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + }, + errorContainer: { + marginTop: 8, + color: colors.error.default, + flexDirection: 'row', + alignItems: 'center', + }, + errorIcon: { + paddingRight: 4, + color: colors.error.default, + }, + conversionEstimation: { + paddingLeft: 2, + marginRight: 14, + flex: 1, + textAlign: 'center', + fontSize: 11, + }, + }); const RangeInput = ({ leftLabelComponent, @@ -98,6 +99,9 @@ const RangeInput = ({ }) => { const textInput = useRef(null); const [errorState, setErrorState] = useState(); + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + const handleClickUnit = useCallback(() => { textInput?.current?.focus?.(); }, []); diff --git a/app/components/UI/AccountList/AccountElement/index.js b/app/components/UI/AccountList/AccountElement/index.js index 66ada80a18f..7c395f75d66 100644 --- a/app/components/UI/AccountList/AccountElement/index.js +++ b/app/components/UI/AccountList/AccountElement/index.js @@ -2,81 +2,83 @@ import React, { PureComponent } from 'react'; import Identicon from '../../Identicon'; import PropTypes from 'prop-types'; import { TouchableOpacity, StyleSheet, Text, View } from 'react-native'; -import { colors, fontStyles } from '../../../../styles/common'; +import { fontStyles } from '../../../../styles/common'; import { renderFromWei } from '../../../../util/number'; import { getTicker } from '../../../../util/transactions'; import { isDefaultAccountName } from '../../../../util/ENSUtils'; import { strings } from '../../../../../locales/i18n'; import Icon from 'react-native-vector-icons/MaterialCommunityIcons'; import { connect } from 'react-redux'; +import { ThemeContext } from '../../../../util/theme'; const EMPTY = '0x0'; const BALANCE_KEY = 'balance'; -const styles = StyleSheet.create({ - account: { - borderBottomWidth: StyleSheet.hairlineWidth, - borderColor: colors.grey100, - flexDirection: 'row', - paddingHorizontal: 20, - paddingVertical: 20, - height: 80, - }, - disabledAccount: { - opacity: 0.5, - }, - accountInfo: { - marginLeft: 15, - marginRight: 0, - flex: 1, - flexDirection: 'row', - }, - accountLabel: { - fontSize: 18, - color: colors.fontPrimary, - ...fontStyles.normal, - }, - accountBalanceWrapper: { - display: 'flex', - flexDirection: 'row', - }, - accountBalance: { - paddingTop: 5, - fontSize: 12, - color: colors.fontSecondary, - ...fontStyles.normal, - }, - accountBalanceError: { - color: colors.fontError, - marginLeft: 4, - }, - importedView: { - flex: 0.5, - alignItems: 'center', - marginTop: 2, - }, - accountMain: { - flex: 1, - flexDirection: 'column', - }, - selectedWrapper: { - flex: 0.2, - alignItems: 'flex-end', - }, - importedText: { - color: colors.grey400, - fontSize: 10, - ...fontStyles.bold, - }, - importedWrapper: { - width: 73, - paddingHorizontal: 10, - paddingVertical: 3, - borderRadius: 10, - borderWidth: 1, - borderColor: colors.grey400, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + account: { + borderBottomWidth: StyleSheet.hairlineWidth, + borderColor: colors.border.muted, + flexDirection: 'row', + paddingHorizontal: 20, + paddingVertical: 20, + height: 80, + }, + disabledAccount: { + opacity: 0.5, + }, + accountInfo: { + marginLeft: 15, + marginRight: 0, + flex: 1, + flexDirection: 'row', + }, + accountLabel: { + fontSize: 18, + color: colors.text.default, + ...fontStyles.normal, + }, + accountBalanceWrapper: { + display: 'flex', + flexDirection: 'row', + }, + accountBalance: { + paddingTop: 5, + fontSize: 12, + color: colors.text.alternative, + ...fontStyles.normal, + }, + accountBalanceError: { + color: colors.error.default, + marginLeft: 4, + }, + importedView: { + flex: 0.5, + alignItems: 'center', + marginTop: 2, + }, + accountMain: { + flex: 1, + flexDirection: 'column', + }, + selectedWrapper: { + flex: 0.2, + alignItems: 'flex-end', + }, + importedText: { + color: colors.text.alternative, + fontSize: 10, + ...fontStyles.bold, + }, + importedWrapper: { + width: 73, + paddingHorizontal: 10, + paddingVertical: 3, + borderRadius: 10, + borderWidth: 1, + borderColor: colors.text.alternative, + }, + }); /** * View that renders specific account element in AccountList @@ -121,7 +123,10 @@ class AccountElement extends PureComponent { render() { const { disabled, updatedBalanceFromStore, ticker } = this.props; const { address, name, ens, isSelected, isImported, balanceError } = this.props.item; - const selected = isSelected ? : null; + const { colors } = this.context; + const styles = createStyles(colors); + + const selected = isSelected ? : null; const imported = isImported ? ( @@ -187,4 +192,6 @@ const mapStateToProps = ( }; }; +AccountElement.contextType = ThemeContext; + export default connect(mapStateToProps)(AccountElement); diff --git a/app/components/UI/AccountList/index.js b/app/components/UI/AccountList/index.js index ad97525dc87..b071fcacb5a 100644 --- a/app/components/UI/AccountList/index.js +++ b/app/components/UI/AccountList/index.js @@ -12,7 +12,7 @@ import { View, SafeAreaView, } from 'react-native'; -import { colors, fontStyles } from '../../../styles/common'; +import { fontStyles } from '../../../styles/common'; import Device from '../../../util/device'; import { strings } from '../../../../locales/i18n'; import { toChecksumAddress } from 'ethereumjs-util'; @@ -23,53 +23,55 @@ import { ANALYTICS_EVENT_OPTS } from '../../../util/analytics'; import { doENSReverseLookup } from '../../../util/ENSUtils'; import AccountElement from './AccountElement'; import { connect } from 'react-redux'; +import { ThemeContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - borderTopLeftRadius: 10, - borderTopRightRadius: 10, - minHeight: 450, - }, - titleWrapper: { - width: '100%', - height: 33, - alignItems: 'center', - justifyContent: 'center', - borderBottomWidth: StyleSheet.hairlineWidth, - borderColor: colors.grey100, - }, - dragger: { - width: 48, - height: 5, - borderRadius: 4, - backgroundColor: colors.grey400, - opacity: Device.isAndroid() ? 0.6 : 0.5, - }, - accountsWrapper: { - flex: 1, - }, - footer: { - height: Device.isIphoneX() ? 140 : 110, - paddingBottom: Device.isIphoneX() ? 30 : 0, - justifyContent: 'center', - flexDirection: 'column', - alignItems: 'center', - }, - btnText: { - fontSize: 14, - color: colors.blue, - ...fontStyles.normal, - }, - footerButton: { - width: '100%', - height: 55, - alignItems: 'center', - justifyContent: 'center', - borderTopWidth: StyleSheet.hairlineWidth, - borderColor: colors.grey100, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + borderTopLeftRadius: 10, + borderTopRightRadius: 10, + minHeight: 450, + }, + titleWrapper: { + width: '100%', + height: 33, + alignItems: 'center', + justifyContent: 'center', + borderBottomWidth: StyleSheet.hairlineWidth, + borderColor: colors.border.muted, + }, + dragger: { + width: 48, + height: 5, + borderRadius: 4, + backgroundColor: colors.border.default, + opacity: Device.isAndroid() ? 0.6 : 0.5, + }, + accountsWrapper: { + flex: 1, + }, + footer: { + height: Device.isIphoneX() ? 140 : 110, + paddingBottom: Device.isIphoneX() ? 30 : 0, + justifyContent: 'center', + flexDirection: 'column', + alignItems: 'center', + }, + btnText: { + fontSize: 14, + color: colors.primary.default, + ...fontStyles.normal, + }, + footerButton: { + width: '100%', + height: 55, + alignItems: 'center', + justifyContent: 'center', + borderTopWidth: StyleSheet.hairlineWidth, + borderColor: colors.border.muted, + }, + }); /** * View that contains the list of all the available accounts @@ -353,6 +355,9 @@ class AccountList extends PureComponent { render() { const { orderedAccounts } = this.state; const { enableAccountsAddition } = this.props; + const { colors } = this.context; + const styles = createStyles(colors); + return ( @@ -375,7 +380,7 @@ class AccountList extends PureComponent { onPress={this.addAccount} > {this.state.loading ? ( - + ) : ( {strings('accounts.create_new_account')} )} @@ -394,6 +399,8 @@ class AccountList extends PureComponent { } } +AccountList.contextType = ThemeContext; + const mapStateToProps = (state) => ({ accounts: state.engine.backgroundState.AccountTrackerController.accounts, thirdPartyApiMode: state.privacy.thirdPartyApiMode, diff --git a/app/components/UI/ActionModal/ActionContent/index.js b/app/components/UI/ActionModal/ActionContent/index.js index 06f9f79202d..a5f1e43f6d1 100644 --- a/app/components/UI/ActionModal/ActionContent/index.js +++ b/app/components/UI/ActionModal/ActionContent/index.js @@ -1,44 +1,45 @@ import React from 'react'; import PropTypes from 'prop-types'; import { StyleSheet, View } from 'react-native'; -import { colors } from '../../../../styles/common'; import StyledButton from '../../StyledButton'; import { strings } from '../../../../../locales/i18n'; +import { useAppThemeFromContext } from '../../../../util/theme'; -const styles = StyleSheet.create({ - viewWrapper: { - flexDirection: 'column', - justifyContent: 'center', - alignItems: 'center', - marginHorizontal: 24, - }, - viewContainer: { - width: '100%', - backgroundColor: colors.white, - borderRadius: 10, - }, - actionHorizontalContainer: { - flexDirection: 'row', - padding: 16, - borderTopWidth: 1, - borderTopColor: colors.grey200, - }, - actionVerticalContainer: { - flexDirection: 'column', - paddingHorizontal: 16, - paddingVertical: 8, - }, - childrenContainer: { - flexDirection: 'row', - alignItems: 'center', - }, - button: { - margin: 8, - }, - buttonHorizontal: { - flex: 1, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + viewWrapper: { + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + marginHorizontal: 24, + }, + viewContainer: { + width: '100%', + backgroundColor: colors.background.default, + borderRadius: 10, + }, + actionHorizontalContainer: { + flexDirection: 'row', + padding: 16, + borderTopWidth: 1, + borderTopColor: colors.border.muted, + }, + actionVerticalContainer: { + flexDirection: 'column', + paddingHorizontal: 16, + paddingVertical: 8, + }, + childrenContainer: { + flexDirection: 'row', + alignItems: 'center', + }, + button: { + margin: 8, + }, + buttonHorizontal: { + flex: 1, + }, + }); /** * View that renders the content of an action modal @@ -65,6 +66,9 @@ export default function ActionContent({ childrenContainerStyle, verticalButtons, }) { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ( diff --git a/app/components/UI/CollectibleMedia/index.js b/app/components/UI/CollectibleMedia/index.js index 547ebf48e80..21564218ce6 100644 --- a/app/components/UI/CollectibleMedia/index.js +++ b/app/components/UI/CollectibleMedia/index.js @@ -3,58 +3,59 @@ import PropTypes from 'prop-types'; import { StyleSheet, View, ViewPropTypes } from 'react-native'; import RemoteImage from '../../Base/RemoteImage'; import MediaPlayer from '../../Views/MediaPlayer'; -import { colors } from '../../../styles/common'; import AppConstants from '../../../core/AppConstants'; import scaling from '../../../util/scaling'; import { toLowerCaseEquals } from '../../../util/general'; import Text from '../../Base/Text'; import Device from '../../../util/device'; +import { useAppThemeFromContext } from '../../../util/theme'; const MEDIA_WIDTH_MARGIN = Device.isMediumDevice() ? 32 : 0; -const styles = StyleSheet.create({ - container(backgroundColor) { - return { - flex: 0, +const createStyles = (colors) => + StyleSheet.create({ + container(backgroundColor) { + return { + flex: 0, + borderRadius: 12, + backgroundColor: `#${backgroundColor}`, + }; + }, + tinyImage: { + width: 32, + height: 32, + }, + smallImage: { + width: 50, + height: 50, + }, + bigImage: { + height: 260, + width: 260, + }, + cover: { + height: scaling.scale(Device.getDeviceWidth() - MEDIA_WIDTH_MARGIN, { baseModel: 2 }), + }, + image: { borderRadius: 12, - backgroundColor: `#${backgroundColor}`, - }; - }, - tinyImage: { - width: 32, - height: 32, - }, - smallImage: { - width: 50, - height: 50, - }, - bigImage: { - height: 260, - width: 260, - }, - cover: { - height: scaling.scale(Device.getDeviceWidth() - MEDIA_WIDTH_MARGIN, { baseModel: 2 }), - }, - image: { - borderRadius: 12, - }, - textContainer: { - alignItems: 'center', - justifyContent: 'center', - backgroundColor: colors.grey100, - borderRadius: 8, - }, - textWrapper: { - textAlign: 'center', - }, - textWrapperIcon: { - textAlign: 'center', - fontSize: 18, - }, - mediaPlayer: { - minHeight: 10, - }, -}); + }, + textContainer: { + alignItems: 'center', + justifyContent: 'center', + backgroundColor: colors.background.alternative, + borderRadius: 8, + }, + textWrapper: { + textAlign: 'center', + }, + textWrapperIcon: { + textAlign: 'center', + fontSize: 18, + }, + mediaPlayer: { + minHeight: 10, + }, + }); /** * View that renders an ERC-721 Token image @@ -62,6 +63,8 @@ const styles = StyleSheet.create({ export default function CollectibleMedia({ collectible, renderAnimation, style, tiny, small, big, cover, onClose }) { const [sourceUri, setSourceUri] = useState(null); const [isUniV3NFT, setIsUniV3NFT] = useState(false); + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); const fallback = () => setSourceUri(null); @@ -120,7 +123,7 @@ export default function CollectibleMedia({ collectible, renderAnimation, style, ); - }, [collectible, sourceUri, isUniV3NFT, onClose, renderAnimation, style, tiny, small, big, cover]); + }, [collectible, sourceUri, isUniV3NFT, onClose, renderAnimation, style, tiny, small, big, cover, styles]); return {renderMedia()}; } diff --git a/app/components/UI/CustomNonceModal/index.js b/app/components/UI/CustomNonceModal/index.js index 277d0509cb9..3805128dff6 100644 --- a/app/components/UI/CustomNonceModal/index.js +++ b/app/components/UI/CustomNonceModal/index.js @@ -1,5 +1,5 @@ import React from 'react'; -import { colors, fontStyles } from '../../../styles/common'; +import { fontStyles } from '../../../styles/common'; import { strings } from '../../../../locales/i18n'; import { StyleSheet, View, TextInput, SafeAreaView, TouchableOpacity } from 'react-native'; import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view'; @@ -10,105 +10,109 @@ import Modal from 'react-native-modal'; import PropTypes from 'prop-types'; import Icon from 'react-native-vector-icons/FontAwesome'; import EvilIcons from 'react-native-vector-icons/EvilIcons'; +import { useAppThemeFromContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - bottomModal: { - justifyContent: 'flex-end', - margin: 0, - }, - keyboardAwareWrapper: { - flex: 1, - justifyContent: 'flex-end', - }, - modal: { - minHeight: 200, - backgroundColor: colors.white, - borderTopLeftRadius: 20, - borderTopRightRadius: 20, - }, - modalContainer: { - margin: 24, - }, - title: { - fontSize: 14, - color: colors.black, - }, - nonceInput: { - width: 80, - fontSize: 36, - ...fontStyles.bold, - color: colors.black, - textAlign: 'center', - marginHorizontal: 24, - }, - desc: { - color: colors.black, - fontSize: 12, - lineHeight: 16, - marginVertical: 10, - }, - nonceInputContainer: { - display: 'flex', - flexDirection: 'row', - alignItems: 'center', - alignSelf: 'center', - marginVertical: 10, - }, - incrementDecrementNonceContainer: { - display: 'flex', - flexDirection: 'row', - alignItems: 'center', - alignSelf: 'center', - }, - currentSuggested: { - fontSize: 14, - color: colors.grey500, - marginBottom: 10, - }, - nonceWarning: { - borderWidth: 1, - borderColor: colors.yellow, - backgroundColor: colors.yellow100, - padding: 16, - display: 'flex', - flexDirection: 'row', - borderRadius: 8, - marginTop: 10, - marginBottom: 16, - }, - nonceWarningText: { - color: colors.black, - fontSize: 12, - lineHeight: 16, - width: '100%', - flex: 1, - }, - descWarningContainer: { - height: 240, - }, - actionRow: { - flexDirection: 'row', - marginBottom: 15, - }, - actionButton: { - flex: 1, - marginHorizontal: 8, - }, - incrementHit: { - padding: 4, - }, - icon: { - flex: 0, - marginTop: 6, - paddingRight: 14, - }, - incrementDecrementIcon: { - color: colors.blue, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + bottomModal: { + justifyContent: 'flex-end', + margin: 0, + }, + keyboardAwareWrapper: { + flex: 1, + justifyContent: 'flex-end', + }, + modal: { + minHeight: 200, + backgroundColor: colors.background.default, + borderTopLeftRadius: 20, + borderTopRightRadius: 20, + }, + modalContainer: { + margin: 24, + }, + title: { + fontSize: 14, + color: colors.text.default, + }, + nonceInput: { + width: 80, + fontSize: 36, + ...fontStyles.bold, + color: colors.text.default, + textAlign: 'center', + marginHorizontal: 24, + }, + desc: { + color: colors.text.default, + fontSize: 12, + lineHeight: 16, + marginVertical: 10, + }, + nonceInputContainer: { + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + alignSelf: 'center', + marginVertical: 10, + }, + incrementDecrementNonceContainer: { + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + alignSelf: 'center', + }, + currentSuggested: { + fontSize: 14, + color: colors.text.alternative, + marginBottom: 10, + }, + nonceWarning: { + borderWidth: 1, + borderColor: colors.warning.default, + backgroundColor: colors.warning.muted, + padding: 16, + display: 'flex', + flexDirection: 'row', + borderRadius: 8, + marginTop: 10, + marginBottom: 16, + }, + nonceWarningText: { + color: colors.text.default, + fontSize: 12, + lineHeight: 16, + width: '100%', + flex: 1, + }, + descWarningContainer: { + height: 240, + }, + actionRow: { + flexDirection: 'row', + marginBottom: 15, + }, + actionButton: { + flex: 1, + marginHorizontal: 8, + }, + incrementHit: { + padding: 4, + }, + icon: { + flex: 0, + marginTop: 6, + paddingRight: 14, + }, + incrementDecrementIcon: { + color: colors.primary.default, + }, + }); const CustomModalNonce = ({ proposedNonce, nonceValue, close, save }) => { const [nonce, onChangeText] = React.useState(nonceValue); + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); const incrementDecrementNonce = (decrement) => { let newValue = nonce; diff --git a/app/components/UI/EditGasFee1559/index.js b/app/components/UI/EditGasFee1559/index.js index f400d81a598..2486fbf5fa1 100644 --- a/app/components/UI/EditGasFee1559/index.js +++ b/app/components/UI/EditGasFee1559/index.js @@ -6,7 +6,6 @@ import Text from '../../Base/Text'; import StyledButton from '../StyledButton'; import RangeInput from '../../Base/RangeInput'; import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIcons'; -import { colors } from '../../../styles/common'; import InfoModal from '../Swaps/components/InfoModal'; import Icon from 'react-native-vector-icons/Ionicons'; import { strings } from '../../../../locales/i18n'; @@ -21,118 +20,120 @@ import AnalyticsV2 from '../../../util/analyticsV2'; import TimeEstimateInfoModal from '../TimeEstimateInfoModal'; import useModalHandler from '../../Base/hooks/useModalHandler'; import AppConstants from '../../../core/AppConstants'; +import { useAppThemeFromContext } from '../../../util/theme'; const GAS_LIMIT_INCREMENT = new BigNumber(1000); const GAS_INCREMENT = new BigNumber(1); const GAS_LIMIT_MIN = new BigNumber(21000); const GAS_MIN = new BigNumber(0.000001); -const styles = StyleSheet.create({ - root: { - backgroundColor: colors.white, - borderTopLeftRadius: 20, - borderTopRightRadius: 20, - minHeight: 200, - maxHeight: '95%', - paddingTop: 24, - paddingBottom: Device.isIphoneX() ? 32 : 24, - }, - wrapper: { - paddingHorizontal: 24, - }, - customGasHeader: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - width: '100%', - paddingBottom: 20, - }, - newGasFeeHeader: { - flexDirection: 'row', - alignItems: 'center', - width: '100%', - justifyContent: 'center', - }, - headerContainer: { - alignItems: 'center', - marginBottom: 22, - }, - headerText: { - fontSize: 48, - flex: 1, - textAlign: 'center', - }, - headerTitle: { - flexDirection: 'row', - }, - saveButton: { - marginBottom: 20, - }, - labelTextContainer: { - flexDirection: 'row', - alignItems: 'center', - }, - hitSlop: { - top: 10, - left: 10, - bottom: 10, - right: 10, - }, - labelInfo: { - color: colors.grey200, - }, - advancedOptionsContainer: { - marginTop: 25, - marginBottom: 30, - }, - advancedOptionsInputsContainer: { - marginTop: 14, - }, - rangeInputContainer: { - marginBottom: 20, - }, - advancedOptionsButton: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'center', - }, - advancedOptionsIcon: { - paddingTop: 1, - marginLeft: 5, - }, - learnMoreLabels: { - marginTop: 9, - }, - /* Add when the learn more link is ready +const createStyles = (colors) => + StyleSheet.create({ + root: { + backgroundColor: colors.background.default, + borderTopLeftRadius: 20, + borderTopRightRadius: 20, + minHeight: 200, + maxHeight: '95%', + paddingTop: 24, + paddingBottom: Device.isIphoneX() ? 32 : 24, + }, + wrapper: { + paddingHorizontal: 24, + }, + customGasHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + width: '100%', + paddingBottom: 20, + }, + newGasFeeHeader: { + flexDirection: 'row', + alignItems: 'center', + width: '100%', + justifyContent: 'center', + }, + headerContainer: { + alignItems: 'center', + marginBottom: 22, + }, + headerText: { + fontSize: 48, + flex: 1, + textAlign: 'center', + }, + headerTitle: { + flexDirection: 'row', + }, + saveButton: { + marginBottom: 20, + }, + labelTextContainer: { + flexDirection: 'row', + alignItems: 'center', + }, + hitSlop: { + top: 10, + left: 10, + bottom: 10, + right: 10, + }, + labelInfo: { + color: colors.text.muted, + }, + advancedOptionsContainer: { + marginTop: 25, + marginBottom: 30, + }, + advancedOptionsInputsContainer: { + marginTop: 14, + }, + rangeInputContainer: { + marginBottom: 20, + }, + advancedOptionsButton: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + }, + advancedOptionsIcon: { + paddingTop: 1, + marginLeft: 5, + }, + learnMoreLabels: { + marginTop: 9, + }, + /* Add when the learn more link is ready learnMoreLink: { marginTop: 14 },*/ - warningTextContainer: { - lineHeight: 20, - paddingLeft: 4, - flex: 1, - }, - warningText: { - lineHeight: 20, - flex: 1, - }, - warningContainer: { - marginBottom: 20, - }, - dappEditGasContainer: { - marginVertical: 20, - }, - subheader: { - marginBottom: 6, - }, - learnMoreModal: { - maxHeight: Device.getDeviceHeight() * 0.7, - }, - redInfo: { - marginLeft: 2, - color: colors.red, - }, -}); + warningTextContainer: { + lineHeight: 20, + paddingLeft: 4, + flex: 1, + }, + warningText: { + lineHeight: 20, + flex: 1, + }, + warningContainer: { + marginBottom: 20, + }, + dappEditGasContainer: { + marginVertical: 20, + }, + subheader: { + marginBottom: 6, + }, + learnMoreModal: { + maxHeight: Device.getDeviceHeight() * 0.7, + }, + redInfo: { + marginLeft: 2, + color: colors.error.default, + }, + }); const EditGasFee1559 = ({ selected, @@ -179,6 +180,8 @@ const EditGasFee1559 = ({ const [showInputs, setShowInputs] = useState(!dappSuggestedGas); const [isVisibleTimeEstimateInfoModal, , showTimeEstimateInfoModal, hideTimeEstimateInfoModal] = useModalHandler(false); + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); const getAnalyticsParams = useCallback(() => { try { @@ -501,7 +504,9 @@ const EditGasFee1559 = ({ } + renderIcon={() => ( + + )} style={styles.warningContainer} > {() => ( @@ -515,7 +520,7 @@ const EditGasFee1559 = ({ ); return warning; - }, [warning]); + }, [warning, styles, colors]); const renderError = useMemo(() => { if (!error) return null; @@ -524,7 +529,9 @@ const EditGasFee1559 = ({ } + renderIcon={() => ( + + )} style={styles.warningContainer} > {() => ( @@ -538,7 +545,7 @@ const EditGasFee1559 = ({ ); return error; - }, [error]); + }, [error, styles, colors]); const renderDisplayTitle = useMemo(() => { if (updateOption) @@ -556,12 +563,12 @@ const EditGasFee1559 = ({ - + {renderDisplayTitle} - + {updateOption && ( diff --git a/app/components/UI/EditGasFeeLegacy/index.js b/app/components/UI/EditGasFeeLegacy/index.js index 4fb4336d8f2..f93f7a7ce45 100644 --- a/app/components/UI/EditGasFeeLegacy/index.js +++ b/app/components/UI/EditGasFeeLegacy/index.js @@ -8,7 +8,6 @@ import Text from '../../Base/Text'; import StyledButton from '../StyledButton'; import RangeInput from '../../Base/RangeInput'; import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIcons'; -import { colors } from '../../../styles/common'; import InfoModal from '../Swaps/components/InfoModal'; import Icon from 'react-native-vector-icons/Ionicons'; import { strings } from '../../../../locales/i18n'; @@ -19,86 +18,88 @@ import { isMainnetByChainId } from '../../../util/networks'; import FadeAnimationView from '../FadeAnimationView'; import AnalyticsV2 from '../../../util/analyticsV2'; import AppConstants from '../../../core/AppConstants'; +import { useAppThemeFromContext } from '../../../util/theme'; const GAS_LIMIT_INCREMENT = new BigNumber(1000); const GAS_PRICE_INCREMENT = new BigNumber(1); const GAS_LIMIT_MIN = new BigNumber(21000); const GAS_PRICE_MIN = new BigNumber(0.000001); -const styles = StyleSheet.create({ - root: { - backgroundColor: colors.white, - borderTopLeftRadius: 20, - borderTopRightRadius: 20, - minHeight: 200, - maxHeight: '95%', - paddingTop: 24, - paddingBottom: Device.isIphoneX() ? 32 : 24, - }, - wrapper: { - paddingHorizontal: 24, - }, - customGasHeader: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - width: '100%', - paddingBottom: 20, - }, - headerContainer: { - alignItems: 'center', - marginBottom: 22, - }, - headerText: { - fontSize: 48, - }, - headerTitle: { - flexDirection: 'row', - }, - headerTitleSide: { - flex: 1, - }, - labelTextContainer: { - flexDirection: 'row', - alignItems: 'center', - }, - hitSlop: { - top: 10, - left: 10, - bottom: 10, - right: 10, - }, - labelInfo: { - color: colors.grey200, - }, - advancedOptionsContainer: { - marginTop: 25, - marginBottom: 30, - }, - advancedOptionsInputsContainer: { - marginTop: 14, - }, - rangeInputContainer: { - marginBottom: 20, - }, - advancedOptionsButton: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'center', - }, - advancedOptionsIcon: { - paddingTop: 1, - marginLeft: 5, - }, - warningTextContainer: { - paddingLeft: 4, - lineHeight: 20, - textAlign: 'center', - }, - warningText: { - lineHeight: 20, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + root: { + backgroundColor: colors.background.default, + borderTopLeftRadius: 20, + borderTopRightRadius: 20, + minHeight: 200, + maxHeight: '95%', + paddingTop: 24, + paddingBottom: Device.isIphoneX() ? 32 : 24, + }, + wrapper: { + paddingHorizontal: 24, + }, + customGasHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + width: '100%', + paddingBottom: 20, + }, + headerContainer: { + alignItems: 'center', + marginBottom: 22, + }, + headerText: { + fontSize: 48, + }, + headerTitle: { + flexDirection: 'row', + }, + headerTitleSide: { + flex: 1, + }, + labelTextContainer: { + flexDirection: 'row', + alignItems: 'center', + }, + hitSlop: { + top: 10, + left: 10, + bottom: 10, + right: 10, + }, + labelInfo: { + color: colors.text.muted, + }, + advancedOptionsContainer: { + marginTop: 25, + marginBottom: 30, + }, + advancedOptionsInputsContainer: { + marginTop: 14, + }, + rangeInputContainer: { + marginBottom: 20, + }, + advancedOptionsButton: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + }, + advancedOptionsIcon: { + paddingTop: 1, + marginLeft: 5, + }, + warningTextContainer: { + paddingLeft: 4, + lineHeight: 20, + textAlign: 'center', + }, + warningText: { + lineHeight: 20, + }, + }); const EditGasFeeLegacy = ({ selected, @@ -130,6 +131,8 @@ const EditGasFeeLegacy = ({ const [showAdvancedOptions, setShowAdvancedOptions] = useState(!selected || onlyAdvanced); const [selectedOption, setSelectedOption] = useState(selected); const [gasPriceError, setGasPriceError] = useState(); + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); const getAnalyticsParams = useCallback(() => { try { @@ -243,7 +246,9 @@ const EditGasFeeLegacy = ({ } + renderIcon={() => ( + + )} style={styles.warningContainer} > {() => ( @@ -257,7 +262,7 @@ const EditGasFeeLegacy = ({ ); return warning; - }, [warning]); + }, [warning, styles, colors]); const renderError = useMemo(() => { if (!error) return null; @@ -266,7 +271,9 @@ const EditGasFeeLegacy = ({ } + renderIcon={() => ( + + )} style={styles.warningContainer} > {() => ( @@ -280,7 +287,7 @@ const EditGasFeeLegacy = ({ ); return error; - }, [error]); + }, [error, styles, colors]); const isMainnet = isMainnetByChainId(chainId); const nativeCurrencySelected = primaryCurrency === 'ETH' || !isMainnet; @@ -303,12 +310,12 @@ const EditGasFeeLegacy = ({ - + {strings('transaction.edit_network_fee')} - + {renderWarning} diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index 07790875136..e34e67f5322 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -375,12 +375,12 @@ export function getApproveNavbar(title) { export function getSendFlowTitle(title, navigation, route, themeColors) { const innerStyles = StyleSheet.create({ headerButtonText: { - color: themeColors.primary, + color: themeColors.primary.default, fontSize: 14, ...fontStyles.normal, }, headerStyle: { - backgroundColor: themeColors.backgroundDefault, + backgroundColor: themeColors.background.default, }, }); const rightAction = () => { diff --git a/app/components/UI/TransactionReview/TransactionReviewEIP1559/index.js b/app/components/UI/TransactionReview/TransactionReviewEIP1559/index.js index ecfcd7d49a0..ce532db071f 100644 --- a/app/components/UI/TransactionReview/TransactionReviewEIP1559/index.js +++ b/app/components/UI/TransactionReview/TransactionReviewEIP1559/index.js @@ -3,7 +3,6 @@ import { TouchableOpacity, View, StyleSheet, Linking } from 'react-native'; import Summary from '../../../Base/Summary'; import Text from '../../../Base/Text'; import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'; -import { colors } from '../../../../styles/common'; import { isMainnetByChainId } from '../../../../util/networks'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; @@ -15,63 +14,70 @@ import TimeEstimateInfoModal from '../../TimeEstimateInfoModal'; import useModalHandler from '../../../Base/hooks/useModalHandler'; import AppConstants from '../../../../core/AppConstants'; import Device from '../../../../util/device'; +import { useAppThemeFromContext } from '../../../../util/theme'; -const styles = StyleSheet.create({ - overview: (noMargin) => ({ - marginHorizontal: noMargin ? 0 : 24, - paddingTop: 10, - paddingBottom: 10, - }), - valuesContainer: { - flex: 1, - flexDirection: 'row', - justifyContent: 'flex-end', - }, - gasInfoContainer: { - paddingLeft: 2, - }, - gasInfoIcon: (hasOrigin) => ({ - color: hasOrigin ? colors.orange : colors.grey200, - }), - amountContainer: { - flex: 1, - paddingRight: 10, - }, - gasRowContainer: { - flexDirection: 'row', - flex: 1, - alignItems: 'center', - marginBottom: 2, - }, - gasBottomRowContainer: { - marginTop: 4, - }, - hitSlop: { - top: 10, - left: 10, - bottom: 10, - right: 10, - }, - redInfo: { - color: colors.red, - }, - timeEstimateContainer: { - alignItems: 'center', - flexDirection: 'row', - }, - flex: { - flex: 1, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + overview: (noMargin) => ({ + marginHorizontal: noMargin ? 0 : 24, + paddingTop: 10, + paddingBottom: 10, + }), + valuesContainer: { + flex: 1, + flexDirection: 'row', + justifyContent: 'flex-end', + }, + gasInfoContainer: { + paddingLeft: 2, + }, + gasInfoIcon: (hasOrigin) => ({ + color: hasOrigin ? colors.orange : colors.text.muted, + }), + amountContainer: { + flex: 1, + paddingRight: 10, + }, + gasRowContainer: { + flexDirection: 'row', + flex: 1, + alignItems: 'center', + marginBottom: 2, + }, + gasBottomRowContainer: { + marginTop: 4, + }, + hitSlop: { + top: 10, + left: 10, + bottom: 10, + right: 10, + }, + redInfo: { + color: colors.error.default, + }, + timeEstimateContainer: { + alignItems: 'center', + flexDirection: 'row', + }, + flex: { + flex: 1, + }, + }); // eslint-disable-next-line react/prop-types -const Skeleton = ({ width, noStyle }) => ( - - - - - -); +const Skeleton = ({ width, noStyle }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ( + + + + + + ); +}; const TransactionReviewEIP1559 = ({ totalNative, @@ -105,6 +111,8 @@ const TransactionReviewEIP1559 = ({ const toggleLearnMoreModal = useCallback(() => { setShowLearnMoreModal((showLearnMoreModal) => !showLearnMoreModal); }, []); + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); const openLinkAboutGas = useCallback( () => Linking.openURL('https://community.metamask.io/t/what-is-gas-why-do-transactions-take-so-long/3172'), diff --git a/app/components/Views/SendFlow/AddressElement/index.js b/app/components/Views/SendFlow/AddressElement/index.js index 95884810d31..290d01c7832 100644 --- a/app/components/Views/SendFlow/AddressElement/index.js +++ b/app/components/Views/SendFlow/AddressElement/index.js @@ -2,38 +2,40 @@ import React, { PureComponent } from 'react'; import { renderShortAddress } from '../../../../util/address'; import { StyleSheet, View, Text, TouchableOpacity } from 'react-native'; import Identicon from '../../../UI/Identicon'; -import { fontStyles, colors } from '../../../../styles/common'; +import { fontStyles } from '../../../../styles/common'; import PropTypes from 'prop-types'; import { doENSReverseLookup } from '../../../../util/ENSUtils'; import { connect } from 'react-redux'; +import { ThemeContext } from '../../../../util/theme'; -const styles = StyleSheet.create({ - addressElementWrapper: { - padding: 16, - flexDirection: 'row', - alignItems: 'center', - borderBottomWidth: 1, - borderBottomColor: colors.grey050, - }, - addressElementInformation: { - flex: 1, - flexDirection: 'column', - }, - addressIdenticon: { - paddingRight: 16, - }, - addressTextNickname: { - ...fontStyles.normal, - flex: 1, - color: colors.black, - fontSize: 14, - }, - addressTextAddress: { - ...fontStyles.normal, - fontSize: 12, - color: colors.grey500, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + addressElementWrapper: { + padding: 16, + flexDirection: 'row', + alignItems: 'center', + borderBottomWidth: 1, + borderBottomColor: colors.border.muted, + }, + addressElementInformation: { + flex: 1, + flexDirection: 'column', + }, + addressIdenticon: { + paddingRight: 16, + }, + addressTextNickname: { + ...fontStyles.normal, + flex: 1, + color: colors.text.default, + fontSize: 14, + }, + addressTextAddress: { + ...fontStyles.normal, + fontSize: 12, + color: colors.text.alternative, + }, + }); class AddressElement extends PureComponent { static propTypes = { @@ -78,6 +80,9 @@ class AddressElement extends PureComponent { const { name, address } = this.state; const primaryLabel = name && name[0] !== ' ' ? name : renderShortAddress(address); const secondaryLabel = name && name[0] !== ' ' && renderShortAddress(address); + const { colors } = this.context; + const styles = createStyles(colors); + return ( onAccountPress(address)} @@ -103,6 +108,8 @@ class AddressElement extends PureComponent { }; } +AddressElement.contextType = ThemeContext; + const mapStateToProps = (state) => ({ network: state.engine.backgroundState.NetworkController.network, }); diff --git a/app/components/Views/SendFlow/AddressInputs/index.js b/app/components/Views/SendFlow/AddressInputs/index.js index 2bf36eec096..acd24345691 100644 --- a/app/components/Views/SendFlow/AddressInputs/index.js +++ b/app/components/Views/SendFlow/AddressInputs/index.js @@ -1,6 +1,6 @@ import React from 'react'; import { StyleSheet, View, TextInput, TouchableOpacity } from 'react-native'; -import { colors, fontStyles, baseStyles } from '../../../../styles/common'; +import { fontStyles, baseStyles } from '../../../../styles/common'; import AntIcon from 'react-native-vector-icons/AntDesign'; import FontAwesome from 'react-native-vector-icons/FontAwesome'; import PropTypes from 'prop-types'; @@ -9,127 +9,134 @@ import { renderShortAddress } from '../../../../util/address'; import { strings } from '../../../../../locales/i18n'; import Text from '../../../Base/Text'; import { hasZeroWidthPoints } from '../../../../util/validators'; +import { useAppThemeFromContext } from '../../../../util/theme'; -const styles = StyleSheet.create({ - wrapper: { - flexDirection: 'row', - marginHorizontal: 8, - }, - selectWrapper: { - flex: 1, - marginLeft: 8, - paddingHorizontal: 10, - minHeight: 52, - flexDirection: 'row', - borderWidth: 1, - borderRadius: 8, - marginVertical: 8, - }, - inputWrapper: { - flex: 1, - marginLeft: 8, - padding: 10, - minHeight: 52, - flexDirection: 'row', - borderWidth: 1, - borderRadius: 8, - marginTop: 8, - }, - input: { - flex: 1, - flexDirection: 'row', - alignItems: 'center', - }, - identiconWrapper: { - flexDirection: 'row', - alignItems: 'center', - }, - addressToInformation: { - flex: 1, - flexDirection: 'row', - alignItems: 'center', - position: 'relative', - }, - exclamation: { - backgroundColor: colors.white, - borderRadius: 12, - position: 'absolute', - bottom: 8, - left: 20, - }, - address: { - flexDirection: 'column', - alignItems: 'flex-start', - marginHorizontal: 8, - }, - addressWrapper: { flexDirection: 'row' }, - textAddress: { - ...fontStyles.normal, - color: colors.black, - fontSize: 14, - }, - textBalance: { - ...fontStyles.normal, - fontSize: 12, - color: colors.grey500, - }, - label: { - flexDirection: 'row', - alignItems: 'center', - width: '15%', - }, - labelText: { - ...fontStyles.normal, - color: colors.black, - fontSize: 16, - }, - textInput: { - ...fontStyles.normal, - paddingLeft: 0, - paddingRight: 8, - width: '100%', - }, - scanIcon: { - flexDirection: 'column', - alignItems: 'center', - }, - iconOpaque: { - color: colors.grey500, - }, - iconHighlighted: { - color: colors.blue, - }, - borderOpaque: { - borderColor: colors.grey100, - }, - borderHighlighted: { - borderColor: colors.blue, - }, - iconWrapper: { - flexDirection: 'row', - alignItems: 'center', - }, - dropdownIconWrapper: { - height: 23, - width: 23, - }, - dropdownIcon: { - alignSelf: 'center', - }, - checkIconWrapper: { - flexDirection: 'row', - alignItems: 'center', - }, - checkAddress: { - flex: 0.9, - // maxWidth: '90%' - }, - toInputWrapper: { - flexDirection: 'row', - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + flexDirection: 'row', + marginHorizontal: 8, + }, + selectWrapper: { + flex: 1, + marginLeft: 8, + paddingHorizontal: 10, + minHeight: 52, + flexDirection: 'row', + borderWidth: 1, + borderRadius: 8, + marginVertical: 8, + }, + inputWrapper: { + flex: 1, + marginLeft: 8, + padding: 10, + minHeight: 52, + flexDirection: 'row', + borderWidth: 1, + borderRadius: 8, + marginTop: 8, + borderColor: colors.border.default, + }, + input: { + flex: 1, + flexDirection: 'row', + alignItems: 'center', + }, + identiconWrapper: { + flexDirection: 'row', + alignItems: 'center', + }, + addressToInformation: { + flex: 1, + flexDirection: 'row', + alignItems: 'center', + position: 'relative', + }, + exclamation: { + backgroundColor: colors.background.default, + borderRadius: 12, + position: 'absolute', + bottom: 8, + left: 20, + }, + address: { + flexDirection: 'column', + alignItems: 'flex-start', + marginHorizontal: 8, + }, + addressWrapper: { flexDirection: 'row' }, + textAddress: { + ...fontStyles.normal, + color: colors.text.default, + fontSize: 14, + }, + textBalance: { + ...fontStyles.normal, + fontSize: 12, + color: colors.text.alternative, + }, + label: { + flexDirection: 'row', + alignItems: 'center', + width: '15%', + }, + labelText: { + ...fontStyles.normal, + color: colors.text.default, + fontSize: 16, + }, + textInput: { + ...fontStyles.normal, + paddingLeft: 0, + paddingRight: 8, + width: '100%', + color: colors.text.default, + }, + scanIcon: { + flexDirection: 'column', + alignItems: 'center', + }, + iconOpaque: { + color: colors.text.alternative, + }, + iconHighlighted: { + color: colors.primary.default, + }, + borderOpaque: { + borderColor: colors.border.default, + }, + borderHighlighted: { + borderColor: colors.primary.default, + }, + iconWrapper: { + flexDirection: 'row', + alignItems: 'center', + }, + dropdownIconWrapper: { + height: 23, + width: 23, + }, + dropdownIcon: { + alignSelf: 'center', + }, + checkIconWrapper: { + flexDirection: 'row', + alignItems: 'center', + }, + checkAddress: { + flex: 0.9, + // maxWidth: '90%' + }, + toInputWrapper: { + flexDirection: 'row', + }, + }); const AddressName = ({ toAddressName, confusableCollection = [] }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + if (confusableCollection.length) { const texts = toAddressName.split('').map((char, index) => { // if text has a confusable highlight it red @@ -183,6 +190,9 @@ export const AddressTo = (props) => { confusableCollection, displayExclamation, } = props; + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ( @@ -197,7 +207,7 @@ export const AddressTo = (props) => { autoCorrect={false} onChangeText={onToSelectedAddressChange} placeholder={strings('transactions.address_to_placeholder')} - placeholderTextColor={colors.grey100} + placeholderTextColor={colors.text.muted} spellCheck={false} style={[styles.textInput, inputWidth]} numberOfLines={1} @@ -224,7 +234,7 @@ export const AddressTo = (props) => { {displayExclamation && ( - + )} @@ -243,7 +253,7 @@ export const AddressTo = (props) => { {renderShortAddress(toSelectedAddress)} - + @@ -326,6 +336,9 @@ AddressTo.propTypes = { export const AddressFrom = (props) => { const { highlighted, onPressIcon, fromAccountName, fromAccountBalance, fromAccountAddress } = props; + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ( diff --git a/app/components/Views/SendFlow/AddressList/index.js b/app/components/Views/SendFlow/AddressList/index.js index 7fc7483298f..b4a765bd608 100644 --- a/app/components/Views/SendFlow/AddressList/index.js +++ b/app/components/Views/SendFlow/AddressList/index.js @@ -1,54 +1,56 @@ import React, { PureComponent } from 'react'; import { StyleSheet, View, Text, TouchableOpacity, ScrollView } from 'react-native'; -import { colors, fontStyles } from '../../../../styles/common'; +import { fontStyles } from '../../../../styles/common'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import Fuse from 'fuse.js'; import { strings } from '../../../../../locales/i18n'; import AddressElement from '../AddressElement'; +import { ThemeContext } from '../../../../util/theme'; -const styles = StyleSheet.create({ - root: { - flex: 1, - backgroundColor: colors.white, - }, - messageText: { - ...fontStyles.normal, - color: colors.blue, - fontSize: 16, - textAlign: 'center', - }, - messageLeft: { - textAlign: 'left', - }, - myAccountsWrapper: { - flexGrow: 1, - }, - myAccountsTouchable: { - borderBottomWidth: 1, - borderBottomColor: colors.grey050, - padding: 16, - }, - labelElementWrapper: { - backgroundColor: colors.grey000, - flexDirection: 'row', - alignItems: 'center', - borderBottomWidth: 1, - borderBottomColor: colors.grey050, - padding: 8, - }, - labelElementInitialText: { - textTransform: 'uppercase', - }, - labelElementText: { - ...fontStyles.normal, - fontSize: 12, - marginHorizontal: 8, - color: colors.grey600, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + root: { + flex: 1, + backgroundColor: colors.background.default, + }, + messageText: { + ...fontStyles.normal, + color: colors.primary.default, + fontSize: 16, + textAlign: 'center', + }, + messageLeft: { + textAlign: 'left', + }, + myAccountsWrapper: { + flexGrow: 1, + }, + myAccountsTouchable: { + borderBottomWidth: 1, + borderBottomColor: colors.border.muted, + padding: 16, + }, + labelElementWrapper: { + backgroundColor: colors.background.default, + flexDirection: 'row', + alignItems: 'center', + borderBottomWidth: 1, + borderBottomColor: colors.border.muted, + padding: 8, + }, + labelElementInitialText: { + textTransform: 'uppercase', + }, + labelElementText: { + ...fontStyles.normal, + fontSize: 12, + marginHorizontal: 8, + color: colors.text.alternative, + }, + }); -const LabelElement = (label) => ( +const LabelElement = (label, styles) => ( 1 ? {} : styles.labelElementInitialText]}>{label} @@ -173,6 +175,9 @@ class AddressList extends PureComponent { renderMyAccounts = () => { const { identities, onAccountPress, inputSearch, onAccountLongPress } = this.props; const { myAccountsOpened } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + if (inputSearch) return; return !myAccountsOpened ? ( { const { onAccountPress, onAccountLongPress } = this.props; + const { colors } = this.context; + const styles = createStyles(colors); + if (typeof element === 'string') { - return LabelElement(element); + return LabelElement(element, styles); } const key = element.address + element.name; return ( @@ -217,10 +225,13 @@ class AddressList extends PureComponent { renderRecents = () => { const { recents, onAccountPress, onAccountLongPress, inputSearch } = this.props; + const { colors } = this.context; + const styles = createStyles(colors); + if (!recents.length || inputSearch) return; return ( <> - {LabelElement(strings('address_book.recents'))} + {LabelElement(strings('address_book.recents'), styles)} {recents .filter((recent) => recent != null) .map((address, index) => ( @@ -238,6 +249,9 @@ class AddressList extends PureComponent { render = () => { const { contactElements } = this.state; const { onlyRenderAddressBook } = this.props; + const { colors } = this.context; + const styles = createStyles(colors); + return ( @@ -250,6 +264,8 @@ class AddressList extends PureComponent { }; } +AddressList.contextType = ThemeContext; + const mapStateToProps = (state) => ({ recents: state.recents, addressBook: state.engine.backgroundState.AddressBookController.addressBook, diff --git a/app/components/Views/SendFlow/Amount/index.js b/app/components/Views/SendFlow/Amount/index.js index 649b10e9fb1..a3de3cb99d6 100644 --- a/app/components/Views/SendFlow/Amount/index.js +++ b/app/components/Views/SendFlow/Amount/index.js @@ -1,5 +1,5 @@ import React, { PureComponent } from 'react'; -import { colors, fontStyles } from '../../../../styles/common'; +import { fontStyles } from '../../../../styles/common'; import { StyleSheet, Text, @@ -65,230 +65,233 @@ const { hexToBN, BNToHex } = util; const KEYBOARD_OFFSET = Device.isSmallDevice() ? 80 : 120; -const styles = StyleSheet.create({ - wrapper: { - flex: 1, - backgroundColor: colors.white, - }, - scrollWrapper: { - marginBottom: 60, - }, - buttonNextWrapper: { - flex: 1, - flexDirection: 'row', - alignItems: 'flex-end', - }, - buttonNext: { - flex: 1, - marginHorizontal: 24, - }, - inputWrapper: { - flex: 1, - marginTop: 30, - marginHorizontal: 24, - }, - actionsWrapper: { - flexDirection: 'row', - }, - action: { - flex: 1, - alignItems: 'center', - }, - actionBorder: { - flex: 0.8, - }, - actionDropdown: { - ...fontStyles.normal, - backgroundColor: colors.blue, - paddingHorizontal: 16, - paddingVertical: 2, - borderRadius: 100, - flexDirection: 'row', - alignItems: 'center', - }, - textDropdown: { - ...fontStyles.normal, - fontSize: 14, - color: colors.white, - paddingVertical: 2, - }, - iconDropdown: { - paddingLeft: 10, - }, - maxText: { - ...fontStyles.normal, - fontSize: 12, - color: colors.blue, - alignSelf: 'flex-end', - textTransform: 'uppercase', - }, - actionMax: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'flex-end', - }, - actionMaxTouchable: {}, - inputContainerWrapper: { - marginVertical: 16, - alignItems: 'center', - }, - inputContainer: { - flexDirection: 'row', - }, - inputCurrencyText: { - ...fontStyles.normal, - fontWeight: fontStyles.light.fontWeight, - color: colors.black, - fontSize: 44, - marginRight: 8, - paddingVertical: Device.isIos() ? 0 : 8, - justifyContent: 'center', - alignItems: 'center', - textTransform: 'uppercase', - }, - textInput: { - ...fontStyles.normal, - fontWeight: fontStyles.light.fontWeight, - fontSize: 44, - textAlign: 'center', - color: colors.black, - }, - switch: { - flex: 1, - marginTop: Device.isIos() ? 0 : 2, - }, - actionSwitch: { - paddingHorizontal: 8, - paddingVertical: 2, - borderRadius: 8, - flexDirection: 'row', - borderColor: colors.grey500, - borderWidth: 1, - right: -2, - }, - textSwitch: { - ...fontStyles.normal, - fontSize: 14, - color: colors.grey500, - textTransform: 'uppercase', - }, - switchWrapper: { - flexDirection: 'row', - alignItems: 'center', - }, - bottomModal: { - justifyContent: 'flex-end', - margin: 0, - }, - tokenImage: { - width: 36, - height: 36, - overflow: 'hidden', - }, - assetElementWrapper: { - height: 70, - backgroundColor: colors.white, - borderWidth: 1, - borderColor: colors.grey000, - flexDirection: 'row', - alignItems: 'center', - paddingHorizontal: 24, - }, - assetElement: { - flexDirection: 'row', - flex: 1, - }, - assetsModalWrapper: { - backgroundColor: colors.white, - borderTopLeftRadius: 10, - borderTopRightRadius: 10, - height: 450, - }, - titleWrapper: { - width: '100%', - height: 33, - alignItems: 'center', - justifyContent: 'center', - borderBottomWidth: StyleSheet.hairlineWidth, - borderColor: colors.grey100, - }, - dragger: { - width: 48, - height: 5, - borderRadius: 4, - backgroundColor: colors.grey400, - opacity: Device.isAndroid() ? 0.6 : 0.5, - }, - textAssetTitle: { - ...fontStyles.normal, - fontSize: 18, - }, - assetInformationWrapper: { - flex: 1, - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - marginLeft: 16, - }, - assetBalanceWrapper: { - flexDirection: 'column', - }, - textAssetBalance: { - ...fontStyles.normal, - fontSize: 18, - textAlign: 'right', - }, - textAssetFiat: { - ...fontStyles.normal, - fontSize: 12, - color: colors.grey500, - textAlign: 'right', - textTransform: 'uppercase', - }, - errorMessageWrapper: { - marginVertical: 16, - }, - CollectibleMedia: { - width: 120, - height: 120, - }, - collectibleName: { - ...fontStyles.normal, - fontSize: 32, - color: colors.grey500, - textAlign: 'center', - }, - collectibleId: { - ...fontStyles.normal, - fontSize: 14, - color: colors.grey500, - marginTop: 8, - textAlign: 'center', - }, - collectibleInputWrapper: { - margin: 24, - }, - collectibleInputImageWrapper: { - flexDirection: 'column', - alignItems: 'center', - }, - collectibleInputInformationWrapper: { - marginTop: 12, - }, - nextActionWrapper: { - flex: 1, - marginBottom: 16, - }, - balanceWrapper: { - marginVertical: 16, - }, - balanceText: { - ...fontStyles.normal, - alignSelf: 'center', - fontSize: 12, - lineHeight: 16, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + flex: 1, + backgroundColor: colors.background.default, + }, + scrollWrapper: { + marginBottom: 60, + }, + buttonNextWrapper: { + flex: 1, + flexDirection: 'row', + alignItems: 'flex-end', + }, + buttonNext: { + flex: 1, + marginHorizontal: 24, + }, + inputWrapper: { + flex: 1, + marginTop: 30, + marginHorizontal: 24, + }, + actionsWrapper: { + flexDirection: 'row', + }, + action: { + flex: 1, + alignItems: 'center', + }, + actionBorder: { + flex: 0.8, + }, + actionDropdown: { + ...fontStyles.normal, + backgroundColor: colors.primary.default, + paddingHorizontal: 16, + paddingVertical: 2, + borderRadius: 100, + flexDirection: 'row', + alignItems: 'center', + }, + textDropdown: { + ...fontStyles.normal, + fontSize: 14, + color: colors.primary.inverse, + paddingVertical: 2, + }, + iconDropdown: { + paddingLeft: 10, + }, + maxText: { + ...fontStyles.normal, + fontSize: 12, + color: colors.primary.default, + alignSelf: 'flex-end', + textTransform: 'uppercase', + }, + actionMax: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'flex-end', + }, + actionMaxTouchable: {}, + inputContainerWrapper: { + marginVertical: 16, + alignItems: 'center', + }, + inputContainer: { + flexDirection: 'row', + }, + inputCurrencyText: { + ...fontStyles.normal, + fontWeight: fontStyles.light.fontWeight, + color: colors.text.default, + fontSize: 44, + marginRight: 8, + paddingVertical: Device.isIos() ? 0 : 8, + justifyContent: 'center', + alignItems: 'center', + textTransform: 'uppercase', + }, + textInput: { + ...fontStyles.normal, + fontWeight: fontStyles.light.fontWeight, + fontSize: 44, + textAlign: 'center', + color: colors.text.default, + }, + switch: { + flex: 1, + marginTop: Device.isIos() ? 0 : 2, + }, + actionSwitch: { + paddingHorizontal: 8, + paddingVertical: 2, + borderRadius: 8, + flexDirection: 'row', + borderColor: colors.text.alternative, + borderWidth: 1, + right: -2, + }, + textSwitch: { + ...fontStyles.normal, + fontSize: 14, + color: colors.text.alternative, + textTransform: 'uppercase', + }, + switchWrapper: { + flexDirection: 'row', + alignItems: 'center', + }, + bottomModal: { + justifyContent: 'flex-end', + margin: 0, + }, + tokenImage: { + width: 36, + height: 36, + overflow: 'hidden', + }, + assetElementWrapper: { + height: 70, + borderBottomWidth: 1, + borderColor: colors.border.muted, + flexDirection: 'row', + alignItems: 'center', + paddingHorizontal: 24, + }, + assetElement: { + flexDirection: 'row', + flex: 1, + }, + assetsModalWrapper: { + backgroundColor: colors.background.default, + borderTopLeftRadius: 10, + borderTopRightRadius: 10, + height: 450, + }, + titleWrapper: { + width: '100%', + height: 33, + alignItems: 'center', + justifyContent: 'center', + borderBottomWidth: 1, + borderColor: colors.border.muted, + }, + dragger: { + width: 48, + height: 5, + borderRadius: 4, + backgroundColor: colors.border.default, + opacity: Device.isAndroid() ? 0.6 : 0.5, + }, + textAssetTitle: { + ...fontStyles.normal, + fontSize: 18, + color: colors.text.default, + }, + assetInformationWrapper: { + flex: 1, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginLeft: 16, + }, + assetBalanceWrapper: { + flexDirection: 'column', + }, + textAssetBalance: { + ...fontStyles.normal, + fontSize: 18, + textAlign: 'right', + color: colors.text.default, + }, + textAssetFiat: { + ...fontStyles.normal, + fontSize: 12, + color: colors.text.alternative, + textAlign: 'right', + textTransform: 'uppercase', + }, + errorMessageWrapper: { + marginVertical: 16, + }, + CollectibleMedia: { + width: 120, + height: 120, + }, + collectibleName: { + ...fontStyles.normal, + fontSize: 32, + color: colors.text.alternative, + textAlign: 'center', + }, + collectibleId: { + ...fontStyles.normal, + fontSize: 14, + color: colors.text.alternative, + marginTop: 8, + textAlign: 'center', + }, + collectibleInputWrapper: { + margin: 24, + }, + collectibleInputImageWrapper: { + flexDirection: 'column', + alignItems: 'center', + }, + collectibleInputInformationWrapper: { + marginTop: 12, + }, + nextActionWrapper: { + flex: 1, + marginBottom: 16, + }, + balanceWrapper: { + marginVertical: 16, + }, + balanceText: { + ...fontStyles.normal, + alignSelf: 'center', + fontSize: 12, + lineHeight: 16, + color: colors.text.default, + }, + }); /** * View that wraps the wraps the "Send" screen @@ -822,6 +825,9 @@ class Amount extends PureComponent { this.props; let balance, balanceFiat; const { address, decimals, symbol } = token; + const { colors } = this.context; + const styles = createStyles(colors); + if (token.isETH) { balance = renderFromWei(accounts[selectedAddress].balance); balanceFiat = weiToFiat(hexToBN(accounts[selectedAddress].balance), conversionRate, currentCurrency); @@ -858,6 +864,9 @@ class Amount extends PureComponent { renderCollectible = (collectible, index) => { const { name } = collectible; + const { colors } = this.context; + const styles = createStyles(colors); + return ( { const { assetsModalVisible } = this.state; const tradableCollectibles = this.collectibles.filter(({ standard }) => standard === 'ERC721'); + const { colors } = this.context; + const styles = createStyles(colors); return ( @@ -966,6 +980,7 @@ class Amount extends PureComponent { onChangeText={this.onInputChange} keyboardType={'numeric'} placeholder={'0'} + placeholderTextColor={colors.text.muted} testID={'txn-amount-input'} /> @@ -981,7 +996,7 @@ class Amount extends PureComponent { @@ -1004,6 +1019,9 @@ class Amount extends PureComponent { renderCollectibleInput = () => { const { amountError } = this.state; const { selectedAsset } = this.props; + const { colors } = this.context; + const styles = createStyles(colors); + return ( @@ -1033,6 +1051,8 @@ class Amount extends PureComponent { selectedAsset, transactionState: { isPaymentRequest }, } = this.props; + const { colors } = this.context; + const styles = createStyles(colors); return ( @@ -1053,7 +1073,7 @@ class Amount extends PureComponent { diff --git a/app/components/Views/SendFlow/Confirm/index.js b/app/components/Views/SendFlow/Confirm/index.js index c29d43ed281..646b0528076 100644 --- a/app/components/Views/SendFlow/Confirm/index.js +++ b/app/components/Views/SendFlow/Confirm/index.js @@ -1,5 +1,5 @@ import React, { PureComponent } from 'react'; -import { colors, baseStyles, fontStyles } from '../../../../styles/common'; +import { baseStyles, fontStyles } from '../../../../styles/common'; import { InteractionManager, StyleSheet, @@ -78,146 +78,150 @@ const EMPTY_LEGACY_TRANSACTION_DATA = { const { hexToBN, BNToHex } = util; -const styles = StyleSheet.create({ - wrapper: { - flex: 1, - backgroundColor: colors.white, - }, - inputWrapper: { - flex: 0, - borderBottomWidth: 1, - borderBottomColor: colors.grey050, - paddingHorizontal: 8, - }, - amountWrapper: { - flexDirection: 'column', - margin: 24, - }, - textAmountLabel: { - ...fontStyles.normal, - fontSize: 14, - textAlign: 'center', - color: colors.grey500, - textTransform: 'uppercase', - marginVertical: 3, - }, - textAmount: { - ...fontStyles.normal, - fontWeight: fontStyles.light.fontWeight, - color: colors.black, - fontSize: 44, - textAlign: 'center', - }, - buttonNext: { - flex: 1, - marginHorizontal: 24, - alignSelf: 'flex-end', - }, - buttonNextWrapper: { - flexDirection: 'row', - alignItems: 'flex-end', - marginBottom: 16, - }, - actionTouchable: { - padding: 12, - }, - actionText: { - ...fontStyles.normal, - color: colors.blue, - fontSize: 14, - alignSelf: 'center', - }, - actionsWrapper: { - margin: 24, - }, - CollectibleMediaWrapper: { - flexDirection: 'column', - alignItems: 'center', - margin: 16, - }, - collectibleName: { - ...fontStyles.normal, - fontSize: 18, - color: colors.black, - textAlign: 'center', - }, - collectibleTokenId: { - ...fontStyles.normal, - fontSize: 12, - color: colors.grey500, - marginTop: 8, - textAlign: 'center', - }, - CollectibleMedia: { - height: 120, - width: 120, - }, - qrCode: { - marginBottom: 16, - paddingHorizontal: 36, - paddingBottom: 24, - paddingTop: 16, - backgroundColor: colors.grey000, - borderRadius: 8, - width: '100%', - }, - hexDataWrapper: { - padding: 10, - alignItems: 'center', - }, - addressTitle: { - ...fontStyles.bold, - color: colors.black, - alignItems: 'center', - justifyContent: 'center', - textAlign: 'center', - fontSize: 16, - marginBottom: 16, - }, - hexDataClose: { - zIndex: 999, - position: 'absolute', - top: 12, - right: 20, - }, - hexDataText: { - textAlign: 'justify', - }, - bottomModal: { - justifyContent: 'flex-end', - margin: 0, - }, - keyboardAwareWrapper: { - flex: 1, - justifyContent: 'flex-end', - }, - errorWrapper: { - marginHorizontal: 24, - marginTop: 12, - paddingHorizontal: 10, - paddingVertical: 8, - backgroundColor: colors.red000, - borderColor: colors.red, - borderRadius: 8, - borderWidth: 1, - justifyContent: 'center', - alignItems: 'center', - }, - error: { - color: colors.red, - fontSize: 12, - lineHeight: 16, - ...fontStyles.normal, - textAlign: 'center', - }, - underline: { - textDecorationLine: 'underline', - ...fontStyles.bold, - }, - text: { - lineHeight: 20, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + flex: 1, + backgroundColor: colors.background.default, + }, + inputWrapper: { + flex: 0, + borderBottomWidth: 1, + borderBottomColor: colors.border.default, + paddingHorizontal: 8, + }, + amountWrapper: { + flexDirection: 'column', + margin: 24, + }, + textAmountLabel: { + ...fontStyles.normal, + fontSize: 14, + textAlign: 'center', + color: colors.text.alternative, + textTransform: 'uppercase', + marginVertical: 3, + }, + textAmount: { + ...fontStyles.normal, + fontWeight: fontStyles.light.fontWeight, + color: colors.text.default, + fontSize: 44, + textAlign: 'center', + }, + buttonNext: { + flex: 1, + marginHorizontal: 24, + alignSelf: 'flex-end', + }, + buttonNextWrapper: { + flexDirection: 'row', + alignItems: 'flex-end', + marginBottom: 16, + }, + actionTouchable: { + padding: 12, + }, + actionText: { + ...fontStyles.normal, + color: colors.primary.default, + fontSize: 14, + alignSelf: 'center', + }, + actionsWrapper: { + margin: 24, + }, + CollectibleMediaWrapper: { + flexDirection: 'column', + alignItems: 'center', + margin: 16, + }, + collectibleName: { + ...fontStyles.normal, + fontSize: 18, + color: colors.text.default, + textAlign: 'center', + }, + collectibleTokenId: { + ...fontStyles.normal, + fontSize: 12, + color: colors.text.alternative, + marginTop: 8, + textAlign: 'center', + }, + CollectibleMedia: { + height: 120, + width: 120, + }, + qrCode: { + marginBottom: 16, + paddingHorizontal: 36, + paddingBottom: 24, + paddingTop: 16, + backgroundColor: colors.grey000, + borderRadius: 8, + width: '100%', + }, + hexDataWrapper: { + padding: 10, + alignItems: 'center', + borderRadius: 10, + backgroundColor: colors.background.default, + }, + addressTitle: { + ...fontStyles.bold, + color: colors.text.default, + alignItems: 'center', + justifyContent: 'center', + textAlign: 'center', + fontSize: 16, + marginBottom: 16, + }, + hexDataClose: { + zIndex: 999, + position: 'absolute', + top: 12, + right: 20, + }, + hexDataText: { + textAlign: 'justify', + }, + bottomModal: { + justifyContent: 'flex-end', + margin: 0, + }, + keyboardAwareWrapper: { + flex: 1, + justifyContent: 'flex-end', + }, + errorWrapper: { + marginHorizontal: 24, + marginTop: 12, + paddingHorizontal: 10, + paddingVertical: 8, + backgroundColor: colors.error.muted, + borderColor: colors.error.default, + borderRadius: 8, + borderWidth: 1, + justifyContent: 'center', + alignItems: 'center', + }, + error: { + color: colors.error.default, + fontSize: 12, + lineHeight: 16, + ...fontStyles.normal, + textAlign: 'center', + }, + underline: { + textDecorationLine: 'underline', + ...fontStyles.bold, + }, + text: { + lineHeight: 20, + color: colors.text.default, + }, + }); /** * View that wraps the wraps the "Send" screen @@ -948,6 +952,8 @@ class Confirm extends PureComponent { renderCustomGasModalEIP1559 = () => { const { primaryCurrency, chainId, gasFeeEstimates } = this.props; const { EIP1559TransactionDataTemp, gasSelected, isAnimating, animateOnChange } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); return ( { const { primaryCurrency, chainId, gasEstimateType, gasFeeEstimates } = this.props; const { LegacyTransactionDataTemp, gasSelected, isAnimating, animateOnChange } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + return ( { const { hexDataModalVisible } = this.state; const { data } = this.props.transactionState.transaction; + const { colors } = this.context; + const styles = createStyles(colors); + return ( - + {strings('transaction.hex_data')} @@ -1080,6 +1092,8 @@ class Confirm extends PureComponent { renderFromAccountModal = () => { const { identities, keyrings, ticker } = this.props; const { fromAccountModalVisible, fromSelectedAddress } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); return ( + StyleSheet.create({ + wrapper: { + flex: 1, + backgroundColor: colors.background.default, + }, + imputWrapper: { + flex: 0, + borderBottomWidth: 1, + borderBottomColor: colors.border.muted, + paddingHorizontal: 8, + }, + bottomModal: { + justifyContent: 'flex-end', + margin: 0, + }, + myAccountsText: { + ...fontStyles.normal, + color: colors.primary.default, + fontSize: 16, + alignSelf: 'center', + }, + myAccountsTouchable: { + padding: 28, + }, + addToAddressBookRoot: { + flex: 1, + padding: 24, + }, + addToAddressBookWrapper: { + flexDirection: 'row', + alignItems: 'center', + }, + addTextTitle: { + ...fontStyles.normal, + fontSize: 24, + color: colors.text.default, + marginBottom: 24, + }, + addTextSubtitle: { + ...fontStyles.normal, + fontSize: 16, + color: colors.text.alternative, + marginBottom: 24, + }, + addTextInput: { + ...fontStyles.normal, + color: colors.text.default, + fontSize: 20, + }, + addInputWrapper: { + flexDirection: 'row', + borderWidth: 1, + borderRadius: 8, + borderColor: colors.border.default, + height: 50, + width: '100%', + }, + input: { + flex: 1, + flexDirection: 'row', + alignItems: 'center', + marginHorizontal: 6, + width: '100%', + }, + nextActionWrapper: { + flex: 1, + marginBottom: 16, + }, + buttonNextWrapper: { + flexDirection: 'row', + alignItems: 'flex-end', + }, + buttonNext: { + flex: 1, + marginHorizontal: 24, + }, + addressErrorWrapper: { + margin: 16, + }, + footerContainer: { + flex: 1, + justifyContent: 'flex-end', + }, + warningContainer: { + marginTop: 20, + marginHorizontal: 24, + marginBottom: 32, + }, + buyEth: { + color: colors.warning.inverse, + textDecorationLine: 'underline', + }, + confusabeError: { + display: 'flex', + flexDirection: 'row', + justifyContent: 'space-between', + margin: 16, + padding: 16, + borderWidth: 1, + borderColor: colors.error.default, + backgroundColor: colors.error.muted, + borderRadius: 8, + }, + confusabeWarning: { + borderColor: colors.warning.default, + backgroundColor: colors.warning.muted, + }, + confusableTitle: { + marginTop: -3, + color: colors.error.default, + ...fontStyles.bold, + fontSize: 14, + }, + confusableMsg: { + color: colors.error.default, + fontSize: 12, + lineHeight: 16, + paddingRight: 10, + }, + black: { + color: colors.text.default, + }, + warningIcon: { + marginRight: 8, + }, + }); const dummy = () => true; @@ -476,6 +477,9 @@ class SendFlow extends PureComponent { renderAddToAddressBookModal = () => { const { addToAddressBookModalVisible, alias } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + return ( { const { identities, keyrings, ticker } = this.props; const { fromAccountModalVisible, fromSelectedAddress } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + return ( { + const { colors } = this.context; + const styles = createStyles(colors); + if (!allowedToBuy(this.props.network)) { return null; } @@ -595,6 +605,8 @@ class SendFlow extends PureComponent { isOnlyWarning, confusableCollection, } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); const checksummedAddress = toSelectedAddress && toChecksumAddress(toSelectedAddress); const existingContact = checksummedAddress && addressBook[network] && addressBook[network][checksummedAddress]; @@ -652,7 +664,7 @@ class SendFlow extends PureComponent { From 5fb50f048e8746e9abd1656f43845a6738de60fe Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Fri, 11 Feb 2022 11:58:25 -0800 Subject: [PATCH 30/77] Add dark theme colors to send and receive flows --- .eslintrc.js | 2 +- app/components/Base/ModalDragger.js | 46 +-- .../FiatOrders/PaymentMethodApplePay/index.js | 192 ++++++----- .../components/CountrySelectorModal.js | 114 ++++--- .../UI/FiatOrders/components/ScreenView.js | 30 +- app/components/UI/Navbar/index.js | 40 +-- .../UI/PaymentRequest/AssetList/index.tsx | 84 ++--- app/components/UI/PaymentRequest/index.js | 310 +++++++++--------- .../UI/PaymentRequestSuccess/index.js | 255 +++++++------- app/components/UI/ReceiveRequest/index.js | 110 ++++--- .../Views/GasEducationCarousel/index.js | 170 +++++----- 11 files changed, 711 insertions(+), 642 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 3abaf112e37..68200c09a3c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -119,7 +119,7 @@ module.exports = { 'eslint-comments/no-unused-disable': 0, 'react-native/no-color-literals': 2, 'react-native/no-inline-styles': 2, - 'react-native/no-unused-styles': 2, + 'react-native/no-unused-styles': 0, 'react-native/split-platform-components': 2, 'react/jsx-boolean-value': 2, 'react/jsx-key': 1, diff --git a/app/components/Base/ModalDragger.js b/app/components/Base/ModalDragger.js index 38c55250545..c151c65ecf3 100644 --- a/app/components/Base/ModalDragger.js +++ b/app/components/Base/ModalDragger.js @@ -1,31 +1,35 @@ import React from 'react'; import PropTypes from 'prop-types'; import { StyleSheet, View } from 'react-native'; -import { colors } from '../../styles/common'; import Device from '../../util/device'; +import { useAppThemeFromContext } from '../../util/theme'; -const styles = StyleSheet.create({ - draggerWrapper: { - width: '100%', - height: 33, - alignItems: 'center', - justifyContent: 'center', - borderBottomWidth: StyleSheet.hairlineWidth, - borderColor: colors.grey100, - }, - borderless: { - borderColor: colors.transparent, - }, - dragger: { - width: 48, - height: 5, - borderRadius: 4, - backgroundColor: colors.grey400, - opacity: Device.isAndroid() ? 0.6 : 0.5, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + draggerWrapper: { + width: '100%', + height: 33, + alignItems: 'center', + justifyContent: 'center', + borderBottomWidth: StyleSheet.hairlineWidth, + borderColor: colors.border.muted, + }, + borderless: { + borderColor: colors.transparent, + }, + dragger: { + width: 48, + height: 5, + borderRadius: 4, + backgroundColor: colors.border.default, + opacity: Device.isAndroid() ? 0.6 : 0.5, + }, + }); function ModalDragger({ borderless }) { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ( diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index 02a9f1ed41f..c22669034c6 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -29,108 +29,122 @@ import CountrySelector from '../components/CountrySelector'; import Keypad, { KEYS } from '../../../Base/Keypad'; import Text from '../../../Base/Text'; import StyledButton from '../../StyledButton'; -import { colors, fontStyles } from '../../../../styles/common'; +import { fontStyles } from '../../../../styles/common'; import { protectWalletModalVisible } from '../../../../actions/user'; import { addFiatOrder, fiatOrdersCountrySelector, setFiatOrdersCountry } from '../../../../reducers/fiatOrders'; import { useAppThemeFromContext } from '../../../../util/theme'; //* styles and components */ -const styles = StyleSheet.create({ - screen: { - flexGrow: 1, - justifyContent: 'space-between', - }, - selectors: { - flexDirection: 'row', - marginTop: Device.isIphone5() ? 12 : 18, - marginHorizontal: 25, - justifyContent: 'space-between', - alignItems: 'center', - }, - spacer: { - minWidth: 8, - }, - amountContainer: { - margin: Device.isIphone5() ? 0 : 12, - padding: Device.isMediumDevice() ? (Device.isIphone5() ? 5 : 10) : 15, - alignItems: 'center', - justifyContent: 'center', - }, - amount: { - ...fontStyles.light, - color: colors.black, - fontSize: Device.isIphone5() ? 48 : 48, - height: Device.isIphone5() ? 50 : 60, - }, - amountDescription: { - minHeight: 22, - }, - amountError: { - color: colors.red, - }, - content: { - flexGrow: 1, - justifyContent: 'space-around', - }, - quickAmounts: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-around', - marginHorizontal: 70, - }, - quickAmount: { - borderRadius: 18, - borderColor: colors.grey200, - borderWidth: 1, - paddingVertical: 5, - paddingHorizontal: 8, - alignItems: 'center', - minWidth: 49, - }, - quickAmountPlaceholder: { - backgroundColor: colors.grey000, - borderColor: colors.grey000, - }, - quickAmountSelected: { - backgroundColor: colors.blue, - borderColor: colors.blue, - }, - quickAmountSelectedText: { - color: colors.white, - }, - buttonContainer: { - paddingBottom: 20, - }, - applePayButton: { - backgroundColor: colors.black, - padding: 10, - margin: Device.isIphone5() ? 5 : 10, - marginHorizontal: 25, - alignItems: 'center', - }, - applePayButtonText: { - color: colors.white, - }, - applePayButtonContentDisabled: { - opacity: 0.6, - }, - applePayLogo: { - marginLeft: 4, - }, -}); +const applePayBackgroundColor = 'black'; +const applePayTextColor = 'white'; +const createStyles = (colors) => + StyleSheet.create({ + screen: { + flexGrow: 1, + justifyContent: 'space-between', + backgroundColor: colors.background.default, + }, + selectors: { + flexDirection: 'row', + marginTop: Device.isIphone5() ? 12 : 18, + marginHorizontal: 25, + justifyContent: 'space-between', + alignItems: 'center', + }, + spacer: { + minWidth: 8, + }, + amountContainer: { + margin: Device.isIphone5() ? 0 : 12, + padding: Device.isMediumDevice() ? (Device.isIphone5() ? 5 : 10) : 15, + alignItems: 'center', + justifyContent: 'center', + }, + amount: { + ...fontStyles.light, + color: colors.text.default, + fontSize: Device.isIphone5() ? 48 : 48, + height: Device.isIphone5() ? 50 : 60, + }, + amountDescription: { + minHeight: 22, + }, + amountError: { + color: colors.error.default, + }, + content: { + flexGrow: 1, + justifyContent: 'space-around', + }, + quickAmounts: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-around', + marginHorizontal: 70, + }, + quickAmount: { + borderRadius: 18, + borderColor: colors.border.default, + borderWidth: 1, + paddingVertical: 5, + paddingHorizontal: 8, + alignItems: 'center', + minWidth: 49, + }, + quickAmountPlaceholder: { + backgroundColor: colors.background.alternative, + borderColor: colors.background.alternative, + }, + quickAmountSelected: { + backgroundColor: colors.primary.default, + borderColor: colors.primary.default, + }, + quickAmountSelectedText: { + color: colors.primary.inverse, + }, + buttonContainer: { + paddingBottom: 20, + }, + applePayButton: { + // FIXED APPLE BUTTON COLOR. DO NOT CHANGE + backgroundColor: applePayBackgroundColor, + padding: 10, + margin: Device.isIphone5() ? 5 : 10, + marginHorizontal: 25, + alignItems: 'center', + }, + applePayButtonText: { + // FIXED APPLE BUTTON COLOR. DO NOT CHANGE + color: applePayTextColor, + }, + applePayButtonContentDisabled: { + opacity: 0.6, + }, + applePayLogo: { + marginLeft: 4, + }, + }); /* eslint-disable import/no-commonjs */ const ApplePayLogo = require('../../../../images/ApplePayLogo.png'); -const ApplePay = ({ disabled }) => ( - -); +const ApplePay = ({ disabled }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ( + + ); +}; ApplePay.propTypes = { disabled: PropTypes.bool, }; const QuickAmount = ({ amount, current, currencySymbol, placeholder, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + if (placeholder) { return ( @@ -181,6 +195,9 @@ function PaymentMethodApplePay({ }) { const navigation = useNavigation(); const [amount, setAmount] = useState('0'); + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + const { symbol: currencySymbol, decimalSeparator, @@ -196,7 +213,6 @@ function PaymentMethodApplePay({ : amountWithPeriod, [amountWithPeriod] ); - const { colors } = useAppThemeFromContext(); const handleWyreTerms = useWyreTerms(navigation); const wyreCurrencies = useMemo(() => [`${selectedCurrency}ETH`, `USD${selectedCurrency}`], [selectedCurrency]); diff --git a/app/components/UI/FiatOrders/components/CountrySelectorModal.js b/app/components/UI/FiatOrders/components/CountrySelectorModal.js index 4ea4c2d8833..67d2db028ea 100644 --- a/app/components/UI/FiatOrders/components/CountrySelectorModal.js +++ b/app/components/UI/FiatOrders/components/CountrySelectorModal.js @@ -19,63 +19,69 @@ import { strings } from '../../../../../locales/i18n'; import Text from '../../../Base/Text'; import ListItem from '../../../Base/ListItem'; import ModalDragger from '../../../Base/ModalDragger'; -import { colors, fontStyles } from '../../../../styles/common'; +import { fontStyles } from '../../../../styles/common'; +import { useAppThemeFromContext } from '../../../../util/theme'; -const styles = StyleSheet.create({ - modal: { - margin: 0, - justifyContent: 'flex-end', - }, - modalView: { - backgroundColor: colors.white, - borderTopLeftRadius: 10, - borderTopRightRadius: 10, - }, - inputWrapper: { - flexDirection: 'row', - alignItems: 'center', - marginHorizontal: 30, - marginVertical: 10, - paddingVertical: Device.isAndroid() ? 0 : 10, - paddingHorizontal: 5, - borderRadius: 5, - borderWidth: 1, - borderColor: colors.grey100, - }, - searchIcon: { - marginHorizontal: 8, - }, - input: { - ...fontStyles.normal, - flex: 1, - }, - modalTitle: { - marginTop: Device.isIphone5() ? 10 : 15, - marginBottom: Device.isIphone5() ? 5 : 5, - marginHorizontal: 36, - }, - resultsView: { - height: Device.isSmallDevice() ? 130 : 250, - marginTop: 10, - }, - resultRow: { - borderTopWidth: StyleSheet.hairlineWidth, - borderColor: colors.grey100, - paddingHorizontal: 20, - }, - flag: { - fontSize: 24, - }, - emptyList: { - marginVertical: 10, - marginHorizontal: 30, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + modal: { + margin: 0, + justifyContent: 'flex-end', + }, + modalView: { + backgroundColor: colors.background.default, + borderTopLeftRadius: 10, + borderTopRightRadius: 10, + }, + inputWrapper: { + flexDirection: 'row', + alignItems: 'center', + marginHorizontal: 30, + marginVertical: 10, + paddingVertical: Device.isAndroid() ? 0 : 10, + paddingHorizontal: 5, + borderRadius: 5, + borderWidth: 1, + borderColor: colors.border.default, + }, + searchIcon: { + marginHorizontal: 8, + color: colors.text.muted, + }, + input: { + ...fontStyles.normal, + flex: 1, + color: colors.text.default, + }, + modalTitle: { + marginTop: Device.isIphone5() ? 10 : 15, + marginBottom: Device.isIphone5() ? 5 : 5, + marginHorizontal: 36, + }, + resultsView: { + height: Device.isSmallDevice() ? 130 : 250, + marginTop: 10, + }, + resultRow: { + borderTopWidth: StyleSheet.hairlineWidth, + borderColor: colors.border.muted, + paddingHorizontal: 20, + }, + flag: { + fontSize: 24, + }, + emptyList: { + marginVertical: 10, + marginHorizontal: 30, + }, + }); function CountrySelectorModal({ isVisible, dismiss, countries, onItemPress }) { const searchInput = useRef(null); const list = useRef(); const [searchString, setSearchString] = useState(''); + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); const countriesFuse = useMemo( () => @@ -118,7 +124,7 @@ function CountrySelectorModal({ isVisible, dismiss, countries, onItemPress }) { ), - [onItemPress] + [onItemPress, styles] ); const renderEmptyList = useMemo( @@ -127,7 +133,7 @@ function CountrySelectorModal({ isVisible, dismiss, countries, onItemPress }) { {strings('fiat_on_ramp.no_countries_result', { searchString })} ), - [searchString] + [searchString, styles] ); return ( @@ -159,7 +165,7 @@ function CountrySelectorModal({ isVisible, dismiss, countries, onItemPress }) { ref={searchInput} style={styles.input} placeholder={strings('fiat_on_ramp.search_country')} - placeholderTextColor={colors.grey500} + placeholderTextColor={colors.text.muted} value={searchString} onChangeText={handleSearchTextChange} /> diff --git a/app/components/UI/FiatOrders/components/ScreenView.js b/app/components/UI/FiatOrders/components/ScreenView.js index fecb1938cd1..b5106c30470 100644 --- a/app/components/UI/FiatOrders/components/ScreenView.js +++ b/app/components/UI/FiatOrders/components/ScreenView.js @@ -1,18 +1,24 @@ import React from 'react'; import { SafeAreaView, StyleSheet, ScrollView } from 'react-native'; -import { colors } from '../../../../styles/common'; +import { useAppThemeFromContext } from '../../../../util/theme'; -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - flex: 1, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + }, + }); -const ScreenView = (props) => ( - - - -); +const ScreenView = (props) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ( + + + + ); +}; export default ScreenView; diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index 39895788e72..465739a4e8c 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -247,21 +247,21 @@ export function getPaymentRequestOptionsTitle(title, navigation, route, themeCol const innerStyles = StyleSheet.create({ headerTitleStyle: { fontSize: 20, - color: themeColors.textDefault, + color: themeColors.text.default, ...fontStyles.normal, }, headerIcon: { - color: themeColors.primary, + color: themeColors.primary.default, }, headerStyle: { - backgroundColor: themeColors.backgroundDefault, + backgroundColor: themeColors.background.default, }, }); return { title, headerTitleStyle: innerStyles.headerTitleStyle, - headerTintColor: themeColors.primary, + headerTintColor: themeColors.primary.default, headerLeft: () => goBack ? ( // eslint-disable-next-line react/jsx-no-bind @@ -300,18 +300,18 @@ export function getPaymentRequestSuccessOptionsTitle(navigation, themeColors) { headerStyle: { shadowColor: colors.transparent, elevation: 0, - backgroundColor: themeColors.backgroundDefault, + backgroundColor: themeColors.background.default, borderBottomWidth: 0, }, headerIcon: { - color: themeColors.primary, + color: themeColors.primary.default, }, }); return { headerStyle: innerStyles.headerStyle, title: null, - headerTintColor: themeColors.primary, + headerTintColor: themeColors.primary.default, headerLeft: () => , headerRight: () => ( + StyleSheet.create({ + item: { + borderWidth: 1, + borderColor: colors.border.default, + padding: 8, + marginBottom: 8, + borderRadius: 8, + }, + assetListElement: { + flex: 1, + flexDirection: 'row', + alignItems: 'flex-start', + }, + text: { + ...(fontStyles.normal as any), + color: colors.text.default, + }, + textSymbol: { + ...fontStyles.normal, + paddingBottom: 4, + fontSize: 16, + color: colors.text.default, + } as any, + assetInfo: { + flex: 1, + flexDirection: 'column', + alignSelf: 'center', + padding: 4, + }, + assetIcon: { + flexDirection: 'column', + alignSelf: 'center', + marginRight: 12, + }, + ethLogo: { + width: 50, + height: 50, + }, + }); interface Props { /** @@ -64,6 +68,8 @@ interface Props { const AssetList = ({ searchResults, handleSelectAsset, emptyMessage }: Props) => { const tokenList = useSelector(getTokenList); + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); /** * Render logo according to asset. Could be ETH, Identicon or contractMap logo @@ -83,7 +89,7 @@ const AssetList = ({ searchResults, handleSelectAsset, emptyMessage }: Props) => } return ; }, - [tokenList] + [tokenList, styles] ); return ( diff --git a/app/components/UI/PaymentRequest/index.js b/app/components/UI/PaymentRequest/index.js index c288f78b230..c7879450b20 100644 --- a/app/components/UI/PaymentRequest/index.js +++ b/app/components/UI/PaymentRequest/index.js @@ -10,7 +10,7 @@ import { InteractionManager, } from 'react-native'; import { connect } from 'react-redux'; -import { colors, fontStyles, baseStyles } from '../../../styles/common'; +import { fontStyles, baseStyles } from '../../../styles/common'; import { getPaymentRequestOptionsTitle } from '../../UI/Navbar'; import FeatherIcon from 'react-native-vector-icons/Feather'; import Fuse from 'fuse.js'; @@ -44,148 +44,156 @@ import { utils as ethersUtils } from 'ethers'; import { ThemeContext } from '../../../util/theme'; const KEYBOARD_OFFSET = 120; -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - flex: 1, - }, - contentWrapper: { - paddingTop: 24, - paddingHorizontal: 24, - }, - title: { - ...fontStyles.normal, - fontSize: 16, - }, - searchWrapper: { - marginVertical: 8, - }, - searchInput: { - marginHorizontal: 0, - paddingTop: Device.isAndroid() ? 12 : 2, - borderRadius: 8, - paddingHorizontal: 38, - fontSize: 16, - backgroundColor: colors.white, - height: 40, - width: '100%', - color: colors.grey400, - borderColor: colors.grey100, - borderWidth: 1, - ...fontStyles.normal, - }, - searchIcon: { - position: 'absolute', - textAlignVertical: 'center', - marginTop: Device.isAndroid() ? 9 : 10, - marginLeft: 12, - }, - input: { - ...fontStyles.normal, - backgroundColor: colors.white, - borderWidth: 0, - fontSize: 24, - paddingBottom: 0, - paddingRight: 0, - paddingLeft: 0, - paddingTop: 0, - }, - eth: { - ...fontStyles.normal, - fontSize: 24, - paddingTop: Device.isAndroid() ? 3 : 0, - paddingLeft: 10, - textTransform: 'uppercase', - }, - fiatValue: { - ...fontStyles.normal, - fontSize: 18, - }, - split: { - flex: 1, - flexDirection: 'row', - }, - ethContainer: { - flex: 1, - flexDirection: 'row', - paddingLeft: 6, - paddingRight: 10, - }, - container: { - flex: 1, - flexDirection: 'row', - paddingRight: 10, - paddingVertical: 10, - paddingLeft: 14, - position: 'relative', - backgroundColor: colors.white, - borderColor: colors.grey100, - borderRadius: 4, - borderWidth: 1, - }, - amounts: { - maxWidth: '70%', - }, - switchContainer: { - flex: 1, - flexDirection: 'column', - alignSelf: 'center', - right: 0, - }, - switchTouchable: { - flexDirection: 'row', - alignSelf: 'flex-end', - right: 0, - }, - enterAmountWrapper: { - flex: 1, - flexDirection: 'column', - }, - button: { - marginBottom: 16, - }, - buttonsWrapper: { - flex: 1, - flexDirection: 'row', - alignSelf: 'center', - }, - buttonsContainer: { - flex: 1, - flexDirection: 'column', - alignSelf: 'flex-end', - }, - scrollViewContainer: { - flexGrow: 1, - }, - errorWrapper: { - backgroundColor: colors.red000, - borderRadius: 4, - marginTop: 8, - }, - errorText: { - color: colors.fontError, - alignSelf: 'center', - }, - assetsWrapper: { - marginTop: 16, - }, - assetsTitle: { - ...fontStyles.normal, - fontSize: 16, - marginBottom: 8, - }, - secondaryAmount: { - flexDirection: 'row', - }, - currencySymbol: { - ...fontStyles.normal, - fontSize: 24, - }, - currencySymbolSmall: { - ...fontStyles.normal, - fontSize: 18, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + }, + contentWrapper: { + paddingTop: 24, + paddingHorizontal: 24, + }, + title: { + ...fontStyles.normal, + fontSize: 16, + color: colors.text.default, + }, + searchWrapper: { + marginVertical: 8, + }, + searchInput: { + marginHorizontal: 0, + paddingTop: Device.isAndroid() ? 12 : 2, + borderRadius: 8, + paddingHorizontal: 38, + fontSize: 16, + backgroundColor: colors.background.default, + height: 40, + width: '100%', + color: colors.text.default, + borderColor: colors.border.default, + borderWidth: 1, + ...fontStyles.normal, + }, + searchIcon: { + position: 'absolute', + textAlignVertical: 'center', + marginTop: Device.isAndroid() ? 9 : 10, + marginLeft: 12, + }, + input: { + ...fontStyles.normal, + backgroundColor: colors.background.default, + borderWidth: 0, + fontSize: 24, + paddingBottom: 0, + paddingRight: 0, + paddingLeft: 0, + paddingTop: 0, + color: colors.text.default, + }, + eth: { + ...fontStyles.normal, + fontSize: 24, + paddingTop: Device.isAndroid() ? 3 : 0, + paddingLeft: 10, + textTransform: 'uppercase', + color: colors.text.default, + }, + fiatValue: { + ...fontStyles.normal, + fontSize: 18, + color: colors.text.default, + }, + split: { + flex: 1, + flexDirection: 'row', + }, + ethContainer: { + flex: 1, + flexDirection: 'row', + paddingLeft: 6, + paddingRight: 10, + }, + container: { + flex: 1, + flexDirection: 'row', + paddingRight: 10, + paddingVertical: 10, + paddingLeft: 14, + position: 'relative', + backgroundColor: colors.background.default, + borderColor: colors.border.default, + borderRadius: 4, + borderWidth: 1, + }, + amounts: { + maxWidth: '70%', + }, + switchContainer: { + flex: 1, + flexDirection: 'column', + alignSelf: 'center', + right: 0, + }, + switchTouchable: { + flexDirection: 'row', + alignSelf: 'flex-end', + right: 0, + }, + enterAmountWrapper: { + flex: 1, + flexDirection: 'column', + }, + button: { + marginBottom: 16, + }, + buttonsWrapper: { + flex: 1, + flexDirection: 'row', + alignSelf: 'center', + }, + buttonsContainer: { + flex: 1, + flexDirection: 'column', + alignSelf: 'flex-end', + }, + scrollViewContainer: { + flexGrow: 1, + }, + errorWrapper: { + backgroundColor: colors.error.muted, + borderRadius: 4, + marginTop: 8, + }, + errorText: { + color: colors.error.default, + alignSelf: 'center', + }, + assetsWrapper: { + marginTop: 16, + }, + assetsTitle: { + ...fontStyles.normal, + fontSize: 16, + marginBottom: 8, + color: colors.text.default, + }, + secondaryAmount: { + flexDirection: 'row', + }, + currencySymbol: { + ...fontStyles.normal, + fontSize: 24, + color: colors.text.default, + }, + currencySymbolSmall: { + ...fontStyles.normal, + fontSize: 18, + color: colors.text.default, + }, + }); const fuse = new Fuse([], { shouldSort: true, @@ -373,6 +381,8 @@ class PaymentRequest extends PureComponent { const { tokens, chainId, ticker, tokenList } = this.props; const { inputWidth } = this.state; let results; + const { colors } = this.context; + const styles = createStyles(colors); if (chainId === '1') { results = this.state.searchInputValue ? this.state.results : defaultAssets; @@ -402,7 +412,7 @@ class PaymentRequest extends PureComponent { onChangeText={this.handleSearch} onSubmitEditing={this.handleSearch} placeholder={strings('payment_request.search_assets')} - placeholderTextColor={colors.grey400} + placeholderTextColor={colors.text.muted} returnKeyType="go" value={this.state.searchInputValue} blurOnSubmit @@ -412,7 +422,7 @@ class PaymentRequest extends PureComponent { onPress={this.focusInput} name="search" size={18} - color={colors.grey400} + color={colors.text.muted} style={styles.searchIcon} /> @@ -593,6 +603,9 @@ class PaymentRequest extends PureComponent { const currencySymbol = currencySymbols[currentCurrency]; const exchangeRate = selectedAsset && selectedAsset.address && contractExchangeRates[selectedAsset.address]; let switchable = true; + const { colors } = this.context; + const styles = createStyles(colors); + if (!conversionRate) { switchable = false; } else if (selectedAsset.symbol !== 'ETH' && !exchangeRate) { @@ -618,7 +631,7 @@ class PaymentRequest extends PureComponent { numberOfLines={1} onChangeText={this.updateAmount} placeholder={strings('payment_request.amount_placeholder')} - placeholderTextColor={colors.grey100} + placeholderTextColor={colors.text.muted} spellCheck={false} style={styles.input} value={amount} @@ -651,7 +664,7 @@ class PaymentRequest extends PureComponent { onPress={this.focusInput} name="exchange" size={18} - color={colors.grey200} + color={colors.text.muted} style={{ transform: [{ rotate: '270deg' }] }} /> @@ -691,6 +704,9 @@ class PaymentRequest extends PureComponent { render() { const { mode } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + return ( + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + }, + contentWrapper: { + padding: 24, + }, + button: { + marginBottom: 16, + }, + titleText: { + ...fontStyles.bold, + fontSize: 24, + marginVertical: 16, + alignSelf: 'center', + color: colors.text.default, + }, + descriptionText: { + ...fontStyles.normal, + fontSize: 14, + alignSelf: 'center', + textAlign: 'center', + marginVertical: 8, + color: colors.text.default, + }, + linkText: { + ...fontStyles.normal, + fontSize: 14, + color: colors.primary.default, + alignSelf: 'center', + textAlign: 'center', + marginVertical: 16, + }, + buttonsWrapper: { + flex: 1, + flexDirection: 'row', + alignSelf: 'center', + }, + buttonsContainer: { + flex: 1, + flexDirection: 'column', + alignSelf: 'flex-end', + }, + scrollViewContainer: { + flexGrow: 1, + }, + icon: { + color: colors.primary.default, + marginBottom: 16, + }, + blueIcon: { + color: colors.primary.inverse, + }, + iconWrapper: { + alignItems: 'center', + }, + buttonText: { + ...fontStyles.bold, + color: colors.primary.default, + fontSize: 14, + marginLeft: 8, + }, + blueButtonText: { + ...fontStyles.bold, + color: colors.primary.inverse, + fontSize: 14, + marginLeft: 8, + }, + buttonContent: { + flexDirection: 'row', + alignSelf: 'center', + }, + buttonIconWrapper: { + flexDirection: 'column', + alignSelf: 'center', + }, + buttonTextWrapper: { + flexDirection: 'column', + alignSelf: 'center', + }, + detailsWrapper: { + padding: 10, + alignItems: 'center', + }, + addressTitle: { + fontSize: 16, + ...fontStyles.normal, + color: colors.text.default, + }, + informationWrapper: { + paddingHorizontal: 40, + }, + linkWrapper: { + paddingHorizontal: 24, + }, + titleQr: { + flexDirection: 'row', + alignItems: 'center', + marginBottom: isIos ? 8 : 10, + }, + closeIcon: { + right: isIos ? -20 : -40, + alignItems: 'center', + paddingHorizontal: 10, + }, + qrCode: { + marginBottom: 16, + alignItems: 'center', + justifyContent: 'center', + paddingHorizontal: 36, + paddingBottom: 24, + paddingTop: 16, + backgroundColor: colors.background.alternative, + borderRadius: 8, + }, + qrCodeWrapper: { + borderColor: colors.border.default, + borderRadius: 8, + borderWidth: 1, + padding: 15, + }, + }); /** * View to interact with a previously generated payment request link @@ -254,6 +258,9 @@ class PaymentRequestSuccess extends PureComponent { render() { const { link, amount, symbol, qrModalVisible } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + return ( @@ -281,7 +288,7 @@ class PaymentRequestSuccess extends PureComponent { > - + @@ -298,7 +305,7 @@ class PaymentRequestSuccess extends PureComponent { > - + {strings('payment_request.qr_code')} @@ -338,7 +345,7 @@ class PaymentRequestSuccess extends PureComponent { onPress={this.closeQRModal} testID={'payment-request-qrcode-close-button'} > - + diff --git a/app/components/UI/ReceiveRequest/index.js b/app/components/UI/ReceiveRequest/index.js index fa4986e3dd1..e8d00cbfd61 100644 --- a/app/components/UI/ReceiveRequest/index.js +++ b/app/components/UI/ReceiveRequest/index.js @@ -19,7 +19,7 @@ import { showAlert } from '../../../actions/alert'; import { toggleReceiveModal } from '../../../actions/modals'; import { protectWalletModalVisible } from '../../../actions/user'; -import { colors, fontStyles } from '../../../styles/common'; +import { fontStyles } from '../../../styles/common'; import Text from '../../Base/Text'; import ModalHandler from '../../Base/ModalHandler'; import ModalDragger from '../../Base/ModalDragger'; @@ -30,56 +30,57 @@ import StyledButton from '../StyledButton'; import ClipboardManager from '../../../core/ClipboardManager'; import { ThemeContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - borderTopLeftRadius: 10, - borderTopRightRadius: 10, - }, - body: { - alignItems: 'center', - paddingHorizontal: 15, - }, - qrWrapper: { - margin: 15, - }, - addressWrapper: { - flexDirection: 'row', - alignItems: 'center', - margin: 15, - padding: 9, - paddingHorizontal: 15, - backgroundColor: colors.grey000, - borderRadius: 30, - }, - copyButton: { - backgroundColor: colors.grey050, - color: colors.fontPrimary, - borderRadius: 12, - overflow: 'hidden', - paddingVertical: 3, - paddingHorizontal: 6, - marginHorizontal: 6, - }, - actionRow: { - flexDirection: 'row', - marginBottom: 15, - }, - actionButton: { - flex: 1, - marginHorizontal: 8, - }, - title: { - ...fontStyles.normal, - color: colors.fontPrimary, - fontSize: 18, - flexDirection: 'row', - alignSelf: 'center', - }, - titleWrapper: { - marginTop: 10, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + borderTopLeftRadius: 10, + borderTopRightRadius: 10, + }, + body: { + alignItems: 'center', + paddingHorizontal: 15, + }, + qrWrapper: { + margin: 15, + }, + addressWrapper: { + flexDirection: 'row', + alignItems: 'center', + margin: 15, + padding: 9, + paddingHorizontal: 15, + backgroundColor: colors.background.alternative, + borderRadius: 30, + }, + copyButton: { + backgroundColor: colors.border.muted, + color: colors.text.default, + borderRadius: 12, + overflow: 'hidden', + paddingVertical: 3, + paddingHorizontal: 6, + marginHorizontal: 6, + }, + actionRow: { + flexDirection: 'row', + marginBottom: 15, + }, + actionButton: { + flex: 1, + marginHorizontal: 8, + }, + title: { + ...fontStyles.normal, + color: colors.text.default, + fontSize: 18, + flexDirection: 'row', + alignSelf: 'center', + }, + titleWrapper: { + marginTop: 10, + }, + }); /** * PureComponent that renders receive options @@ -215,6 +216,9 @@ class ReceiveRequest extends PureComponent { }; render() { + const { colors } = this.context; + const styles = createStyles(colors); + return ( @@ -240,6 +244,8 @@ class ReceiveRequest extends PureComponent { diff --git a/app/components/Views/GasEducationCarousel/index.js b/app/components/Views/GasEducationCarousel/index.js index 0cafe341909..0a06d5c4bcb 100644 --- a/app/components/Views/GasEducationCarousel/index.js +++ b/app/components/Views/GasEducationCarousel/index.js @@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import { View, ScrollView, StyleSheet, Image, Dimensions, TouchableOpacity } from 'react-native'; import StyledButton from '../../UI/StyledButton'; -import { colors, baseStyles } from '../../../styles/common'; +import { baseStyles } from '../../../styles/common'; import { strings } from '../../../../locales/i18n'; import FadeOutOverlay from '../../UI/FadeOutOverlay'; import ScrollableTabView from 'react-native-scrollable-tab-view'; @@ -21,89 +21,90 @@ const DEVICE_WIDTH = Dimensions.get('window').width; const IMG_PADDING = Device.isIphone5() ? 220 : 200; -const styles = StyleSheet.create({ - scroll: { - flexGrow: 1, - }, - wrapper: { - paddingVertical: Device.isIphone5() ? 15 : 30, - flex: 1, - }, - title: { - fontSize: 24, - marginBottom: Device.isIphone5() ? 8 : 14, - justifyContent: 'center', - textAlign: 'center', - }, - subtitle: { - fontSize: 14, - marginBottom: Device.isIphone5() ? 8 : 14, - justifyContent: 'center', - textAlign: 'center', - lineHeight: 20, - }, - subheader: { - fontSize: 16, - marginBottom: Device.isIphone5() ? 8 : 14, - lineHeight: 22.5, - justifyContent: 'center', - textAlign: 'center', - }, - link: { - marginTop: Device.isIphone5() ? 12 : 24, - fontSize: 14, - justifyContent: 'center', - textAlign: 'center', - lineHeight: 20, - }, - ctas: { - flex: 1, - justifyContent: 'flex-end', - paddingHorizontal: 40, - }, - ctaWrapper: { - justifyContent: 'flex-end', - }, - carouselImage: {}, - // eslint-disable-next-line react-native/no-unused-styles - carouselImage1: { - width: DEVICE_WIDTH - IMG_PADDING, - height: (DEVICE_WIDTH - IMG_PADDING) * IMAGE_1_RATIO, - }, - // eslint-disable-next-line react-native/no-unused-styles - carouselImage2: { - width: DEVICE_WIDTH - IMG_PADDING, - height: (DEVICE_WIDTH - IMG_PADDING) * IMAGE_2_RATIO, - }, - // eslint-disable-next-line react-native/no-unused-styles - carouselImage3: { - width: DEVICE_WIDTH - IMG_PADDING, - height: (DEVICE_WIDTH - IMG_PADDING) * IMAGE_3_RATIO, - }, - carouselImageWrapper: { - flexDirection: 'row', - justifyContent: 'center', - }, - circle: { - width: 8, - height: 8, - borderRadius: 8 / 2, - backgroundColor: colors.grey500, - opacity: 0.4, - marginHorizontal: 8, - }, - solidCircle: { - opacity: 1, - }, - progessContainer: { - flexDirection: 'row', - alignSelf: 'center', - marginVertical: Device.isIphone5() ? 18 : 36, - }, - tab: { - margin: 32, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + scroll: { + flexGrow: 1, + }, + wrapper: { + paddingVertical: Device.isIphone5() ? 15 : 30, + flex: 1, + }, + title: { + fontSize: 24, + marginBottom: Device.isIphone5() ? 8 : 14, + justifyContent: 'center', + textAlign: 'center', + }, + subtitle: { + fontSize: 14, + marginBottom: Device.isIphone5() ? 8 : 14, + justifyContent: 'center', + textAlign: 'center', + lineHeight: 20, + }, + subheader: { + fontSize: 16, + marginBottom: Device.isIphone5() ? 8 : 14, + lineHeight: 22.5, + justifyContent: 'center', + textAlign: 'center', + }, + link: { + marginTop: Device.isIphone5() ? 12 : 24, + fontSize: 14, + justifyContent: 'center', + textAlign: 'center', + lineHeight: 20, + }, + ctas: { + flex: 1, + justifyContent: 'flex-end', + paddingHorizontal: 40, + }, + ctaWrapper: { + justifyContent: 'flex-end', + }, + carouselImage: {}, + // eslint-disable-next-line react-native/no-unused-styles + carouselImage1: { + width: DEVICE_WIDTH - IMG_PADDING, + height: (DEVICE_WIDTH - IMG_PADDING) * IMAGE_1_RATIO, + }, + // eslint-disable-next-line react-native/no-unused-styles + carouselImage2: { + width: DEVICE_WIDTH - IMG_PADDING, + height: (DEVICE_WIDTH - IMG_PADDING) * IMAGE_2_RATIO, + }, + // eslint-disable-next-line react-native/no-unused-styles + carouselImage3: { + width: DEVICE_WIDTH - IMG_PADDING, + height: (DEVICE_WIDTH - IMG_PADDING) * IMAGE_3_RATIO, + }, + carouselImageWrapper: { + flexDirection: 'row', + justifyContent: 'center', + }, + circle: { + width: 8, + height: 8, + borderRadius: 8 / 2, + backgroundColor: colors.text.alternative, + opacity: 0.4, + marginHorizontal: 8, + }, + solidCircle: { + opacity: 1, + }, + progessContainer: { + flexDirection: 'row', + alignSelf: 'center', + marginVertical: Device.isIphone5() ? 18 : 36, + }, + tab: { + margin: 32, + }, + }); const gas_education_carousel_1 = require('../../../images/gas-education-carousel-1.png'); // eslint-disable-line const gas_education_carousel_2 = require('../../../images/gas-education-carousel-2.png'); // eslint-disable-line @@ -117,6 +118,7 @@ const GasEducationCarousel = ({ navigation, route, conversionRate, currentCurren const [currentTab, setCurrentTab] = useState(1); const [gasFiat, setGasFiat] = useState(null); const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); useEffect(() => { navigation.setOptions(getTransparentOnboardingNavbarOptions(colors)); From aaa7619e3e2e4a65730629363df2c642702d0bbd Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Fri, 11 Feb 2022 16:47:46 -0800 Subject: [PATCH 31/77] Add dark colors to settings --- .../UI/SettingsNotification/index.js | 106 ++-- app/components/Views/ResetPassword/index.js | 458 +++++++++--------- .../Views/RevealPrivateCredential/index.js | 216 +++++---- .../Views/Settings/AdvancedSettings/index.js | 12 +- .../Settings/ExperimentalSettings/index.tsx | 6 +- .../Views/Settings/GeneralSettings/index.js | 6 +- .../Views/Settings/SecuritySettings/index.js | 32 +- .../Views/WalletConnectSessions/index.js | 2 +- package.json | 2 +- yarn.lock | 8 +- 10 files changed, 454 insertions(+), 394 deletions(-) diff --git a/app/components/UI/SettingsNotification/index.js b/app/components/UI/SettingsNotification/index.js index 797e5985603..bbca81b0168 100644 --- a/app/components/UI/SettingsNotification/index.js +++ b/app/components/UI/SettingsNotification/index.js @@ -3,42 +3,53 @@ import PropTypes from 'prop-types'; import { View, StyleSheet } from 'react-native'; import Icon from 'react-native-vector-icons/FontAwesome'; import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'; -import { colors } from '../../../styles/common'; +import { useAppThemeFromContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - menuItemWarning: { - flex: 1, - alignSelf: 'center', - justifyContent: 'flex-end', - flexDirection: 'row', - marginRight: 24, - }, - wrapper: { - padding: 12, - borderRadius: 10, - display: 'flex', - flexDirection: 'row', - justifyContent: 'center', - alignItems: 'center', - width: '100%', - marginTop: 10, - }, - icon: { - marginRight: 4, - }, - red: { - backgroundColor: colors.red000, - }, - normal: { - backgroundColor: colors.grey000, - }, - check: { - color: colors.green500, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + menuItemWarning: { + flex: 1, + alignSelf: 'center', + justifyContent: 'flex-end', + flexDirection: 'row', + marginRight: 24, + }, + wrapper: { + padding: 12, + borderRadius: 10, + display: 'flex', + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + width: '100%', + marginTop: 10, + }, + icon: { + marginRight: 4, + }, + red: { + backgroundColor: colors.error.muted, + }, + normal: { + backgroundColor: colors.background.alternative, + }, + check: { + color: colors.success.default, + }, + }); -const WarningIcon = () => ; -const CheckIcon = () => ; +const WarningIcon = () => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ; +}; +const CheckIcon = () => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ; +}; const propTypes = { style: PropTypes.object, @@ -53,17 +64,22 @@ const defaultProps = { isHighlighted: false, }; -const SettingsNotification = ({ style, isWarning, isNotification, children }) => ( - - {isWarning ? : } - {children} - -); +const SettingsNotification = ({ style, isWarning, isNotification, children }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ( + + {isWarning ? : } + {children} + + ); +}; SettingsNotification.propTypes = propTypes; SettingsNotification.defaultProps = defaultProps; diff --git a/app/components/Views/ResetPassword/index.js b/app/components/Views/ResetPassword/index.js index 669821eaafd..e7454ef53b3 100644 --- a/app/components/Views/ResetPassword/index.js +++ b/app/components/Views/ResetPassword/index.js @@ -25,7 +25,7 @@ import { setLockTime } from '../../../actions/settings'; import StyledButton from '../../UI/StyledButton'; import Engine from '../../../core/Engine'; import Device from '../../../util/device'; -import { colors, fontStyles, baseStyles } from '../../../styles/common'; +import { fontStyles, baseStyles } from '../../../styles/common'; import { strings } from '../../../../locales/i18n'; import { getNavigationOptionsTitle } from '../../UI/Navbar'; import SecureKeychain from '../../../core/SecureKeychain'; @@ -40,210 +40,213 @@ import NotificationManager from '../../../core/NotificationManager'; import { syncPrefs } from '../../../util/sync'; import { ThemeContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - mainWrapper: { - backgroundColor: colors.white, - flex: 1, - }, - scrollviewWrapper: { - flexGrow: 1, - }, - confirm_title: { - fontSize: 32, - marginTop: 10, - marginBottom: 10, - color: colors.fontPrimary, - justifyContent: 'center', - textAlign: 'left', - ...fontStyles.normal, - }, - confirm_input: { - borderWidth: 2, - borderRadius: 5, - width: '100%', - borderColor: colors.grey000, - padding: 10, - height: 40, - }, - confirm_label: { - fontSize: 16, - lineHeight: 23, - color: colors.fontPrimary, - textAlign: 'left', - ...fontStyles.normal, - }, - wrapper: { - flex: 1, - marginBottom: 10, - }, - scrollableWrapper: { - flex: 1, - paddingHorizontal: 32, - }, - keyboardScrollableWrapper: { - flexGrow: 1, - }, - loadingWrapper: { - paddingHorizontal: 40, - paddingBottom: 30, - alignItems: 'center', - flex: 1, - }, - foxWrapper: { - width: Device.isIos() ? 90 : 80, - height: Device.isIos() ? 90 : 80, - marginTop: 30, - marginBottom: 30, - }, - image: { - alignSelf: 'center', - width: 80, - height: 80, - }, - passwordRequiredContent: { - marginBottom: 20, - }, - content: { - alignItems: 'flex-start', - }, - title: { - fontSize: 24, - marginTop: 20, - marginBottom: 20, - color: colors.fontPrimary, - justifyContent: 'center', - textAlign: 'center', - width: '100%', - ...fontStyles.normal, - }, - subtitle: { - fontSize: 16, - lineHeight: 23, - color: colors.fontPrimary, - textAlign: 'center', - ...fontStyles.normal, - }, - text: { - marginBottom: 10, - justifyContent: 'center', - ...fontStyles.normal, - }, - checkboxContainer: { - marginTop: 10, - marginHorizontal: 10, - flex: 1, - alignItems: 'center', - justifyContent: 'center', - flexDirection: 'row', - }, - checkbox: { - width: 18, - height: 18, - margin: 10, - marginTop: -5, - }, - label: { - ...fontStyles.normal, - fontSize: 14, - color: colors.black, - paddingHorizontal: 10, - lineHeight: 18, - }, - learnMore: { - color: colors.blue, - textDecorationLine: 'underline', - textDecorationColor: colors.blue, - }, - field: { - position: 'relative', - }, - input: { - borderWidth: 1, - borderColor: colors.grey500, - padding: 10, - borderRadius: 6, - fontSize: 14, - height: 50, - ...fontStyles.normal, - }, - ctaWrapper: { - flex: 1, - marginTop: 20, - paddingHorizontal: 10, - }, - errorMsg: { - color: colors.red, - ...fontStyles.normal, - }, - biometrics: { - position: 'relative', - marginTop: 20, - marginBottom: 30, - }, - biometryLabel: { - fontSize: 14, - color: colors.fontPrimary, - position: 'absolute', - top: 0, - left: 0, - }, - biometrySwitch: { - position: 'absolute', - top: 0, - right: 0, - }, - hintLabel: { - height: 20, - marginTop: 14, - fontSize: 12, - color: colors.grey450, - textAlign: 'left', - ...fontStyles.normal, - }, - showPassword: { - position: 'absolute', - top: 0, - right: 0, - }, - // eslint-disable-next-line react-native/no-unused-styles - strength_weak: { - color: colors.red, - }, - // eslint-disable-next-line react-native/no-unused-styles - strength_good: { - color: colors.blue, - }, - // eslint-disable-next-line react-native/no-unused-styles - strength_strong: { - color: colors.green300, - }, - showMatchingPasswords: { - position: 'absolute', - top: 50, - right: 17, - alignSelf: 'flex-end', - }, - confirmPasswordWrapper: { - flex: 1, - padding: 30, - paddingTop: 0, - }, - buttonWrapper: { - flex: 1, - marginTop: 20, - justifyContent: 'flex-end', - }, - warningMessageText: { - paddingVertical: 10, - color: colors.red, - ...fontStyles.normal, - }, - keyboardAvoidingView: { - flex: 1, - flexDirection: 'row', - alignSelf: 'center', - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + mainWrapper: { + backgroundColor: colors.background.default, + flex: 1, + }, + scrollviewWrapper: { + flexGrow: 1, + }, + confirm_title: { + fontSize: 32, + marginTop: 10, + marginBottom: 10, + color: colors.text.default, + justifyContent: 'center', + textAlign: 'left', + ...fontStyles.normal, + }, + confirm_input: { + borderWidth: 2, + borderRadius: 5, + width: '100%', + borderColor: colors.border.default, + padding: 10, + height: 40, + color: colors.text.default, + }, + confirm_label: { + fontSize: 16, + lineHeight: 23, + color: colors.text.default, + textAlign: 'left', + ...fontStyles.normal, + }, + wrapper: { + flex: 1, + marginBottom: 10, + }, + scrollableWrapper: { + flex: 1, + paddingHorizontal: 32, + }, + keyboardScrollableWrapper: { + flexGrow: 1, + }, + loadingWrapper: { + paddingHorizontal: 40, + paddingBottom: 30, + alignItems: 'center', + flex: 1, + }, + foxWrapper: { + width: Device.isIos() ? 90 : 80, + height: Device.isIos() ? 90 : 80, + marginTop: 30, + marginBottom: 30, + }, + image: { + alignSelf: 'center', + width: 80, + height: 80, + }, + passwordRequiredContent: { + marginBottom: 20, + }, + content: { + alignItems: 'flex-start', + }, + title: { + fontSize: 24, + marginTop: 20, + marginBottom: 20, + color: colors.text.default, + justifyContent: 'center', + textAlign: 'center', + width: '100%', + ...fontStyles.normal, + }, + subtitle: { + fontSize: 16, + lineHeight: 23, + color: colors.text.default, + textAlign: 'center', + ...fontStyles.normal, + }, + text: { + marginBottom: 10, + justifyContent: 'center', + ...fontStyles.normal, + }, + checkboxContainer: { + marginTop: 10, + marginHorizontal: 10, + flex: 1, + alignItems: 'center', + justifyContent: 'center', + flexDirection: 'row', + }, + checkbox: { + width: 18, + height: 18, + margin: 10, + marginTop: -5, + }, + label: { + ...fontStyles.normal, + fontSize: 14, + color: colors.text.default, + paddingHorizontal: 10, + lineHeight: 18, + }, + learnMore: { + color: colors.primary.default, + textDecorationLine: 'underline', + textDecorationColor: colors.primary.default, + }, + field: { + position: 'relative', + }, + input: { + borderWidth: 1, + borderColor: colors.border.default, + padding: 10, + borderRadius: 6, + fontSize: 14, + height: 50, + ...fontStyles.normal, + color: colors.text.default, + }, + ctaWrapper: { + flex: 1, + marginTop: 20, + paddingHorizontal: 10, + }, + errorMsg: { + color: colors.error.default, + ...fontStyles.normal, + }, + biometrics: { + position: 'relative', + marginTop: 20, + marginBottom: 30, + }, + biometryLabel: { + fontSize: 14, + color: colors.text.default, + position: 'absolute', + top: 0, + left: 0, + }, + biometrySwitch: { + position: 'absolute', + top: 0, + right: 0, + }, + hintLabel: { + height: 20, + marginTop: 14, + fontSize: 12, + color: colors.text.default, + textAlign: 'left', + ...fontStyles.normal, + }, + showPassword: { + position: 'absolute', + top: 0, + right: 0, + }, + // eslint-disable-next-line react-native/no-unused-styles + strength_weak: { + color: colors.error.default, + }, + // eslint-disable-next-line react-native/no-unused-styles + strength_good: { + color: colors.primary.default, + }, + // eslint-disable-next-line react-native/no-unused-styles + strength_strong: { + color: colors.success.default, + }, + showMatchingPasswords: { + position: 'absolute', + top: 50, + right: 17, + alignSelf: 'flex-end', + }, + confirmPasswordWrapper: { + flex: 1, + padding: 30, + paddingTop: 0, + }, + buttonWrapper: { + flex: 1, + marginTop: 20, + justifyContent: 'flex-end', + }, + warningMessageText: { + paddingVertical: 10, + color: colors.error.default, + ...fontStyles.normal, + }, + keyboardAvoidingView: { + flex: 1, + flexDirection: 'row', + alignSelf: 'center', + }, + }); const PASSCODE_NOT_SET_ERROR = 'Error: Passcode not set.'; const RESET_PASSWORD = 'reset_password'; @@ -499,6 +502,9 @@ class ResetPassword extends PureComponent { renderSwitch = () => { const { biometryType, rememberMe, biometryChoice } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + return ( {biometryType ? ( @@ -511,7 +517,9 @@ class ResetPassword extends PureComponent { onValueChange={this.updateBiometryChoice} // eslint-disable-line react/jsx-no-bind value={biometryChoice} style={styles.biometrySwitch} - trackColor={Device.isIos() ? { true: colors.green300, false: colors.grey300 } : null} + trackColor={ + Device.isIos() ? { true: colors.success.default, false: colors.grey300 } : null + } ios_backgroundColor={colors.grey300} /> @@ -523,7 +531,7 @@ class ResetPassword extends PureComponent { onValueChange={(rememberMe) => this.setState({ rememberMe })} // eslint-disable-line react/jsx-no-bind value={rememberMe} style={styles.biometrySwitch} - trackColor={Device.isIos() ? { true: colors.green300, false: colors.grey300 } : null} + trackColor={Device.isIos() ? { true: colors.success.default, false: colors.grey300 } : null} ios_backgroundColor={colors.grey300} /> @@ -583,16 +591,24 @@ class ResetPassword extends PureComponent { }); }; - renderLoader = () => ( - - - - ); + renderLoader = () => { + const { colors } = this.context; + const styles = createStyles(colors); + + return ( + + + + ); + }; setConfirmPassword = (val) => this.setState({ confirmPassword: val }); renderConfirmPassword() { const { warningIncorrectPassword } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + return ( @@ -607,7 +623,7 @@ class ResetPassword extends PureComponent { )} - + {strings( previousScreen === ONBOARDING @@ -715,7 +736,7 @@ class ResetPassword extends PureComponent { onChangeText={this.setConfirmPassword} secureTextEntry={secureTextEntry} placeholder={''} - placeholderTextColor={colors.grey100} + placeholderTextColor={colors.text.muted} testID={'input-password-confirm'} onSubmitEditing={this.onPressCreate} returnKeyType={'done'} @@ -723,7 +744,7 @@ class ResetPassword extends PureComponent { /> {passwordsMatch ? ( - + ) : null} @@ -736,7 +757,7 @@ class ResetPassword extends PureComponent { value={isSelected} onValueChange={this.setSelection} style={styles.checkbox} - tintColors={{ true: colors.blue }} + tintColors={{ true: colors.primary.default }} boxType="square" testID={'password-understand-box'} /> @@ -770,6 +791,9 @@ class ResetPassword extends PureComponent { render() { const { view, ready } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + if (!ready) return this.renderLoader(); return ( diff --git a/app/components/Views/RevealPrivateCredential/index.js b/app/components/Views/RevealPrivateCredential/index.js index 1b69dda9845..76c6d45ee33 100644 --- a/app/components/Views/RevealPrivateCredential/index.js +++ b/app/components/Views/RevealPrivateCredential/index.js @@ -10,7 +10,7 @@ import { InteractionManager, } from 'react-native'; import AsyncStorage from '@react-native-community/async-storage'; -import { colors, fontStyles } from '../../../styles/common'; +import { fontStyles } from '../../../styles/common'; import PropTypes from 'prop-types'; import { strings } from '../../../../locales/i18n'; import ActionView from '../../UI/ActionView'; @@ -28,106 +28,109 @@ import { BIOMETRY_CHOICE } from '../../../constants/storage'; import ClipboardManager from '../../../core/ClipboardManager'; import { ThemeContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - flex: 1, - }, - header: { - borderBottomColor: colors.grey400, - borderBottomWidth: 1, - ...fontStyles.normal, - }, - seedPhrase: { - backgroundColor: colors.white, - marginTop: 10, - paddingBottom: 20, - paddingLeft: 20, - paddingRight: 20, - borderColor: colors.grey400, - borderBottomWidth: 1, - fontSize: 20, - textAlign: 'center', - color: colors.black, - ...fontStyles.normal, - }, - seedPhraseView: { - borderRadius: 10, - borderWidth: 1, - borderColor: colors.grey400, - marginTop: 10, - alignItems: 'center', - }, - privateCredentialAction: { - flex: 1, - flexDirection: 'row', - alignItems: 'center', - }, - rowWrapper: { - padding: 20, - }, - warningWrapper: { - backgroundColor: colors.red000, - }, - warningRowWrapper: { - flex: 1, - flexDirection: 'row', - alignContent: 'center', - alignItems: 'center', - }, - warningText: { - marginTop: 10, - color: colors.red, - ...fontStyles.normal, - }, - input: { - borderWidth: 2, - borderRadius: 5, - borderColor: colors.grey000, - padding: 10, - }, - icon: { - margin: 10, - color: colors.red, - }, - actionIcon: { - margin: 10, - color: colors.blue, - }, - actionText: { - color: colors.blue, - }, - warningMessageText: { - marginLeft: 10, - marginRight: 40, - ...fontStyles.normal, - }, - enterPassword: { - marginBottom: 15, - }, - tabContent: { - padding: 20, - }, - qrCodeWrapper: { - marginTop: 20, - flex: 1, - alignItems: 'center', - justifyContent: 'center', - }, - tabUnderlineStyle: { - height: 2, - backgroundColor: colors.blue, - }, - tabStyle: { - paddingBottom: 0, - backgroundColor: colors.beige, - }, - textStyle: { - fontSize: 12, - letterSpacing: 0.5, - ...fontStyles.bold, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + }, + header: { + borderBottomColor: colors.border.muted, + borderBottomWidth: 1, + ...fontStyles.normal, + }, + seedPhrase: { + backgroundColor: colors.background.default, + marginTop: 10, + paddingBottom: 20, + paddingLeft: 20, + paddingRight: 20, + borderColor: colors.border.default, + borderBottomWidth: 1, + fontSize: 20, + textAlign: 'center', + color: colors.text.default, + ...fontStyles.normal, + }, + seedPhraseView: { + borderRadius: 10, + borderWidth: 1, + borderColor: colors.grey400, + marginTop: 10, + alignItems: 'center', + }, + privateCredentialAction: { + flex: 1, + flexDirection: 'row', + alignItems: 'center', + }, + rowWrapper: { + padding: 20, + }, + warningWrapper: { + backgroundColor: colors.error.muted, + }, + warningRowWrapper: { + flex: 1, + flexDirection: 'row', + alignContent: 'center', + alignItems: 'center', + }, + warningText: { + marginTop: 10, + color: colors.error.default, + ...fontStyles.normal, + }, + input: { + borderWidth: 2, + borderRadius: 5, + borderColor: colors.border.default, + padding: 10, + }, + icon: { + margin: 10, + color: colors.error.default, + }, + actionIcon: { + margin: 10, + color: colors.primary.default, + }, + actionText: { + color: colors.primary.default, + }, + warningMessageText: { + marginLeft: 10, + marginRight: 40, + ...fontStyles.normal, + color: colors.error.default, + }, + enterPassword: { + marginBottom: 15, + }, + tabContent: { + padding: 20, + }, + qrCodeWrapper: { + marginTop: 20, + flex: 1, + alignItems: 'center', + justifyContent: 'center', + }, + tabUnderlineStyle: { + height: 2, + backgroundColor: colors.primary.default, + }, + tabStyle: { + paddingBottom: 0, + backgroundColor: colors.beige, + }, + textStyle: { + fontSize: 12, + letterSpacing: 0.5, + ...fontStyles.bold, + color: colors.text.default, + }, + }); const WRONG_PASSWORD_ERROR = 'Error: Decrypt failed'; @@ -278,11 +281,14 @@ class RevealPrivateCredential extends PureComponent { }; renderTabBar() { + const { colors } = this.context; + const styles = createStyles(colors); + return ( { const { unlocked, privateCredential } = this.state; const privateCredentialName = this.props.privateCredentialName || this.props.route.params.privateCredentialName; + const { colors } = this.context; + const styles = createStyles(colors); return ( @@ -362,7 +370,7 @@ class RevealPrivateCredential extends PureComponent { style={styles.input} testID={'private-credential-password-text-input'} placeholder={'Password'} - placeholderTextColor={colors.grey100} + placeholderTextColor={colors.text.muted} onChangeText={this.onPasswordChange} secureTextEntry onSubmitEditing={this.tryUnlock} diff --git a/app/components/Views/Settings/AdvancedSettings/index.js b/app/components/Views/Settings/AdvancedSettings/index.js index 9cc37f57e7a..4808341ac1b 100644 --- a/app/components/Views/Settings/AdvancedSettings/index.js +++ b/app/components/Views/Settings/AdvancedSettings/index.js @@ -306,8 +306,10 @@ class AdvancedSettings extends PureComponent { @@ -318,8 +320,10 @@ class AdvancedSettings extends PureComponent { diff --git a/app/components/Views/Settings/ExperimentalSettings/index.tsx b/app/components/Views/Settings/ExperimentalSettings/index.tsx index 1c9044c4e1c..753654454ba 100644 --- a/app/components/Views/Settings/ExperimentalSettings/index.tsx +++ b/app/components/Views/Settings/ExperimentalSettings/index.tsx @@ -115,9 +115,11 @@ const ExperimentalSettings = ({ navigation, route }: Props) => { value={isTokenDetectionEnabled} onValueChange={toggleTokenDetection} trackColor={ - Device.isIos() ? { true: colors.primary.default, false: colors.grey000 } : undefined + Device.isIos() + ? { true: colors.primary.default, false: colors.border.muted } + : undefined } - ios_backgroundColor={colors.grey000} + ios_backgroundColor={colors.border.muted} /> diff --git a/app/components/Views/Settings/GeneralSettings/index.js b/app/components/Views/Settings/GeneralSettings/index.js index c5f336a5e36..e56247e1273 100644 --- a/app/components/Views/Settings/GeneralSettings/index.js +++ b/app/components/Views/Settings/GeneralSettings/index.js @@ -300,8 +300,10 @@ class Settings extends PureComponent { diff --git a/app/components/Views/Settings/SecuritySettings/index.js b/app/components/Views/Settings/SecuritySettings/index.js index 1354a59b6c0..ec25a488ee8 100644 --- a/app/components/Views/Settings/SecuritySettings/index.js +++ b/app/components/Views/Settings/SecuritySettings/index.js @@ -715,8 +715,10 @@ class Settings extends PureComponent { @@ -732,8 +734,10 @@ class Settings extends PureComponent { @@ -795,9 +799,9 @@ class Settings extends PureComponent { value={privacyMode} onValueChange={this.togglePrivacy} trackColor={ - Device.isIos() ? { true: colors.primary.default, false: colors.grey000 } : null + Device.isIos() ? { true: colors.primary.default, false: colors.border.muted } : null } - ios_backgroundColor={colors.grey000} + ios_backgroundColor={colors.border.muted} /> @@ -809,9 +813,9 @@ class Settings extends PureComponent { value={analyticsEnabled} onValueChange={this.toggleMetricsOptIn} trackColor={ - Device.isIos() ? { true: colors.primary.default, false: colors.grey000 } : null + Device.isIos() ? { true: colors.primary.default, false: colors.border.muted } : null } - ios_backgroundColor={colors.grey000} + ios_backgroundColor={colors.border.muted} testID={'metametrics-switch'} /> @@ -824,9 +828,9 @@ class Settings extends PureComponent { value={thirdPartyApiMode} onValueChange={this.toggleThirdPartyAPI} trackColor={ - Device.isIos() ? { true: colors.primary.default, false: colors.grey000 } : null + Device.isIos() ? { true: colors.primary.default, false: colors.border.muted } : null } - ios_backgroundColor={colors.grey000} + ios_backgroundColor={colors.border.muted} /> @@ -886,10 +890,10 @@ class Settings extends PureComponent { onValueChange={this.toggleOpenSeaApi} trackColor={ Device.isIos() - ? { true: colors.primary.default, false: colors.grey000 } + ? { true: colors.primary.default, false: colors.border.muted } : null } - ios_backgroundColor={colors.grey000} + ios_backgroundColor={colors.border.muted} /> @@ -902,10 +906,10 @@ class Settings extends PureComponent { onValueChange={this.toggleNftAutodetect} trackColor={ Device.isIos() - ? { true: colors.primary.default, false: colors.grey000 } + ? { true: colors.primary.default, false: colors.border.muted } : null } - ios_backgroundColor={colors.grey000} + ios_backgroundColor={colors.border.muted} disabled={!openSeaEnabled} /> diff --git a/app/components/Views/WalletConnectSessions/index.js b/app/components/Views/WalletConnectSessions/index.js index cad6e4832c1..058ca0310b7 100644 --- a/app/components/Views/WalletConnectSessions/index.js +++ b/app/components/Views/WalletConnectSessions/index.js @@ -29,7 +29,7 @@ const createStyles = (colors) => flexDirection: 'row', paddingVertical: 10, paddingHorizontal: 20, - borderBottomColor: colors.grey000, + borderBottomColor: colors.border.muted, borderBottomWidth: 1, }, info: { diff --git a/package.json b/package.json index 2485259408c..bd153d7d4cc 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "@exodus/react-native-payments": "git+https://github.com/MetaMask/react-native-payments.git#dbc8cbbed570892d2fea5e3d183bf243e062c1e5", "@metamask/contract-metadata": "^1.30.0", "@metamask/controllers": "^22.0.0", - "@metamask/design-tokens": "^1.0.0", + "@metamask/design-tokens": "^1.1.0", "@metamask/etherscan-link": "^2.0.0", "@metamask/swaps-controller": "^6.3.0", "@react-native-clipboard/clipboard": "^1.8.4", diff --git a/yarn.lock b/yarn.lock index 9da199917cf..52e3b4b4a3e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2234,10 +2234,10 @@ web3 "^0.20.7" web3-provider-engine "^16.0.3" -"@metamask/design-tokens@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@metamask/design-tokens/-/design-tokens-1.0.0.tgz#49f0321767f651085b45a5a02114a2529843b24d" - integrity sha512-ZpJwygJwdmbBlku+mubqrdlItz1SO2V6Dnfh/3zhOXUK2sxNSM13b8wZRy/3Zz2AZhLpNg7d0AEw1wmKKopFfw== +"@metamask/design-tokens@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@metamask/design-tokens/-/design-tokens-1.1.0.tgz#f56a50f4819669848cb966275d53c7feef3fd84d" + integrity sha512-G1b8ARsOUEDpSAxkmBAWceKDCxmNPoggIB2YSDF1sOj+p3VRUezoi2lR0rQ+VxpDWa9XoHXZsp4a8q90xoVXoQ== "@metamask/eslint-config-typescript@^7.0.0": version "7.0.1" From 150f0e2381719d0ef13a87e858ab9346de8108f6 Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Fri, 11 Feb 2022 19:57:58 -0800 Subject: [PATCH 32/77] Update onboarding flow with dark colors --- app/components/UI/HintModal/index.js | 152 +++++++++-------- app/components/UI/OnboardingProgress/index.js | 62 +++---- .../UI/OnboardingScreenWithBg/index.js | 26 +-- app/components/UI/SeedphraseModal/index.js | 158 ++++++++++-------- .../UI/SkipAccountSecurityModal/index.js | 2 +- .../UI/StyledButton/styledButtonStyles.js | 12 +- app/components/UI/WebviewError/index.js | 10 +- .../Views/AccountBackupStep1B/index.js | 13 +- app/components/Views/ChoosePassword/index.js | 36 ++-- app/components/Views/ImportFromSeed/index.js | 20 ++- app/components/Views/Login/index.js | 42 ++--- .../Views/ManualBackupStep1/index.js | 16 +- .../Views/ManualBackupStep2/index.js | 19 ++- app/components/Views/Onboarding/index.js | 17 +- app/components/Views/ResetPassword/index.js | 17 +- 15 files changed, 311 insertions(+), 291 deletions(-) diff --git a/app/components/UI/HintModal/index.js b/app/components/UI/HintModal/index.js index 46fb33dad67..ae00f25fb31 100644 --- a/app/components/UI/HintModal/index.js +++ b/app/components/UI/HintModal/index.js @@ -4,79 +4,91 @@ import React from 'react'; import ActionModal from '../../UI/ActionModal'; import Icon from 'react-native-vector-icons/Octicons'; import { strings } from '../../../../locales/i18n'; -import { colors, fontStyles } from '../../../styles/common'; +import { fontStyles } from '../../../styles/common'; +import { useAppThemeFromContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - hintWrapper: { - alignSelf: 'center', - backgroundColor: colors.white, - borderRadius: 16, - padding: 24, - }, - hintHeader: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - marginBottom: 16, - }, - recovery: { - fontSize: 18, - ...fontStyles.bold, - color: colors.fontPrimary, - }, - leaveHint: { - fontSize: 14, - ...fontStyles.regular, - color: colors.fontPrimary, - marginBottom: 16, - }, - noSeedphrase: { - fontSize: 14, - ...fontStyles.regular, - color: colors.red, - marginBottom: 16, - }, - hintInput: { - borderRadius: 6, - borderWidth: 1, - borderColor: colors.grey500, - padding: 16, - minHeight: 76, - paddingTop: 16, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + hintWrapper: { + alignSelf: 'center', + backgroundColor: colors.background.default, + borderRadius: 16, + padding: 24, + }, + hintHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: 16, + }, + recovery: { + fontSize: 18, + ...fontStyles.bold, + color: colors.text.default, + }, + leaveHint: { + fontSize: 14, + ...fontStyles.regular, + color: colors.text.default, + marginBottom: 16, + }, + noSeedphrase: { + fontSize: 14, + ...fontStyles.regular, + color: colors.error.default, + marginBottom: 16, + }, + hintInput: { + borderRadius: 6, + borderWidth: 1, + borderColor: colors.border.default, + padding: 16, + minHeight: 76, + paddingTop: 16, + color: colors.text.default, + }, + dismissButton: { + color: colors.text.default, + }, + }); -const HintModal = ({ onCancel, onConfirm, modalVisible, onRequestClose, value, onChangeText }) => ( - - - - - {strings('manual_backup_step_3.recovery_hint')} - - - +const HintModal = ({ onCancel, onConfirm, modalVisible, onRequestClose, value, onChangeText }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ( + + + + + {strings('manual_backup_step_3.recovery_hint')} + + + + + {strings('manual_backup_step_3.leave_hint')} + {strings('manual_backup_step_3.no_seedphrase')} + - {strings('manual_backup_step_3.leave_hint')} - {strings('manual_backup_step_3.no_seedphrase')} - - - - -); + + + ); +}; const propTypes = { onCancel: PropTypes.func.isRequired, diff --git a/app/components/UI/OnboardingProgress/index.js b/app/components/UI/OnboardingProgress/index.js index 972e81705dc..792d2bff878 100644 --- a/app/components/UI/OnboardingProgress/index.js +++ b/app/components/UI/OnboardingProgress/index.js @@ -1,7 +1,8 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; -import { colors, fontStyles } from '../../../styles/common'; +import { fontStyles } from '../../../styles/common'; import StepIndicator from 'react-native-step-indicator'; +import { ThemeContext } from '../../../util/theme'; const strokeWidth = 2; @@ -21,38 +22,39 @@ export default class OnboardingProgress extends PureComponent { steps: PropTypes.array.isRequired, }; - customStyles = { - stepIndicatorSize: 20, - currentStepIndicatorSize: 20, - separatorStrokeWidth: strokeWidth, - separatorFinishedColor: colors.blue, - separatorUnFinishedColor: colors.grey100, - currentStepStrokeWidth: strokeWidth, - stepStrokeCurrentColor: colors.blue, - stepStrokeWidth: strokeWidth, - stepStrokeFinishedColor: colors.blue, - stepStrokeUnFinishedColor: colors.grey100, - stepIndicatorFinishedColor: colors.blue, - stepIndicatorUnFinishedColor: colors.white, - stepIndicatorCurrentColor: colors.white, - stepIndicatorLabelFontSize: 9, - currentStepIndicatorLabelFontSize: 9, - stepIndicatorLabelCurrentColor: colors.blue, - stepIndicatorLabelFinishedColor: colors.white, - stepIndicatorLabelUnFinishedColor: colors.grey100, - labelColor: colors.grey100, - stepIndicatorLabelFontFamily: fontStyles.normal.fontFamily, - labelFontFamily: fontStyles.normal.fontFamily, - labelSize: 10, - currentStepLabelColor: colors.blue, - finishedStepLabelColor: colors.blue, - }; - render() { const { currentStep, steps } = this.props; + const { colors } = this.context; + const customStyles = { + stepIndicatorSize: 20, + currentStepIndicatorSize: 20, + separatorStrokeWidth: strokeWidth, + separatorFinishedColor: colors.primary.default, + separatorUnFinishedColor: colors.text.muted, + currentStepStrokeWidth: strokeWidth, + stepStrokeCurrentColor: colors.primary.default, + stepStrokeWidth: strokeWidth, + stepStrokeFinishedColor: colors.primary.default, + stepStrokeUnFinishedColor: colors.text.muted, + stepIndicatorFinishedColor: colors.primary.default, + stepIndicatorUnFinishedColor: colors.background.default, + stepIndicatorCurrentColor: colors.background.default, + stepIndicatorLabelFontSize: 9, + currentStepIndicatorLabelFontSize: 9, + stepIndicatorLabelCurrentColor: colors.text.default, + stepIndicatorLabelFinishedColor: colors.primary.inverse, + stepIndicatorLabelUnFinishedColor: colors.text.muted, + labelColor: colors.text.muted, + stepIndicatorLabelFontFamily: fontStyles.normal.fontFamily, + labelFontFamily: fontStyles.normal.fontFamily, + labelSize: 10, + currentStepLabelColor: colors.primary.default, + finishedStepLabelColor: colors.primary.default, + }; + return ( { - const { colors } = useAppThemeFromContext(); - - const styles = StyleSheet.create({ +const createStyles = (colors) => + StyleSheet.create({ flex: { flex: 1, backgroundColor: colors.background.default, @@ -32,6 +22,18 @@ const OnboardingScreenWithBg = (props) => { }, }); +const images = { + a: require('../../../images/welcome-bg1.png'), // eslint-disable-line + b: require('../../../images/welcome-bg2.png'), // eslint-disable-line + c: require('../../../images/welcome-bg3.png'), // eslint-disable-line + d: require('../../../images/welcome-bg4.png'), // eslint-disable-line + carousel: null, +}; + +const OnboardingScreenWithBg = (props) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + return ( diff --git a/app/components/UI/SeedphraseModal/index.js b/app/components/UI/SeedphraseModal/index.js index 4a35062d696..67f8d175650 100644 --- a/app/components/UI/SeedphraseModal/index.js +++ b/app/components/UI/SeedphraseModal/index.js @@ -1,83 +1,97 @@ import React from 'react'; -import { TouchableOpacity, Text, View } from 'react-native'; +import { TouchableOpacity, Text, View, StyleSheet } from 'react-native'; import PropTypes from 'prop-types'; import Icon from 'react-native-vector-icons/FontAwesome'; -import { colors, fontStyles } from '../../../styles/common'; +import { fontStyles } from '../../../styles/common'; import { strings } from '../../../../locales/i18n'; import ActionModal from '../../UI/ActionModal'; +import { useAppThemeFromContext } from '../../../util/theme'; -const styles = { - whatIsSeedphraseTitle: { - flex: 1, - fontSize: 18, - color: colors.fontPrimary, - textAlign: 'center', - ...fontStyles.bold, - }, - modalNoBorder: { - borderTopWidth: 0, - }, - modalContainer: { - flex: 1, - padding: 27, - flexDirection: 'column', - }, - modalXButton: { - padding: 5, - alignItems: 'flex-end', - }, - titleContainer: { - flexDirection: 'row', - justifyContent: 'center', - alignItems: 'center', - marginBottom: 16, - }, - auxCenterView: { - width: 26, - }, - explanationText: { - fontSize: 14, - marginTop: 16, - textAlign: 'center', - ...fontStyles.normal, - color: colors.fontPrimary, - lineHeight: 20, - }, - modalXIcon: { - fontSize: 16, - }, -}; +const createStyles = (colors) => + StyleSheet.create({ + whatIsSeedphraseTitle: { + flex: 1, + fontSize: 18, + color: colors.text.default, + textAlign: 'center', + ...fontStyles.bold, + }, + modalNoBorder: { + borderTopWidth: 0, + }, + modalContainer: { + flex: 1, + padding: 27, + flexDirection: 'column', + }, + modalXButton: { + padding: 5, + alignItems: 'flex-end', + }, + titleContainer: { + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + marginBottom: 16, + }, + auxCenterView: { + width: 26, + }, + explanationText: { + fontSize: 14, + marginTop: 16, + textAlign: 'center', + ...fontStyles.normal, + color: colors.text.default, + lineHeight: 20, + }, + modalXIcon: { + fontSize: 16, + color: colors.text.default, + }, + }); -const SeedphraseModal = ({ showWhatIsSeedphraseModal, hideWhatIsSeedphrase }) => ( - - - - - - {strings('account_backup_step_1.what_is_seedphrase_title')} - - - - - - - {strings('account_backup_step_1.what_is_seedphrase_text_1')} - {strings('account_backup_step_1.what_is_seedphrase_text_2')} - {strings('account_backup_step_1.what_is_seedphrase_text_3')} +const SeedphraseModal = ({ showWhatIsSeedphraseModal, hideWhatIsSeedphrase }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ( + + + + + + {strings('account_backup_step_1.what_is_seedphrase_title')} + + + + + + + + {strings('account_backup_step_1.what_is_seedphrase_text_1')} + + + {strings('account_backup_step_1.what_is_seedphrase_text_2')} + + + {strings('account_backup_step_1.what_is_seedphrase_text_3')} + + - - -); + + ); +}; SeedphraseModal.propTypes = { /** diff --git a/app/components/UI/SkipAccountSecurityModal/index.js b/app/components/UI/SkipAccountSecurityModal/index.js index 7b5c10cf530..7d07791b97b 100644 --- a/app/components/UI/SkipAccountSecurityModal/index.js +++ b/app/components/UI/SkipAccountSecurityModal/index.js @@ -33,11 +33,11 @@ const createStyles = (colors) => flexDirection: 'column', }, skipModalXButton: { - flex: 1, alignItems: 'flex-end', }, skipModalXIcon: { fontSize: 16, + color: colors.text.default, }, skipModalActionButtons: { flexDirection: 'row', diff --git a/app/components/UI/StyledButton/styledButtonStyles.js b/app/components/UI/StyledButton/styledButtonStyles.js index d1d01d2c59e..7bcf01ae2a8 100644 --- a/app/components/UI/StyledButton/styledButtonStyles.js +++ b/app/components/UI/StyledButton/styledButtonStyles.js @@ -37,7 +37,7 @@ const createStyles = (colors) => color: colors.primary.inverse, }, roundedNormal: { - backgroundColor: colors.white, + backgroundColor: colors.background.default, borderWidth: 1, borderColor: colors.primary.default, padding: 8, @@ -46,7 +46,7 @@ const createStyles = (colors) => color: colors.primary.default, }, normal: { - backgroundColor: colors.white, + backgroundColor: colors.background.default, borderWidth: 1, borderColor: colors.primary.default, }, @@ -59,7 +59,7 @@ const createStyles = (colors) => borderColor: colors.transparent, }, cancel: { - backgroundColor: colors.white, + backgroundColor: colors.background.default, borderWidth: 1, borderColor: colors.text.alternative, }, @@ -67,7 +67,7 @@ const createStyles = (colors) => color: colors.text.alternative, }, signingCancel: { - backgroundColor: colors.white, + backgroundColor: colors.background.default, borderWidth: 1, borderColor: colors.primary.default, }, @@ -78,7 +78,7 @@ const createStyles = (colors) => backgroundColor: colors.error.default, }, info: { - backgroundColor: colors.white, + backgroundColor: colors.background.default, borderWidth: 1, borderColor: colors.primary.default, }, @@ -102,7 +102,7 @@ const createStyles = (colors) => borderColor: colors.primary.default, }, signText: { - color: colors.white, + color: colors.primary.inverse, }, danger: { backgroundColor: colors.error.default, diff --git a/app/components/UI/WebviewError/index.js b/app/components/UI/WebviewError/index.js index 71764d167fa..35c38130ebf 100644 --- a/app/components/UI/WebviewError/index.js +++ b/app/components/UI/WebviewError/index.js @@ -1,11 +1,9 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; import { Image, StyleSheet, View, Text } from 'react-native'; -import AnimatedFox from 'react-native-animated-fox'; import StyledButton from '../StyledButton'; import { strings } from '../../../../locales/i18n'; import { fontStyles, colors } from '../../../styles/common'; -import Device from '../../../util/device'; const styles = StyleSheet.create({ wrapper: { @@ -84,11 +82,9 @@ export default class WebviewError extends PureComponent { return error ? ( - {Device.isAndroid() ? ( - - ) : ( - - )} + + {/** Disable animated fox since not yet theme compatible */} + {/* */} {strings('webview_error.title')} diff --git a/app/components/Views/AccountBackupStep1B/index.js b/app/components/Views/AccountBackupStep1B/index.js index 9466b1265e4..92d477cca22 100644 --- a/app/components/Views/AccountBackupStep1B/index.js +++ b/app/components/Views/AccountBackupStep1B/index.js @@ -83,16 +83,8 @@ const createStyles = (colors) => card: { backgroundColor: colors.background.default, borderWidth: 1, - borderColor: colors.grey100, + borderColor: colors.border.default, borderRadius: 10, - shadowColor: colors.black, - shadowOffset: { - width: 1, - height: 4, - }, - shadowOpacity: 0.1, - shadowRadius: 2.62, - elevation: 4, padding: 16, marginBottom: 20, @@ -178,6 +170,7 @@ const createStyles = (colors) => }, secureModalXIcon: { fontSize: 16, + color: colors.text.default, }, auxCenterView: { width: 26, @@ -261,7 +254,7 @@ const AccountBackupStep1B = (props) => { - + {strings('account_backup_step_1B.why_important')} diff --git a/app/components/Views/ChoosePassword/index.js b/app/components/Views/ChoosePassword/index.js index 19b24537e8e..3a10b0b2118 100644 --- a/app/components/Views/ChoosePassword/index.js +++ b/app/components/Views/ChoosePassword/index.js @@ -14,7 +14,6 @@ import { } from 'react-native'; // eslint-disable-next-line import/no-unresolved import CheckBox from '@react-native-community/checkbox'; -import AnimatedFox from 'react-native-animated-fox'; import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view'; import AsyncStorage from '@react-native-community/async-storage'; import { connect } from 'react-redux'; @@ -137,7 +136,7 @@ const createStyles = (colors) => }, input: { borderWidth: 1, - borderColor: colors.grey500, + borderColor: colors.border.default, padding: 10, borderRadius: 6, fontSize: 14, @@ -534,9 +533,9 @@ class ChoosePassword extends PureComponent { value={biometryChoice} style={styles.biometrySwitch} trackColor={ - Device.isIos() ? { true: colors.success.default, false: colors.grey300 } : null + Device.isIos() ? { true: colors.primary.default, false: colors.border.muted } : null } - ios_backgroundColor={colors.grey300} + ios_backgroundColor={colors.border.muted} /> @@ -547,8 +546,10 @@ class ChoosePassword extends PureComponent { onValueChange={(rememberMe) => this.setState({ rememberMe })} // eslint-disable-line react/jsx-no-bind value={rememberMe} style={styles.biometrySwitch} - trackColor={Device.isIos() ? { true: colors.success.default, false: colors.grey300 } : null} - ios_backgroundColor={colors.grey300} + trackColor={ + Device.isIos() ? { true: colors.primary.default, false: colors.border.muted } : null + } + ios_backgroundColor={colors.border.muted} /> )} @@ -593,20 +594,15 @@ class ChoosePassword extends PureComponent { {loading ? ( - {Device.isAndroid() ? ( - - ) : ( - - )} + + {/** Disable animated fox since not yet theme compatible */} + {/* */} - + {strings( previousScreen === ONBOARDING @@ -666,7 +662,7 @@ class ChoosePassword extends PureComponent { onChangeText={this.setConfirmPassword} secureTextEntry={secureTextEntry} placeholder={''} - placeholderTextColor={colors.grey100} + placeholderTextColor={colors.text.muted} testID={'input-password-confirm'} onSubmitEditing={this.onPressCreate} returnKeyType={'done'} diff --git a/app/components/Views/ImportFromSeed/index.js b/app/components/Views/ImportFromSeed/index.js index da5f3b72e31..eb2b577ae83 100644 --- a/app/components/Views/ImportFromSeed/index.js +++ b/app/components/Views/ImportFromSeed/index.js @@ -110,7 +110,7 @@ const createStyles = (colors) => minHeight: 110, height: 'auto', borderWidth: 1, - borderColor: colors.grey500, + borderColor: colors.border.default, backgroundColor: colors.background.default, ...fontStyles.normal, }, @@ -428,8 +428,10 @@ class ImportFromSeed extends PureComponent { onValueChange={this.updateBiometryChoice} value={this.state.biometryChoice} style={styles.biometrySwitch} - trackColor={Device.isIos() ? { true: colors.success.default, false: colors.grey300 } : null} - ios_backgroundColor={colors.grey300} + trackColor={ + Device.isIos() ? { true: colors.primary.default, false: colors.border.muted } : null + } + ios_backgroundColor={colors.border.muted} /> ); @@ -442,8 +444,8 @@ class ImportFromSeed extends PureComponent { onValueChange={(rememberMe) => this.setState({ rememberMe })} // eslint-disable-line react/jsx-no-bind value={this.state.rememberMe} style={styles.biometrySwitch} - trackColor={Device.isIos() ? { true: colors.success.default, false: colors.grey300 } : null} - ios_backgroundColor={colors.grey300} + trackColor={Device.isIos() ? { true: colors.primary.default, false: colors.border.muted } : null} + ios_backgroundColor={colors.border.muted} /> ); @@ -526,7 +528,7 @@ class ImportFromSeed extends PureComponent { secureTextEntry={hideSeedPhraseInput} onChangeText={this.onSeedWordsChange} value={seed} - baseColor={colors.grey500} + baseColor={colors.border.default} tintColor={colors.primary.default} onSubmitEditing={this.jumpToPassword} /> @@ -538,7 +540,7 @@ class ImportFromSeed extends PureComponent { secureTextEntry multiline={!hideSeedPhraseInput} placeholder={strings('import_from_seed.seed_phrase_placeholder')} - placeholderTextColor={colors.grey200} + placeholderTextColor={colors.text.muted} onChangeText={this.onSeedWordsChange} testID="input-seed-phrase" blurOnSubmit @@ -580,7 +582,7 @@ class ImportFromSeed extends PureComponent { secureTextEntry={secureTextEntry} onChangeText={this.onPasswordChange} value={password} - baseColor={colors.grey500} + baseColor={colors.border.default} tintColor={colors.primary.default} onSubmitEditing={this.jumpToConfirmPassword} /> @@ -609,7 +611,7 @@ class ImportFromSeed extends PureComponent { secureTextEntry={secureTextEntry} placeholder={strings('import_from_seed.confirm_password')} value={confirmPassword} - baseColor={colors.grey500} + baseColor={colors.border.default} tintColor={colors.primary.default} onSubmitEditing={this.onPressImport} /> diff --git a/app/components/Views/Login/index.js b/app/components/Views/Login/index.js index 73175002c81..47c1de065ea 100644 --- a/app/components/Views/Login/index.js +++ b/app/components/Views/Login/index.js @@ -19,7 +19,6 @@ import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view import Button from 'react-native-button'; import Engine from '../../../core/Engine'; import StyledButton from '../../UI/StyledButton'; -import AnimatedFox from 'react-native-animated-fox'; import { fontStyles } from '../../../styles/common'; import { strings } from '../../../../locales/i18n'; import SecureKeychain from '../../../core/SecureKeychain'; @@ -469,8 +468,10 @@ class Login extends PureComponent { onValueChange={(biometryChoice) => this.updateBiometryChoice(biometryChoice)} // eslint-disable-line react/jsx-no-bind value={this.state.biometryChoice} style={styles.biometrySwitch} - trackColor={Device.isIos() ? { true: colors.green300, false: colors.grey300 } : null} - ios_backgroundColor={colors.grey300} + trackColor={ + Device.isIos() ? { true: colors.primary.default, false: colors.border.muted } : null + } + ios_backgroundColor={colors.border.muted} /> ); @@ -483,8 +484,8 @@ class Login extends PureComponent { onValueChange={(rememberMe) => this.setState({ rememberMe })} // eslint-disable-line react/jsx-no-bind value={this.state.rememberMe} style={styles.biometrySwitch} - trackColor={Device.isIos() ? { true: colors.green300, false: colors.grey300 } : null} - ios_backgroundColor={colors.grey300} + trackColor={Device.isIos() ? { true: colors.primary.default, false: colors.border.muted } : null} + ios_backgroundColor={colors.border.muted} /> ); @@ -533,7 +534,12 @@ class Login extends PureComponent { onConfirmPress={this.toggleWarningModal} > - + {strings('login.are_you_sure')} {strings('login.your_current_wallet')} @@ -570,8 +576,8 @@ class Login extends PureComponent { onChangeText={this.checkDelete} autoCapitalize="none" value={this.state.deleteText} - baseColor={colors.grey500} - tintColor={colors.blue} + baseColor={colors.border.default} + tintColor={colors.primary.default} onSubmitEditing={this.submitDelete} /> {this.state.showDeleteWarning && ( @@ -585,15 +591,13 @@ class Login extends PureComponent { - {Device.isAndroid() ? ( - - ) : ( - - )} + + {/** Disable animated fox since not yet theme compatible */} + {/* */} {strings('login.title')} @@ -608,8 +612,8 @@ class Login extends PureComponent { ref={this.fieldRef} onChangeText={this.setPassword} value={this.state.password} - baseColor={colors.grey500} - tintColor={colors.blue} + baseColor={colors.border.default} + tintColor={colors.primary.default} onSubmitEditing={this.triggerLogIn} renderRightAccessory={() => ( position: 'absolute', width: '100%', height: '100%', - backgroundColor: colors.grey700, + backgroundColor: colors.text.alternative, opacity: 0.7, alignItems: 'center', borderRadius: 8, @@ -100,21 +100,21 @@ const createStyles = (colors) => icon: { width: 24, height: 24, - color: colors.white, + color: colors.text.default, textAlign: 'center', marginBottom: 32, }, reveal: { fontSize: Device.isMediumDevice() ? 13 : 16, ...fontStyles.bold, - color: colors.white, + color: colors.text.default, lineHeight: 22, marginBottom: 8, textAlign: 'center', }, watching: { fontSize: Device.isMediumDevice() ? 10 : 12, - color: colors.white, + color: colors.text.default, lineHeight: 17, marginBottom: 32, textAlign: 'center', @@ -124,10 +124,10 @@ const createStyles = (colors) => padding: 12, }, seedPhraseWrapper: { - backgroundColor: colors.white, + backgroundColor: colors.background.default, borderRadius: 8, flexDirection: 'row', - borderColor: colors.grey100, + borderColor: colors.border.default, borderWidth: 1, marginBottom: 64, minHeight: 275, @@ -197,7 +197,7 @@ const createStyles = (colors) => borderWidth: 2, borderRadius: 5, width: '100%', - borderColor: colors.grey000, + borderColor: colors.border.default, padding: 10, height: 40, }, @@ -370,7 +370,7 @@ export default class ManualBackupStep1 extends PureComponent { borderRadius: 8, flexDirection: 'row', justifyContent: 'space-between', - borderColor: colors.grey100, + borderColor: colors.border.default, borderWidth: 1, marginBottom: 24, }, seedPhraseWrapperComplete: { - borderColor: colors.green500, + borderColor: colors.success.default, }, seedPhraseWrapperError: { borderColor: colors.error.default, @@ -83,7 +83,7 @@ const createStyles = (colors) => paddingVertical: 6, width: Device.isMediumDevice() ? 75 : 95, backgroundColor: colors.background.default, - borderColor: colors.grey050, + borderColor: colors.border.default, borderWidth: 1, borderRadius: 34, borderStyle: 'dashed', @@ -129,12 +129,12 @@ const createStyles = (colors) => marginLeft: 4, }, selectedWord: { - backgroundColor: colors.grey400, + backgroundColor: colors.border.muted, borderWidth: 1, - borderColor: colors.grey400, + borderColor: colors.border.muted, }, selectedWordText: { - color: colors.white, + color: colors.text.default, }, currentWord: { borderWidth: 1, @@ -145,6 +145,9 @@ const createStyles = (colors) => borderColor: colors.primary.default, borderStyle: 'solid', }, + wordBoxIndex: { + color: colors.text.default, + }, }); /** @@ -303,7 +306,7 @@ class ManualBackupStep2 extends PureComponent { return ( - + {strings('manual_backup_step_2.success')} ); @@ -316,7 +319,7 @@ class ManualBackupStep2 extends PureComponent { return ( - {i + 1}. + {i + 1}. { diff --git a/app/components/Views/Onboarding/index.js b/app/components/Views/Onboarding/index.js index c378a47fb86..7abd9c060ed 100644 --- a/app/components/Views/Onboarding/index.js +++ b/app/components/Views/Onboarding/index.js @@ -30,7 +30,6 @@ import BaseNotification from '../../UI/Notification/BaseNotification'; import Animated, { EasingNode } from 'react-native-reanimated'; import ElevatedView from 'react-native-elevated-view'; import { loadingSet, loadingUnset } from '../../../actions/user'; -import AnimatedFox from 'react-native-animated-fox'; import PreventScreenshot from '../../../core/PreventScreenshot'; import WarningExistingUserModal from '../../UI/WarningExistingUserModal'; import { PREVIOUS_SCREEN, ONBOARDING } from '../../../constants/navigation'; @@ -472,15 +471,13 @@ class Onboarding extends PureComponent { {loading && ( - {Device.isAndroid() ? ( - - ) : ( - - )} + + {/** Disable animated fox since not yet theme compatible */} + {/* */} )} {loading ? this.renderLoader() : this.renderContent()} diff --git a/app/components/Views/ResetPassword/index.js b/app/components/Views/ResetPassword/index.js index 1dbf0e17ca8..b97ee658a06 100644 --- a/app/components/Views/ResetPassword/index.js +++ b/app/components/Views/ResetPassword/index.js @@ -16,7 +16,6 @@ import { } from 'react-native'; // eslint-disable-next-line import/no-unresolved import CheckBox from '@react-native-community/checkbox'; -import AnimatedFox from 'react-native-animated-fox'; import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view'; import AsyncStorage from '@react-native-community/async-storage'; import { connect } from 'react-redux'; @@ -638,15 +637,13 @@ class ResetPassword extends PureComponent { {loading ? ( - {Device.isAndroid() ? ( - - ) : ( - - )} + + {/** Disable animated fox since not yet theme compatible */} + {/* */} From 0951a6a184edd777d1872755cb493d693e40b859 Mon Sep 17 00:00:00 2001 From: Cal Leung Date: Sat, 12 Feb 2022 00:41:05 -0800 Subject: [PATCH 33/77] Add dark colors to import assets screens --- .eslintrc.js | 2 +- app/components/Base/DetailsModal.js | 183 ++++++++----- .../UI/AddCustomCollectible/index.tsx | 64 +++-- app/components/UI/AddCustomToken/index.js | 131 +++++---- app/components/UI/AssetIcon/index.tsx | 24 +- app/components/UI/AssetOverview/index.js | 132 +++++----- app/components/UI/AssetSearch/index.tsx | 49 ++-- app/components/UI/CollectibleModal/index.js | 4 +- .../UI/CollectibleOverview/index.js | 215 +++++++-------- app/components/UI/Collectibles/index.js | 137 +++++----- app/components/UI/Navbar/index.js | 4 +- .../UI/SearchTokenAutocomplete/index.tsx | 36 +-- .../UI/StyledButton/index.android.js | 6 +- app/components/UI/StyledButton/index.ios.js | 6 +- .../UI/StyledButton/styledButtonStyles.js | 249 +++++++++--------- .../TransactionActionContent/index.js | 99 +++---- app/components/UI/TransactionElement/index.js | 157 ++++++----- .../UI/Transactions/RetryModal/index.tsx | 95 +++---- app/components/UI/Transactions/index.js | 188 +++++++------ app/components/Views/AddAsset/index.js | 60 +++-- app/components/Views/Asset/index.js | 50 ++-- app/components/Views/CollectibleView/index.js | 55 ++-- 22 files changed, 1076 insertions(+), 870 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 3abaf112e37..68200c09a3c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -119,7 +119,7 @@ module.exports = { 'eslint-comments/no-unused-disable': 0, 'react-native/no-color-literals': 2, 'react-native/no-inline-styles': 2, - 'react-native/no-unused-styles': 2, + 'react-native/no-unused-styles': 0, 'react-native/split-platform-components': 2, 'react/jsx-boolean-value': 2, 'react/jsx-key': 1, diff --git a/app/components/Base/DetailsModal.js b/app/components/Base/DetailsModal.js index 929dee118bf..e7f7d95f366 100644 --- a/app/components/Base/DetailsModal.js +++ b/app/components/Base/DetailsModal.js @@ -2,82 +2,119 @@ import React from 'react'; import PropTypes from 'prop-types'; import { View, StyleSheet, TouchableOpacity } from 'react-native'; import Ionicons from 'react-native-vector-icons/Ionicons'; -import { colors, fontStyles } from '../../styles/common'; - +import { fontStyles } from '../../styles/common'; import Text from './Text'; +import { useAppThemeFromContext } from '../../util/theme'; + +const createStyles = (colors) => + StyleSheet.create({ + modalContainer: { + width: '100%', + backgroundColor: colors.background.default, + borderRadius: 10, + }, + modalView: { + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + }, + header: { + borderBottomWidth: StyleSheet.hairlineWidth, + borderColor: colors.border.muted, + flexDirection: 'row', + paddingHorizontal: 16, + }, + title: { + flex: 1, + textAlign: 'center', + fontSize: 18, + marginVertical: 12, + marginHorizontal: 24, + color: colors.text.default, + ...fontStyles.bold, + }, + closeIcon: { paddingTop: 4, position: 'absolute', right: 16 }, + body: { + paddingHorizontal: 15, + }, + section: { + paddingVertical: 16, + flexDirection: 'row', + }, + sectionBorderBottom: { + borderBottomColor: colors.border.muted, + borderBottomWidth: 1, + }, + column: { + flex: 1, + }, + columnEnd: { + alignItems: 'flex-end', + }, + sectionTitle: { + ...fontStyles.normal, + fontSize: 10, + color: colors.text.alternative, + marginBottom: 8, + }, + }); +const DetailsModal = ({ children }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); -const styles = StyleSheet.create({ - modalContainer: { - width: '100%', - backgroundColor: colors.white, - borderRadius: 10, - }, - modalView: { - flexDirection: 'column', - justifyContent: 'center', - alignItems: 'center', - }, - header: { - borderBottomWidth: StyleSheet.hairlineWidth, - borderColor: colors.grey100, - flexDirection: 'row', - paddingHorizontal: 16, - }, - title: { - flex: 1, - textAlign: 'center', - fontSize: 18, - marginVertical: 12, - marginHorizontal: 24, - color: colors.fontPrimary, - ...fontStyles.bold, - }, - closeIcon: { paddingTop: 4, position: 'absolute', right: 16 }, - body: { - paddingHorizontal: 15, - }, - section: { - paddingVertical: 16, - flexDirection: 'row', - }, - sectionBorderBottom: { - borderBottomColor: colors.grey100, - borderBottomWidth: 1, - }, - column: { - flex: 1, - }, - columnEnd: { - alignItems: 'flex-end', - }, - sectionTitle: { - ...fontStyles.normal, - fontSize: 10, - color: colors.grey500, - marginBottom: 8, - }, -}); -const DetailsModal = ({ children }) => ( - - {children} - -); + return ( + + {children} + + ); +}; -const DetailsModalHeader = ({ style, ...props }) => ; -const DetailsModalTitle = ({ style, ...props }) => ; -const DetailsModalCloseIcon = ({ style, ...props }) => ( - - - -); -const DetailsModalBody = ({ style, ...props }) => ; -const DetailsModalSection = ({ style, borderBottom, ...props }) => ( - -); -const DetailsModalSectionTitle = ({ style, ...props }) => ; -const DetailsModalColumn = ({ style, end, ...props }) => ( - -); +const DetailsModalHeader = ({ style, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ; +}; +const DetailsModalTitle = ({ style, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ; +}; +const DetailsModalCloseIcon = ({ style, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ( + + + + ); +}; +const DetailsModalBody = ({ style, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ; +}; +const DetailsModalSection = ({ style, borderBottom, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ; +}; +const DetailsModalSectionTitle = ({ style, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ; +}; +const DetailsModalColumn = ({ style, end, ...props }) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + + return ; +}; DetailsModal.Header = DetailsModalHeader; DetailsModal.Title = DetailsModalTitle; diff --git a/app/components/UI/AddCustomCollectible/index.tsx b/app/components/UI/AddCustomCollectible/index.tsx index 1ae72e28511..4892c79c4da 100644 --- a/app/components/UI/AddCustomCollectible/index.tsx +++ b/app/components/UI/AddCustomCollectible/index.tsx @@ -1,7 +1,7 @@ import React, { useState, useEffect } from 'react'; import { useSelector } from 'react-redux'; import { Alert, Text, TextInput, View, StyleSheet } from 'react-native'; -import { colors, fontStyles } from '../../../styles/common'; +import { fontStyles } from '../../../styles/common'; import Engine from '../../../core/Engine'; import { strings } from '../../../../locales/i18n'; import { isValidAddress } from 'ethereumjs-util'; @@ -9,32 +9,36 @@ import ActionView from '../ActionView'; import { isSmartContractAddress } from '../../../util/transactions'; import Device from '../../../util/device'; import AnalyticsV2 from '../../../util/analyticsV2'; - -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - flex: 1, - }, - rowWrapper: { - padding: 20, - }, - rowTitleText: { - paddingBottom: 3, - ...(fontStyles.normal as any), - }, - textInput: { - borderWidth: 1, - borderRadius: 4, - borderColor: colors.grey100, - padding: 16, - ...(fontStyles.normal as any), - }, - warningText: { - marginTop: 15, - color: colors.red, - ...(fontStyles.normal as any), - }, -}); +import { useAppThemeFromContext } from '../../../util/theme'; + +const createStyles = (colors: any) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + }, + rowWrapper: { + padding: 20, + }, + rowTitleText: { + paddingBottom: 3, + ...(fontStyles.normal as any), + color: colors.text.default, + }, + textInput: { + borderWidth: 1, + borderRadius: 4, + borderColor: colors.border.default, + padding: 16, + ...(fontStyles.normal as any), + color: colors.text.default, + }, + warningText: { + marginTop: 15, + color: colors.error.default, + ...(fontStyles.normal as any), + }, + }); interface AddCustomCollectibleProps { navigation?: any; @@ -51,6 +55,8 @@ const AddCustomCollectible = ({ navigation, collectibleContract }: AddCustomColl const [warningTokenId, setWarningTokenId] = useState(''); const [inputWidth, setInputWidth] = useState(Device.isAndroid() ? '99%' : undefined); const assetTokenIdInput = React.createRef() as any; + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); const selectedAddress = useSelector( (state: any) => state.engine.backgroundState.PreferencesController.selectedAddress @@ -187,7 +193,7 @@ const AddCustomCollectible = ({ navigation, collectibleContract }: AddCustomColl {warningTokenId} diff --git a/app/components/UI/AddCustomToken/index.js b/app/components/UI/AddCustomToken/index.js index b9fc31d2a50..aa95be68a0a 100644 --- a/app/components/UI/AddCustomToken/index.js +++ b/app/components/UI/AddCustomToken/index.js @@ -1,6 +1,6 @@ import React, { PureComponent } from 'react'; import { Text, TextInput, View, StyleSheet, InteractionManager } from 'react-native'; -import { colors, fontStyles } from '../../../styles/common'; +import { fontStyles } from '../../../styles/common'; import Engine from '../../../core/Engine'; import PropTypes from 'prop-types'; import { strings } from '../../../../locales/i18n'; @@ -10,30 +10,37 @@ import { isSmartContractAddress } from '../../../util/transactions'; import AnalyticsV2 from '../../../util/analyticsV2'; import WarningMessage from '../../Views/SendFlow/WarningMessage'; import AppConstants from '../../../core/AppConstants'; +import { ThemeContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - flex: 1, - }, - rowWrapper: { - padding: 20, - }, - textInput: { - borderWidth: 1, - borderRadius: 4, - borderColor: colors.grey100, - padding: 16, - ...fontStyles.normal, - }, - warningText: { - marginTop: 15, - color: colors.red, - ...fontStyles.normal, - }, - warningContainer: { marginHorizontal: 20, marginTop: 20, paddingRight: 0 }, - warningLink: { color: colors.blue }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + }, + rowWrapper: { + padding: 20, + }, + textInput: { + borderWidth: 1, + borderRadius: 4, + borderColor: colors.border.default, + padding: 16, + ...fontStyles.normal, + color: colors.text.default, + }, + inputLabel: { + ...fontStyles.normal, + color: colors.text.default, + }, + warningText: { + marginTop: 15, + color: colors.error.default, + ...fontStyles.normal, + }, + warningContainer: { marginHorizontal: 20, marginTop: 20, paddingRight: 0 }, + warningLink: { color: colors.primary.default }, + }); /** * Copmonent that provides ability to add custom tokens. @@ -191,36 +198,44 @@ export default class AddCustomToken extends PureComponent { current && current.focus(); }; - renderWarning = () => ( - - {strings('add_asset.warning_body_description')} - { - // TODO: This functionality exists in a bunch of other places. We need to unify this into a utils function - this.props.navigation.navigate('Webview', { - screen: 'SimpleWebview', - params: { - url: AppConstants.URLS.SECURITY, - title: strings('add_asset.security_tips'), - }, - }); - }} - style={styles.warningLink} - testID={'add-asset-warning-message'} - > - {strings('add_asset.warning_link')} - - - } - /> - ); + renderWarning = () => { + const { colors } = this.context; + const styles = createStyles(colors); + + return ( + + {strings('add_asset.warning_body_description')} + { + // TODO: This functionality exists in a bunch of other places. We need to unify this into a utils function + this.props.navigation.navigate('Webview', { + screen: 'SimpleWebview', + params: { + url: AppConstants.URLS.SECURITY, + title: strings('add_asset.security_tips'), + }, + }); + }} + style={styles.warningLink} + testID={'add-asset-warning-message'} + > + {strings('add_asset.warning_link')} + + + } + /> + ); + }; render = () => { const { address, symbol, decimals } = this.state; + const { colors } = this.context; + const styles = createStyles(colors); + return ( {this.renderWarning()} - {strings('token.token_address')} + {strings('token.token_address')} - {strings('token.token_symbol')} + {strings('token.token_symbol')} {this.state.warningSymbol} - {strings('token.token_precision')} + {strings('token.token_precision')} ; } -const styles = StyleSheet.create({ - logo: { - width: 50, - height: 50, - borderRadius: 25, - overflow: 'hidden', - }, - placeholder: { backgroundColor: colors.white }, -}); +const createStyles = (colors: any) => + StyleSheet.create({ + logo: { + width: 50, + height: 50, + borderRadius: 25, + overflow: 'hidden', + }, + placeholder: { backgroundColor: colors.border.muted }, + }); /** * PureComponent that provides an asset icon dependent on OS. */ // eslint-disable-next-line react/display-name const AssetIcon = memo((props: Props) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); if (!props.logo) return null; + const style = [styles.logo, props.customStyle]; const isImageUrl = isUrl(props.logo) || props.logo.substr(0, 4) === 'ipfs'; const source: ImageSourcePropType = isImageUrl ? { uri: props.logo } : (staticLogos as any)[props.logo]; diff --git a/app/components/UI/AssetOverview/index.js b/app/components/UI/AssetOverview/index.js index 972203192c9..e4c4449f3b7 100644 --- a/app/components/UI/AssetOverview/index.js +++ b/app/components/UI/AssetOverview/index.js @@ -6,7 +6,7 @@ import AssetIcon from '../AssetIcon'; import Identicon from '../Identicon'; import AssetActionButton from '../AssetActionButton'; import AppConstants from '../../../core/AppConstants'; -import { colors, fontStyles } from '../../../styles/common'; +import { fontStyles } from '../../../styles/common'; import { strings } from '../../../../locales/i18n'; import { toggleReceiveModal } from '../../../actions/modals'; import { connect } from 'react-redux'; @@ -25,66 +25,68 @@ import { ANALYTICS_EVENT_OPTS } from '../../../util/analytics'; import { allowedToBuy } from '../FiatOrders'; import AssetSwapButton from '../Swaps/components/AssetSwapButton'; import NetworkMainAssetLogo from '../NetworkMainAssetLogo'; +import { ThemeContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - wrapper: { - flex: 1, - padding: 20, - borderBottomWidth: StyleSheet.hairlineWidth, - borderBottomColor: colors.grey100, - alignContent: 'center', - alignItems: 'center', - paddingBottom: 30, - }, - assetLogo: { - marginTop: 15, - alignItems: 'center', - justifyContent: 'center', - borderRadius: 10, - marginBottom: 10, - }, - ethLogo: { - width: 70, - height: 70, - }, - balance: { - alignItems: 'center', - marginTop: 10, - marginBottom: 20, - }, - amount: { - fontSize: 30, - color: colors.fontPrimary, - ...fontStyles.normal, - textTransform: 'uppercase', - }, - amountFiat: { - fontSize: 18, - color: colors.fontSecondary, - ...fontStyles.light, - textTransform: 'uppercase', - }, - actions: { - flex: 1, - justifyContent: 'center', - alignItems: 'flex-start', - flexDirection: 'row', - }, - warning: { - borderRadius: 8, - color: colors.black, - ...fontStyles.normal, - fontSize: 14, - lineHeight: 20, - borderWidth: 1, - borderColor: colors.yellow, - backgroundColor: colors.yellow100, - padding: 20, - }, - warningLinks: { - color: colors.blue, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + flex: 1, + padding: 20, + borderBottomWidth: StyleSheet.hairlineWidth, + borderBottomColor: colors.border.muted, + alignContent: 'center', + alignItems: 'center', + paddingBottom: 30, + }, + assetLogo: { + marginTop: 15, + alignItems: 'center', + justifyContent: 'center', + borderRadius: 10, + marginBottom: 10, + }, + ethLogo: { + width: 70, + height: 70, + }, + balance: { + alignItems: 'center', + marginTop: 10, + marginBottom: 20, + }, + amount: { + fontSize: 30, + color: colors.text.default, + ...fontStyles.normal, + textTransform: 'uppercase', + }, + amountFiat: { + fontSize: 18, + color: colors.text.alternative, + ...fontStyles.light, + textTransform: 'uppercase', + }, + actions: { + flex: 1, + justifyContent: 'center', + alignItems: 'flex-start', + flexDirection: 'row', + }, + warning: { + borderRadius: 8, + color: colors.warning.inverse, + ...fontStyles.normal, + fontSize: 14, + lineHeight: 20, + borderWidth: 1, + borderColor: colors.warning.default, + backgroundColor: colors.warning.muted, + padding: 20, + }, + warningLinks: { + color: colors.primary.default, + }, + }); /** * View that displays the information of a specific asset (Token or ETH) @@ -210,6 +212,9 @@ class AssetOverview extends PureComponent { tokenList, asset: { address, isETH }, } = this.props; + const { colors } = this.context; + const styles = createStyles(colors); + if (isETH) { return ; } @@ -231,6 +236,8 @@ class AssetOverview extends PureComponent { const { asset: { symbol }, } = this.props; + const { colors } = this.context; + const styles = createStyles(colors); const supportArticleUrl = 'https://metamask.zendesk.com/hc/en-us/articles/360028059272-What-to-do-when-your-balance-of-ETH-and-or-ERC20-tokens-is-incorrect-inaccurate'; @@ -259,6 +266,9 @@ class AssetOverview extends PureComponent { swapsIsLive, swapsTokens, } = this.props; + const { colors } = this.context; + const styles = createStyles(colors); + let mainBalance, secondaryBalance; const itemAddress = safeToChecksumAddress(address); let balance, balanceFiat; @@ -350,4 +360,6 @@ const mapDispatchToProps = (dispatch) => ({ newAssetTransaction: (selectedAsset) => dispatch(newAssetTransaction(selectedAsset)), }); +AssetOverview.contextType = ThemeContext; + export default connect(mapStateToProps, mapDispatchToProps)(AssetOverview); diff --git a/app/components/UI/AssetSearch/index.tsx b/app/components/UI/AssetSearch/index.tsx index f5549bce2ac..6017953454c 100644 --- a/app/components/UI/AssetSearch/index.tsx +++ b/app/components/UI/AssetSearch/index.tsx @@ -1,6 +1,6 @@ import React, { memo, useEffect, useState, useCallback } from 'react'; import { TextInput, View, StyleSheet } from 'react-native'; -import { colors, fontStyles } from '../../../styles/common'; +import { fontStyles } from '../../../styles/common'; import { strings } from '../../../../locales/i18n'; import Fuse from 'fuse.js'; import Icon from 'react-native-vector-icons/FontAwesome'; @@ -8,26 +8,31 @@ import { toLowerCaseEquals } from '../../../util/general'; import { useSelector } from 'react-redux'; import { getTokenListArray } from '../../../reducers/tokens'; import { TokenListToken } from '@metamask/controllers'; +import { useAppThemeFromContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - searchSection: { - margin: 20, - marginBottom: 0, - flex: 1, - flexDirection: 'row', - justifyContent: 'center', - alignItems: 'center', - borderWidth: 1, - borderRadius: 4, - borderColor: colors.grey100, - }, - textInput: { - ...fontStyles.normal, - } as StyleSheet.NamedStyles, - icon: { - padding: 16, - }, -}); +const createStyles = (colors: any) => + StyleSheet.create({ + searchSection: { + margin: 20, + marginBottom: 0, + flex: 1, + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + borderWidth: 1, + borderRadius: 4, + borderColor: colors.border.default, + color: colors.text.default, + }, + textInput: { + ...fontStyles.normal, + color: colors.text.default, + } as StyleSheet.NamedStyles, + icon: { + padding: 16, + color: colors.text.alternative, + }, + }); const fuse = new Fuse([], { shouldSort: true, @@ -59,6 +64,8 @@ const AssetSearch = memo(({ onSearch, onFocus, onBlur }: Props) => { const [searchQuery, setSearchQuery] = useState(''); const [inputDimensions, setInputDimensions] = useState('85%'); const tokenList = useSelector(getTokenListArray); + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); useEffect(() => { setTimeout(() => { @@ -91,7 +98,7 @@ const AssetSearch = memo(({ onSearch, onFocus, onBlur }: Props) => { onFocus={onFocus} onBlur={onBlur} placeholder={strings('token.search_tokens_placeholder')} - placeholderTextColor={colors.grey100} + placeholderTextColor={colors.text.muted} onChangeText={handleSearch} testID={'input-search-asset'} /> diff --git a/app/components/UI/CollectibleModal/index.js b/app/components/UI/CollectibleModal/index.js index 7a70d3c1c5d..2c8a1a2d687 100644 --- a/app/components/UI/CollectibleModal/index.js +++ b/app/components/UI/CollectibleModal/index.js @@ -6,7 +6,7 @@ import { connect } from 'react-redux'; import collectiblesTransferInformation from '../../../util/collectibles-transfer'; import { newAssetTransaction } from '../../../actions/transaction'; import CollectibleMedia from '../CollectibleMedia'; -import { baseStyles, colors } from '../../../styles/common'; +import { baseStyles, colors as importedColors } from '../../../styles/common'; import Device from '../../../util/device'; import ReusableModal from '../ReusableModal'; @@ -26,7 +26,7 @@ const styles = StyleSheet.create({ marginHorizontal: 16, marginTop: Device.hasNotch() ? 36 : 16, borderRadius: 12, - backgroundColor: colors.transparent, + backgroundColor: importedColors.transparent, }, }); diff --git a/app/components/UI/CollectibleOverview/index.js b/app/components/UI/CollectibleOverview/index.js index f196f44ece9..33426b39340 100644 --- a/app/components/UI/CollectibleOverview/index.js +++ b/app/components/UI/CollectibleOverview/index.js @@ -2,7 +2,7 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { StyleSheet, View, Easing, Animated, SafeAreaView, TouchableWithoutFeedback } from 'react-native'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; -import { baseStyles, colors } from '../../../styles/common'; +import { baseStyles } from '../../../styles/common'; import { strings } from '../../../../locales/i18n'; import Text from '../../Base/Text'; import RemoteImage from '../../Base/RemoteImage'; @@ -21,6 +21,7 @@ import { isCollectibleInFavoritesSelector } from '../../../reducers/collectibles import Share from 'react-native-share'; import { PanGestureHandler, gestureHandlerRootHOC, ScrollView } from 'react-native-gesture-handler'; import AppConstants from '../../../core/AppConstants'; +import { useAppThemeFromContext } from '../../../util/theme'; const ANIMATION_VELOCITY = 250; const HAS_NOTCH = Device.hasNotch(); @@ -28,85 +29,86 @@ const ANIMATION_OFFSET = HAS_NOTCH ? 30 : 50; const IS_SMALL_DEVICE = Device.isSmallDevice(); const VERTICAL_ALIGNMENT = IS_SMALL_DEVICE ? 12 : 16; -const styles = StyleSheet.create({ - wrapper: { - flex: 0, - backgroundColor: colors.white, - borderTopEndRadius: 8, - borderTopStartRadius: 8, - }, - generalContainer: { - paddingHorizontal: 16, - }, - information: { - paddingTop: HAS_NOTCH ? 24 : VERTICAL_ALIGNMENT, - }, - row: { - paddingVertical: 6, - }, - name: { - fontSize: Device.isSmallDevice() ? 16 : 24, - marginBottom: 3, - }, - userContainer: { - flexDirection: 'row', - paddingBottom: 16, - }, - userImage: { - width: 38, - height: 38, - borderRadius: 100, - marginRight: 8, - }, - buttonContainer: { - flexDirection: 'row', - marginTop: VERTICAL_ALIGNMENT, - }, - button: { - alignItems: 'center', - justifyContent: 'center', - borderWidth: 1.5, - }, - iconButtons: { - width: 54, - height: 54, - }, - leftButton: { - marginRight: 16, - }, - collectibleInfoContainer: { - flexDirection: 'row', - marginHorizontal: 16, - marginBottom: 8, - }, - collectibleInfoKey: { - paddingRight: 10, - }, - collectibleDescription: { - lineHeight: 22, - }, - userInfoContainer: { - justifyContent: 'center', - }, - titleWrapper: { - width: '100%', - alignItems: 'center', - justifyContent: 'center', - paddingVertical: VERTICAL_ALIGNMENT, - }, - dragger: { - width: 48, - height: 5, - borderRadius: 4, - backgroundColor: colors.grey100, - }, - scrollableDescription: { - maxHeight: Device.getDeviceHeight() / 5, - }, - description: { - marginTop: 8, - }, -}); +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + flex: 0, + backgroundColor: colors.background.default, + borderTopEndRadius: 8, + borderTopStartRadius: 8, + }, + generalContainer: { + paddingHorizontal: 16, + }, + information: { + paddingTop: HAS_NOTCH ? 24 : VERTICAL_ALIGNMENT, + }, + row: { + paddingVertical: 6, + }, + name: { + fontSize: Device.isSmallDevice() ? 16 : 24, + marginBottom: 3, + }, + userContainer: { + flexDirection: 'row', + paddingBottom: 16, + }, + userImage: { + width: 38, + height: 38, + borderRadius: 100, + marginRight: 8, + }, + buttonContainer: { + flexDirection: 'row', + marginTop: VERTICAL_ALIGNMENT, + }, + button: { + alignItems: 'center', + justifyContent: 'center', + borderWidth: 1.5, + }, + iconButtons: { + width: 54, + height: 54, + }, + leftButton: { + marginRight: 16, + }, + collectibleInfoContainer: { + flexDirection: 'row', + marginHorizontal: 16, + marginBottom: 8, + }, + collectibleInfoKey: { + paddingRight: 10, + }, + collectibleDescription: { + lineHeight: 22, + }, + userInfoContainer: { + justifyContent: 'center', + }, + titleWrapper: { + width: '100%', + alignItems: 'center', + justifyContent: 'center', + paddingVertical: VERTICAL_ALIGNMENT, + }, + dragger: { + width: 48, + height: 5, + borderRadius: 4, + backgroundColor: colors.border.default, + }, + scrollableDescription: { + maxHeight: Device.getDeviceHeight() / 5, + }, + description: { + marginTop: 8, + }, + }); /** * View that displays the information of a specific ERC-721 Token @@ -128,6 +130,8 @@ const CollectibleOverview = ({ const [position, setPosition] = useState(0); const positionAnimated = useRef(new Animated.Value(0)).current; const scrollViewRef = useRef(null); + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); const translationHeight = useMemo( () => wrapperHeight - headerHeight - ANIMATION_OFFSET, @@ -140,29 +144,32 @@ const CollectibleOverview = ({ return collectible?.description?.length > maxLength; }, [collectible.description]); - const renderCollectibleInfoRow = useCallback((key, value, onPress) => { - if (!value) return null; - return ( - - - {key} - - - {value} - - - ); - }, []); + const renderCollectibleInfoRow = useCallback( + (key, value, onPress) => { + if (!value) return null; + return ( + + + {key} + + + {value} + + + ); + }, + [styles] + ); const renderCollectibleInfo = () => [ renderCollectibleInfoRow(strings('collectible.collectible_token_standard'), collectible?.standard), @@ -287,7 +294,7 @@ const CollectibleOverview = ({ diff --git a/app/components/UI/Collectibles/index.js b/app/components/UI/Collectibles/index.js index b0a8cf36468..c5049ed7af1 100644 --- a/app/components/UI/Collectibles/index.js +++ b/app/components/UI/Collectibles/index.js @@ -1,51 +1,53 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; import { Alert, ScrollView, RefreshControl, FlatList, StyleSheet, Text, View } from 'react-native'; -import { colors, fontStyles } from '../../../styles/common'; +import { fontStyles } from '../../../styles/common'; import { strings } from '../../../../locales/i18n'; import ActionSheet from 'react-native-actionsheet'; import Engine from '../../../core/Engine'; import CollectibleMedia from '../CollectibleMedia'; import AssetElement from '../AssetElement'; - -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - flex: 1, - }, - emptyView: { - backgroundColor: colors.white, - justifyContent: 'center', - alignItems: 'center', - marginTop: 50, - }, - text: { - fontSize: 20, - color: colors.fontTertiary, - ...fontStyles.normal, - }, - itemWrapper: { - flex: 1, - flexDirection: 'row', - }, - rows: { - flex: 1, - marginLeft: 20, - marginTop: 6, - }, - name: { - fontSize: 16, - color: colors.fontPrimary, - ...fontStyles.normal, - }, - tokenId: { - fontSize: 12, - marginTop: 4, - marginRight: 8, - color: colors.grey400, - ...fontStyles.normal, - }, -}); +import { ThemeContext } from '../../../util/theme'; + +const createStyles = (colors) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + }, + emptyView: { + backgroundColor: colors.background.default, + justifyContent: 'center', + alignItems: 'center', + marginTop: 50, + }, + text: { + fontSize: 20, + color: colors.text.muted, + ...fontStyles.normal, + }, + itemWrapper: { + flex: 1, + flexDirection: 'row', + }, + rows: { + flex: 1, + marginLeft: 20, + marginTop: 6, + }, + name: { + fontSize: 16, + color: colors.text.default, + ...fontStyles.normal, + }, + tokenId: { + fontSize: 12, + marginTop: 4, + marginRight: 8, + color: colors.text.alternative, + ...fontStyles.normal, + }, + }); /** * View that renders a list of Collectibles @@ -80,13 +82,18 @@ export default class Collectibles extends PureComponent { longPressedCollectible = null; - renderEmpty = () => ( - }> - - {strings('wallet.no_collectibles')} - - - ); + renderEmpty = () => { + const { colors } = this.context; + const styles = createStyles(colors); + + return ( + }> + + {strings('wallet.no_collectibles')} + + + ); + }; onItemPress = (collectible) => { this.props.navigation.navigate('CollectibleView', { @@ -140,20 +147,25 @@ export default class Collectibles extends PureComponent { keyExtractor = (item) => `${item.address}_${item.tokenId}`; - renderItem = ({ item }) => ( - - - - - {item.name} - - {strings('unit.token_id')} - {item.tokenId} - + renderItem = ({ item }) => { + const { colors } = this.context; + const styles = createStyles(colors); + + return ( + + + + + {item.name} + + {strings('unit.token_id')} + {item.tokenId} + + - - - ); + + ); + }; renderCollectiblesList() { const { collectibles } = this.props; @@ -170,6 +182,9 @@ export default class Collectibles extends PureComponent { render() { const { collectibles } = this.props; + const { colors } = this.context; + const styles = createStyles(colors); + return ( {collectibles && collectibles.length ? this.renderCollectiblesList() : this.renderEmpty()} @@ -186,3 +201,5 @@ export default class Collectibles extends PureComponent { ); } } + +Collectibles.contextType = ThemeContext; diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index eb686e8b011..60f397d119c 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -711,10 +711,10 @@ export function getWalletNavbarOptions(title, navigation, drawerRef) { export function getNetworkNavbarOptions(title, translate, navigation, themeColors) { const innerStyles = StyleSheet.create({ headerStyle: { - backgroundColor: themeColors.backgroundDefault, + backgroundColor: themeColors.background.default, }, headerIcon: { - color: themeColors.primary, + color: themeColors.primary.default, }, }); return { diff --git a/app/components/UI/SearchTokenAutocomplete/index.tsx b/app/components/UI/SearchTokenAutocomplete/index.tsx index 21cd7276544..c3ceb3d2cac 100644 --- a/app/components/UI/SearchTokenAutocomplete/index.tsx +++ b/app/components/UI/SearchTokenAutocomplete/index.tsx @@ -1,6 +1,5 @@ import React, { useCallback, useState } from 'react'; import { View, StyleSheet, InteractionManager, Text, LayoutAnimation } from 'react-native'; -import { colors } from '../../../styles/common'; import { strings } from '../../../../locales/i18n'; import ActionView from '../ActionView'; import AssetSearch from '../AssetSearch'; @@ -11,20 +10,22 @@ import Alert, { AlertType } from '../../Base/Alert'; import FontAwesome from 'react-native-vector-icons/FontAwesome'; import { useSelector } from 'react-redux'; import { MAINNET } from '../../../constants/network'; +import { useAppThemeFromContext } from '../../../util/theme'; -const styles = StyleSheet.create({ - wrapper: { - backgroundColor: colors.white, - flex: 1, - }, - tokenDetectionBanner: { marginHorizontal: 20, marginTop: 20, paddingRight: 0 }, - tokenDetectionDescription: { color: colors.black }, - tokenDetectionLink: { color: colors.blue }, - tokenDetectionIcon: { - paddingTop: 4, - paddingRight: 8, - }, -}); +const createStyles = (colors: any) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.background.default, + flex: 1, + }, + tokenDetectionBanner: { marginHorizontal: 20, marginTop: 20, paddingRight: 0 }, + tokenDetectionDescription: { color: colors.text.default }, + tokenDetectionLink: { color: colors.primary.default }, + tokenDetectionIcon: { + paddingTop: 4, + paddingRight: 8, + }, + }); interface Props { /** @@ -42,6 +43,9 @@ const SearchTokenAutocomplete = ({ navigation }: Props) => { const [selectedAsset, setSelectedAsset] = useState({}); const [isSearchFocused, setIsSearchFocused] = useState(false); const { address, symbol, decimals } = selectedAsset as any; + const { colors } = useAppThemeFromContext(); + const styles = createStyles(colors); + const isTokenDetectionEnabled = useSelector( (state: any) => !state.engine.backgroundState.PreferencesController.useStaticTokenList ); @@ -120,7 +124,7 @@ const SearchTokenAutocomplete = ({ navigation }: Props) => { )} @@ -144,7 +148,7 @@ const SearchTokenAutocomplete = ({ navigation }: Props) => { ); - }, [navigation, isSearchFocused, isTokenDetectionEnabled, isMainnet]); + }, [navigation, isSearchFocused, isTokenDetectionEnabled, isMainnet, colors, styles]); return ( diff --git a/app/components/UI/StyledButton/index.android.js b/app/components/UI/StyledButton/index.android.js index 4d90b09e718..441938f0645 100644 --- a/app/components/UI/StyledButton/index.android.js +++ b/app/components/UI/StyledButton/index.android.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { Text, TouchableNativeFeedback, View, ViewPropTypes } from 'react-native'; import coalesceNonElementChildren from 'react-native-button/coalesceNonElementChildren'; import getStyles from './styledButtonStyles'; +import { ThemeContext } from '../../../util/theme'; /** * UI component that wraps StyledButton @@ -93,7 +94,8 @@ export default class StyledButton extends PureComponent { render = () => { const { type } = this.props; - const { fontStyle, containerStyle } = getStyles(type); + const { colors } = this.context; + const { fontStyle, containerStyle } = getStyles(type, colors); const touchableProps = {}; const containerStyles = [ ...containerStyle, @@ -113,3 +115,5 @@ export default class StyledButton extends PureComponent { ); }; } + +StyledButton.contextType = ThemeContext; diff --git a/app/components/UI/StyledButton/index.ios.js b/app/components/UI/StyledButton/index.ios.js index 9ac6142e1b5..eff2925d988 100644 --- a/app/components/UI/StyledButton/index.ios.js +++ b/app/components/UI/StyledButton/index.ios.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { ViewPropTypes, Text } from 'react-native'; import Button from 'react-native-button'; import getStyles from './styledButtonStyles'; +import { ThemeContext } from '../../../util/theme'; /** * UI component that renders a styled button @@ -64,7 +65,8 @@ export default class StyledButton extends PureComponent { render = () => { const { type, onPress, onPressOut, style, children, disabled, styleDisabled, testID, disabledContainerStyle } = this.props; - const { fontStyle, containerStyle } = getStyles(type); + const { colors } = this.context; + const { fontStyle, containerStyle } = getStyles(type, colors); return (