1*f90698e4S猫头猫import React, {useMemo, useState} from 'react'; 2*f90698e4S猫头猫import {StyleSheet, View} from 'react-native'; 3*f90698e4S猫头猫import rpx from '@/utils/rpx'; 4*f90698e4S猫头猫import ThemeText from '@/components/base/themeText'; 5*f90698e4S猫头猫import useColors from '@/hooks/useColors'; 6*f90698e4S猫头猫import {TouchableWithoutFeedback} from 'react-native-gesture-handler'; 7*f90698e4S猫头猫import MusicSheet from '@/core/musicSheet'; 8*f90698e4S猫头猫import {FlashList} from '@shopify/flash-list'; 9*f90698e4S猫头猫import ListItem from '@/components/base/listItem'; 10*f90698e4S猫头猫import {ROUTE_PATH, useNavigate} from '@/entry/router'; 11*f90698e4S猫头猫import {ImgAsset} from '@/constants/assetsConst'; 12*f90698e4S猫头猫import {showDialog} from '@/components/dialogs/useDialog'; 13*f90698e4S猫头猫import Toast from '@/utils/toast'; 14*f90698e4S猫头猫import Empty from '@/components/base/empty'; 15*f90698e4S猫头猫import IconButton from '@/components/base/iconButton'; 16*f90698e4S猫头猫import {showPanel} from '@/components/panels/usePanel'; 17*f90698e4S猫头猫 18*f90698e4S猫头猫export default function Sheets() { 19*f90698e4S猫头猫 const [index, setIndex] = useState(0); 20*f90698e4S猫头猫 const colors = useColors(); 21*f90698e4S猫头猫 const navigate = useNavigate(); 22*f90698e4S猫头猫 23*f90698e4S猫头猫 const allSheets = MusicSheet.useUserSheets(); 24*f90698e4S猫头猫 const staredSheets: IMusic.IMusicSheet = []; 25*f90698e4S猫头猫 26*f90698e4S猫头猫 const selectedTabTextStyle = useMemo(() => { 27*f90698e4S猫头猫 return [ 28*f90698e4S猫头猫 styles.selectTabText, 29*f90698e4S猫头猫 { 30*f90698e4S猫头猫 borderBottomColor: colors.primary, 31*f90698e4S猫头猫 }, 32*f90698e4S猫头猫 ]; 33*f90698e4S猫头猫 }, [colors]); 34*f90698e4S猫头猫 35*f90698e4S猫头猫 return ( 36*f90698e4S猫头猫 <> 37*f90698e4S猫头猫 <View style={styles.subTitleContainer}> 38*f90698e4S猫头猫 <TouchableWithoutFeedback 39*f90698e4S猫头猫 style={styles.tabContainer} 40*f90698e4S猫头猫 onPress={() => { 41*f90698e4S猫头猫 setIndex(0); 42*f90698e4S猫头猫 }}> 43*f90698e4S猫头猫 <ThemeText 44*f90698e4S猫头猫 fontSize="title" 45*f90698e4S猫头猫 style={[ 46*f90698e4S猫头猫 styles.tabText, 47*f90698e4S猫头猫 index === 0 ? selectedTabTextStyle : null, 48*f90698e4S猫头猫 ]}> 49*f90698e4S猫头猫 我的歌单 50*f90698e4S猫头猫 </ThemeText> 51*f90698e4S猫头猫 <ThemeText 52*f90698e4S猫头猫 fontColor="textSecondary" 53*f90698e4S猫头猫 fontSize="subTitle" 54*f90698e4S猫头猫 style={styles.tabText}> 55*f90698e4S猫头猫 {' '} 56*f90698e4S猫头猫 ({allSheets.length}) 57*f90698e4S猫头猫 </ThemeText> 58*f90698e4S猫头猫 </TouchableWithoutFeedback> 59*f90698e4S猫头猫 <TouchableWithoutFeedback 60*f90698e4S猫头猫 style={styles.tabContainer} 61*f90698e4S猫头猫 onPress={() => { 62*f90698e4S猫头猫 setIndex(1); 63*f90698e4S猫头猫 }}> 64*f90698e4S猫头猫 <ThemeText 65*f90698e4S猫头猫 fontSize="title" 66*f90698e4S猫头猫 style={[ 67*f90698e4S猫头猫 styles.tabText, 68*f90698e4S猫头猫 index === 1 ? selectedTabTextStyle : null, 69*f90698e4S猫头猫 ]}> 70*f90698e4S猫头猫 收藏歌单 71*f90698e4S猫头猫 </ThemeText> 72*f90698e4S猫头猫 <ThemeText 73*f90698e4S猫头猫 fontColor="textSecondary" 74*f90698e4S猫头猫 fontSize="subTitle" 75*f90698e4S猫头猫 style={styles.tabText}> 76*f90698e4S猫头猫 {' '} 77*f90698e4S猫头猫 ({staredSheets.length}) 78*f90698e4S猫头猫 </ThemeText> 79*f90698e4S猫头猫 </TouchableWithoutFeedback> 80*f90698e4S猫头猫 <View style={styles.more}> 81*f90698e4S猫头猫 <IconButton 82*f90698e4S猫头猫 name="plus" 83*f90698e4S猫头猫 sizeType="normal" 84*f90698e4S猫头猫 accessibilityLabel="新建歌单" 85*f90698e4S猫头猫 onPress={() => { 86*f90698e4S猫头猫 showPanel('NewMusicSheet'); 87*f90698e4S猫头猫 }} 88*f90698e4S猫头猫 /> 89*f90698e4S猫头猫 </View> 90*f90698e4S猫头猫 </View> 91*f90698e4S猫头猫 <FlashList 92*f90698e4S猫头猫 ListEmptyComponent={<Empty />} 93*f90698e4S猫头猫 data={(index === 0 ? allSheets : staredSheets) ?? []} 94*f90698e4S猫头猫 estimatedItemSize={ListItem.Size.big} 95*f90698e4S猫头猫 renderItem={({item: sheet}) => ( 96*f90698e4S猫头猫 <ListItem 97*f90698e4S猫头猫 key={`${sheet.id}`} 98*f90698e4S猫头猫 heightType="big" 99*f90698e4S猫头猫 withHorizonalPadding 100*f90698e4S猫头猫 onPress={() => { 101*f90698e4S猫头猫 navigate(ROUTE_PATH.LOCAL_SHEET_DETAIL, { 102*f90698e4S猫头猫 id: sheet.id, 103*f90698e4S猫头猫 }); 104*f90698e4S猫头猫 }}> 105*f90698e4S猫头猫 <ListItem.ListItemImage 106*f90698e4S猫头猫 uri={sheet.coverImg} 107*f90698e4S猫头猫 fallbackImg={ImgAsset.albumDefault} 108*f90698e4S猫头猫 /> 109*f90698e4S猫头猫 <ListItem.Content 110*f90698e4S猫头猫 title={sheet.title} 111*f90698e4S猫头猫 description={`${sheet.musicList.length ?? '-'}首`} 112*f90698e4S猫头猫 /> 113*f90698e4S猫头猫 <ListItem.ListItemIcon 114*f90698e4S猫头猫 position="right" 115*f90698e4S猫头猫 icon="trash-can-outline" 116*f90698e4S猫头猫 onPress={() => { 117*f90698e4S猫头猫 showDialog('SimpleDialog', { 118*f90698e4S猫头猫 title: '删除歌单', 119*f90698e4S猫头猫 content: `确定删除歌单「${sheet.title}」吗?`, 120*f90698e4S猫头猫 onOk: async () => { 121*f90698e4S猫头猫 await MusicSheet.removeSheet(sheet.id); 122*f90698e4S猫头猫 Toast.success('已删除'); 123*f90698e4S猫头猫 }, 124*f90698e4S猫头猫 }); 125*f90698e4S猫头猫 }} 126*f90698e4S猫头猫 /> 127*f90698e4S猫头猫 </ListItem> 128*f90698e4S猫头猫 )} 129*f90698e4S猫头猫 nestedScrollEnabled 130*f90698e4S猫头猫 /> 131*f90698e4S猫头猫 </> 132*f90698e4S猫头猫 ); 133*f90698e4S猫头猫} 134*f90698e4S猫头猫 135*f90698e4S猫头猫const styles = StyleSheet.create({ 136*f90698e4S猫头猫 subTitleContainer: { 137*f90698e4S猫头猫 paddingHorizontal: rpx(24), 138*f90698e4S猫头猫 flexDirection: 'row', 139*f90698e4S猫头猫 alignItems: 'flex-start', 140*f90698e4S猫头猫 marginBottom: rpx(12), 141*f90698e4S猫头猫 }, 142*f90698e4S猫头猫 subTitleLeft: { 143*f90698e4S猫头猫 flexDirection: 'row', 144*f90698e4S猫头猫 }, 145*f90698e4S猫头猫 tabContainer: { 146*f90698e4S猫头猫 flexDirection: 'row', 147*f90698e4S猫头猫 marginRight: rpx(32), 148*f90698e4S猫头猫 }, 149*f90698e4S猫头猫 150*f90698e4S猫头猫 tabText: { 151*f90698e4S猫头猫 lineHeight: rpx(64), 152*f90698e4S猫头猫 }, 153*f90698e4S猫头猫 selectTabText: { 154*f90698e4S猫头猫 borderBottomWidth: rpx(6), 155*f90698e4S猫头猫 fontWeight: 'bold', 156*f90698e4S猫头猫 }, 157*f90698e4S猫头猫 more: { 158*f90698e4S猫头猫 height: rpx(64), 159*f90698e4S猫头猫 marginTop: rpx(3), 160*f90698e4S猫头猫 flexGrow: 1, 161*f90698e4S猫头猫 flexDirection: 'row', 162*f90698e4S猫头猫 justifyContent: 'flex-end', 163*f90698e4S猫头猫 }, 164*f90698e4S猫头猫}); 165