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