xref: /MusicFree/src/pages/recommendSheets/hooks/useRecommendSheets.ts (revision ceb900cd812eb1b086ac040a306ddf325339e920)
1import PluginManager from '@/core/pluginManager';
2import {resetMediaItem} from '@/utils/mediaItem';
3import {useCallback, useEffect, useRef, useState} from 'react';
4
5export default function (pluginHash: string, tag: ICommon.IUnique) {
6    const [sheets, setSheets] = useState<IMusic.IMusicSheetItemBase[]>([]);
7    const [status, setStatus] = useState<'loading' | 'idle' | 'done'>('idle');
8    const currentTagRef = useRef<string>();
9    const pageRef = useRef(0);
10
11    const query = useCallback(async () => {
12        console.log(currentTagRef, tag, pageRef.current, status);
13        if (
14            (status === 'loading' || status === 'done') &&
15            currentTagRef.current === tag.id
16        ) {
17            return;
18        }
19        if (currentTagRef.current !== tag.id) {
20            setSheets([]);
21            pageRef.current = 0;
22        }
23        pageRef.current++;
24        currentTagRef.current = tag.id;
25        const plugin = PluginManager.getByHash(pluginHash);
26        if (plugin) {
27            setStatus('loading');
28            const res = await plugin.methods?.getRecommendSheetsByTag?.(
29                tag,
30                pageRef.current,
31            );
32            console.log(res.isEnd);
33            if (tag.id === currentTagRef.current) {
34                setSheets(prev => [
35                    ...prev,
36                    ...res.data!.map(item =>
37                        resetMediaItem(item, plugin.instance.platform),
38                    ),
39                ]);
40            }
41
42            if (res.isEnd) {
43                setStatus('done');
44            } else {
45                setStatus('idle');
46            }
47        } else {
48            setStatus('done');
49            setSheets([]);
50        }
51    }, [tag, status]);
52
53    useEffect(() => {
54        query();
55    }, [tag]);
56
57    return [query, sheets, status] as const;
58}
59