added disableFetch for usePublish

This commit is contained in:
PhilReact 2025-06-16 09:26:47 +03:00
parent 945f5b7d83
commit 2c3b8a6472
4 changed files with 103 additions and 26 deletions

View File

@ -42,6 +42,8 @@ import { useGlobal } from "../../context/GlobalProvider";
import { ENTITY_SUBTITLE, SERVICE_SUBTITLE } from "./video-player-constants"; import { ENTITY_SUBTITLE, SERVICE_SUBTITLE } from "./video-player-constants";
import ISO6391, { LanguageCode } from "iso-639-1"; import ISO6391, { LanguageCode } from "iso-639-1";
import LanguageSelect from "./LanguageSelect"; import LanguageSelect from "./LanguageSelect";
import DownloadIcon from '@mui/icons-material/Download';
import DownloadingIcon from '@mui/icons-material/Downloading';
import { import {
useDropzone, useDropzone,
DropzoneRootProps, DropzoneRootProps,
@ -58,6 +60,9 @@ import {
showLoading, showLoading,
showSuccess, showSuccess,
} from "../../utils/toast"; } from "../../utils/toast";
import { RequestQueueWithPromise } from "../../utils/queue";
export const requestQueueGetStatus = new RequestQueueWithPromise(1);
export interface SubtitleManagerProps { export interface SubtitleManagerProps {
@ -138,13 +143,12 @@ const SubtitleManagerComponent = ({
identifier: postIdSearch, identifier: postIdSearch,
name, name,
limit: 0, limit: 0,
includeMetadata: true
}; };
const res = await lists.fetchResources( const res = await lists.fetchResourcesResultsOnly(
searchParams, searchParams
`subs-${videoId}`,
"BASE64"
); );
lists.addList(`subs-${videoId}`, res || []); lists.addList(`subs-${videoId}`, res?.filter((item)=> !!item?.metadata?.title) || []);
console.log("resres2", res); console.log("resres2", res);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
@ -215,6 +219,9 @@ const SubtitleManagerComponent = ({
name, name,
size: 100, size: 100,
created: Date.now(), created: Date.now(),
metadata: {
title: sub.language || undefined,
}
}, },
data: data, data: data,
}); });
@ -387,7 +394,7 @@ const SubtitleManagerComponent = ({
disabled={showAll} disabled={showAll}
onClick={() => setShowAll(true)} onClick={() => setShowAll(true)}
> >
Load all Load community subs
</Button> </Button>
</Box> </Box>
{/* <Box> {/* <Box>
@ -827,17 +834,75 @@ const PublishSubtitles = ({
}; };
interface SubProps { interface SubProps {
sub: QortalGetMetadata; sub: QortalMetadata;
onSelect: (subtitle: Subtitle) => void; onSelect: (subtitle: Subtitle) => void;
currentSubtrack: null | string; currentSubtrack: null | string;
} }
const subtitlesStatus: Record<string, boolean> = {}
const Subtitle = ({ sub, onSelect, currentSubtrack }: SubProps) => { const Subtitle = ({ sub, onSelect, currentSubtrack }: SubProps) => {
const { resource, isLoading, error } = usePublish(2, "JSON", sub); const [selectedToDownload, setSelectedToDownload] = useState<null | QortalGetMetadata>(null)
console.log("resource", resource); 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 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<string> => {
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 ( return (
<ButtonBase <ButtonBase
onClick={() => onSelect(isSelected ? null : resource?.data)} onClick={() => {
if(resource?.data){
onSelect(isSelected ? null : resource?.data)
} else {
refetch()
}
}}
sx={{ sx={{
px: 2, px: 2,
py: 1, py: 1,
@ -848,13 +913,14 @@ const Subtitle = ({ sub, onSelect, currentSubtrack }: SubProps) => {
justifyContent: "space-between", justifyContent: "space-between",
}} }}
> >
{isLoading && <Skeleton variant="text" sx={{ fontSize: "1.25rem", width: '100%' }} />} {isGettingStatus && <Skeleton variant="text" sx={{ fontSize: "1.25rem", width: '100%' }} />}
{!isLoading && !error && ( {!isGettingStatus && (
<> <>
<Typography>{resource?.data?.language}</Typography> <Typography>{sub?.metadata?.title}</Typography>
{isSelected ? <CheckIcon /> : <ArrowForwardIosIcon />} {(!isLoading && !error && !resource?.data) ? <DownloadIcon /> : isLoading ? <DownloadingIcon /> : isSelected ? <CheckIcon /> : <ArrowForwardIosIcon />}
</> </>
)} )}
</ButtonBase> </ButtonBase>
); );
}; };
@ -865,7 +931,6 @@ interface MySubtitleProps {
} }
const MySubtitle = ({ sub, onDelete }: MySubtitleProps) => { const MySubtitle = ({ sub, onDelete }: MySubtitleProps) => {
const { resource, isLoading, error } = usePublish(2, "JSON", sub); const { resource, isLoading, error } = usePublish(2, "JSON", sub);
console.log("resource", resource);
return ( return (
<Card <Card
sx={{ sx={{

View File

@ -1,9 +1,9 @@
import React, { useMemo } from "react"; import React, { useMemo } from "react";
import { useListStore } from "../state/lists"; import { useListStore } from "../state/lists";
import { useCacheStore } from "../state/cache"; // Assuming you export getResourceCache import { useCacheStore } from "../state/cache"; // Assuming you export getResourceCache
import { QortalGetMetadata } from "../types/interfaces/resources"; import { QortalMetadata } from "../types/interfaces/resources";
export function useListReturn(listName: string): QortalGetMetadata[] { export function useListReturn(listName: string): QortalMetadata[] {
const list = useListStore((state) => state.lists[listName]?.items) || []; const list = useListStore((state) => state.lists[listName]?.items) || [];
const filterOutDeletedResources = useCacheStore((s) => s.filterOutDeletedResources); const filterOutDeletedResources = useCacheStore((s) => s.filterOutDeletedResources);
const deletedResources = useCacheStore((s) => s.deletedResources); const deletedResources = useCacheStore((s) => s.deletedResources);

View File

@ -22,7 +22,7 @@ interface StoredPublish {
resource: { qortalMetadata: QortalMetadata; data: any } | null; resource: { qortalMetadata: QortalMetadata; data: any } | null;
error: string | null; error: string | null;
}> }>
fetchPublish: (metadataProp: QortalGetMetadata) => Promise<{ fetchPublish: (metadataProp: QortalGetMetadata, disableFetch?: boolean) => Promise<{
hasResource: boolean | null; hasResource: boolean | null;
resource: { qortalMetadata: QortalMetadata; data: any } | null; resource: { qortalMetadata: QortalMetadata; data: any } | null;
error: string | null; error: string | null;
@ -44,7 +44,8 @@ interface StoredPublish {
export function usePublish( export function usePublish(
maxFetchTries: number, maxFetchTries: number,
returnType: ReturnType, returnType: ReturnType,
metadata: QortalGetMetadata metadata: QortalGetMetadata,
disableFetch?: boolean
): UsePublishWithMetadata; ): UsePublishWithMetadata;
export function usePublish( export function usePublish(
@ -57,7 +58,8 @@ interface StoredPublish {
export function usePublish( export function usePublish(
maxFetchTries: number = 3, maxFetchTries: number = 3,
returnType: ReturnType = "JSON", returnType: ReturnType = "JSON",
metadata?: QortalGetMetadata | null metadata?: QortalGetMetadata | null,
disableFetch?: boolean
): UsePublishWithMetadata | UsePublishWithoutMetadata { ): UsePublishWithMetadata | UsePublishWithoutMetadata {
const {auth, appInfo} = useGlobal() const {auth, appInfo} = useGlobal()
const username = auth?.name const username = auth?.name
@ -92,6 +94,7 @@ interface StoredPublish {
const fetchPublish = useCallback( const fetchPublish = useCallback(
async ( async (
metadataProp: QortalGetMetadata, metadataProp: QortalGetMetadata,
disableFetch?: boolean
) => { ) => {
let hasResource = null; let hasResource = null;
let resource = null; let resource = null;
@ -127,6 +130,13 @@ interface StoredPublish {
hasResource: true 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 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, { const responseMetadata = await fetch(url, {
method: "GET", method: "GET",
@ -202,9 +212,9 @@ interface StoredPublish {
useEffect(() => { useEffect(() => {
if (metadata?.identifier && metadata?.name && metadata?.service) { 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 ()=> { const refetchData = useCallback(async ()=> {
if(!metadata) throw new Error('usePublish is missing metadata') if(!metadata) throw new Error('usePublish is missing metadata')

View File

@ -276,9 +276,10 @@ export const useResources = (retryAttempts: number = 2, maxSize = 5242880) => {
let responseData: QortalMetadata[] = []; let responseData: QortalMetadata[] = [];
let filteredResults: QortalMetadata[] = []; let filteredResults: QortalMetadata[] = [];
let lastCreated = params.before || undefined; let lastCreated = params.before || undefined;
const targetLimit = params.limit ?? 20; const targetLimit = params.limit ?? 20; // Use `params.limit` if provided, else default to 20
const isUnlimited = params.limit === 0;
while (filteredResults.length < targetLimit) { while (isUnlimited || filteredResults.length < targetLimit) {
const response = await qortalRequest({ const response = await qortalRequest({
action: "SEARCH_QDN_RESOURCES", action: "SEARCH_QDN_RESOURCES",
mode: "ALL", mode: "ALL",
@ -293,12 +294,13 @@ export const useResources = (retryAttempts: number = 2, maxSize = 5242880) => {
const validResults = responseData.filter((item) => item.size !== 32); const validResults = responseData.filter((item) => item.size !== 32);
filteredResults = [...filteredResults, ...validResults]; filteredResults = [...filteredResults, ...validResults];
if (filteredResults.length >= targetLimit) { if (filteredResults.length >= targetLimit && !isUnlimited) {
filteredResults = filteredResults.slice(0, targetLimit); filteredResults = filteredResults.slice(0, targetLimit);
break; break;
} }
lastCreated = responseData[responseData.length - 1]?.created; lastCreated = responseData[responseData.length - 1]?.created;
if (isUnlimited) break;
if (!lastCreated) break; if (!lastCreated) break;
} }