xref: /MusicFree/src/core/theme.ts (revision b4a87dd6dc0e75f2872da8effb28113164357ce0)
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