Untitled

 avatar
unknown
plain_text
2 days ago
1.5 kB
19
Indexable
// theme.tsx

import AsyncStorage from "@react-native-async-storage/async-storage";
import { createContext, useContext, useEffect, useState } from 'react';

export type Theme = {
    BACKGROUND: string;
    PRIMARY: string;
};

export const LIGHT: Theme = {
    BACKGROUND: "rgba(238, 230, 232, 1)",
    PRIMARY: "rgba(244, 244, 244, 1)",
}
export const DARK: Theme = {
    BACKGROUND: "rgba(7, 7, 7, 1)",
    PRIMARY: "rgba(39, 39, 38, 1)",
}

const ThemeContext = createContext({
    theme: LIGHT,
    toggleTheme: () => { },
});

type Props = {
    children?: React.ReactNode;
};

export default function ThemeProvider({ children }: Props) {
    const [theme, setTheme] = useState<Theme>(DARK);

    useEffect(() => {
        (async () => {
            const storedTheme = await AsyncStorage.getItem("theme");
            if (storedTheme == null) {
                await AsyncStorage.setItem("theme", "dark");
                setTheme(DARK);
            }
            else if (storedTheme === "dark") {
                setTheme(DARK);
            } else {
                setTheme(LIGHT);
            }
        })();
    }, []);

    const toggleTheme = async () => {
        await AsyncStorage.setItem("theme", theme === LIGHT ? "dark" : "light");
        setTheme(prev => prev === LIGHT ? DARK : LIGHT);
    };

    return (
        <ThemeContext.Provider value={{ theme, toggleTheme }}>
            {children}
        </ThemeContext.Provider>
    );
}

export const useTheme = () => useContext(ThemeContext);
Editor is loading...
Leave a Comment