xref: /MusicFree/src/pages/setCustomTheme/body.tsx (revision ab55f125072c3b77549324c638fbca1fe4561337)
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';
17a27adc20S猫头猫
18a27adc20S猫头猫export default function Body() {
19a27adc20S猫头猫    const theme = Theme.useTheme();
20a27adc20S猫头猫    const backgroundInfo = Theme.useBackground();
21a27adc20S猫头猫
22a27adc20S猫头猫    async function onImageClick() {
23a27adc20S猫头猫        try {
24a27adc20S猫头猫            const result = await launchImageLibrary({
25a27adc20S猫头猫                mediaType: 'photo',
26a27adc20S猫头猫            });
27a27adc20S猫头猫            const uri = result.assets?.[0].uri;
28a27adc20S猫头猫            if (!uri) {
29a27adc20S猫头猫                return;
30a27adc20S猫头猫            }
31a27adc20S猫头猫
32a27adc20S猫头猫            const bgPath = `${pathConst.dataPath}background${uri.substring(
33a27adc20S猫头猫                uri.lastIndexOf('.'),
34a27adc20S猫头猫            )}`;
35a27adc20S猫头猫            await copyFile(uri, bgPath);
36a27adc20S猫头猫
37a27adc20S猫头猫            const colorsResult = await ImageColors.getColors(uri, {
38a27adc20S猫头猫                fallback: '#ffffff',
39a27adc20S猫头猫            });
40a27adc20S猫头猫            const colors = {
41a27adc20S猫头猫                primary:
42a27adc20S猫头猫                    colorsResult.platform === 'android'
43a27adc20S猫头猫                        ? colorsResult.dominant
44a27adc20S猫头猫                        : colorsResult.platform === 'ios'
45a27adc20S猫头猫                        ? colorsResult.primary
46a27adc20S猫头猫                        : colorsResult.vibrant,
47a27adc20S猫头猫                average:
48a27adc20S猫头猫                    colorsResult.platform === 'android'
49a27adc20S猫头猫                        ? colorsResult.average
50a27adc20S猫头猫                        : colorsResult.platform === 'ios'
51a27adc20S猫头猫                        ? colorsResult.detail
52a27adc20S猫头猫                        : colorsResult.dominant,
53a27adc20S猫头猫                vibrant:
54a27adc20S猫头猫                    colorsResult.platform === 'android'
55a27adc20S猫头猫                        ? colorsResult.vibrant
56a27adc20S猫头猫                        : colorsResult.platform === 'ios'
57a27adc20S猫头猫                        ? colorsResult.secondary
58a27adc20S猫头猫                        : colorsResult.vibrant,
59a27adc20S猫头猫            };
60b4a87dd6S猫头猫            Theme.setTheme('custom', {
61b4a87dd6S猫头猫                colors: {
62b4a87dd6S猫头猫                    appBar: colors.primary,
63*ab55f125S猫头猫                    primary: Color(colors.primary).lighten(2).toString(),
64*ab55f125S猫头猫                    musicBar: colors.primary,
65b4a87dd6S猫头猫                },
66b4a87dd6S猫头猫                background: {
67b4a87dd6S猫头猫                    url: `file://${bgPath}#${Date.now()}`,
68b4a87dd6S猫头猫                },
69b4a87dd6S猫头猫            });
70a27adc20S猫头猫            // Config.set('setting.theme.colors', {
71a27adc20S猫头猫            //     primary: primaryColor,
72a27adc20S猫头猫            //     textHighlight: textHighlight,
73a27adc20S猫头猫            //     accent: textHighlight,
74a27adc20S猫头猫            // });
75a27adc20S猫头猫        } catch (e) {
76a27adc20S猫头猫            console.log(e);
77a27adc20S猫头猫        }
78a27adc20S猫头猫    }
79a27adc20S猫头猫
80a27adc20S猫头猫    return (
81a27adc20S猫头猫        <ScrollView style={globalStyle.fwflex1}>
82a27adc20S猫头猫            <TouchableOpacity onPress={onImageClick}>
83a27adc20S猫头猫                <Image
84a27adc20S猫头猫                    style={styles.image}
85a27adc20S猫头猫                    uri={backgroundInfo?.url}
86a27adc20S猫头猫                    emptySrc={ImgAsset.addBackground}
87a27adc20S猫头猫                />
88a27adc20S猫头猫            </TouchableOpacity>
89a27adc20S猫头猫
90a27adc20S猫头猫            <View style={styles.sliderWrapper}>
91a27adc20S猫头猫                <ThemeText>模糊度</ThemeText>
92a27adc20S猫头猫                <Slider
93a27adc20S猫头猫                    style={styles.slider}
94b4a87dd6S猫头猫                    minimumTrackTintColor={theme.colors.primary}
95b4a87dd6S猫头猫                    maximumTrackTintColor={theme.colors.text ?? '#999999'}
96b4a87dd6S猫头猫                    thumbTintColor={theme.colors.primary}
97a27adc20S猫头猫                    minimumValue={0}
98b4a87dd6S猫头猫                    step={1}
99a27adc20S猫头猫                    maximumValue={30}
100a27adc20S猫头猫                    onSlidingComplete={val => {
101a27adc20S猫头猫                        Theme.setBackground({
102a27adc20S猫头猫                            blur: val,
103a27adc20S猫头猫                        });
104a27adc20S猫头猫                    }}
105a27adc20S猫头猫                    value={backgroundInfo?.blur ?? 20}
106a27adc20S猫头猫                />
107a27adc20S猫头猫            </View>
108a27adc20S猫头猫            <View style={styles.sliderWrapper}>
109a27adc20S猫头猫                <ThemeText>透明度</ThemeText>
110a27adc20S猫头猫                <Slider
111a27adc20S猫头猫                    style={styles.slider}
112b4a87dd6S猫头猫                    minimumTrackTintColor={theme.colors.primary}
113b4a87dd6S猫头猫                    maximumTrackTintColor={theme.colors.text ?? '#999999'}
114b4a87dd6S猫头猫                    thumbTintColor={theme.colors.primary}
115a27adc20S猫头猫                    minimumValue={0.3}
116b4a87dd6S猫头猫                    step={0.01}
117a27adc20S猫头猫                    maximumValue={1}
118a27adc20S猫头猫                    onSlidingComplete={val => {
119a27adc20S猫头猫                        Theme.setBackground({
120a27adc20S猫头猫                            opacity: val,
121a27adc20S猫头猫                        });
122a27adc20S猫头猫                    }}
123a27adc20S猫头猫                    value={backgroundInfo?.opacity ?? 0.7}
124a27adc20S猫头猫                />
125a27adc20S猫头猫            </View>
126a27adc20S猫头猫            <View style={styles.colorsContainer}>
127a27adc20S猫头猫                {Theme.configableColorKey.map(key => (
128a27adc20S猫头猫                    <View key={key} style={styles.colorItem}>
129a27adc20S猫头猫                        <ThemeText>{Theme.colorDesc[key]}</ThemeText>
130a27adc20S猫头猫                        <TouchableOpacity
131a27adc20S猫头猫                            onPress={() => {
132a27adc20S猫头猫                                showPanel('ColorPicker', {
133a27adc20S猫头猫                                    // @ts-ignore
134a27adc20S猫头猫                                    defaultColor: theme.colors[key],
135b4a87dd6S猫头猫                                    onSelected(color) {
136b4a87dd6S猫头猫                                        Theme.setColors({
137b4a87dd6S猫头猫                                            [key]: color.hexa().toString(),
138b4a87dd6S猫头猫                                        });
139b4a87dd6S猫头猫                                    },
140a27adc20S猫头猫                                });
141a27adc20S猫头猫                            }}
142a27adc20S猫头猫                            style={styles.colorItemBlockContainer}>
143a27adc20S猫头猫                            <View
144a27adc20S猫头猫                                style={[
145a27adc20S猫头猫                                    {
146a27adc20S猫头猫                                        /** @ts-ignore */
147a27adc20S猫头猫                                        backgroundColor: theme.colors[key],
148a27adc20S猫头猫                                    },
149a27adc20S猫头猫                                    styles.colorBlock,
150a27adc20S猫头猫                                ]}
151a27adc20S猫头猫                            />
152a27adc20S猫头猫                            <ThemeText
153a27adc20S猫头猫                                fontSize="subTitle"
154a27adc20S猫头猫                                style={styles.colorText}>
155a27adc20S猫头猫                                {
156a27adc20S猫头猫                                    /** @ts-ignore */
157a27adc20S猫头猫                                    Color(theme.colors[key]).hexa().toString()
158a27adc20S猫头猫                                }
159a27adc20S猫头猫                            </ThemeText>
160a27adc20S猫头猫                        </TouchableOpacity>
161a27adc20S猫头猫                    </View>
162a27adc20S猫头猫                ))}
163a27adc20S猫头猫            </View>
164a27adc20S猫头猫        </ScrollView>
165a27adc20S猫头猫    );
166a27adc20S猫头猫}
167a27adc20S猫头猫
168a27adc20S猫头猫const styles = StyleSheet.create({
169a27adc20S猫头猫    container: {
170a27adc20S猫头猫        width: '100%',
171a27adc20S猫头猫        flex: 1,
172a27adc20S猫头猫    },
173a27adc20S猫头猫    image: {
174a27adc20S猫头猫        marginTop: rpx(36),
175a27adc20S猫头猫        borderRadius: rpx(12),
176a27adc20S猫头猫        width: rpx(460),
177a27adc20S猫头猫        height: rpx(690),
178a27adc20S猫头猫        alignSelf: 'center',
179a27adc20S猫头猫    },
180a27adc20S猫头猫    sliderWrapper: {
181a27adc20S猫头猫        marginTop: rpx(48),
182a27adc20S猫头猫        width: '100%',
183a27adc20S猫头猫        paddingHorizontal: rpx(24),
184a27adc20S猫头猫        flexDirection: 'row',
185a27adc20S猫头猫        justifyContent: 'space-between',
186a27adc20S猫头猫        alignItems: 'center',
187a27adc20S猫头猫    },
188a27adc20S猫头猫    slider: {
189a27adc20S猫头猫        flex: 1,
190a27adc20S猫头猫        height: rpx(40),
191a27adc20S猫头猫    },
192a27adc20S猫头猫    colorsContainer: {
193a27adc20S猫头猫        width: '100%',
194a27adc20S猫头猫        flex: 1,
195a27adc20S猫头猫        flexDirection: 'row',
196a27adc20S猫头猫        flexWrap: 'wrap',
197a27adc20S猫头猫        marginTop: rpx(48),
198a27adc20S猫头猫        paddingHorizontal: rpx(24),
199a27adc20S猫头猫        justifyContent: 'space-between',
200a27adc20S猫头猫    },
201a27adc20S猫头猫    colorItem: {
202a27adc20S猫头猫        flex: 1,
203a27adc20S猫头猫        flexBasis: '40%',
204a27adc20S猫头猫        marginBottom: rpx(36),
205a27adc20S猫头猫    },
206a27adc20S猫头猫    colorBlock: {
207a27adc20S猫头猫        width: rpx(76),
208a27adc20S猫头猫        height: rpx(50),
209a27adc20S猫头猫        borderWidth: 1,
210a27adc20S猫头猫        borderStyle: 'solid',
211a27adc20S猫头猫        borderColor: '#ccc',
212a27adc20S猫头猫    },
213a27adc20S猫头猫    colorItemBlockContainer: {
214a27adc20S猫头猫        marginTop: rpx(18),
215a27adc20S猫头猫        flexDirection: 'row',
216a27adc20S猫头猫        alignItems: 'center',
217a27adc20S猫头猫    },
218a27adc20S猫头猫    colorText: {
219a27adc20S猫头猫        marginLeft: rpx(8),
220a27adc20S猫头猫    },
221a27adc20S猫头猫});
222