import { useRouter, useSegments } from "expo-router"; import type React from "react"; import { type PropsWithChildren, useCallback, useMemo } from "react"; import { TouchableOpacity, type TouchableOpacityProps } from "react-native"; import * as ContextMenu from "zeego/context-menu"; import { useJellyseerr } from "@/hooks/useJellyseerr"; import { MediaType } from "@/utils/jellyseerr/server/constants/media"; import { hasPermission, Permission, } from "@/utils/jellyseerr/server/lib/permissions"; import type { MovieDetails } from "@/utils/jellyseerr/server/models/Movie"; import type { MovieResult, TvResult, } from "@/utils/jellyseerr/server/models/Search"; import type { TvDetails } from "@/utils/jellyseerr/server/models/Tv"; interface Props extends TouchableOpacityProps { result?: MovieResult | TvResult | MovieDetails | TvDetails; mediaTitle: string; releaseYear: number; canRequest: boolean; posterSrc: string; mediaType: MediaType; } export const TouchableJellyseerrRouter: React.FC> = ({ result, mediaTitle, releaseYear, canRequest, posterSrc, mediaType, children, ...props }) => { const router = useRouter(); const segments = useSegments(); const { jellyseerrApi, jellyseerrUser, requestMedia } = useJellyseerr(); const from = segments[2]; const autoApprove = useMemo(() => { return ( jellyseerrUser && hasPermission(Permission.AUTO_APPROVE, jellyseerrUser.permissions, { type: "or", }) ); }, [jellyseerrApi, jellyseerrUser]); const request = useCallback(() => { if (!result) return; requestMedia(mediaTitle, { mediaId: result.id, mediaType, }); }, [jellyseerrApi, result]); if (from === "(home)" || from === "(search)" || from === "(libraries)") return ( { if (!result) return; // @ts-expect-error router.push({ pathname: `/(auth)/(tabs)/${from}/jellyseerr/page`, params: { ...result, mediaTitle, releaseYear, canRequest, posterSrc, mediaType, }, }); }} {...props} > {children} Actions {canRequest && mediaType === MediaType.MOVIE && ( { if (autoApprove) { request(); } }} shouldDismissMenuOnSelect > Request )} ); };