import React, {ReactNode, createContext, useContext} from 'react' import {TextStyle, ViewStyle} from 'react-native' import {darkTheme, defaultTheme, dimTheme} from './themes' import {ThemeName} from '#/alf/themes' export type ColorScheme = 'light' | 'dark' export type PaletteColorName = | 'default' | 'primary' | 'secondary' | 'inverted' | 'error' export type PaletteColor = { background: string backgroundLight: string text: string textLight: string textInverted: string link: string border: string borderDark: string icon: string [k: string]: string } export type Palette = Record export type ShapeName = 'button' | 'bigButton' | 'smallButton' export type Shapes = Record export type TypographyVariant = | '2xl-thin' | '2xl' | '2xl-medium' | '2xl-bold' | '2xl-heavy' | 'xl-thin' | 'xl' | 'xl-medium' | 'xl-bold' | 'xl-heavy' | 'lg-thin' | 'lg' | 'lg-medium' | 'lg-bold' | 'lg-heavy' | 'md-thin' | 'md' | 'md-medium' | 'md-bold' | 'md-heavy' | 'sm-thin' | 'sm' | 'sm-medium' | 'sm-bold' | 'sm-heavy' | 'xs-thin' | 'xs' | 'xs-medium' | 'xs-bold' | 'xs-heavy' | 'title-2xl' | 'title-xl' | 'title-lg' | 'title' | 'title-sm' | 'post-text-lg' | 'post-text' | 'button' | 'button-lg' | 'mono' export type Typography = Record export interface Theme { colorScheme: ColorScheme palette: Palette shapes: Shapes typography: Typography } export interface ThemeProviderProps { children?: ReactNode theme: ThemeName } export const ThemeContext = createContext(defaultTheme) export const useTheme = () => useContext(ThemeContext) function getTheme(theme: ThemeName) { switch (theme) { case 'light': return defaultTheme case 'dim': return dimTheme case 'dark': return darkTheme default: return defaultTheme } } export const ThemeProvider: React.FC = ({ theme, children, }) => { const themeValue = getTheme(theme) return ( {children} ) }