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'; 17bef6dda8S猫头猫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猫头猫 24*7aed04d4S猫头猫 const allSheets = MusicSheet.useSheets(); 25bef6dda8S猫头猫 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} 96bef6dda8S猫头猫 renderItem={({item: sheet}) => { 97bef6dda8S猫头猫 const isLocalSheet = !( 98bef6dda8S猫头猫 sheet.platform && sheet.platform !== localPluginPlatform 99bef6dda8S猫头猫 ); 100bef6dda8S猫头猫 101bef6dda8S猫头猫 return ( 102f90698e4S猫头猫 <ListItem 103f90698e4S猫头猫 key={`${sheet.id}`} 104f90698e4S猫头猫 heightType="big" 105f90698e4S猫头猫 withHorizonalPadding 106f90698e4S猫头猫 onPress={() => { 107bef6dda8S猫头猫 if (isLocalSheet) { 108f90698e4S猫头猫 navigate(ROUTE_PATH.LOCAL_SHEET_DETAIL, { 109f90698e4S猫头猫 id: sheet.id, 110f90698e4S猫头猫 }); 111bef6dda8S猫头猫 } else { 112bef6dda8S猫头猫 navigate(ROUTE_PATH.PLUGIN_SHEET_DETAIL, { 113bef6dda8S猫头猫 sheetInfo: sheet, 114bef6dda8S猫头猫 }); 115bef6dda8S猫头猫 } 116f90698e4S猫头猫 }}> 117f90698e4S猫头猫 <ListItem.ListItemImage 118bef6dda8S猫头猫 uri={sheet.coverImg ?? sheet.artwork} 119f90698e4S猫头猫 fallbackImg={ImgAsset.albumDefault} 120*7aed04d4S猫头猫 maskIcon={ 121*7aed04d4S猫头猫 sheet.id === MusicSheet.defaultSheet.id 122*7aed04d4S猫头猫 ? 'heart' 123*7aed04d4S猫头猫 : null 124*7aed04d4S猫头猫 } 125f90698e4S猫头猫 /> 126f90698e4S猫头猫 <ListItem.Content 127f90698e4S猫头猫 title={sheet.title} 128bef6dda8S猫头猫 description={ 129bef6dda8S猫头猫 isLocalSheet 130bef6dda8S猫头猫 ? `${sheet.musicList?.length ?? '-'}首` 131bef6dda8S猫头猫 : `${sheet.artist}` 132bef6dda8S猫头猫 } 133f90698e4S猫头猫 /> 134f90698e4S猫头猫 <ListItem.ListItemIcon 135f90698e4S猫头猫 position="right" 136f90698e4S猫头猫 icon="trash-can-outline" 137f90698e4S猫头猫 onPress={() => { 138f90698e4S猫头猫 showDialog('SimpleDialog', { 139f90698e4S猫头猫 title: '删除歌单', 140f90698e4S猫头猫 content: `确定删除歌单「${sheet.title}」吗?`, 141f90698e4S猫头猫 onOk: async () => { 142bef6dda8S猫头猫 if (isLocalSheet) { 143bef6dda8S猫头猫 await MusicSheet.removeSheet( 144bef6dda8S猫头猫 sheet.id, 145bef6dda8S猫头猫 ); 146f90698e4S猫头猫 Toast.success('已删除'); 147bef6dda8S猫头猫 } else { 148bef6dda8S猫头猫 await MusicSheet.unstarMusicSheet( 149bef6dda8S猫头猫 sheet, 150bef6dda8S猫头猫 ); 151bef6dda8S猫头猫 Toast.success('已取消收藏'); 152bef6dda8S猫头猫 } 153f90698e4S猫头猫 }, 154f90698e4S猫头猫 }); 155f90698e4S猫头猫 }} 156f90698e4S猫头猫 /> 157f90698e4S猫头猫 </ListItem> 158bef6dda8S猫头猫 ); 159bef6dda8S猫头猫 }} 160f90698e4S猫头猫 nestedScrollEnabled 161f90698e4S猫头猫 /> 162f90698e4S猫头猫 </> 163f90698e4S猫头猫 ); 164f90698e4S猫头猫} 165f90698e4S猫头猫 166f90698e4S猫头猫const styles = StyleSheet.create({ 167f90698e4S猫头猫 subTitleContainer: { 168f90698e4S猫头猫 paddingHorizontal: rpx(24), 169f90698e4S猫头猫 flexDirection: 'row', 170f90698e4S猫头猫 alignItems: 'flex-start', 171f90698e4S猫头猫 marginBottom: rpx(12), 172f90698e4S猫头猫 }, 173f90698e4S猫头猫 subTitleLeft: { 174f90698e4S猫头猫 flexDirection: 'row', 175f90698e4S猫头猫 }, 176f90698e4S猫头猫 tabContainer: { 177f90698e4S猫头猫 flexDirection: 'row', 178f90698e4S猫头猫 marginRight: rpx(32), 179f90698e4S猫头猫 }, 180f90698e4S猫头猫 181f90698e4S猫头猫 tabText: { 182f90698e4S猫头猫 lineHeight: rpx(64), 183f90698e4S猫头猫 }, 184f90698e4S猫头猫 selectTabText: { 185f90698e4S猫头猫 borderBottomWidth: rpx(6), 186f90698e4S猫头猫 fontWeight: 'bold', 187f90698e4S猫头猫 }, 188f90698e4S猫头猫 more: { 189f90698e4S猫头猫 height: rpx(64), 190f90698e4S猫头猫 marginTop: rpx(3), 191f90698e4S猫头猫 flexGrow: 1, 192f90698e4S猫头猫 flexDirection: 'row', 193f90698e4S猫头猫 justifyContent: 'flex-end', 194f90698e4S猫头猫 }, 195f90698e4S猫头猫}); 196