1import React from 'react'; 2import {StyleSheet, View} from 'react-native'; 3import rpx, {vmax} from '@/utils/rpx'; 4import ListItem from '@/components/base/listItem'; 5import {ImgAsset} from '@/constants/assetsConst'; 6import Toast from '@/utils/toast'; 7 8import {useSafeAreaInsets} from 'react-native-safe-area-context'; 9import PanelBase from '../base/panelBase'; 10import {FlatList} from 'react-native-gesture-handler'; 11import {hidePanel, showPanel} from '../usePanel'; 12import PanelHeader from '../base/panelHeader'; 13import MusicSheet from '@/core/musicSheet'; 14 15interface IAddToMusicSheetProps { 16 musicItem: IMusic.IMusicItem | IMusic.IMusicItem[]; 17 // 如果是新建歌单,可以传入一个默认的名称 18 newSheetDefaultName?: string; 19} 20 21export default function AddToMusicSheet(props: IAddToMusicSheetProps) { 22 const sheets = MusicSheet.useSheetsBase(); 23 24 const {musicItem = [], newSheetDefaultName} = props ?? {}; 25 const safeAreaInsets = useSafeAreaInsets(); 26 27 return ( 28 <PanelBase 29 renderBody={() => ( 30 <> 31 <PanelHeader 32 hideButtons 33 title={`添加到歌单 (${ 34 Array.isArray(musicItem) ? musicItem.length : 1 35 }首) `} 36 /> 37 <View style={style.wrapper}> 38 <FlatList 39 data={sheets ?? []} 40 keyExtractor={sheet => sheet.id} 41 style={{ 42 marginBottom: safeAreaInsets.bottom, 43 }} 44 ListHeaderComponent={ 45 <ListItem 46 withHorizontalPadding 47 key="new" 48 onPress={() => { 49 showPanel('CreateMusicSheet', { 50 defaultName: newSheetDefaultName, 51 async onSheetCreated(sheetId) { 52 try { 53 await MusicSheet.addMusic( 54 sheetId, 55 musicItem, 56 ); 57 Toast.success( 58 '添加到歌单成功', 59 ); 60 } catch { 61 Toast.warn( 62 '添加到歌单失败', 63 ); 64 } 65 }, 66 onCancel() { 67 showPanel('AddToMusicSheet', { 68 musicItem: musicItem, 69 newSheetDefaultName, 70 }); 71 }, 72 }); 73 }}> 74 <ListItem.ListItemImage 75 fallbackImg={ImgAsset.add} 76 /> 77 <ListItem.Content title="新建歌单" /> 78 </ListItem> 79 } 80 renderItem={({item: sheet}) => ( 81 <ListItem 82 withHorizontalPadding 83 key={`${sheet.id}`} 84 onPress={async () => { 85 try { 86 await MusicSheet.addMusic( 87 sheet.id, 88 musicItem, 89 ); 90 hidePanel(); 91 Toast.success('添加到歌单成功'); 92 } catch { 93 Toast.warn('添加到歌单失败'); 94 } 95 }}> 96 <ListItem.ListItemImage 97 uri={sheet.coverImg} 98 fallbackImg={ImgAsset.albumDefault} 99 /> 100 <ListItem.Content 101 title={sheet.title} 102 description={`${ 103 sheet.worksNum ?? '-' 104 }首`} 105 /> 106 </ListItem> 107 )} 108 /> 109 </View> 110 </> 111 )} 112 height={vmax(70)} 113 /> 114 ); 115} 116 117const style = StyleSheet.create({ 118 wrapper: { 119 width: '100%', 120 flex: 1, 121 }, 122 header: { 123 paddingHorizontal: rpx(24), 124 marginTop: rpx(36), 125 marginBottom: rpx(36), 126 }, 127}); 128