Skip to content

Instantly share code, notes, and snippets.

View jeanverster's full-sized avatar

Jean Verster jeanverster

View GitHub Profile
@jeanverster
jeanverster / theme.ts
Last active November 5, 2019 16:35
Theme.ts
colors: {
text: '#0A0A0A',
background: '#FFF',
primary: '#1476F2',
secondary: '#595959',
border: '#E2E8F0',
modes: {
dark: {
text: '#FFF',
background: '#141414',
const AppNavigation = createAppContainer(
createAnimatedSwitchNavigator(
{
LaunchScreen,
LoginStack,
HomeTabs
},
{
initialRouteName: 'LaunchScreen'
}
import { get, merge } from 'lodash'
import * as React from 'react'
import { ThemeProvider } from 'styled-components'
import AppProvider from './src/context'
import AppNavigation from './src/navigation'
import { modes, theme as baseTheme } from './src/theme'
import { colorModeStorage } from './src/utils'
const AppWithProvider = () => {
const getTheme = (mode) =>
export const colorModeStorage = {
get: async (): Promise<string | null> => {
return await AsyncStorage.getItem('MODE')
},
set: (mode: string): Promise<void> => {
return AsyncStorage.setItem('MODE', mode)
}
}
import * as React from 'react'
type AppContextType = {
mode: string
toggleMode: () => void
}
export const AppContext = React.createContext<Partial<AppContextType>>({
mode: 'default'
})
modes: {
dark: {
text: '#fff',
background: '#000',
primary: '#0cf',
secondary: '#f0e',
},
cyan: {
text: '#023',
background: '#0ff',
React.useEffect(() => {
async function getMode() {
const stored = await colorModeStorage.get()
setMode(stored)
}
getMode()
}, [])
React.useEffect(() => {
if (!mode) return
import { modes } from './src/theme'
const [mode, setMode] = React.useState(modes[0])
const toggleMode = () => {
const i = (modes.indexOf(mode) + 1) % modes.length
setMode(modes[i])
}
<ThemeProvider theme={theme}>
import { modes, theme as baseTheme } from './src/theme'
import { get, merge } from 'lodash'
const getTheme = (mode) =>
merge({}, baseTheme, {
colors: get(baseTheme.colors.modes, mode, baseTheme.colors)
}
const theme = getTheme(mode)
import { ThemeProvider } from 'styled-components'
<ThemeProvider theme={theme}>
<App />
</ThemeProvider>