import { RequestStateCode } from "@/constants/commonConst";
import PluginManager from "@/core/pluginManager";
import { useEffect, useRef, useState } from "react";
export default function useTopListDetail(
topListItem: IMusic.IMusicSheetItemBase | null,
pluginHash: string,
) {
const [mergedTopListItem, setMergedTopListItem] =
useState<ICommon.WithMusicList<IMusic.IMusicSheetItemBase> | null>(
topListItem,
);
const pageRef = useRef(1);
const [requestState, setRequestState] = useState(RequestStateCode.IDLE);
async function loadMore() {
if (!topListItem) {
return;
}
try {
if (
requestState === RequestStateCode.PENDING_FIRST_PAGE ||
requestState === RequestStateCode.PENDING_REST_PAGE ||
requestState === RequestStateCode.FINISHED
) {
return;
}
if (pageRef.current === 1) {
setRequestState(RequestStateCode.PENDING_FIRST_PAGE);
} else {
setRequestState(RequestStateCode.PENDING_REST_PAGE);
}
const result = await PluginManager.getByHash(
pluginHash,
)?.methods?.getTopListDetail(topListItem, pageRef.current);
if (!result) {
throw new Error();
}
const currentPage = pageRef.current;
setMergedTopListItem(
prev =>
({
...prev,
...result.topListItem,
musicList:
currentPage === 1
? result.musicList ?? []
: [
...(prev?.musicList ?? []),
...(result.musicList ?? []),
],
} as IMusic.IMusicSheetItem),
);
if (result.isEnd === false) {
setRequestState(RequestStateCode.PARTLY_DONE);
} else {
setRequestState(RequestStateCode.FINISHED);
}
pageRef.current++;
} catch {
setRequestState(RequestStateCode.ERROR);
}
}
useEffect(() => {
if (topListItem === null) {
return;
}
loadMore();
}, []);
return [mergedTopListItem, requestState, loadMore] as const;
}