1a27adc20S猫头猫import Config from '@/core/config'; 2a27adc20S猫头猫 3a27adc20S猫头猫import { 4a27adc20S猫头猫 DarkTheme as _DarkTheme, 5a27adc20S猫头猫 DefaultTheme as _DefaultTheme, 6a27adc20S猫头猫} from '@react-navigation/native'; 7a27adc20S猫头猫import {GlobalState} from '@/utils/stateMapper'; 8a27adc20S猫头猫import {CustomizedColors} from '@/hooks/useColors'; 9a27adc20S猫头猫 10a27adc20S猫头猫export const lightTheme = { 11a27adc20S猫头猫 id: 'p-light', 12a27adc20S猫头猫 ..._DefaultTheme, 13a27adc20S猫头猫 colors: { 14a27adc20S猫头猫 ..._DefaultTheme.colors, 15a27adc20S猫头猫 primary: '#f17d34', 16a27adc20S猫头猫 background: 'transparent', 17a27adc20S猫头猫 _background: '#fafafa', 18a27adc20S猫头猫 divider: 'rgba(0,0,0,0.1)', 19a27adc20S猫头猫 text: '#333333', 20a27adc20S猫头猫 listActive: 'rgba(0,0,0,0.1)', // 在手机上表现是ripple 21a27adc20S猫头猫 mask: 'rgba(51,51,51,0.2)', 22a27adc20S猫头猫 shadow: '#000', 23a27adc20S猫头猫 backdrop: '#f0f0f0', 24a27adc20S猫头猫 placeholder: '#eaeaea', 25a27adc20S猫头猫 success: '#08A34C', 26a27adc20S猫头猫 danger: '#FC5F5F', 27a27adc20S猫头猫 info: '#0A95C8', 28a27adc20S猫头猫 musicBar: '#fff', 29a27adc20S猫头猫 appBar: '#f17d34', 30a27adc20S猫头猫 headerText: '#fefefe', 31a27adc20S猫头猫 }, 32a27adc20S猫头猫}; 33a27adc20S猫头猫 34a27adc20S猫头猫export const darkTheme = { 35a27adc20S猫头猫 id: 'p-dark', 36a27adc20S猫头猫 ..._DarkTheme, 37a27adc20S猫头猫 colors: { 38a27adc20S猫头猫 ..._DarkTheme.colors, 39a27adc20S猫头猫 primary: '#3FA3B5', 40a27adc20S猫头猫 background: 'transparent', 41a27adc20S猫头猫 _background: '#202020', 42a27adc20S猫头猫 divider: 'rgba(255,255,255,0.1)', 43a27adc20S猫头猫 text: '#fcfcfc', 44a27adc20S猫头猫 listActive: 'rgba(255,255,255,0.1)', // 在手机上表现是ripple 45a27adc20S猫头猫 mask: 'rgba(33,33,33,0.8)', 46a27adc20S猫头猫 shadow: '#666', 47a27adc20S猫头猫 backdrop: '#303030', 48a27adc20S猫头猫 placeholder: '#424242', 49a27adc20S猫头猫 success: '#08A34C', 50a27adc20S猫头猫 danger: '#FC5F5F', 51a27adc20S猫头猫 info: '#0A95C8', 52a27adc20S猫头猫 appBar: '#262626', 53a27adc20S猫头猫 musicBar: '#262626', 54a27adc20S猫头猫 headerText: '#fcfcfc', 55a27adc20S猫头猫 }, 56a27adc20S猫头猫}; 57a27adc20S猫头猫 58a27adc20S猫头猫interface IBackgroundInfo { 59a27adc20S猫头猫 url?: string; 60a27adc20S猫头猫 blur?: number; 61a27adc20S猫头猫 opacity?: number; 62a27adc20S猫头猫} 63a27adc20S猫头猫 64a27adc20S猫头猫const themeStore = new GlobalState(darkTheme); 65a27adc20S猫头猫const backgroundStore = new GlobalState<IBackgroundInfo | null>(null); 66a27adc20S猫头猫 67a27adc20S猫头猫function setup() { 68a27adc20S猫头猫 const currentTheme = Config.get('setting.theme.selectedTheme') ?? 'p-dark'; 69a27adc20S猫头猫 70a27adc20S猫头猫 if (currentTheme === 'p-dark') { 71a27adc20S猫头猫 themeStore.setValue(darkTheme); 72a27adc20S猫头猫 } else if (currentTheme === 'p-light') { 73a27adc20S猫头猫 themeStore.setValue(lightTheme); 74a27adc20S猫头猫 } else { 75a27adc20S猫头猫 themeStore.setValue({ 76a27adc20S猫头猫 id: currentTheme, 77a27adc20S猫头猫 dark: true, 78a27adc20S猫头猫 // @ts-ignore 79a27adc20S猫头猫 colors: 80a27adc20S猫头猫 (Config.get('setting.theme.colors') as CustomizedColors) ?? 81a27adc20S猫头猫 darkTheme.colors, 82a27adc20S猫头猫 }); 83a27adc20S猫头猫 } 84a27adc20S猫头猫 85a27adc20S猫头猫 const bgUrl = Config.get('setting.theme.background'); 86a27adc20S猫头猫 const bgBlur = Config.get('setting.theme.backgroundBlur'); 87a27adc20S猫头猫 const bgOpacity = Config.get('setting.theme.backgroundOpacity'); 88a27adc20S猫头猫 89a27adc20S猫头猫 backgroundStore.setValue({ 90a27adc20S猫头猫 url: bgUrl, 91a27adc20S猫头猫 blur: bgBlur ?? 20, 92a27adc20S猫头猫 opacity: bgOpacity ?? 0.6, 93a27adc20S猫头猫 }); 94a27adc20S猫头猫} 95a27adc20S猫头猫 96a27adc20S猫头猫function setTheme( 97a27adc20S猫头猫 themeName: string, 98a27adc20S猫头猫 extra?: { 99*b4a87dd6S猫头猫 colors?: Partial<CustomizedColors>; 100a27adc20S猫头猫 background?: IBackgroundInfo; 101a27adc20S猫头猫 }, 102a27adc20S猫头猫) { 103a27adc20S猫头猫 if (themeName === 'p-light') { 104a27adc20S猫头猫 themeStore.setValue(lightTheme); 105a27adc20S猫头猫 } else if (themeName === 'p-dark') { 106a27adc20S猫头猫 themeStore.setValue(darkTheme); 107a27adc20S猫头猫 } else { 108a27adc20S猫头猫 themeStore.setValue({ 109a27adc20S猫头猫 id: themeName, 110a27adc20S猫头猫 dark: true, 111a27adc20S猫头猫 colors: { 112a27adc20S猫头猫 ...darkTheme.colors, 113a27adc20S猫头猫 ...(extra?.colors ?? {}), 114a27adc20S猫头猫 }, 115a27adc20S猫头猫 }); 116a27adc20S猫头猫 } 117a27adc20S猫头猫 118a27adc20S猫头猫 Config.set('setting.theme.selectedTheme', themeName); 119a27adc20S猫头猫 Config.set('setting.theme.colors', themeStore.getValue().colors); 120a27adc20S猫头猫 121a27adc20S猫头猫 if (extra?.background) { 122a27adc20S猫头猫 const currentBg = backgroundStore.getValue(); 123*b4a87dd6S猫头猫 let newBg: IBackgroundInfo = { 124a27adc20S猫头猫 blur: 20, 125a27adc20S猫头猫 opacity: 0.6, 126a27adc20S猫头猫 ...(currentBg ?? {}), 127a27adc20S猫头猫 url: undefined, 128a27adc20S猫头猫 }; 129a27adc20S猫头猫 if (extra.background.blur) { 130a27adc20S猫头猫 newBg.blur = extra.background.blur; 131a27adc20S猫头猫 } 132a27adc20S猫头猫 if (extra.background.opacity) { 133a27adc20S猫头猫 newBg.opacity = extra.background.opacity; 134a27adc20S猫头猫 } 135*b4a87dd6S猫头猫 if (extra.background.url) { 136*b4a87dd6S猫头猫 newBg.url = extra.background.url; 137*b4a87dd6S猫头猫 } 138a27adc20S猫头猫 139a27adc20S猫头猫 Config.set('setting.theme.background', newBg.url); 140a27adc20S猫头猫 Config.set('setting.theme.backgroundBlur', newBg.blur); 141a27adc20S猫头猫 Config.set('setting.theme.backgroundOpacity', newBg.opacity); 142a27adc20S猫头猫 143a27adc20S猫头猫 backgroundStore.setValue(newBg); 144a27adc20S猫头猫 } 145a27adc20S猫头猫} 146a27adc20S猫头猫 147a27adc20S猫头猫function setColors(colors: Partial<CustomizedColors>) { 148a27adc20S猫头猫 const currentTheme = themeStore.getValue(); 149a27adc20S猫头猫 if (currentTheme.id !== 'p-light' && currentTheme.id !== 'p-dark') { 150a27adc20S猫头猫 const newTheme = { 151a27adc20S猫头猫 ...currentTheme, 152a27adc20S猫头猫 colors: { 153a27adc20S猫头猫 ...currentTheme.colors, 154a27adc20S猫头猫 ...colors, 155a27adc20S猫头猫 }, 156a27adc20S猫头猫 }; 157a27adc20S猫头猫 158a27adc20S猫头猫 Config.set('setting.theme.colors', newTheme.colors); 159a27adc20S猫头猫 themeStore.setValue(newTheme); 160a27adc20S猫头猫 } 161a27adc20S猫头猫} 162a27adc20S猫头猫 163a27adc20S猫头猫function setBackground(backgroundInfo: Partial<IBackgroundInfo>) { 164a27adc20S猫头猫 const currentBackgroundInfo = backgroundStore.getValue(); 165a27adc20S猫头猫 let newBgInfo = { 166a27adc20S猫头猫 ...(currentBackgroundInfo ?? { 167a27adc20S猫头猫 opacity: 0.6, 168a27adc20S猫头猫 blur: 20, 169a27adc20S猫头猫 }), 170a27adc20S猫头猫 }; 171a27adc20S猫头猫 if (backgroundInfo.blur) { 172a27adc20S猫头猫 Config.set('setting.theme.backgroundBlur', backgroundInfo.blur); 173a27adc20S猫头猫 newBgInfo.blur = backgroundInfo.blur; 174a27adc20S猫头猫 } 175a27adc20S猫头猫 if (backgroundInfo.opacity) { 176a27adc20S猫头猫 Config.set('setting.theme.backgroundOpacity', backgroundInfo.opacity); 177a27adc20S猫头猫 newBgInfo.opacity = backgroundInfo.opacity; 178a27adc20S猫头猫 } 179a27adc20S猫头猫 if (backgroundInfo.url !== undefined) { 180a27adc20S猫头猫 Config.set('setting.theme.background', backgroundInfo.url); 181a27adc20S猫头猫 newBgInfo.url = backgroundInfo.url; 182a27adc20S猫头猫 } 183a27adc20S猫头猫 backgroundStore.setValue(newBgInfo); 184a27adc20S猫头猫} 185a27adc20S猫头猫 186a27adc20S猫头猫const configableColorKey: Array<keyof CustomizedColors> = [ 187a27adc20S猫头猫 'appBar', 188a27adc20S猫头猫 'musicBar', 189a27adc20S猫头猫 'primary', 190*b4a87dd6S猫头猫 '_background', 191a27adc20S猫头猫 'headerText', 192a27adc20S猫头猫 'text', 193a27adc20S猫头猫]; 194a27adc20S猫头猫 195a27adc20S猫头猫const colorDesc: Record<string, string> = { 196a27adc20S猫头猫 appBar: '标题栏背景色', 197a27adc20S猫头猫 headerText: '标题栏文字颜色', 198a27adc20S猫头猫 text: '文字颜色', 199a27adc20S猫头猫 musicBar: '音乐栏背景色', 200a27adc20S猫头猫 primary: '主题色', 201*b4a87dd6S猫头猫 _background: '背景色', 202a27adc20S猫头猫}; 203a27adc20S猫头猫 204a27adc20S猫头猫const Theme = { 205a27adc20S猫头猫 setup, 206a27adc20S猫头猫 setTheme, 207a27adc20S猫头猫 setBackground, 208a27adc20S猫头猫 setColors, 209a27adc20S猫头猫 useTheme: themeStore.useValue, 210a27adc20S猫头猫 useBackground: backgroundStore.useValue, 211a27adc20S猫头猫 configableColorKey, 212a27adc20S猫头猫 colorDesc, 213a27adc20S猫头猫}; 214a27adc20S猫头猫 215a27adc20S猫头猫export default Theme; 216