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