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猫头猫 247aed04d4S猫头猫 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} 41*95270b83S猫头猫 accessible 42*95270b83S猫头猫 accessibilityLabel={`我的歌单,共${allSheets.length}个`} 43f90698e4S猫头猫 onPress={() => { 44f90698e4S猫头猫 setIndex(0); 45f90698e4S猫头猫 }}> 46f90698e4S猫头猫 <ThemeText 47*95270b83S猫头猫 accessible={false} 48f90698e4S猫头猫 fontSize="title" 49f90698e4S猫头猫 style={[ 50f90698e4S猫头猫 styles.tabText, 51f90698e4S猫头猫 index === 0 ? selectedTabTextStyle : null, 52f90698e4S猫头猫 ]}> 53f90698e4S猫头猫 我的歌单 54f90698e4S猫头猫 </ThemeText> 55f90698e4S猫头猫 <ThemeText 56*95270b83S猫头猫 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} 66*95270b83S猫头猫 accessible 67*95270b83S猫头猫 accessibilityLabel={`收藏歌单,共${staredSheets.length}个`} 68f90698e4S猫头猫 onPress={() => { 69f90698e4S猫头猫 setIndex(1); 70f90698e4S猫头猫 }}> 71f90698e4S猫头猫 <ThemeText 72f90698e4S猫头猫 fontSize="title" 73*95270b83S猫头猫 accessible={false} 74f90698e4S猫头猫 style={[ 75f90698e4S猫头猫 styles.tabText, 76f90698e4S猫头猫 index === 1 ? selectedTabTextStyle : null, 77f90698e4S猫头猫 ]}> 78f90698e4S猫头猫 收藏歌单 79f90698e4S猫头猫 </ThemeText> 80f90698e4S猫头猫 <ThemeText 81f90698e4S猫头猫 fontColor="textSecondary" 82f90698e4S猫头猫 fontSize="subTitle" 83*95270b83S猫头猫 accessible={false} 84f90698e4S猫头猫 style={styles.tabText}> 85f90698e4S猫头猫 {' '} 86f90698e4S猫头猫 ({staredSheets.length}) 87f90698e4S猫头猫 </ThemeText> 88f90698e4S猫头猫 </TouchableWithoutFeedback> 89f90698e4S猫头猫 <View style={styles.more}> 90f90698e4S猫头猫 <IconButton 91f90698e4S猫头猫 name="plus" 92f90698e4S猫头猫 sizeType="normal" 93f90698e4S猫头猫 accessibilityLabel="新建歌单" 94f90698e4S猫头猫 onPress={() => { 95f90698e4S猫头猫 showPanel('NewMusicSheet'); 96f90698e4S猫头猫 }} 97f90698e4S猫头猫 /> 98f90698e4S猫头猫 </View> 99f90698e4S猫头猫 </View> 100f90698e4S猫头猫 <FlashList 101f90698e4S猫头猫 ListEmptyComponent={<Empty />} 102f90698e4S猫头猫 data={(index === 0 ? allSheets : staredSheets) ?? []} 103f90698e4S猫头猫 estimatedItemSize={ListItem.Size.big} 104bef6dda8S猫头猫 renderItem={({item: sheet}) => { 105bef6dda8S猫头猫 const isLocalSheet = !( 106bef6dda8S猫头猫 sheet.platform && sheet.platform !== localPluginPlatform 107bef6dda8S猫头猫 ); 108bef6dda8S猫头猫 109bef6dda8S猫头猫 return ( 110f90698e4S猫头猫 <ListItem 111f90698e4S猫头猫 key={`${sheet.id}`} 112f90698e4S猫头猫 heightType="big" 113f90698e4S猫头猫 withHorizonalPadding 114f90698e4S猫头猫 onPress={() => { 115bef6dda8S猫头猫 if (isLocalSheet) { 116f90698e4S猫头猫 navigate(ROUTE_PATH.LOCAL_SHEET_DETAIL, { 117f90698e4S猫头猫 id: sheet.id, 118f90698e4S猫头猫 }); 119bef6dda8S猫头猫 } else { 120bef6dda8S猫头猫 navigate(ROUTE_PATH.PLUGIN_SHEET_DETAIL, { 121bef6dda8S猫头猫 sheetInfo: sheet, 122bef6dda8S猫头猫 }); 123bef6dda8S猫头猫 } 124f90698e4S猫头猫 }}> 125f90698e4S猫头猫 <ListItem.ListItemImage 126bef6dda8S猫头猫 uri={sheet.coverImg ?? sheet.artwork} 127f90698e4S猫头猫 fallbackImg={ImgAsset.albumDefault} 1287aed04d4S猫头猫 maskIcon={ 1297aed04d4S猫头猫 sheet.id === MusicSheet.defaultSheet.id 1307aed04d4S猫头猫 ? 'heart' 1317aed04d4S猫头猫 : null 1327aed04d4S猫头猫 } 133f90698e4S猫头猫 /> 134f90698e4S猫头猫 <ListItem.Content 135f90698e4S猫头猫 title={sheet.title} 136bef6dda8S猫头猫 description={ 137bef6dda8S猫头猫 isLocalSheet 138bef6dda8S猫头猫 ? `${sheet.musicList?.length ?? '-'}首` 139bef6dda8S猫头猫 : `${sheet.artist}` 140bef6dda8S猫头猫 } 141f90698e4S猫头猫 /> 142f90698e4S猫头猫 <ListItem.ListItemIcon 143f90698e4S猫头猫 position="right" 144f90698e4S猫头猫 icon="trash-can-outline" 145f90698e4S猫头猫 onPress={() => { 146f90698e4S猫头猫 showDialog('SimpleDialog', { 147f90698e4S猫头猫 title: '删除歌单', 148f90698e4S猫头猫 content: `确定删除歌单「${sheet.title}」吗?`, 149f90698e4S猫头猫 onOk: async () => { 150bef6dda8S猫头猫 if (isLocalSheet) { 151bef6dda8S猫头猫 await MusicSheet.removeSheet( 152bef6dda8S猫头猫 sheet.id, 153bef6dda8S猫头猫 ); 154f90698e4S猫头猫 Toast.success('已删除'); 155bef6dda8S猫头猫 } else { 156bef6dda8S猫头猫 await MusicSheet.unstarMusicSheet( 157bef6dda8S猫头猫 sheet, 158bef6dda8S猫头猫 ); 159bef6dda8S猫头猫 Toast.success('已取消收藏'); 160bef6dda8S猫头猫 } 161f90698e4S猫头猫 }, 162f90698e4S猫头猫 }); 163f90698e4S猫头猫 }} 164f90698e4S猫头猫 /> 165f90698e4S猫头猫 </ListItem> 166bef6dda8S猫头猫 ); 167bef6dda8S猫头猫 }} 168f90698e4S猫头猫 nestedScrollEnabled 169f90698e4S猫头猫 /> 170f90698e4S猫头猫 </> 171f90698e4S猫头猫 ); 172f90698e4S猫头猫} 173f90698e4S猫头猫 174f90698e4S猫头猫const styles = StyleSheet.create({ 175f90698e4S猫头猫 subTitleContainer: { 176f90698e4S猫头猫 paddingHorizontal: rpx(24), 177f90698e4S猫头猫 flexDirection: 'row', 178f90698e4S猫头猫 alignItems: 'flex-start', 179f90698e4S猫头猫 marginBottom: rpx(12), 180f90698e4S猫头猫 }, 181f90698e4S猫头猫 subTitleLeft: { 182f90698e4S猫头猫 flexDirection: 'row', 183f90698e4S猫头猫 }, 184f90698e4S猫头猫 tabContainer: { 185f90698e4S猫头猫 flexDirection: 'row', 186f90698e4S猫头猫 marginRight: rpx(32), 187f90698e4S猫头猫 }, 188f90698e4S猫头猫 189f90698e4S猫头猫 tabText: { 190f90698e4S猫头猫 lineHeight: rpx(64), 191f90698e4S猫头猫 }, 192f90698e4S猫头猫 selectTabText: { 193f90698e4S猫头猫 borderBottomWidth: rpx(6), 194f90698e4S猫头猫 fontWeight: 'bold', 195f90698e4S猫头猫 }, 196f90698e4S猫头猫 more: { 197f90698e4S猫头猫 height: rpx(64), 198f90698e4S猫头猫 marginTop: rpx(3), 199f90698e4S猫头猫 flexGrow: 1, 200f90698e4S猫头猫 flexDirection: 'row', 201f90698e4S猫头猫 justifyContent: 'flex-end', 202f90698e4S猫头猫 }, 203f90698e4S猫头猫}); 204