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 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
</Button>
</Box>
{/* <Box>
@ -827,17 +834,75 @@ const PublishSubtitles = ({
};
interface SubProps {
sub: QortalGetMetadata;
sub: QortalMetadata;
onSelect: (subtitle: Subtitle) => void;
currentSubtrack: null | string;
}
const subtitlesStatus: Record<string, boolean> = {}
const Subtitle = ({ sub, onSelect, currentSubtrack }: SubProps) => {
const { resource, isLoading, error } = usePublish(2, "JSON", sub);
console.log("resource", resource);
const [selectedToDownload, setSelectedToDownload] = useState<null | QortalGetMetadata>(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<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 (
<ButtonBase
onClick={() => 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 && <Skeleton variant="text" sx={{ fontSize: "1.25rem", width: '100%' }} />}
{!isLoading && !error && (
{isGettingStatus && <Skeleton variant="text" sx={{ fontSize: "1.25rem", width: '100%' }} />}
{!isGettingStatus && (
<>
<Typography>{resource?.data?.language}</Typography>
{isSelected ? <CheckIcon /> : <ArrowForwardIosIcon />}
<Typography>{sub?.metadata?.title}</Typography>
{(!isLoading && !error && !resource?.data) ? <DownloadIcon /> : isLoading ? <DownloadingIcon /> : isSelected ? <CheckIcon /> : <ArrowForwardIosIcon />}
</>
)}
</ButtonBase>
);
};
@ -865,7 +931,6 @@ interface MySubtitleProps {
}
const MySubtitle = ({ sub, onDelete }: MySubtitleProps) => {
const { resource, isLoading, error } = usePublish(2, "JSON", sub);
console.log("resource", resource);
return (
<Card
sx={{

View File

@ -1,9 +1,9 @@
import React, { useMemo } from "react";
import { useListStore } from "../state/lists";
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 filterOutDeletedResources = useCacheStore((s) => s.filterOutDeletedResources);
const deletedResources = useCacheStore((s) => s.deletedResources);

View File

@ -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')

View File

@ -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;
}