mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-01-15 15:48:05 +00:00
Some checks failed
🤖 Android APK Build (Phone + TV) / 🏗️ Build Android APK (phone) (push) Has been cancelled
🤖 Android APK Build (Phone + TV) / 🏗️ Build Android APK (tv) (push) Has been cancelled
🤖 iOS IPA Build (Phone + TV) / 🏗️ Build iOS IPA (phone) (push) Has been cancelled
🔒 Lockfile Consistency Check / 🔍 Check bun.lock and package.json consistency (push) Has been cancelled
🛡️ CodeQL Analysis / 🔎 Analyze with CodeQL (actions) (push) Has been cancelled
🛡️ CodeQL Analysis / 🔎 Analyze with CodeQL (javascript-typescript) (push) Has been cancelled
🏷️🔀Merge Conflict Labeler / 🏷️ Labeling Merge Conflicts (push) Has been cancelled
🚦 Security & Quality Gate / 📝 Validate PR Title (push) Has been cancelled
🚦 Security & Quality Gate / 🔍 Vulnerable Dependencies (push) Has been cancelled
🚦 Security & Quality Gate / 🚑 Expo Doctor Check (push) Has been cancelled
🚦 Security & Quality Gate / 🔍 Lint & Test (check) (push) Has been cancelled
🚦 Security & Quality Gate / 🔍 Lint & Test (format) (push) Has been cancelled
🚦 Security & Quality Gate / 🔍 Lint & Test (lint) (push) Has been cancelled
🚦 Security & Quality Gate / 🔍 Lint & Test (typecheck) (push) Has been cancelled
🕒 Handle Stale Issues / 🗑️ Cleanup Stale Issues (push) Has been cancelled
94 lines
2.6 KiB
TypeScript
94 lines
2.6 KiB
TypeScript
import { useQuery } from "@tanstack/react-query";
|
|
import type React from "react";
|
|
import type { ViewProps } from "react-native";
|
|
import Slide, { type SlideProps } from "@/components/jellyseerr/discover/Slide";
|
|
import JellyseerrPoster from "@/components/posters/JellyseerrPoster";
|
|
import { useJellyseerr } from "@/hooks/useJellyseerr";
|
|
import { MediaType } from "@/utils/jellyseerr/server/constants/media";
|
|
import type MediaRequest from "@/utils/jellyseerr/server/entity/MediaRequest";
|
|
import type { NonFunctionProperties } from "@/utils/jellyseerr/server/interfaces/api/common";
|
|
|
|
type ExtendedMediaRequest = NonFunctionProperties<MediaRequest> & {
|
|
profileName: string;
|
|
canRemove: boolean;
|
|
};
|
|
|
|
const RequestCard: React.FC<{ request: ExtendedMediaRequest }> = ({
|
|
request,
|
|
}) => {
|
|
const { jellyseerrApi } = useJellyseerr();
|
|
|
|
const { data: details } = useQuery({
|
|
queryKey: [
|
|
"jellyseerr",
|
|
"detail",
|
|
request.media.mediaType,
|
|
request.media.tmdbId,
|
|
],
|
|
queryFn: async () => {
|
|
return request.media.mediaType === MediaType.MOVIE
|
|
? jellyseerrApi?.movieDetails(request.media.tmdbId)
|
|
: jellyseerrApi?.tvDetails(request.media.tmdbId);
|
|
},
|
|
enabled: !!jellyseerrApi,
|
|
refetchOnMount: true,
|
|
staleTime: 0,
|
|
});
|
|
|
|
const { data: refreshedRequest } = useQuery({
|
|
queryKey: ["jellyseerr", "requests", request.media.mediaType, request.id],
|
|
queryFn: async () => jellyseerrApi?.getRequest(request.id),
|
|
enabled: !!jellyseerrApi,
|
|
refetchOnMount: true,
|
|
refetchInterval: 5000,
|
|
staleTime: 0,
|
|
});
|
|
|
|
return (
|
|
<JellyseerrPoster
|
|
horizontal
|
|
showDownloadInfo
|
|
item={details}
|
|
mediaRequest={refreshedRequest}
|
|
/>
|
|
);
|
|
};
|
|
|
|
const RecentRequestsSlide: React.FC<SlideProps & ViewProps> = ({
|
|
slide,
|
|
...props
|
|
}) => {
|
|
const { jellyseerrApi } = useJellyseerr();
|
|
|
|
const { data: requests } = useQuery({
|
|
queryKey: ["jellyseerr", "recent_requests"],
|
|
queryFn: async () => jellyseerrApi?.requests(),
|
|
enabled: !!jellyseerrApi,
|
|
refetchOnMount: true,
|
|
staleTime: 0,
|
|
});
|
|
|
|
return (
|
|
requests &&
|
|
requests.results.length > 0 && (
|
|
<Slide
|
|
{...props}
|
|
slide={slide}
|
|
data={
|
|
requests.results.map((item) => ({
|
|
...item,
|
|
profileName: item.profileName ?? "Unknown",
|
|
canRemove: Boolean(item.canRemove),
|
|
})) as ExtendedMediaRequest[]
|
|
}
|
|
keyExtractor={(item) => item.id.toString()}
|
|
renderItem={(item: ExtendedMediaRequest) => (
|
|
<RequestCard request={item} />
|
|
)}
|
|
/>
|
|
)
|
|
);
|
|
};
|
|
|
|
export default RecentRequestsSlide;
|