import React, { createContext, useContext, useState, useEffect, ReactNode } from 'react';
import { useColorScheme as useSystemColorScheme } from 'react-native';
import AsyncStorage from '@react-native-async-storage/async-storage';
type ThemeMode = 'light' | 'dark' | 'system';
type ColorScheme = 'light' | 'dark';
interface ThemeContextType {
themeMode: ThemeMode;
colorScheme: ColorScheme;
setThemeMode: (mode: ThemeMode) => void;
}
const ThemeContext = createContext<ThemeContextType | undefined>(undefined);
const THEME_STORAGE_KEY = '@taskflow:theme';
export function ThemeProvider({ children }: { children: ReactNode }) {
const systemColorScheme = useSystemColorScheme();
const [themeMode, setThemeModeState] = useState<ThemeMode>('system');
useEffect(() => {
loadTheme();
}, []);
const loadTheme = async () => {
try {
const saved = await AsyncStorage.getItem(THEME_STORAGE_KEY);
if (saved) {
setThemeModeState(saved as ThemeMode);
}
} catch (error) {
console.error('Failed to load theme:', error);
}
};
const setThemeMode = async (mode: ThemeMode) => {
try {
await AsyncStorage.setItem(THEME_STORAGE_KEY, mode);
setThemeModeState(mode);
} catch (error) {
console.error('Failed to save theme:', error);
}
};
const colorScheme: ColorScheme =
themeMode === 'system'
? (systemColorScheme ?? 'light')
: themeMode;
return (
<ThemeContext.Provider value={{ themeMode, colorScheme, setThemeMode }}>
{children}
</ThemeContext.Provider>
);
}
export function useTheme() {
const context = useContext(ThemeContext);
if (!context) {
throw new Error('useTheme must be used within ThemeProvider');
}
return context;
}