import React, {forwardRef, useCallback, useMemo, useState} from "react"; import {View, ViewProps} from "react-native"; import {useJellyseerr} from "@/hooks/useJellyseerr"; import {useQuery} from "@tanstack/react-query"; import {MediaType} from "@/utils/jellyseerr/server/constants/media"; import {BottomSheetBackdrop, BottomSheetBackdropProps, BottomSheetModal, BottomSheetView} from "@gorhom/bottom-sheet"; import Dropdown from "@/components/common/Dropdown"; import {QualityProfile, RootFolder, Tag} from "@/utils/jellyseerr/server/api/servarr/base"; import {MediaRequestBody} from "@/utils/jellyseerr/server/interfaces/api/requestInterfaces"; import {BottomSheetModalMethods} from "@gorhom/bottom-sheet/lib/typescript/types"; import {Button} from "@/components/Button"; import {Text} from "@/components/common/Text"; interface Props { id: number; title: string, type: MediaType; isAnime?: boolean; is4k?: boolean; onRequested?: () => void; } const RequestModal = forwardRef>(({ id, title, type, isAnime = false, onRequested, ...props }, ref) => { const {jellyseerrApi, jellyseerrUser, requestMedia} = useJellyseerr(); const [requestOverrides, setRequestOverrides] = useState({ mediaId: Number(id), mediaType: type, userId: jellyseerrUser?.id }); const [modalRequestProps, setModalRequestProps] = useState(); const {data: serviceSettings} = useQuery({ queryKey: ["jellyseerr", "request", type, 'service'], queryFn: async () => jellyseerrApi?.service(type == 'movie' ? 'radarr' : 'sonarr'), enabled: !!jellyseerrApi && !!jellyseerrUser, refetchOnMount: 'always' }); const {data: users} = useQuery({ queryKey: ["jellyseerr", "users"], queryFn: async () => jellyseerrApi?.user({take: 1000, sort: 'displayname'}), enabled: !!jellyseerrApi && !!jellyseerrUser, refetchOnMount: 'always' }); const defaultService = useMemo( () => serviceSettings?.find?.(v => v.isDefault), [serviceSettings] ); const {data: defaultServiceDetails} = useQuery({ queryKey: ["jellyseerr", "request", type, 'service', 'details', defaultService?.id], queryFn: async () => { setRequestOverrides((prev) => ({ ...prev, serverId: defaultService?.id })) return jellyseerrApi?.serviceDetails(type === 'movie' ? 'radarr' : 'sonarr', defaultService!!.id) }, enabled: !!jellyseerrApi && !!jellyseerrUser && !!defaultService, refetchOnMount: 'always', }); const defaultProfile: QualityProfile = useMemo( () => defaultServiceDetails?.profiles .find(p => p.id === (isAnime ? defaultServiceDetails.server?.activeAnimeProfileId : defaultServiceDetails.server?.activeProfileId) ), [defaultServiceDetails] ); const defaultFolder: RootFolder = useMemo( () => defaultServiceDetails?.rootFolders .find(f => f.path === (isAnime ? defaultServiceDetails?.server.activeAnimeDirectory : defaultServiceDetails.server?.activeDirectory) ), [defaultServiceDetails] ); const defaultTags: Tag[] = useMemo( () => { const tags = defaultServiceDetails?.tags .filter(t => (isAnime ? defaultServiceDetails?.server.activeAnimeTags : defaultServiceDetails?.server.activeTags )?.includes(t.id) ) ?? [] console.log(tags) return tags }, [defaultServiceDetails] ); const seasonTitle = useMemo( () => modalRequestProps?.seasons?.length ? `Season (${modalRequestProps?.seasons})` : undefined, [modalRequestProps?.seasons] ); const request = useCallback(() => {requestMedia( seasonTitle ? `${title}, ${seasonTitle}` : title, { is4k: defaultService?.is4k || defaultServiceDetails?.server.is4k, profileId: defaultProfile.id, rootFolder: defaultFolder.path, tags: defaultTags.map(t => t.id), ...modalRequestProps, ...requestOverrides }, onRequested ) }, [requestOverrides, defaultProfile, defaultFolder, defaultTags]); const pathTitleExtractor = (item: RootFolder) => `${item.path} (${item.freeSpace.bytesToReadable()})`; return ( setModalRequestProps(undefined)} handleIndicatorStyle={{ backgroundColor: "white", }} backgroundStyle={{ backgroundColor: "#171717", }} backdropComponent={(sheetProps: BottomSheetBackdropProps) => } > {(data) => { setModalRequestProps(data?.data as MediaRequestBody) return Advanced {seasonTitle && {seasonTitle} } {(defaultService && defaultServiceDetails && users) && ( <> item.name} placeholderText={defaultProfile.name} keyExtractor={(item) => item.id.toString()} label={"Quality Profile"} onSelected={(item) => item && setRequestOverrides((prev) => ({ ...prev, profileId: item?.id })) } title={"Quality Profile"} /> item.id.toString()} label={"Root Folder"} onSelected={(item) => item && setRequestOverrides((prev) => ({ ...prev, rootFolder: item.path }))} title={"Root Folder"} /> item.label} placeholderText={defaultTags.map(t => t.label).join(",")} keyExtractor={(item) => item.id.toString()} label={"Tags"} onSelected={(...item) => item && setRequestOverrides((prev) => ({ ...prev, tags: item.map(i => i.id) })) } title={"Tags"} /> item.displayName} placeholderText={jellyseerrUser!!.displayName} keyExtractor={(item) => item.id.toString() || ""} label={"Request As"} onSelected={(item) => item && setRequestOverrides((prev) => ({ ...prev, userId: item?.id })) } title={"Request As"} /> ) } }} ); }); export default RequestModal;