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 {FlashList} from '@shopify/flash-list'; 8f90698e4S猫头猫import ListItem from '@/components/base/listItem'; 9*b4c389f4Smaotoumaoimport {ROUTE_PATH, useNavigate} from '@/core/router'; 10f90698e4S猫头猫import {ImgAsset} from '@/constants/assetsConst'; 11f90698e4S猫头猫import {showDialog} from '@/components/dialogs/useDialog'; 12f90698e4S猫头猫import Toast from '@/utils/toast'; 13f90698e4S猫头猫import Empty from '@/components/base/empty'; 14f90698e4S猫头猫import IconButton from '@/components/base/iconButton'; 15f90698e4S猫头猫import {showPanel} from '@/components/panels/usePanel'; 16bef6dda8S猫头猫import {localPluginPlatform} from '@/constants/commonConst'; 17740e3947S猫头猫import MusicSheet from '@/core/musicSheet'; 18f90698e4S猫头猫 19f90698e4S猫头猫export default function Sheets() { 20f90698e4S猫头猫 const [index, setIndex] = useState(0); 21f90698e4S猫头猫 const colors = useColors(); 22f90698e4S猫头猫 const navigate = useNavigate(); 23f90698e4S猫头猫 24740e3947S猫头猫 const allSheets = MusicSheet.useSheetsBase(); 25740e3947S猫头猫 const staredSheets = MusicSheet.useStarredSheets(); 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} 4195270b83S猫头猫 accessible 4295270b83S猫头猫 accessibilityLabel={`我的歌单,共${allSheets.length}个`} 43f90698e4S猫头猫 onPress={() => { 44f90698e4S猫头猫 setIndex(0); 45f90698e4S猫头猫 }}> 46f90698e4S猫头猫 <ThemeText 4795270b83S猫头猫 accessible={false} 48f90698e4S猫头猫 fontSize="title" 49f90698e4S猫头猫 style={[ 50f90698e4S猫头猫 styles.tabText, 51f90698e4S猫头猫 index === 0 ? selectedTabTextStyle : null, 52f90698e4S猫头猫 ]}> 53f90698e4S猫头猫 我的歌单 54f90698e4S猫头猫 </ThemeText> 55f90698e4S猫头猫 <ThemeText 5695270b83S猫头猫 accessible={false} 57f90698e4S猫头猫 fontColor="textSecondary" 58f90698e4S猫头猫 fontSize="subTitle" 59f90698e4S猫头猫 style={styles.tabText}> 60f90698e4S猫头猫 {' '} 61f90698e4S猫头猫 ({allSheets.length}) 62f90698e4S猫头猫 </ThemeText> 63f90698e4S猫头猫 </TouchableWithoutFeedback> 64f90698e4S猫头猫 <TouchableWithoutFeedback 65f90698e4S猫头猫 style={styles.tabContainer} 6695270b83S猫头猫 accessible 6795270b83S猫头猫 accessibilityLabel={`收藏歌单,共${staredSheets.length}个`} 68f90698e4S猫头猫 onPress={() => { 69f90698e4S猫头猫 setIndex(1); 70f90698e4S猫头猫 }}> 71f90698e4S猫头猫 <ThemeText 72f90698e4S猫头猫 fontSize="title" 7395270b83S猫头猫 accessible={false} 74f90698e4S猫头猫 style={[ 75f90698e4S猫头猫 styles.tabText, 76f90698e4S猫头猫 index === 1 ? selectedTabTextStyle : null, 77f90698e4S猫头猫 ]}> 78f90698e4S猫头猫 收藏歌单 79f90698e4S猫头猫 </ThemeText> 80f90698e4S猫头猫 <ThemeText 81f90698e4S猫头猫 fontColor="textSecondary" 82f90698e4S猫头猫 fontSize="subTitle" 8395270b83S猫头猫 accessible={false} 84f90698e4S猫头猫 style={styles.tabText}> 85f90698e4S猫头猫 {' '} 86f90698e4S猫头猫 ({staredSheets.length}) 87f90698e4S猫头猫 </ThemeText> 88f90698e4S猫头猫 </TouchableWithoutFeedback> 89f90698e4S猫头猫 <View style={styles.more}> 90f90698e4S猫头猫 <IconButton 91f90698e4S猫头猫 name="plus" 9264394008S猫头猫 style={styles.newSheetButton} 93f90698e4S猫头猫 sizeType="normal" 94f90698e4S猫头猫 accessibilityLabel="新建歌单" 95f90698e4S猫头猫 onPress={() => { 96740e3947S猫头猫 showPanel('CreateMusicSheet'); 97f90698e4S猫头猫 }} 98f90698e4S猫头猫 /> 9964394008S猫头猫 <IconButton 1005589cdf3S猫头猫 name="inbox-arrow-down" 10164394008S猫头猫 sizeType="normal" 10264394008S猫头猫 accessibilityLabel="导入歌单" 10364394008S猫头猫 onPress={() => { 10464394008S猫头猫 showPanel('ImportMusicSheet'); 10564394008S猫头猫 }} 10664394008S猫头猫 /> 107f90698e4S猫头猫 </View> 108f90698e4S猫头猫 </View> 109f90698e4S猫头猫 <FlashList 110f90698e4S猫头猫 ListEmptyComponent={<Empty />} 111f90698e4S猫头猫 data={(index === 0 ? allSheets : staredSheets) ?? []} 112f90698e4S猫头猫 estimatedItemSize={ListItem.Size.big} 113bef6dda8S猫头猫 renderItem={({item: sheet}) => { 114bef6dda8S猫头猫 const isLocalSheet = !( 115bef6dda8S猫头猫 sheet.platform && sheet.platform !== localPluginPlatform 116bef6dda8S猫头猫 ); 117bef6dda8S猫头猫 118bef6dda8S猫头猫 return ( 119f90698e4S猫头猫 <ListItem 120f90698e4S猫头猫 key={`${sheet.id}`} 121f90698e4S猫头猫 heightType="big" 1225589cdf3S猫头猫 withHorizontalPadding 123f90698e4S猫头猫 onPress={() => { 124bef6dda8S猫头猫 if (isLocalSheet) { 125f90698e4S猫头猫 navigate(ROUTE_PATH.LOCAL_SHEET_DETAIL, { 126f90698e4S猫头猫 id: sheet.id, 127f90698e4S猫头猫 }); 128bef6dda8S猫头猫 } else { 129bef6dda8S猫头猫 navigate(ROUTE_PATH.PLUGIN_SHEET_DETAIL, { 130bef6dda8S猫头猫 sheetInfo: sheet, 131bef6dda8S猫头猫 }); 132bef6dda8S猫头猫 } 133f90698e4S猫头猫 }}> 134f90698e4S猫头猫 <ListItem.ListItemImage 135bef6dda8S猫头猫 uri={sheet.coverImg ?? sheet.artwork} 136f90698e4S猫头猫 fallbackImg={ImgAsset.albumDefault} 1377aed04d4S猫头猫 maskIcon={ 1387aed04d4S猫头猫 sheet.id === MusicSheet.defaultSheet.id 1397aed04d4S猫头猫 ? 'heart' 1407aed04d4S猫头猫 : null 1417aed04d4S猫头猫 } 142f90698e4S猫头猫 /> 143f90698e4S猫头猫 <ListItem.Content 144f90698e4S猫头猫 title={sheet.title} 145bef6dda8S猫头猫 description={ 146bef6dda8S猫头猫 isLocalSheet 147740e3947S猫头猫 ? `${sheet.worksNum}首` 148bef6dda8S猫头猫 : `${sheet.artist}` 149bef6dda8S猫头猫 } 150f90698e4S猫头猫 /> 1519cfce1b6S猫头猫 {sheet.id !== MusicSheet.defaultSheet.id ? ( 152f90698e4S猫头猫 <ListItem.ListItemIcon 153f90698e4S猫头猫 position="right" 1545589cdf3S猫头猫 icon="trash-outline" 155f90698e4S猫头猫 onPress={() => { 156f90698e4S猫头猫 showDialog('SimpleDialog', { 157f90698e4S猫头猫 title: '删除歌单', 158f90698e4S猫头猫 content: `确定删除歌单「${sheet.title}」吗?`, 159f90698e4S猫头猫 onOk: async () => { 160bef6dda8S猫头猫 if (isLocalSheet) { 161bef6dda8S猫头猫 await MusicSheet.removeSheet( 162bef6dda8S猫头猫 sheet.id, 163bef6dda8S猫头猫 ); 164f90698e4S猫头猫 Toast.success('已删除'); 165bef6dda8S猫头猫 } else { 166bef6dda8S猫头猫 await MusicSheet.unstarMusicSheet( 167bef6dda8S猫头猫 sheet, 168bef6dda8S猫头猫 ); 169bef6dda8S猫头猫 Toast.success('已取消收藏'); 170bef6dda8S猫头猫 } 171f90698e4S猫头猫 }, 172f90698e4S猫头猫 }); 173f90698e4S猫头猫 }} 174f90698e4S猫头猫 /> 1759cfce1b6S猫头猫 ) : null} 176f90698e4S猫头猫 </ListItem> 177bef6dda8S猫头猫 ); 178bef6dda8S猫头猫 }} 179f90698e4S猫头猫 nestedScrollEnabled 180f90698e4S猫头猫 /> 181f90698e4S猫头猫 </> 182f90698e4S猫头猫 ); 183f90698e4S猫头猫} 184f90698e4S猫头猫 185f90698e4S猫头猫const styles = StyleSheet.create({ 186f90698e4S猫头猫 subTitleContainer: { 187f90698e4S猫头猫 paddingHorizontal: rpx(24), 188f90698e4S猫头猫 flexDirection: 'row', 189f90698e4S猫头猫 alignItems: 'flex-start', 190f90698e4S猫头猫 marginBottom: rpx(12), 191f90698e4S猫头猫 }, 192f90698e4S猫头猫 subTitleLeft: { 193f90698e4S猫头猫 flexDirection: 'row', 194f90698e4S猫头猫 }, 195f90698e4S猫头猫 tabContainer: { 196f90698e4S猫头猫 flexDirection: 'row', 197f90698e4S猫头猫 marginRight: rpx(32), 198f90698e4S猫头猫 }, 199f90698e4S猫头猫 200f90698e4S猫头猫 tabText: { 201f90698e4S猫头猫 lineHeight: rpx(64), 202f90698e4S猫头猫 }, 203f90698e4S猫头猫 selectTabText: { 204f90698e4S猫头猫 borderBottomWidth: rpx(6), 205f90698e4S猫头猫 fontWeight: 'bold', 206f90698e4S猫头猫 }, 207f90698e4S猫头猫 more: { 208f90698e4S猫头猫 height: rpx(64), 209f90698e4S猫头猫 marginTop: rpx(3), 210f90698e4S猫头猫 flexGrow: 1, 211f90698e4S猫头猫 flexDirection: 'row', 212f90698e4S猫头猫 justifyContent: 'flex-end', 213f90698e4S猫头猫 }, 21464394008S猫头猫 newSheetButton: { 21564394008S猫头猫 marginRight: rpx(24), 21664394008S猫头猫 }, 217f90698e4S猫头猫}); 218