diff --git a/app/(auth)/(tabs)/(home)/settings/popular-lists/page.tsx b/app/(auth)/(tabs)/(home)/settings/popular-lists/page.tsx index c7d66e75..6dfcb3c8 100644 --- a/app/(auth)/(tabs)/(home)/settings/popular-lists/page.tsx +++ b/app/(auth)/(tabs)/(home)/settings/popular-lists/page.tsx @@ -2,19 +2,16 @@ import { Text } from "@/components/common/Text"; import { ListGroup } from "@/components/list/ListGroup"; import { ListItem } from "@/components/list/ListItem"; import { Loader } from "@/components/Loader"; +import DisabledSetting from "@/components/settings/DisabledSetting"; import { apiAtom, userAtom } from "@/providers/JellyfinProvider"; import { useSettings } from "@/utils/atoms/settings"; import { getItemsApi } from "@jellyfin/sdk/lib/utils/api"; import { useQuery, useQueryClient } from "@tanstack/react-query"; -import { useNavigation } from "expo-router"; import { useAtom } from "jotai"; -import { Linking, Switch, View } from "react-native"; -import {useMemo} from "react"; -import DisabledSetting from "@/components/settings/DisabledSetting"; +import { useMemo } from "react"; +import { Linking, Switch } from "react-native"; export default function page() { - const navigation = useNavigation(); - const [api] = useAtom(apiAtom); const [user] = useAtom(userAtom); @@ -50,18 +47,17 @@ export default function page() { staleTime: 0, }); - const disabled = useMemo(() => ( - pluginSettings?.usePopularPlugin?.locked === true && - pluginSettings?.mediaListCollectionIds?.locked === true - ), [pluginSettings]); + const disabled = useMemo( + () => + pluginSettings?.usePopularPlugin?.locked === true && + pluginSettings?.mediaListCollectionIds?.locked === true, + [pluginSettings] + ); if (!settings) return null; return ( - + updateSettings({ usePopularPlugin }) - } + } /> @@ -103,11 +99,17 @@ export default function page() { { if (!settings.mediaListCollectionIds) { updateSettings({ diff --git a/app/+not-found.tsx b/app/+not-found.tsx index 41968287..5a8c1964 100644 --- a/app/+not-found.tsx +++ b/app/+not-found.tsx @@ -1,13 +1,10 @@ -import { Link, Stack, usePathname } from "expo-router"; +import { Link, Stack } from "expo-router"; import { StyleSheet } from "react-native"; import { ThemedText } from "@/components/ThemedText"; import { ThemedView } from "@/components/ThemedView"; -import { useEffect } from "react"; export default function NotFoundScreen() { - const pathname = usePathname(); - return ( <> diff --git a/components/MediaSourceSelector.tsx b/components/MediaSourceSelector.tsx index 4888692a..6a76e714 100644 --- a/components/MediaSourceSelector.tsx +++ b/components/MediaSourceSelector.tsx @@ -1,13 +1,11 @@ -import { tc } from "@/utils/textTools"; import { BaseItemDto, MediaSourceInfo, } from "@jellyfin/sdk/lib/generated-client/models"; -import { useEffect, useMemo } from "react"; +import { useMemo } from "react"; import { TouchableOpacity, View } from "react-native"; import * as DropdownMenu from "zeego/dropdown-menu"; import { Text } from "./common/Text"; -import { convertBitsToMegabitsOrGigabits } from "@/utils/bToMb"; interface Props extends React.ComponentProps { item: BaseItemDto; @@ -34,9 +32,9 @@ export const MediaSourceSelector: React.FC = ({ if (!mediaSources.length) return ""; let commonPrefix = ""; - for (let i = 0; i < mediaSources[0].Name.length; i++) { - const char = mediaSources[0].Name[i]; - if (mediaSources.every((source) => source.Name[i] === char)) { + for (let i = 0; i < mediaSources[0].Name!.length; i++) { + const char = mediaSources[0].Name![i]; + if (mediaSources.every((source) => source.Name![i] === char)) { commonPrefix += char; } else { commonPrefix = commonPrefix.slice(0, -1); diff --git a/components/filters/FilterButton.tsx b/components/filters/FilterButton.tsx index 6d976b26..de8caa2e 100644 --- a/components/filters/FilterButton.tsx +++ b/components/filters/FilterButton.tsx @@ -1,7 +1,7 @@ import { Text } from "@/components/common/Text"; import { FontAwesome, Ionicons } from "@expo/vector-icons"; import { useQuery } from "@tanstack/react-query"; -import { useEffect, useState } from "react"; +import { useState } from "react"; import { TouchableOpacity, View, ViewProps } from "react-native"; import { FilterSheet } from "./FilterSheet"; diff --git a/components/jellyseerr/discover/CompanySlide.tsx b/components/jellyseerr/discover/CompanySlide.tsx index b30df3d7..abee4a9d 100644 --- a/components/jellyseerr/discover/CompanySlide.tsx +++ b/components/jellyseerr/discover/CompanySlide.tsx @@ -1,23 +1,30 @@ -import React, {useCallback} from "react"; -import { - useJellyseerr, -} from "@/hooks/useJellyseerr"; -import {TouchableOpacity, ViewProps} from "react-native"; -import Slide, {SlideProps} from "@/components/jellyseerr/discover/Slide"; -import {COMPANY_LOGO_IMAGE_FILTER, Network} from "@/utils/jellyseerr/src/components/Discover/NetworkSlider"; import GenericSlideCard from "@/components/jellyseerr/discover/GenericSlideCard"; -import {Studio} from "@/utils/jellyseerr/src/components/Discover/StudioSlider"; -import {router, useSegments} from "expo-router"; +import Slide, { SlideProps } from "@/components/jellyseerr/discover/Slide"; +import { useJellyseerr } from "@/hooks/useJellyseerr"; +import { + COMPANY_LOGO_IMAGE_FILTER, + Network, +} from "@/utils/jellyseerr/src/components/Discover/NetworkSlider"; +import { Studio } from "@/utils/jellyseerr/src/components/Discover/StudioSlider"; +import { router, useSegments } from "expo-router"; +import React, { useCallback } from "react"; +import { TouchableOpacity, ViewProps } from "react-native"; -const CompanySlide: React.FC<{data: Network[] | Studio[]} & SlideProps & ViewProps> = ({ slide, data, ...props }) => { +const CompanySlide: React.FC< + { data: Network[] | Studio[] } & SlideProps & ViewProps +> = ({ slide, data, ...props }) => { const segments = useSegments(); const { jellyseerrApi } = useJellyseerr(); const from = segments[2]; - const navigate = useCallback(({id, image, name}: Network | Studio) => router.push({ - pathname: `/(auth)/(tabs)/${from}/jellyseerr/company/${id}`, - params: {id, image, name, type: slide.type } - }), [slide]); + const navigate = useCallback( + ({ id, image, name }: Network | Studio) => + router.push({ + pathname: `/(auth)/(tabs)/${from}/jellyseerr/company/${id}`, + params: { id, image, name, type: slide.type }, + }), + [slide] + ); return ( )} diff --git a/components/jellyseerr/discover/GenreSlide.tsx b/components/jellyseerr/discover/GenreSlide.tsx index 551ee2de..36623e20 100644 --- a/components/jellyseerr/discover/GenreSlide.tsx +++ b/components/jellyseerr/discover/GenreSlide.tsx @@ -1,55 +1,66 @@ -import React, {useCallback} from "react"; -import {Endpoints, useJellyseerr,} from "@/hooks/useJellyseerr"; -import {TouchableOpacity, ViewProps} from "react-native"; -import Slide, {SlideProps} from "@/components/jellyseerr/discover/Slide"; import GenericSlideCard from "@/components/jellyseerr/discover/GenericSlideCard"; -import {router, useSegments} from "expo-router"; -import {useQuery} from "@tanstack/react-query"; -import {DiscoverSliderType} from "@/utils/jellyseerr/server/constants/discover"; -import {genreColorMap} from "@/utils/jellyseerr/src/components/Discover/constants"; -import {GenreSliderItem} from "@/utils/jellyseerr/server/interfaces/api/discoverInterfaces"; +import Slide, { SlideProps } from "@/components/jellyseerr/discover/Slide"; +import { Endpoints, useJellyseerr } from "@/hooks/useJellyseerr"; +import { DiscoverSliderType } from "@/utils/jellyseerr/server/constants/discover"; +import { GenreSliderItem } from "@/utils/jellyseerr/server/interfaces/api/discoverInterfaces"; +import { genreColorMap } from "@/utils/jellyseerr/src/components/Discover/constants"; +import { useQuery } from "@tanstack/react-query"; +import { router, useSegments } from "expo-router"; +import React, { useCallback } from "react"; +import { TouchableOpacity, ViewProps } from "react-native"; const GenreSlide: React.FC = ({ slide, ...props }) => { const segments = useSegments(); const { jellyseerrApi } = useJellyseerr(); const from = segments[2]; - const navigate = useCallback((genre: GenreSliderItem) => router.push({ - pathname: `/(auth)/(tabs)/${from}/jellyseerr/genre/${genre.id}`, - params: {type: slide.type, name: genre.name} - }), [slide]); + const navigate = useCallback( + (genre: GenreSliderItem) => + router.push({ + pathname: `/(auth)/(tabs)/${from}/jellyseerr/genre/${genre.id}`, + params: { type: slide.type, name: genre.name }, + }), + [slide] + ); - const {data, isFetching, isLoading } = useQuery({ - queryKey: ['jellyseerr', 'discover', slide.type, slide.id], + const { data, isFetching, isLoading } = useQuery({ + queryKey: ["jellyseerr", "discover", slide.type, slide.id], queryFn: async () => { return jellyseerrApi?.getGenreSliders( slide.type == DiscoverSliderType.MOVIE_GENRES ? Endpoints.MOVIE : Endpoints.TV - ) + ); }, - enabled: !!jellyseerrApi - }) + enabled: !!jellyseerrApi, + }); return ( - data && item.id.toString()} - renderItem={(item, index) => ( - navigate(item)}> - - - )} - /> + data && ( + item.id.toString()} + renderItem={(item, index) => ( + navigate(item)}> + + + )} + /> + ) ); }; diff --git a/components/list/ListItem.tsx b/components/list/ListItem.tsx index 46856b00..403b33dc 100644 --- a/components/list/ListItem.tsx +++ b/components/list/ListItem.tsx @@ -1,3 +1,4 @@ +import { Ionicons } from "@expo/vector-icons"; import { PropsWithChildren, ReactNode } from "react"; import { TouchableOpacity, @@ -6,7 +7,6 @@ import { ViewProps, } from "react-native"; import { Text } from "../common/Text"; -import { Ionicons } from "@expo/vector-icons"; interface Props extends TouchableOpacityProps, ViewProps { title?: string | null | undefined; diff --git a/components/settings/StorageSettings.tsx b/components/settings/StorageSettings.tsx index 9064bc14..ca7743e0 100644 --- a/components/settings/StorageSettings.tsx +++ b/components/settings/StorageSettings.tsx @@ -1,12 +1,9 @@ -import { Button } from "@/components/Button"; import { Text } from "@/components/common/Text"; +import { useHaptic } from "@/hooks/useHaptic"; import { useDownload } from "@/providers/DownloadProvider"; -import { clearLogs } from "@/utils/log"; import { useQuery } from "@tanstack/react-query"; import * as FileSystem from "expo-file-system"; -import { useHaptic } from "@/hooks/useHaptic"; import { View } from "react-native"; -import * as Progress from "react-native-progress"; import { toast } from "sonner-native"; import { ListGroup } from "../list/ListGroup"; import { ListItem } from "../list/ListItem"; diff --git a/components/video-player/controls/EpisodeList.tsx b/components/video-player/controls/EpisodeList.tsx index db7c5c71..422a2fc3 100644 --- a/components/video-player/controls/EpisodeList.tsx +++ b/components/video-player/controls/EpisodeList.tsx @@ -1,26 +1,26 @@ -import { apiAtom, userAtom } from "@/providers/JellyfinProvider"; -import { runtimeTicksToSeconds } from "@/utils/time"; -import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models"; -import { useQuery, useQueryClient } from "@tanstack/react-query"; -import { atom, useAtom } from "jotai"; -import { useEffect, useMemo, useState, useRef } from "react"; -import { View, TouchableOpacity } from "react-native"; -import { getTvShowsApi } from "@jellyfin/sdk/lib/utils/api"; -import { getUserItemData } from "@/utils/jellyfin/user-library/getUserItemData"; -import { Ionicons } from "@expo/vector-icons"; -import { Loader } from "@/components/Loader"; -import ContinueWatchingPoster from "@/components/ContinueWatchingPoster"; -import { Text } from "@/components/common/Text"; -import { DownloadSingleItem } from "@/components/DownloadItem"; -import { useSafeAreaInsets } from "react-native-safe-area-context"; import { HorizontalScroll, HorizontalScrollRef, } from "@/components/common/HorrizontalScroll"; +import { Text } from "@/components/common/Text"; +import ContinueWatchingPoster from "@/components/ContinueWatchingPoster"; +import { DownloadSingleItem } from "@/components/DownloadItem"; +import { Loader } from "@/components/Loader"; import { SeasonDropdown, SeasonIndexState, } from "@/components/series/SeasonDropdown"; +import { apiAtom, userAtom } from "@/providers/JellyfinProvider"; +import { getUserItemData } from "@/utils/jellyfin/user-library/getUserItemData"; +import { runtimeTicksToSeconds } from "@/utils/time"; +import { Ionicons } from "@expo/vector-icons"; +import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models"; +import { getTvShowsApi } from "@jellyfin/sdk/lib/utils/api"; +import { useQuery, useQueryClient } from "@tanstack/react-query"; +import { atom, useAtom } from "jotai"; +import { useEffect, useMemo, useRef, useState } from "react"; +import { TouchableOpacity, View } from "react-native"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; type Props = { item: BaseItemDto;