From 48422fa93e1274d7448f866201cf574f429e17c6 Mon Sep 17 00:00:00 2001 From: Fredrik Burmester Date: Tue, 31 Dec 2024 13:32:43 +0100 Subject: [PATCH] fix: design --- .../jellyseerr/page.tsx | 226 +++++++++++------- 1 file changed, 137 insertions(+), 89 deletions(-) diff --git a/app/(auth)/(tabs)/(home,libraries,search)/jellyseerr/page.tsx b/app/(auth)/(tabs)/(home,libraries,search)/jellyseerr/page.tsx index f537b3f5..4acd8053 100644 --- a/app/(auth)/(tabs)/(home,libraries,search)/jellyseerr/page.tsx +++ b/app/(auth)/(tabs)/(home,libraries,search)/jellyseerr/page.tsx @@ -1,40 +1,62 @@ -import React, {useCallback, useRef, useState} from "react"; -import {useLocalSearchParams} from "expo-router"; -import {MovieResult, TvResult} from "@/utils/jellyseerr/server/models/Search"; -import {Text} from "@/components/common/Text"; -import {ParallaxScrollView} from "@/components/ParallaxPage"; -import {Image} from "expo-image"; -import {TouchableOpacity, View} from "react-native"; -import {Ionicons} from "@expo/vector-icons"; -import {useSafeAreaInsets} from "react-native-safe-area-context"; -import {OverviewText} from "@/components/OverviewText"; -import {GenreTags} from "@/components/GenreTags"; -import {MediaType} from "@/utils/jellyseerr/server/constants/media"; -import {useQuery} from "@tanstack/react-query"; -import {useJellyseerr} from "@/hooks/useJellyseerr"; -import {Button} from "@/components/Button"; -import {BottomSheetBackdrop, BottomSheetBackdropProps, BottomSheetModal, BottomSheetView} from "@gorhom/bottom-sheet"; -import {IssueType, IssueTypeName} from "@/utils/jellyseerr/server/constants/issue"; +import React, { useCallback, useRef, useState } from "react"; +import { useLocalSearchParams } from "expo-router"; +import { MovieResult, TvResult } from "@/utils/jellyseerr/server/models/Search"; +import { Text } from "@/components/common/Text"; +import { ParallaxScrollView } from "@/components/ParallaxPage"; +import { Image } from "expo-image"; +import { TouchableOpacity, View } from "react-native"; +import { Ionicons } from "@expo/vector-icons"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; +import { OverviewText } from "@/components/OverviewText"; +import { GenreTags } from "@/components/GenreTags"; +import { MediaType } from "@/utils/jellyseerr/server/constants/media"; +import { useQuery } from "@tanstack/react-query"; +import { useJellyseerr } from "@/hooks/useJellyseerr"; +import { Button } from "@/components/Button"; +import { + BottomSheetBackdrop, + BottomSheetBackdropProps, + BottomSheetModal, + BottomSheetView, +} from "@gorhom/bottom-sheet"; +import { + IssueType, + IssueTypeName, +} from "@/utils/jellyseerr/server/constants/issue"; import * as DropdownMenu from "zeego/dropdown-menu"; -import {Input} from "@/components/common/Input"; -import {TvDetails} from "@/utils/jellyseerr/server/models/Tv"; +import { Input } from "@/components/common/Input"; +import { TvDetails } from "@/utils/jellyseerr/server/models/Tv"; import JellyseerrSeasons from "@/components/series/JellyseerrSeasons"; -import {JellyserrRatings} from "@/components/Ratings"; +import { JellyserrRatings } from "@/components/Ratings"; const Page: React.FC = () => { const insets = useSafeAreaInsets(); const params = useLocalSearchParams(); - const {mediaTitle, releaseYear, canRequest: canRequestString, posterSrc, ...result} = - params as unknown as {mediaTitle: string, releaseYear: number, canRequest: string, posterSrc: string} & Partial; + const { + mediaTitle, + releaseYear, + canRequest: canRequestString, + posterSrc, + ...result + } = params as unknown as { + mediaTitle: string; + releaseYear: number; + canRequest: string; + posterSrc: string; + } & Partial; const canRequest = canRequestString === "true"; - const {jellyseerrApi, requestMedia} = useJellyseerr(); + const { jellyseerrApi, requestMedia } = useJellyseerr(); const [issueType, setIssueType] = useState(); const [issueMessage, setIssueMessage] = useState(); const bottomSheetModalRef = useRef(null); - const {data: details, isLoading} = useQuery({ + const { + data: details, + isFetching, + isLoading, + } = useQuery({ enabled: !!jellyseerrApi && !!result && !!result.id, queryKey: ["jellyseerr", "detail", result.mediaType, result.id], staleTime: 0, @@ -45,8 +67,8 @@ const Page: React.FC = () => { queryFn: async () => { return result.mediaType === MediaType.MOVIE ? jellyseerrApi?.movieDetails(result.id!!) - : jellyseerrApi?.tvDetails(result.id!!) - } + : jellyseerrApi?.tvDetails(result.id!!); + }, }); const renderBackdrop = useCallback( @@ -62,23 +84,30 @@ const Page: React.FC = () => { const submitIssue = useCallback(() => { if (result.id && issueType && issueMessage && details) { - jellyseerrApi?.submitIssue(details.mediaInfo.id, Number(issueType), issueMessage) + jellyseerrApi + ?.submitIssue(details.mediaInfo.id, Number(issueType), issueMessage) .then(() => { - setIssueType(undefined) - setIssueMessage(undefined) - bottomSheetModalRef?.current?.close() - }) + setIssueType(undefined); + setIssueMessage(undefined); + bottomSheetModalRef?.current?.close(); + }); } - }, [jellyseerrApi, details, result, issueType, issueMessage]) + }, [jellyseerrApi, details, result, issueType, issueMessage]); - const request = useCallback(() => requestMedia(mediaTitle, { - mediaId: Number(result.id!!), - mediaType: result.mediaType!!, - tvdbId: details?.externalIds?.tvdbId, - seasons: (details as TvDetails)?.seasons?.filter?.(s => s.seasonNumber !== 0)?.map?.(s => s.seasonNumber) - }), [details, result, requestMedia]); + const request = useCallback( + () => + requestMedia(mediaTitle, { + mediaId: Number(result.id!!), + mediaType: result.mediaType!!, + tvdbId: details?.externalIds?.tvdbId, + seasons: (details as TvDetails)?.seasons + ?.filter?.((s) => s.seasonNumber !== 0) + ?.map?.((s) => s.seasonNumber), + }), + [details, result, requestMedia] + ); - return ( + return ( { name="image-outline" size={24} color="white" - style={{opacity: 0.4}} + style={{ opacity: 0.4 }} /> )} @@ -123,12 +152,18 @@ const Page: React.FC = () => { } > - - <> + + - - {mediaTitle} + + + {mediaTitle} + {releaseYear} { }} /> - - g.name) || []} /> - {canRequest ? - - : - - } - + + g.name) || []} /> + + {canRequest ? ( + + ) : ( + + )} + + - {result.mediaType === MediaType.TV && - - } + {result.mediaType === MediaType.TV && ( + + )} @@ -185,17 +225,23 @@ const Page: React.FC = () => { - Whats wrong? + + Whats wrong? + - Issue Type + + Issue Type + - {issueType ? IssueTypeName[issueType] : 'Select an issue' } + {issueType + ? IssueTypeName[issueType] + : "Select an issue"} @@ -210,14 +256,20 @@ const Page: React.FC = () => { sideOffset={0} > Types - {Object.entries(IssueTypeName).reverse().map(([key, value], idx) => ( - setIssueType(key as unknown as IssueType)} - > - {value} - - ))} + {Object.entries(IssueTypeName) + .reverse() + .map(([key, value], idx) => ( + + setIssueType(key as unknown as IssueType) + } + > + + {value} + + + ))} @@ -234,11 +286,7 @@ const Page: React.FC = () => { onChangeText={setIssueMessage} /> - @@ -246,6 +294,6 @@ const Page: React.FC = () => { ); -} +}; -export default Page; \ No newline at end of file +export default Page;