From bd908516b5a3cb3556b8dc5931c1d098d49100c3 Mon Sep 17 00:00:00 2001 From: herrrta <73949927+herrrta@users.noreply.github.com> Date: Sun, 2 Mar 2025 12:21:24 -0500 Subject: [PATCH] fix: Advanced request options not saving #543 --- .../jellyseerr/page.tsx | 13 +- components/common/Dropdown.tsx | 10 +- components/jellyseerr/RequestModal.tsx | 179 +++++++++--------- 3 files changed, 104 insertions(+), 98 deletions(-) diff --git a/app/(auth)/(tabs)/(home,libraries,search,favorites)/jellyseerr/page.tsx b/app/(auth)/(tabs)/(home,libraries,search,favorites)/jellyseerr/page.tsx index 52e64bc5..5cfe68cf 100644 --- a/app/(auth)/(tabs)/(home,libraries,search,favorites)/jellyseerr/page.tsx +++ b/app/(auth)/(tabs)/(home,libraries,search,favorites)/jellyseerr/page.tsx @@ -61,6 +61,7 @@ const Page: React.FC = () => { const [issueType, setIssueType] = useState(); const [issueMessage, setIssueMessage] = useState(); + const [requestBody, _setRequestBody] = useState(); const advancedReqModalRef = useRef(null); const bottomSheetModalRef = useRef(null); @@ -111,6 +112,11 @@ const Page: React.FC = () => { } }, [jellyseerrApi, details, result, issueType, issueMessage]); + const setRequestBody = useCallback((body: MediaRequestBody) => { + _setRequestBody(body) + advancedReqModalRef?.current?.present?.(); + }, [requestBody, _setRequestBody, advancedReqModalRef]) + const request = useCallback(async () => { const body: MediaRequestBody = { mediaId: Number(result.id!!), @@ -122,7 +128,7 @@ const Page: React.FC = () => { }; if (hasAdvancedRequestPermission) { - advancedReqModalRef?.current?.present?.(body); + setRequestBody(body) return; } @@ -255,7 +261,7 @@ const Page: React.FC = () => { refetch={refetch} hasAdvancedRequest={hasAdvancedRequestPermission} onAdvancedRequest={(data) => - advancedReqModalRef?.current?.present(data) + setRequestBody(data) } /> )} @@ -269,14 +275,17 @@ const Page: React.FC = () => { { + _setRequestBody(undefined) advancedReqModalRef?.current?.close(); refetch(); }} + onDismiss={() => _setRequestBody(undefined)} /> { title: string | ReactNode; label: string; onSelected: (...item: T[]) => void; - multi?: boolean; + multiple?: boolean; } const Dropdown = ({ @@ -30,7 +30,7 @@ const Dropdown = ({ title, label, onSelected, - multi = false, + multiple = false, ...props }: PropsWithChildren & ViewProps>) => { if (Platform.isTV) return null; @@ -72,7 +72,7 @@ const Dropdown = ({ > {label} {data.map((item, idx) => - multi ? ( + multiple ? ( keyExtractor(s) == keyExtractor(item)) @@ -80,7 +80,7 @@ const Dropdown = ({ : "off" } key={keyExtractor(item)} - onValueChange={(next, previous) => + onValueChange={(next: "on" | "off", previous: "on" | "off") => { setSelected((p) => { const prev = p || []; if (next == "on") { @@ -92,7 +92,7 @@ const Dropdown = ({ ), ]; }) - } + }} > {titleExtractor(item)} diff --git a/components/jellyseerr/RequestModal.tsx b/components/jellyseerr/RequestModal.tsx index ec1ac97b..6ff70030 100644 --- a/components/jellyseerr/RequestModal.tsx +++ b/components/jellyseerr/RequestModal.tsx @@ -15,18 +15,22 @@ import { useTranslation } from "react-i18next"; interface Props { id: number; title: string, + requestBody?: MediaRequestBody, type: MediaType; isAnime?: boolean; is4k?: boolean; onRequested?: () => void; + onDismiss?: () => void; } const RequestModal = forwardRef>(({ id, title, + requestBody, type, isAnime = false, onRequested, + onDismiss, ...props }, ref) => { const {jellyseerrApi, jellyseerrUser, requestMedia} = useJellyseerr(); @@ -39,8 +43,6 @@ const RequestModal = forwardRef(); - const {data: serviceSettings} = useQuery({ queryKey: ["jellyseerr", "request", type, 'service'], queryFn: async () => jellyseerrApi?.service(type == 'movie' ? 'radarr' : 'sonarr'), @@ -98,16 +100,14 @@ const RequestModal = forwardRef modalRequestProps?.seasons?.length ? t("jellyseerr.season_x", {seasons: modalRequestProps?.seasons}) : undefined, - [modalRequestProps?.seasons] + () => requestBody?.seasons?.length ? t("jellyseerr.season_x", {seasons: requestBody?.seasons}) : undefined, + [requestBody?.seasons] ); const request = useCallback(() => {requestMedia( @@ -117,12 +117,12 @@ const RequestModal = forwardRef t.id), - ...modalRequestProps, + ...requestBody, ...requestOverrides }, onRequested ) - }, [modalRequestProps, requestOverrides, defaultProfile, defaultFolder, defaultTags]); + }, [requestBody, requestOverrides, defaultProfile, defaultFolder, defaultTags]); const pathTitleExtractor = (item: RootFolder) => `${item.path} (${item.freeSpace.bytesToReadable()})`; @@ -131,7 +131,7 @@ const RequestModal = forwardRef setModalRequestProps(undefined)} + onDismiss={onDismiss} handleIndicatorStyle={{ backgroundColor: "white", }} @@ -146,89 +146,86 @@ const RequestModal = forwardRef } > - {(data) => { - setModalRequestProps(data?.data as MediaRequestBody) - return - - - {t("jellyseerr.advanced")} - {seasonTitle && - {seasonTitle} - } - - - {(defaultService && defaultServiceDetails && users) && ( - <> - item.name} - placeholderText={defaultProfile.name} - keyExtractor={(item) => item.id.toString()} - label={t("jellyseerr.quality_profile")} - onSelected={(item) => - item && setRequestOverrides((prev) => ({ - ...prev, - profileId: item?.id - })) - } - title={t("jellyseerr.quality_profile")} - /> - item.id.toString()} - label={t("jellyseerr.root_folder")} - onSelected={(item) => - item && setRequestOverrides((prev) => ({ - ...prev, - rootFolder: item.path - }))} - title={t("jellyseerr.root_folder")} - /> - item.label} - placeholderText={defaultTags.map(t => t.label).join(",")} - keyExtractor={(item) => item.id.toString()} - label={t("jellyseerr.tags")} - onSelected={(...item) => - item && setRequestOverrides((prev) => ({ - ...prev, - tags: item.map(i => i.id) - })) - } - title={t("jellyseerr.tags")} - /> - item.displayName} - placeholderText={jellyseerrUser!!.displayName} - keyExtractor={(item) => item.id.toString() || ""} - label={t("jellyseerr.request_as")} - onSelected={(item) => - item && setRequestOverrides((prev) => ({ - ...prev, - userId: item?.id - })) - } - title={t("jellyseerr.request_as")} - /> - - ) - } - - + + + + {t("jellyseerr.advanced")} + {seasonTitle && + {seasonTitle} + } - - }} + + {(defaultService && defaultServiceDetails && users) && ( + <> + item.name} + placeholderText={requestOverrides.profileName || defaultProfile.name} + keyExtractor={(item) => item.id.toString()} + label={t("jellyseerr.quality_profile")} + onSelected={(item) => + item && setRequestOverrides((prev) => ({ + ...prev, + profileId: item?.id + })) + } + title={t("jellyseerr.quality_profile")} + /> + item.id.toString()} + label={t("jellyseerr.root_folder")} + onSelected={(item) => + item && setRequestOverrides((prev) => ({ + ...prev, + rootFolder: item.path + }))} + title={t("jellyseerr.root_folder")} + /> + item.label} + placeholderText={defaultTags.map(t => t.label).join(",")} + keyExtractor={(item) => item.id.toString()} + label={t("jellyseerr.tags")} + onSelected={(...selected) => + setRequestOverrides((prev) => ({ + ...prev, + tags: selected.map(i => i.id) + })) + } + title={t("jellyseerr.tags")} + /> + item.displayName} + placeholderText={jellyseerrUser!!.displayName} + keyExtractor={(item) => item.id.toString() || ""} + label={t("jellyseerr.request_as")} + onSelected={(item) => + item && setRequestOverrides((prev) => ({ + ...prev, + userId: item?.id + })) + } + title={t("jellyseerr.request_as")} + /> + + ) + } + + + + ); });