xref: /MusicFree/src/pages/recommendSheets/hooks/useRecommendSheets.ts (revision 410a159129b1f6a7a1f44fde7bfad9a46f91e161)
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        if (
13            (status === 'loading' || status === 'done') &&
14            currentTagRef.current === tag.id
15        ) {
16            return;
17        }
18        if (currentTagRef.current !== tag.id) {
19            setSheets([]);
20            pageRef.current = 0;
21        }
22        pageRef.current++;
23        currentTagRef.current = tag.id;
24        const plugin = PluginManager.getByHash(pluginHash);
25        if (plugin) {
26            setStatus('loading');
27            const res = await plugin.methods?.getRecommendSheetsByTag?.(
28                tag,
29                pageRef.current,
30            );
31            console.log(res.isEnd);
32            if (tag.id === currentTagRef.current) {
33                setSheets(prev => [
34                    ...prev,
35                    ...res.data!.map(item =>
36                        resetMediaItem(item, plugin.instance.platform),
37                    ),
38                ]);
39            }
40
41            if (res.isEnd) {
42                setStatus('done');
43            } else {
44                setStatus('idle');
45            }
46        } else {
47            setStatus('done');
48            setSheets([]);
49        }
50    }, [tag, status]);
51
52    useEffect(() => {
53        query();
54    }, [tag]);
55
56    return [query, sheets, status] as const;
57}
58