xref: /MusicFree/src/pages/home/components/homeBody/sheets.tsx (revision f90698e4f487034964a52e83e0bbca6e7a56aaa5)
1*f90698e4S猫头猫import React, {useMemo, useState} from 'react';
2*f90698e4S猫头猫import {StyleSheet, View} from 'react-native';
3*f90698e4S猫头猫import rpx from '@/utils/rpx';
4*f90698e4S猫头猫import ThemeText from '@/components/base/themeText';
5*f90698e4S猫头猫import useColors from '@/hooks/useColors';
6*f90698e4S猫头猫import {TouchableWithoutFeedback} from 'react-native-gesture-handler';
7*f90698e4S猫头猫import MusicSheet from '@/core/musicSheet';
8*f90698e4S猫头猫import {FlashList} from '@shopify/flash-list';
9*f90698e4S猫头猫import ListItem from '@/components/base/listItem';
10*f90698e4S猫头猫import {ROUTE_PATH, useNavigate} from '@/entry/router';
11*f90698e4S猫头猫import {ImgAsset} from '@/constants/assetsConst';
12*f90698e4S猫头猫import {showDialog} from '@/components/dialogs/useDialog';
13*f90698e4S猫头猫import Toast from '@/utils/toast';
14*f90698e4S猫头猫import Empty from '@/components/base/empty';
15*f90698e4S猫头猫import IconButton from '@/components/base/iconButton';
16*f90698e4S猫头猫import {showPanel} from '@/components/panels/usePanel';
17*f90698e4S猫头猫
18*f90698e4S猫头猫export default function Sheets() {
19*f90698e4S猫头猫    const [index, setIndex] = useState(0);
20*f90698e4S猫头猫    const colors = useColors();
21*f90698e4S猫头猫    const navigate = useNavigate();
22*f90698e4S猫头猫
23*f90698e4S猫头猫    const allSheets = MusicSheet.useUserSheets();
24*f90698e4S猫头猫    const staredSheets: IMusic.IMusicSheet = [];
25*f90698e4S猫头猫
26*f90698e4S猫头猫    const selectedTabTextStyle = useMemo(() => {
27*f90698e4S猫头猫        return [
28*f90698e4S猫头猫            styles.selectTabText,
29*f90698e4S猫头猫            {
30*f90698e4S猫头猫                borderBottomColor: colors.primary,
31*f90698e4S猫头猫            },
32*f90698e4S猫头猫        ];
33*f90698e4S猫头猫    }, [colors]);
34*f90698e4S猫头猫
35*f90698e4S猫头猫    return (
36*f90698e4S猫头猫        <>
37*f90698e4S猫头猫            <View style={styles.subTitleContainer}>
38*f90698e4S猫头猫                <TouchableWithoutFeedback
39*f90698e4S猫头猫                    style={styles.tabContainer}
40*f90698e4S猫头猫                    onPress={() => {
41*f90698e4S猫头猫                        setIndex(0);
42*f90698e4S猫头猫                    }}>
43*f90698e4S猫头猫                    <ThemeText
44*f90698e4S猫头猫                        fontSize="title"
45*f90698e4S猫头猫                        style={[
46*f90698e4S猫头猫                            styles.tabText,
47*f90698e4S猫头猫                            index === 0 ? selectedTabTextStyle : null,
48*f90698e4S猫头猫                        ]}>
49*f90698e4S猫头猫                        我的歌单
50*f90698e4S猫头猫                    </ThemeText>
51*f90698e4S猫头猫                    <ThemeText
52*f90698e4S猫头猫                        fontColor="textSecondary"
53*f90698e4S猫头猫                        fontSize="subTitle"
54*f90698e4S猫头猫                        style={styles.tabText}>
55*f90698e4S猫头猫                        {' '}
56*f90698e4S猫头猫                        ({allSheets.length})
57*f90698e4S猫头猫                    </ThemeText>
58*f90698e4S猫头猫                </TouchableWithoutFeedback>
59*f90698e4S猫头猫                <TouchableWithoutFeedback
60*f90698e4S猫头猫                    style={styles.tabContainer}
61*f90698e4S猫头猫                    onPress={() => {
62*f90698e4S猫头猫                        setIndex(1);
63*f90698e4S猫头猫                    }}>
64*f90698e4S猫头猫                    <ThemeText
65*f90698e4S猫头猫                        fontSize="title"
66*f90698e4S猫头猫                        style={[
67*f90698e4S猫头猫                            styles.tabText,
68*f90698e4S猫头猫                            index === 1 ? selectedTabTextStyle : null,
69*f90698e4S猫头猫                        ]}>
70*f90698e4S猫头猫                        收藏歌单
71*f90698e4S猫头猫                    </ThemeText>
72*f90698e4S猫头猫                    <ThemeText
73*f90698e4S猫头猫                        fontColor="textSecondary"
74*f90698e4S猫头猫                        fontSize="subTitle"
75*f90698e4S猫头猫                        style={styles.tabText}>
76*f90698e4S猫头猫                        {' '}
77*f90698e4S猫头猫                        ({staredSheets.length})
78*f90698e4S猫头猫                    </ThemeText>
79*f90698e4S猫头猫                </TouchableWithoutFeedback>
80*f90698e4S猫头猫                <View style={styles.more}>
81*f90698e4S猫头猫                    <IconButton
82*f90698e4S猫头猫                        name="plus"
83*f90698e4S猫头猫                        sizeType="normal"
84*f90698e4S猫头猫                        accessibilityLabel="新建歌单"
85*f90698e4S猫头猫                        onPress={() => {
86*f90698e4S猫头猫                            showPanel('NewMusicSheet');
87*f90698e4S猫头猫                        }}
88*f90698e4S猫头猫                    />
89*f90698e4S猫头猫                </View>
90*f90698e4S猫头猫            </View>
91*f90698e4S猫头猫            <FlashList
92*f90698e4S猫头猫                ListEmptyComponent={<Empty />}
93*f90698e4S猫头猫                data={(index === 0 ? allSheets : staredSheets) ?? []}
94*f90698e4S猫头猫                estimatedItemSize={ListItem.Size.big}
95*f90698e4S猫头猫                renderItem={({item: sheet}) => (
96*f90698e4S猫头猫                    <ListItem
97*f90698e4S猫头猫                        key={`${sheet.id}`}
98*f90698e4S猫头猫                        heightType="big"
99*f90698e4S猫头猫                        withHorizonalPadding
100*f90698e4S猫头猫                        onPress={() => {
101*f90698e4S猫头猫                            navigate(ROUTE_PATH.LOCAL_SHEET_DETAIL, {
102*f90698e4S猫头猫                                id: sheet.id,
103*f90698e4S猫头猫                            });
104*f90698e4S猫头猫                        }}>
105*f90698e4S猫头猫                        <ListItem.ListItemImage
106*f90698e4S猫头猫                            uri={sheet.coverImg}
107*f90698e4S猫头猫                            fallbackImg={ImgAsset.albumDefault}
108*f90698e4S猫头猫                        />
109*f90698e4S猫头猫                        <ListItem.Content
110*f90698e4S猫头猫                            title={sheet.title}
111*f90698e4S猫头猫                            description={`${sheet.musicList.length ?? '-'}首`}
112*f90698e4S猫头猫                        />
113*f90698e4S猫头猫                        <ListItem.ListItemIcon
114*f90698e4S猫头猫                            position="right"
115*f90698e4S猫头猫                            icon="trash-can-outline"
116*f90698e4S猫头猫                            onPress={() => {
117*f90698e4S猫头猫                                showDialog('SimpleDialog', {
118*f90698e4S猫头猫                                    title: '删除歌单',
119*f90698e4S猫头猫                                    content: `确定删除歌单「${sheet.title}」吗?`,
120*f90698e4S猫头猫                                    onOk: async () => {
121*f90698e4S猫头猫                                        await MusicSheet.removeSheet(sheet.id);
122*f90698e4S猫头猫                                        Toast.success('已删除');
123*f90698e4S猫头猫                                    },
124*f90698e4S猫头猫                                });
125*f90698e4S猫头猫                            }}
126*f90698e4S猫头猫                        />
127*f90698e4S猫头猫                    </ListItem>
128*f90698e4S猫头猫                )}
129*f90698e4S猫头猫                nestedScrollEnabled
130*f90698e4S猫头猫            />
131*f90698e4S猫头猫        </>
132*f90698e4S猫头猫    );
133*f90698e4S猫头猫}
134*f90698e4S猫头猫
135*f90698e4S猫头猫const styles = StyleSheet.create({
136*f90698e4S猫头猫    subTitleContainer: {
137*f90698e4S猫头猫        paddingHorizontal: rpx(24),
138*f90698e4S猫头猫        flexDirection: 'row',
139*f90698e4S猫头猫        alignItems: 'flex-start',
140*f90698e4S猫头猫        marginBottom: rpx(12),
141*f90698e4S猫头猫    },
142*f90698e4S猫头猫    subTitleLeft: {
143*f90698e4S猫头猫        flexDirection: 'row',
144*f90698e4S猫头猫    },
145*f90698e4S猫头猫    tabContainer: {
146*f90698e4S猫头猫        flexDirection: 'row',
147*f90698e4S猫头猫        marginRight: rpx(32),
148*f90698e4S猫头猫    },
149*f90698e4S猫头猫
150*f90698e4S猫头猫    tabText: {
151*f90698e4S猫头猫        lineHeight: rpx(64),
152*f90698e4S猫头猫    },
153*f90698e4S猫头猫    selectTabText: {
154*f90698e4S猫头猫        borderBottomWidth: rpx(6),
155*f90698e4S猫头猫        fontWeight: 'bold',
156*f90698e4S猫头猫    },
157*f90698e4S猫头猫    more: {
158*f90698e4S猫头猫        height: rpx(64),
159*f90698e4S猫头猫        marginTop: rpx(3),
160*f90698e4S猫头猫        flexGrow: 1,
161*f90698e4S猫头猫        flexDirection: 'row',
162*f90698e4S猫头猫        justifyContent: 'flex-end',
163*f90698e4S猫头猫    },
164*f90698e4S猫头猫});
165