xref: /MusicFree/src/pages/home/components/homeBody/sheets.tsx (revision b4c389f44ac4dad056e7314478fadd2eca82a4b1)
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