/** * 主题化组件 * * 提供自动适配主题的 Text 和 View 组件 * 支持从 settingsStore 读取主题设置 */ import { Text as DefaultText, View as DefaultView, TextStyle } from 'react-native'; import Colors from '@/constants/Colors'; import { useColorScheme } from '@/hooks/useTheme'; type ThemeProps = { lightColor?: string; darkColor?: string; }; export type TextProps = ThemeProps & DefaultText['props']; export type ViewProps = ThemeProps & DefaultView['props']; /** * 获取主题颜色 * * @param props - 包含 light 和 dark 颜色的对象 * @param colorName - Colors 中定义的颜色名称 * @returns 当前主题对应的颜色值 */ export function useThemeColor( props: { light?: string; dark?: string }, colorName: keyof typeof Colors.light & keyof typeof Colors.dark ) { const theme = useColorScheme() ?? 'light'; const colorFromProps = props[theme]; if (colorFromProps) { return colorFromProps; } else { return Colors[theme][colorName]; } } /** * 主题化 Text 组件 * * 自动应用当前主题的文本颜色 */ export function Text(props: TextProps) { const { style, lightColor, darkColor, ...otherProps } = props; const color = useThemeColor({ light: lightColor, dark: darkColor }, 'text'); return ; } /** * 主题化 View 组件 * * 自动应用当前主题的背景颜色 */ export function View(props: ViewProps) { const { style, lightColor, darkColor, ...otherProps } = props; const backgroundColor = useThemeColor({ light: lightColor, dark: darkColor }, 'background'); return ; } /** * 主题化 Text 组件(带类型) * * 支持不同的文本类型:title, subtitle, defaultSemiBold, link */ export type ThemedTextProps = TextProps & { type?: 'default' | 'title' | 'defaultSemiBold' | 'subtitle' | 'link'; }; export function ThemedText({ style, type = 'default', ...rest }: ThemedTextProps) { const color = useThemeColor({}, 'text'); const linkColor = useThemeColor({}, 'tint'); const typeStyles: Record = { default: { fontSize: 16, lineHeight: 24, }, defaultSemiBold: { fontSize: 16, lineHeight: 24, fontWeight: '600', }, title: { fontSize: 32, fontWeight: 'bold', lineHeight: 40, }, subtitle: { fontSize: 20, fontWeight: '600', lineHeight: 28, }, link: { fontSize: 16, lineHeight: 24, color: linkColor, }, }; return ( ); } /** * 主题化 View 组件 */ export type ThemedViewProps = ViewProps; export function ThemedView({ style, ...otherProps }: ThemedViewProps) { const backgroundColor = useThemeColor({}, 'background'); return ; }