From 2c3b8a64728246223b4199888782384468fe3f6d Mon Sep 17 00:00:00 2001 From: PhilReact Date: Mon, 16 Jun 2025 09:26:47 +0300 Subject: [PATCH] added disableFetch for usePublish --- .../VideoPlayer/SubtitleManager.tsx | 95 ++++++++++++++++--- src/hooks/useListData.tsx | 4 +- src/hooks/usePublish.tsx | 20 +++- src/hooks/useResources.tsx | 10 +- 4 files changed, 103 insertions(+), 26 deletions(-) diff --git a/src/components/VideoPlayer/SubtitleManager.tsx b/src/components/VideoPlayer/SubtitleManager.tsx index e117032..0f3e258 100644 --- a/src/components/VideoPlayer/SubtitleManager.tsx +++ b/src/components/VideoPlayer/SubtitleManager.tsx @@ -42,6 +42,8 @@ import { useGlobal } from "../../context/GlobalProvider"; import { ENTITY_SUBTITLE, SERVICE_SUBTITLE } from "./video-player-constants"; import ISO6391, { LanguageCode } from "iso-639-1"; import LanguageSelect from "./LanguageSelect"; +import DownloadIcon from '@mui/icons-material/Download'; +import DownloadingIcon from '@mui/icons-material/Downloading'; import { useDropzone, DropzoneRootProps, @@ -58,6 +60,9 @@ import { showLoading, showSuccess, } from "../../utils/toast"; +import { RequestQueueWithPromise } from "../../utils/queue"; + +export const requestQueueGetStatus = new RequestQueueWithPromise(1); export interface SubtitleManagerProps { @@ -138,13 +143,12 @@ const SubtitleManagerComponent = ({ identifier: postIdSearch, name, limit: 0, + includeMetadata: true }; - const res = await lists.fetchResources( - searchParams, - `subs-${videoId}`, - "BASE64" + const res = await lists.fetchResourcesResultsOnly( + searchParams ); - lists.addList(`subs-${videoId}`, res || []); + lists.addList(`subs-${videoId}`, res?.filter((item)=> !!item?.metadata?.title) || []); console.log("resres2", res); } catch (error) { console.error(error); @@ -215,6 +219,9 @@ const SubtitleManagerComponent = ({ name, size: 100, created: Date.now(), + metadata: { + title: sub.language || undefined, + } }, data: data, }); @@ -387,7 +394,7 @@ const SubtitleManagerComponent = ({ disabled={showAll} onClick={() => setShowAll(true)} > - Load all + Load community subs {/* @@ -827,17 +834,75 @@ const PublishSubtitles = ({ }; interface SubProps { - sub: QortalGetMetadata; + sub: QortalMetadata; onSelect: (subtitle: Subtitle) => void; currentSubtrack: null | string; } + const subtitlesStatus: Record = {} + const Subtitle = ({ sub, onSelect, currentSubtrack }: SubProps) => { - const { resource, isLoading, error } = usePublish(2, "JSON", sub); - console.log("resource", resource); + const [selectedToDownload, setSelectedToDownload] = useState(null) + const [isReady, setIsReady] = useState(false) + const { resource, isLoading, error, refetch } = usePublish(2, "JSON", sub, true); + console.log("resource", resource, isLoading); const isSelected = currentSubtrack === resource?.data?.language; + const [isGettingStatus, setIsGettingStatus] = useState(true) + // useEffect(()=> { + // if(resource?.data){ + // console.log('onselectdone') + // onSelect(resource?.data) + // } + // }, [isSelected, resource?.data]) + console.log('isReady', resource?.data) + const getStatus = useCallback(async (service: Service, name: string, identifier: string)=> { + try { + if(subtitlesStatus[`${service}-${name}-${identifier}`]){ + setIsReady(true) + refetch() + return + } + + const response = await requestQueueGetStatus.enqueue( + (): Promise => { + return qortalRequest({ + action: 'GET_QDN_RESOURCE_STATUS', + identifier, + service, + name, + build: false + }) + } + ); + if(response?.status === 'READY'){ + setIsReady(true) + subtitlesStatus[`${service}-${name}-${identifier}`] = true + refetch() + + } + } catch (error) { + + } finally { + setIsGettingStatus(false) + } + }, []) + + useEffect(()=> { + if(sub?.service && sub?.name && sub?.identifier){ + getStatus(sub?.service, sub?.name, sub?.identifier) + } + }, [sub?.identifier, sub?.name, sub?.service]) +console.log('tester', isReady,isLoading,error,resource?.data) + return ( onSelect(isSelected ? null : resource?.data)} + onClick={() => { + if(resource?.data){ + onSelect(isSelected ? null : resource?.data) + + } else { + refetch() + } + }} sx={{ px: 2, py: 1, @@ -848,13 +913,14 @@ const Subtitle = ({ sub, onSelect, currentSubtrack }: SubProps) => { justifyContent: "space-between", }} > - {isLoading && } - {!isLoading && !error && ( + {isGettingStatus && } + {!isGettingStatus && ( <> - {resource?.data?.language} - {isSelected ? : } + {sub?.metadata?.title} + {(!isLoading && !error && !resource?.data) ? : isLoading ? : isSelected ? : } )} + ); }; @@ -865,7 +931,6 @@ interface MySubtitleProps { } const MySubtitle = ({ sub, onDelete }: MySubtitleProps) => { const { resource, isLoading, error } = usePublish(2, "JSON", sub); - console.log("resource", resource); return ( state.lists[listName]?.items) || []; const filterOutDeletedResources = useCacheStore((s) => s.filterOutDeletedResources); const deletedResources = useCacheStore((s) => s.deletedResources); diff --git a/src/hooks/usePublish.tsx b/src/hooks/usePublish.tsx index d7b43e3..fa844ed 100644 --- a/src/hooks/usePublish.tsx +++ b/src/hooks/usePublish.tsx @@ -22,7 +22,7 @@ interface StoredPublish { resource: { qortalMetadata: QortalMetadata; data: any } | null; error: string | null; }> - fetchPublish: (metadataProp: QortalGetMetadata) => Promise<{ + fetchPublish: (metadataProp: QortalGetMetadata, disableFetch?: boolean) => Promise<{ hasResource: boolean | null; resource: { qortalMetadata: QortalMetadata; data: any } | null; error: string | null; @@ -44,7 +44,8 @@ interface StoredPublish { export function usePublish( maxFetchTries: number, returnType: ReturnType, - metadata: QortalGetMetadata + metadata: QortalGetMetadata, + disableFetch?: boolean ): UsePublishWithMetadata; export function usePublish( @@ -57,7 +58,8 @@ interface StoredPublish { export function usePublish( maxFetchTries: number = 3, returnType: ReturnType = "JSON", - metadata?: QortalGetMetadata | null + metadata?: QortalGetMetadata | null, + disableFetch?: boolean ): UsePublishWithMetadata | UsePublishWithoutMetadata { const {auth, appInfo} = useGlobal() const username = auth?.name @@ -92,6 +94,7 @@ interface StoredPublish { const fetchPublish = useCallback( async ( metadataProp: QortalGetMetadata, + disableFetch?: boolean ) => { let hasResource = null; let resource = null; @@ -127,6 +130,13 @@ interface StoredPublish { hasResource: true } } + if(metadata && disableFetch){ + return { + resource: null, + error: null, + hasResource: null + } + } const url = `/arbitrary/resources/search?mode=ALL&service=${metadataProp?.service}&limit=1&includemetadata=true&reverse=true&excludeblocked=true&name=${encodeURIComponent(metadataProp?.name)}&exactmatchnames=true&offset=0&identifier=${encodeURIComponent(metadataProp?.identifier)}`; const responseMetadata = await fetch(url, { method: "GET", @@ -202,9 +212,9 @@ interface StoredPublish { useEffect(() => { if (metadata?.identifier && metadata?.name && metadata?.service) { - fetchPublish(metadata); + fetchPublish(metadata, disableFetch); } - }, [metadata?.identifier, metadata?.service, metadata?.identifier, returnType]); + }, [metadata?.identifier, metadata?.service, metadata?.identifier, returnType, disableFetch]); const refetchData = useCallback(async ()=> { if(!metadata) throw new Error('usePublish is missing metadata') diff --git a/src/hooks/useResources.tsx b/src/hooks/useResources.tsx index a05fb34..80495f2 100644 --- a/src/hooks/useResources.tsx +++ b/src/hooks/useResources.tsx @@ -276,9 +276,10 @@ export const useResources = (retryAttempts: number = 2, maxSize = 5242880) => { let responseData: QortalMetadata[] = []; let filteredResults: QortalMetadata[] = []; let lastCreated = params.before || undefined; - const targetLimit = params.limit ?? 20; - - while (filteredResults.length < targetLimit) { + const targetLimit = params.limit ?? 20; // Use `params.limit` if provided, else default to 20 + const isUnlimited = params.limit === 0; + while (isUnlimited || filteredResults.length < targetLimit) { + const response = await qortalRequest({ action: "SEARCH_QDN_RESOURCES", mode: "ALL", @@ -293,12 +294,13 @@ export const useResources = (retryAttempts: number = 2, maxSize = 5242880) => { const validResults = responseData.filter((item) => item.size !== 32); filteredResults = [...filteredResults, ...validResults]; - if (filteredResults.length >= targetLimit) { + if (filteredResults.length >= targetLimit && !isUnlimited) { filteredResults = filteredResults.slice(0, targetLimit); break; } lastCreated = responseData[responseData.length - 1]?.created; + if (isUnlimited) break; if (!lastCreated) break; }