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