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