import { StyleProp, StyleSheet, Text, TextStyle, type TextProps } from 'react-native'; import { Colors } from '@/constants/Colors'; import { FontColor, Fonts, FontSize, FontWeight } from '@/constants/Fonts'; import { useThemeColor } from '@/hooks/useThemeColor'; export type ThemeColor = keyof typeof Colors.light & keyof typeof Colors.dark; export type ColorValue = `#${string}` | `rgb(${string})` | `rgba(${string})` | string; export type ThemedTextProps = TextProps & { lightColor?: string; darkColor?: string; type?: 'default' | 'title' | 'defaultSemiBold' | 'subtitle' | 'link' | 'sfPro' | 'inter'; weight?: FontWeight; size?: FontSize; radius?: FontSize color?: ThemeColor | FontColor | ColorValue; }; export function isFontColorKey(key: string): key is FontColor { return ['bgPrimary', 'bgSecondary', 'textPrimary', 'textSecondary', 'textThird', 'textWhite'].includes(key); } export function ThemedText({ style, lightColor, darkColor, type = 'default', weight = 'regular', size, radius, color, ...rest }: ThemedTextProps) { const themeColor = useThemeColor({ light: lightColor, dark: darkColor }, 'text'); const textColor = (() => { if (!color) return themeColor; // 检查是否是主题颜色 const themeColors = Object.keys(Colors.light) as ThemeColor[]; if (themeColors.includes(color as ThemeColor)) { return useThemeColor({ light: lightColor, dark: darkColor }, color as ThemeColor); } // 检查是否是 Fonts 中定义的颜色 if (isFontColorKey(color)) { return Fonts[color as FontColor]; } // 返回自定义颜色值 return color; })(); const baseStyle: StyleProp = { fontFamily: Fonts.quicksand, color: textColor, fontWeight: Number(Fonts[weight as keyof typeof Fonts]) as TextStyle['fontWeight'], }; return ( ); } const styles = StyleSheet.create({ default: { fontSize: Number(Fonts.base), lineHeight: 24, fontFamily: Fonts.quicksand, }, defaultSemiBold: { fontSize: Number(Fonts.base), lineHeight: 24, fontWeight: '600', }, title: { fontSize: Fonts['2xl'], fontWeight: '700', lineHeight: 32, }, subtitle: { fontSize: Fonts.lg, fontWeight: '600', lineHeight: 28, }, link: { fontSize: Fonts.sm, lineHeight: 20, color: '#0a7ea4', textDecorationLine: 'underline', }, sfPro: { fontSize: Number(Fonts.base), lineHeight: 24, fontWeight: '600', fontFamily: Fonts.sfPro, }, inter: { fontSize: Number(Fonts.base), lineHeight: 24, fontWeight: '600', fontFamily: Fonts.inter, }, });