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'; 17*277c5280S猫头猫import {grayRate} from '@/utils/colorUtil'; 18*277c5280S猫头猫import {CustomizedColors} from '@/hooks/useColors'; 19a27adc20S猫头猫 20a27adc20S猫头猫export default function Body() { 21a27adc20S猫头猫 const theme = Theme.useTheme(); 22a27adc20S猫头猫 const backgroundInfo = Theme.useBackground(); 23a27adc20S猫头猫 24a27adc20S猫头猫 async function onImageClick() { 25a27adc20S猫头猫 try { 26a27adc20S猫头猫 const result = await launchImageLibrary({ 27a27adc20S猫头猫 mediaType: 'photo', 28a27adc20S猫头猫 }); 29a27adc20S猫头猫 const uri = result.assets?.[0].uri; 30a27adc20S猫头猫 if (!uri) { 31a27adc20S猫头猫 return; 32a27adc20S猫头猫 } 33a27adc20S猫头猫 34a27adc20S猫头猫 const bgPath = `${pathConst.dataPath}background${uri.substring( 35a27adc20S猫头猫 uri.lastIndexOf('.'), 36a27adc20S猫头猫 )}`; 37a27adc20S猫头猫 await copyFile(uri, bgPath); 38a27adc20S猫头猫 39a27adc20S猫头猫 const colorsResult = await ImageColors.getColors(uri, { 40a27adc20S猫头猫 fallback: '#ffffff', 41a27adc20S猫头猫 }); 42a27adc20S猫头猫 const colors = { 43a27adc20S猫头猫 primary: 44a27adc20S猫头猫 colorsResult.platform === 'android' 45a27adc20S猫头猫 ? colorsResult.dominant 46a27adc20S猫头猫 : colorsResult.platform === 'ios' 47a27adc20S猫头猫 ? colorsResult.primary 48a27adc20S猫头猫 : colorsResult.vibrant, 49a27adc20S猫头猫 average: 50a27adc20S猫头猫 colorsResult.platform === 'android' 51a27adc20S猫头猫 ? colorsResult.average 52a27adc20S猫头猫 : colorsResult.platform === 'ios' 53a27adc20S猫头猫 ? colorsResult.detail 54a27adc20S猫头猫 : colorsResult.dominant, 55a27adc20S猫头猫 vibrant: 56a27adc20S猫头猫 colorsResult.platform === 'android' 57a27adc20S猫头猫 ? colorsResult.vibrant 58a27adc20S猫头猫 : colorsResult.platform === 'ios' 59a27adc20S猫头猫 ? colorsResult.secondary 60a27adc20S猫头猫 : colorsResult.vibrant, 61a27adc20S猫头猫 }; 62*277c5280S猫头猫 63*277c5280S猫头猫 const primaryGrayRate = grayRate(colors.primary!); 64*277c5280S猫头猫 65*277c5280S猫头猫 let themeColors: Partial<CustomizedColors>; 66*277c5280S猫头猫 if (primaryGrayRate < -0.4) { 67*277c5280S猫头猫 const primaryColor = Color(colors.primary!); 68*277c5280S猫头猫 69*277c5280S猫头猫 console.log( 70*277c5280S猫头猫 colors.primary, 71*277c5280S猫头猫 primaryGrayRate, 72*277c5280S猫头猫 primaryColor 73*277c5280S猫头猫 .whiten(3 * primaryGrayRate) 74*277c5280S猫头猫 .hex() 75*277c5280S猫头猫 .toString(), 76*277c5280S猫头猫 ); 77*277c5280S猫头猫 themeColors = { 78b4a87dd6S猫头猫 appBar: colors.primary, 79*277c5280S猫头猫 primary: primaryColor 80*277c5280S猫头猫 .darken(primaryGrayRate * 5) 81*277c5280S猫头猫 .toString(), 82ab55f125S猫头猫 musicBar: colors.primary, 83*277c5280S猫头猫 card: 'rgba(0,0,0,0.2)', 84*277c5280S猫头猫 tabBar: primaryColor.alpha(0.2).toString(), 85*277c5280S猫头猫 }; 86*277c5280S猫头猫 } else if (primaryGrayRate > 0.4) { 87*277c5280S猫头猫 themeColors = { 88*277c5280S猫头猫 appBar: colors.primary, 89*277c5280S猫头猫 primary: Color(colors.primary) 90*277c5280S猫头猫 .darken(primaryGrayRate * 5) 91*277c5280S猫头猫 .toString(), 92*277c5280S猫头猫 musicBar: colors.primary, 93*277c5280S猫头猫 card: 'rgba(0,0,0,0.2)', 94*277c5280S猫头猫 }; 95*277c5280S猫头猫 } else { 96*277c5280S猫头猫 // const primaryColor = Color(colors.primary!); 97*277c5280S猫头猫 98*277c5280S猫头猫 themeColors = { 99*277c5280S猫头猫 appBar: colors.primary, 100*277c5280S猫头猫 primary: Color(colors.primary) 101*277c5280S猫头猫 .saturate(Math.abs(primaryGrayRate) * 2 + 2) 102*277c5280S猫头猫 .toString(), 103*277c5280S猫头猫 musicBar: colors.primary, 104*277c5280S猫头猫 card: 'rgba(0,0,0,0.2)', 105*277c5280S猫头猫 }; 106*277c5280S猫头猫 } 107*277c5280S猫头猫 108*277c5280S猫头猫 Theme.setTheme('custom', { 109*277c5280S猫头猫 colors: themeColors, 110b4a87dd6S猫头猫 background: { 111b4a87dd6S猫头猫 url: `file://${bgPath}#${Date.now()}`, 112b4a87dd6S猫头猫 }, 113b4a87dd6S猫头猫 }); 114a27adc20S猫头猫 // Config.set('setting.theme.colors', { 115a27adc20S猫头猫 // primary: primaryColor, 116a27adc20S猫头猫 // textHighlight: textHighlight, 117a27adc20S猫头猫 // accent: textHighlight, 118a27adc20S猫头猫 // }); 119a27adc20S猫头猫 } catch (e) { 120a27adc20S猫头猫 console.log(e); 121a27adc20S猫头猫 } 122a27adc20S猫头猫 } 123a27adc20S猫头猫 124a27adc20S猫头猫 return ( 125a27adc20S猫头猫 <ScrollView style={globalStyle.fwflex1}> 126a27adc20S猫头猫 <TouchableOpacity onPress={onImageClick}> 127a27adc20S猫头猫 <Image 128a27adc20S猫头猫 style={styles.image} 129a27adc20S猫头猫 uri={backgroundInfo?.url} 130a27adc20S猫头猫 emptySrc={ImgAsset.addBackground} 131a27adc20S猫头猫 /> 132a27adc20S猫头猫 </TouchableOpacity> 133a27adc20S猫头猫 134a27adc20S猫头猫 <View style={styles.sliderWrapper}> 135a27adc20S猫头猫 <ThemeText>模糊度</ThemeText> 136a27adc20S猫头猫 <Slider 137a27adc20S猫头猫 style={styles.slider} 138b4a87dd6S猫头猫 minimumTrackTintColor={theme.colors.primary} 139b4a87dd6S猫头猫 maximumTrackTintColor={theme.colors.text ?? '#999999'} 140b4a87dd6S猫头猫 thumbTintColor={theme.colors.primary} 141a27adc20S猫头猫 minimumValue={0} 142b4a87dd6S猫头猫 step={1} 143a27adc20S猫头猫 maximumValue={30} 144a27adc20S猫头猫 onSlidingComplete={val => { 145a27adc20S猫头猫 Theme.setBackground({ 146a27adc20S猫头猫 blur: val, 147a27adc20S猫头猫 }); 148a27adc20S猫头猫 }} 149a27adc20S猫头猫 value={backgroundInfo?.blur ?? 20} 150a27adc20S猫头猫 /> 151a27adc20S猫头猫 </View> 152a27adc20S猫头猫 <View style={styles.sliderWrapper}> 153a27adc20S猫头猫 <ThemeText>透明度</ThemeText> 154a27adc20S猫头猫 <Slider 155a27adc20S猫头猫 style={styles.slider} 156b4a87dd6S猫头猫 minimumTrackTintColor={theme.colors.primary} 157b4a87dd6S猫头猫 maximumTrackTintColor={theme.colors.text ?? '#999999'} 158b4a87dd6S猫头猫 thumbTintColor={theme.colors.primary} 159a27adc20S猫头猫 minimumValue={0.3} 160b4a87dd6S猫头猫 step={0.01} 161a27adc20S猫头猫 maximumValue={1} 162a27adc20S猫头猫 onSlidingComplete={val => { 163a27adc20S猫头猫 Theme.setBackground({ 164a27adc20S猫头猫 opacity: val, 165a27adc20S猫头猫 }); 166a27adc20S猫头猫 }} 167a27adc20S猫头猫 value={backgroundInfo?.opacity ?? 0.7} 168a27adc20S猫头猫 /> 169a27adc20S猫头猫 </View> 170a27adc20S猫头猫 <View style={styles.colorsContainer}> 171a27adc20S猫头猫 {Theme.configableColorKey.map(key => ( 172a27adc20S猫头猫 <View key={key} style={styles.colorItem}> 173a27adc20S猫头猫 <ThemeText>{Theme.colorDesc[key]}</ThemeText> 174a27adc20S猫头猫 <TouchableOpacity 175a27adc20S猫头猫 onPress={() => { 176a27adc20S猫头猫 showPanel('ColorPicker', { 177a27adc20S猫头猫 // @ts-ignore 178a27adc20S猫头猫 defaultColor: theme.colors[key], 179b4a87dd6S猫头猫 onSelected(color) { 180b4a87dd6S猫头猫 Theme.setColors({ 181b4a87dd6S猫头猫 [key]: color.hexa().toString(), 182b4a87dd6S猫头猫 }); 183b4a87dd6S猫头猫 }, 184a27adc20S猫头猫 }); 185a27adc20S猫头猫 }} 186a27adc20S猫头猫 style={styles.colorItemBlockContainer}> 187*277c5280S猫头猫 <View style={[styles.colorBlockContainer]}> 188*277c5280S猫头猫 <Image 189*277c5280S猫头猫 resizeMode="repeat" 190*277c5280S猫头猫 emptySrc={ImgAsset.transparentBg} 191*277c5280S猫头猫 style={styles.transparentBg} 192*277c5280S猫头猫 /> 193a27adc20S猫头猫 <View 194a27adc20S猫头猫 style={[ 195a27adc20S猫头猫 { 196a27adc20S猫头猫 /** @ts-ignore */ 197a27adc20S猫头猫 backgroundColor: theme.colors[key], 198a27adc20S猫头猫 }, 199a27adc20S猫头猫 styles.colorBlock, 200a27adc20S猫头猫 ]} 201a27adc20S猫头猫 /> 202*277c5280S猫头猫 </View> 203a27adc20S猫头猫 <ThemeText 204a27adc20S猫头猫 fontSize="subTitle" 205a27adc20S猫头猫 style={styles.colorText}> 206a27adc20S猫头猫 { 207a27adc20S猫头猫 /** @ts-ignore */ 208a27adc20S猫头猫 Color(theme.colors[key]).hexa().toString() 209a27adc20S猫头猫 } 210a27adc20S猫头猫 </ThemeText> 211a27adc20S猫头猫 </TouchableOpacity> 212a27adc20S猫头猫 </View> 213a27adc20S猫头猫 ))} 214a27adc20S猫头猫 </View> 215a27adc20S猫头猫 </ScrollView> 216a27adc20S猫头猫 ); 217a27adc20S猫头猫} 218a27adc20S猫头猫 219a27adc20S猫头猫const styles = StyleSheet.create({ 220a27adc20S猫头猫 container: { 221a27adc20S猫头猫 width: '100%', 222a27adc20S猫头猫 flex: 1, 223a27adc20S猫头猫 }, 224a27adc20S猫头猫 image: { 225a27adc20S猫头猫 marginTop: rpx(36), 226a27adc20S猫头猫 borderRadius: rpx(12), 227a27adc20S猫头猫 width: rpx(460), 228a27adc20S猫头猫 height: rpx(690), 229a27adc20S猫头猫 alignSelf: 'center', 230a27adc20S猫头猫 }, 231a27adc20S猫头猫 sliderWrapper: { 232a27adc20S猫头猫 marginTop: rpx(48), 233a27adc20S猫头猫 width: '100%', 234a27adc20S猫头猫 paddingHorizontal: rpx(24), 235a27adc20S猫头猫 flexDirection: 'row', 236a27adc20S猫头猫 justifyContent: 'space-between', 237a27adc20S猫头猫 alignItems: 'center', 238a27adc20S猫头猫 }, 239a27adc20S猫头猫 slider: { 240a27adc20S猫头猫 flex: 1, 241a27adc20S猫头猫 height: rpx(40), 242a27adc20S猫头猫 }, 243a27adc20S猫头猫 colorsContainer: { 244a27adc20S猫头猫 width: '100%', 245a27adc20S猫头猫 flex: 1, 246a27adc20S猫头猫 flexDirection: 'row', 247a27adc20S猫头猫 flexWrap: 'wrap', 248a27adc20S猫头猫 marginTop: rpx(48), 249a27adc20S猫头猫 paddingHorizontal: rpx(24), 250a27adc20S猫头猫 justifyContent: 'space-between', 251a27adc20S猫头猫 }, 252a27adc20S猫头猫 colorItem: { 253a27adc20S猫头猫 flex: 1, 254a27adc20S猫头猫 flexBasis: '40%', 255a27adc20S猫头猫 marginBottom: rpx(36), 256a27adc20S猫头猫 }, 257*277c5280S猫头猫 colorBlockContainer: { 258a27adc20S猫头猫 width: rpx(76), 259a27adc20S猫头猫 height: rpx(50), 260a27adc20S猫头猫 borderWidth: 1, 261a27adc20S猫头猫 borderStyle: 'solid', 262a27adc20S猫头猫 borderColor: '#ccc', 263a27adc20S猫头猫 }, 264*277c5280S猫头猫 colorBlock: { 265*277c5280S猫头猫 width: '100%', 266*277c5280S猫头猫 height: '100%', 267*277c5280S猫头猫 position: 'absolute', 268*277c5280S猫头猫 top: 0, 269*277c5280S猫头猫 left: 0, 270*277c5280S猫头猫 zIndex: 2, 271*277c5280S猫头猫 }, 272a27adc20S猫头猫 colorItemBlockContainer: { 273a27adc20S猫头猫 marginTop: rpx(18), 274a27adc20S猫头猫 flexDirection: 'row', 275a27adc20S猫头猫 alignItems: 'center', 276a27adc20S猫头猫 }, 277a27adc20S猫头猫 colorText: { 278a27adc20S猫头猫 marginLeft: rpx(8), 279a27adc20S猫头猫 }, 280*277c5280S猫头猫 transparentBg: { 281*277c5280S猫头猫 position: 'absolute', 282*277c5280S猫头猫 zIndex: -1, 283*277c5280S猫头猫 width: '100%', 284*277c5280S猫头猫 height: '100%', 285*277c5280S猫头猫 left: 0, 286*277c5280S猫头猫 top: 0, 287*277c5280S猫头猫 }, 288a27adc20S猫头猫}); 289