xref: /MusicFree/src/pages/setCustomTheme/body.tsx (revision 277c528005b29b919b3eda695ee03717976a5a83)
1a27adc20S猫头猫import React from 'react';
2a27adc20S猫头猫import {StyleSheet, View} from 'react-native';
3a27adc20S猫头猫import rpx from '@/utils/rpx';
4a27adc20S猫头猫import globalStyle from '@/constants/globalStyle';
5a27adc20S猫头猫import Image from '@/components/base/image';
6a27adc20S猫头猫import {ImgAsset} from '@/constants/assetsConst';
7a27adc20S猫头猫import {ScrollView, TouchableOpacity} from 'react-native-gesture-handler';
8a27adc20S猫头猫import {launchImageLibrary} from 'react-native-image-picker';
9a27adc20S猫头猫import pathConst from '@/constants/pathConst';
10a27adc20S猫头猫import {copyFile} from 'react-native-fs';
11a27adc20S猫头猫import ImageColors from 'react-native-image-colors';
12a27adc20S猫头猫import ThemeText from '@/components/base/themeText';
13a27adc20S猫头猫import Slider from '@react-native-community/slider';
14a27adc20S猫头猫import Theme from '@/core/theme';
15a27adc20S猫头猫import Color from 'color';
16a27adc20S猫头猫import {showPanel} from '@/components/panels/usePanel';
17*277c5280S猫头猫import {grayRate} from '@/utils/colorUtil';
18*277c5280S猫头猫import {CustomizedColors} from '@/hooks/useColors';
19a27adc20S猫头猫
20a27adc20S猫头猫export default function Body() {
21a27adc20S猫头猫    const theme = Theme.useTheme();
22a27adc20S猫头猫    const backgroundInfo = Theme.useBackground();
23a27adc20S猫头猫
24a27adc20S猫头猫    async function onImageClick() {
25a27adc20S猫头猫        try {
26a27adc20S猫头猫            const result = await launchImageLibrary({
27a27adc20S猫头猫                mediaType: 'photo',
28a27adc20S猫头猫            });
29a27adc20S猫头猫            const uri = result.assets?.[0].uri;
30a27adc20S猫头猫            if (!uri) {
31a27adc20S猫头猫                return;
32a27adc20S猫头猫            }
33a27adc20S猫头猫
34a27adc20S猫头猫            const bgPath = `${pathConst.dataPath}background${uri.substring(
35a27adc20S猫头猫                uri.lastIndexOf('.'),
36a27adc20S猫头猫            )}`;
37a27adc20S猫头猫            await copyFile(uri, bgPath);
38a27adc20S猫头猫
39a27adc20S猫头猫            const colorsResult = await ImageColors.getColors(uri, {
40a27adc20S猫头猫                fallback: '#ffffff',
41a27adc20S猫头猫            });
42a27adc20S猫头猫            const colors = {
43a27adc20S猫头猫                primary:
44a27adc20S猫头猫                    colorsResult.platform === 'android'
45a27adc20S猫头猫                        ? colorsResult.dominant
46a27adc20S猫头猫                        : colorsResult.platform === 'ios'
47a27adc20S猫头猫                        ? colorsResult.primary
48a27adc20S猫头猫                        : colorsResult.vibrant,
49a27adc20S猫头猫                average:
50a27adc20S猫头猫                    colorsResult.platform === 'android'
51a27adc20S猫头猫                        ? colorsResult.average
52a27adc20S猫头猫                        : colorsResult.platform === 'ios'
53a27adc20S猫头猫                        ? colorsResult.detail
54a27adc20S猫头猫                        : colorsResult.dominant,
55a27adc20S猫头猫                vibrant:
56a27adc20S猫头猫                    colorsResult.platform === 'android'
57a27adc20S猫头猫                        ? colorsResult.vibrant
58a27adc20S猫头猫                        : colorsResult.platform === 'ios'
59a27adc20S猫头猫                        ? colorsResult.secondary
60a27adc20S猫头猫                        : colorsResult.vibrant,
61a27adc20S猫头猫            };
62*277c5280S猫头猫
63*277c5280S猫头猫            const primaryGrayRate = grayRate(colors.primary!);
64*277c5280S猫头猫
65*277c5280S猫头猫            let themeColors: Partial<CustomizedColors>;
66*277c5280S猫头猫            if (primaryGrayRate < -0.4) {
67*277c5280S猫头猫                const primaryColor = Color(colors.primary!);
68*277c5280S猫头猫
69*277c5280S猫头猫                console.log(
70*277c5280S猫头猫                    colors.primary,
71*277c5280S猫头猫                    primaryGrayRate,
72*277c5280S猫头猫                    primaryColor
73*277c5280S猫头猫                        .whiten(3 * primaryGrayRate)
74*277c5280S猫头猫                        .hex()
75*277c5280S猫头猫                        .toString(),
76*277c5280S猫头猫                );
77*277c5280S猫头猫                themeColors = {
78b4a87dd6S猫头猫                    appBar: colors.primary,
79*277c5280S猫头猫                    primary: primaryColor
80*277c5280S猫头猫                        .darken(primaryGrayRate * 5)
81*277c5280S猫头猫                        .toString(),
82ab55f125S猫头猫                    musicBar: colors.primary,
83*277c5280S猫头猫                    card: 'rgba(0,0,0,0.2)',
84*277c5280S猫头猫                    tabBar: primaryColor.alpha(0.2).toString(),
85*277c5280S猫头猫                };
86*277c5280S猫头猫            } else if (primaryGrayRate > 0.4) {
87*277c5280S猫头猫                themeColors = {
88*277c5280S猫头猫                    appBar: colors.primary,
89*277c5280S猫头猫                    primary: Color(colors.primary)
90*277c5280S猫头猫                        .darken(primaryGrayRate * 5)
91*277c5280S猫头猫                        .toString(),
92*277c5280S猫头猫                    musicBar: colors.primary,
93*277c5280S猫头猫                    card: 'rgba(0,0,0,0.2)',
94*277c5280S猫头猫                };
95*277c5280S猫头猫            } else {
96*277c5280S猫头猫                // const primaryColor = Color(colors.primary!);
97*277c5280S猫头猫
98*277c5280S猫头猫                themeColors = {
99*277c5280S猫头猫                    appBar: colors.primary,
100*277c5280S猫头猫                    primary: Color(colors.primary)
101*277c5280S猫头猫                        .saturate(Math.abs(primaryGrayRate) * 2 + 2)
102*277c5280S猫头猫                        .toString(),
103*277c5280S猫头猫                    musicBar: colors.primary,
104*277c5280S猫头猫                    card: 'rgba(0,0,0,0.2)',
105*277c5280S猫头猫                };
106*277c5280S猫头猫            }
107*277c5280S猫头猫
108*277c5280S猫头猫            Theme.setTheme('custom', {
109*277c5280S猫头猫                colors: themeColors,
110b4a87dd6S猫头猫                background: {
111b4a87dd6S猫头猫                    url: `file://${bgPath}#${Date.now()}`,
112b4a87dd6S猫头猫                },
113b4a87dd6S猫头猫            });
114a27adc20S猫头猫            // Config.set('setting.theme.colors', {
115a27adc20S猫头猫            //     primary: primaryColor,
116a27adc20S猫头猫            //     textHighlight: textHighlight,
117a27adc20S猫头猫            //     accent: textHighlight,
118a27adc20S猫头猫            // });
119a27adc20S猫头猫        } catch (e) {
120a27adc20S猫头猫            console.log(e);
121a27adc20S猫头猫        }
122a27adc20S猫头猫    }
123a27adc20S猫头猫
124a27adc20S猫头猫    return (
125a27adc20S猫头猫        <ScrollView style={globalStyle.fwflex1}>
126a27adc20S猫头猫            <TouchableOpacity onPress={onImageClick}>
127a27adc20S猫头猫                <Image
128a27adc20S猫头猫                    style={styles.image}
129a27adc20S猫头猫                    uri={backgroundInfo?.url}
130a27adc20S猫头猫                    emptySrc={ImgAsset.addBackground}
131a27adc20S猫头猫                />
132a27adc20S猫头猫            </TouchableOpacity>
133a27adc20S猫头猫
134a27adc20S猫头猫            <View style={styles.sliderWrapper}>
135a27adc20S猫头猫                <ThemeText>模糊度</ThemeText>
136a27adc20S猫头猫                <Slider
137a27adc20S猫头猫                    style={styles.slider}
138b4a87dd6S猫头猫                    minimumTrackTintColor={theme.colors.primary}
139b4a87dd6S猫头猫                    maximumTrackTintColor={theme.colors.text ?? '#999999'}
140b4a87dd6S猫头猫                    thumbTintColor={theme.colors.primary}
141a27adc20S猫头猫                    minimumValue={0}
142b4a87dd6S猫头猫                    step={1}
143a27adc20S猫头猫                    maximumValue={30}
144a27adc20S猫头猫                    onSlidingComplete={val => {
145a27adc20S猫头猫                        Theme.setBackground({
146a27adc20S猫头猫                            blur: val,
147a27adc20S猫头猫                        });
148a27adc20S猫头猫                    }}
149a27adc20S猫头猫                    value={backgroundInfo?.blur ?? 20}
150a27adc20S猫头猫                />
151a27adc20S猫头猫            </View>
152a27adc20S猫头猫            <View style={styles.sliderWrapper}>
153a27adc20S猫头猫                <ThemeText>透明度</ThemeText>
154a27adc20S猫头猫                <Slider
155a27adc20S猫头猫                    style={styles.slider}
156b4a87dd6S猫头猫                    minimumTrackTintColor={theme.colors.primary}
157b4a87dd6S猫头猫                    maximumTrackTintColor={theme.colors.text ?? '#999999'}
158b4a87dd6S猫头猫                    thumbTintColor={theme.colors.primary}
159a27adc20S猫头猫                    minimumValue={0.3}
160b4a87dd6S猫头猫                    step={0.01}
161a27adc20S猫头猫                    maximumValue={1}
162a27adc20S猫头猫                    onSlidingComplete={val => {
163a27adc20S猫头猫                        Theme.setBackground({
164a27adc20S猫头猫                            opacity: val,
165a27adc20S猫头猫                        });
166a27adc20S猫头猫                    }}
167a27adc20S猫头猫                    value={backgroundInfo?.opacity ?? 0.7}
168a27adc20S猫头猫                />
169a27adc20S猫头猫            </View>
170a27adc20S猫头猫            <View style={styles.colorsContainer}>
171a27adc20S猫头猫                {Theme.configableColorKey.map(key => (
172a27adc20S猫头猫                    <View key={key} style={styles.colorItem}>
173a27adc20S猫头猫                        <ThemeText>{Theme.colorDesc[key]}</ThemeText>
174a27adc20S猫头猫                        <TouchableOpacity
175a27adc20S猫头猫                            onPress={() => {
176a27adc20S猫头猫                                showPanel('ColorPicker', {
177a27adc20S猫头猫                                    // @ts-ignore
178a27adc20S猫头猫                                    defaultColor: theme.colors[key],
179b4a87dd6S猫头猫                                    onSelected(color) {
180b4a87dd6S猫头猫                                        Theme.setColors({
181b4a87dd6S猫头猫                                            [key]: color.hexa().toString(),
182b4a87dd6S猫头猫                                        });
183b4a87dd6S猫头猫                                    },
184a27adc20S猫头猫                                });
185a27adc20S猫头猫                            }}
186a27adc20S猫头猫                            style={styles.colorItemBlockContainer}>
187*277c5280S猫头猫                            <View style={[styles.colorBlockContainer]}>
188*277c5280S猫头猫                                <Image
189*277c5280S猫头猫                                    resizeMode="repeat"
190*277c5280S猫头猫                                    emptySrc={ImgAsset.transparentBg}
191*277c5280S猫头猫                                    style={styles.transparentBg}
192*277c5280S猫头猫                                />
193a27adc20S猫头猫                                <View
194a27adc20S猫头猫                                    style={[
195a27adc20S猫头猫                                        {
196a27adc20S猫头猫                                            /** @ts-ignore */
197a27adc20S猫头猫                                            backgroundColor: theme.colors[key],
198a27adc20S猫头猫                                        },
199a27adc20S猫头猫                                        styles.colorBlock,
200a27adc20S猫头猫                                    ]}
201a27adc20S猫头猫                                />
202*277c5280S猫头猫                            </View>
203a27adc20S猫头猫                            <ThemeText
204a27adc20S猫头猫                                fontSize="subTitle"
205a27adc20S猫头猫                                style={styles.colorText}>
206a27adc20S猫头猫                                {
207a27adc20S猫头猫                                    /** @ts-ignore */
208a27adc20S猫头猫                                    Color(theme.colors[key]).hexa().toString()
209a27adc20S猫头猫                                }
210a27adc20S猫头猫                            </ThemeText>
211a27adc20S猫头猫                        </TouchableOpacity>
212a27adc20S猫头猫                    </View>
213a27adc20S猫头猫                ))}
214a27adc20S猫头猫            </View>
215a27adc20S猫头猫        </ScrollView>
216a27adc20S猫头猫    );
217a27adc20S猫头猫}
218a27adc20S猫头猫
219a27adc20S猫头猫const styles = StyleSheet.create({
220a27adc20S猫头猫    container: {
221a27adc20S猫头猫        width: '100%',
222a27adc20S猫头猫        flex: 1,
223a27adc20S猫头猫    },
224a27adc20S猫头猫    image: {
225a27adc20S猫头猫        marginTop: rpx(36),
226a27adc20S猫头猫        borderRadius: rpx(12),
227a27adc20S猫头猫        width: rpx(460),
228a27adc20S猫头猫        height: rpx(690),
229a27adc20S猫头猫        alignSelf: 'center',
230a27adc20S猫头猫    },
231a27adc20S猫头猫    sliderWrapper: {
232a27adc20S猫头猫        marginTop: rpx(48),
233a27adc20S猫头猫        width: '100%',
234a27adc20S猫头猫        paddingHorizontal: rpx(24),
235a27adc20S猫头猫        flexDirection: 'row',
236a27adc20S猫头猫        justifyContent: 'space-between',
237a27adc20S猫头猫        alignItems: 'center',
238a27adc20S猫头猫    },
239a27adc20S猫头猫    slider: {
240a27adc20S猫头猫        flex: 1,
241a27adc20S猫头猫        height: rpx(40),
242a27adc20S猫头猫    },
243a27adc20S猫头猫    colorsContainer: {
244a27adc20S猫头猫        width: '100%',
245a27adc20S猫头猫        flex: 1,
246a27adc20S猫头猫        flexDirection: 'row',
247a27adc20S猫头猫        flexWrap: 'wrap',
248a27adc20S猫头猫        marginTop: rpx(48),
249a27adc20S猫头猫        paddingHorizontal: rpx(24),
250a27adc20S猫头猫        justifyContent: 'space-between',
251a27adc20S猫头猫    },
252a27adc20S猫头猫    colorItem: {
253a27adc20S猫头猫        flex: 1,
254a27adc20S猫头猫        flexBasis: '40%',
255a27adc20S猫头猫        marginBottom: rpx(36),
256a27adc20S猫头猫    },
257*277c5280S猫头猫    colorBlockContainer: {
258a27adc20S猫头猫        width: rpx(76),
259a27adc20S猫头猫        height: rpx(50),
260a27adc20S猫头猫        borderWidth: 1,
261a27adc20S猫头猫        borderStyle: 'solid',
262a27adc20S猫头猫        borderColor: '#ccc',
263a27adc20S猫头猫    },
264*277c5280S猫头猫    colorBlock: {
265*277c5280S猫头猫        width: '100%',
266*277c5280S猫头猫        height: '100%',
267*277c5280S猫头猫        position: 'absolute',
268*277c5280S猫头猫        top: 0,
269*277c5280S猫头猫        left: 0,
270*277c5280S猫头猫        zIndex: 2,
271*277c5280S猫头猫    },
272a27adc20S猫头猫    colorItemBlockContainer: {
273a27adc20S猫头猫        marginTop: rpx(18),
274a27adc20S猫头猫        flexDirection: 'row',
275a27adc20S猫头猫        alignItems: 'center',
276a27adc20S猫头猫    },
277a27adc20S猫头猫    colorText: {
278a27adc20S猫头猫        marginLeft: rpx(8),
279a27adc20S猫头猫    },
280*277c5280S猫头猫    transparentBg: {
281*277c5280S猫头猫        position: 'absolute',
282*277c5280S猫头猫        zIndex: -1,
283*277c5280S猫头猫        width: '100%',
284*277c5280S猫头猫        height: '100%',
285*277c5280S猫头猫        left: 0,
286*277c5280S猫头猫        top: 0,
287*277c5280S猫头猫    },
288a27adc20S猫头猫});
289