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