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