diff --git a/.github/workflows/notification.yaml b/.github/workflows/notification.yaml
new file mode 100644
index 00000000..00cab601
--- /dev/null
+++ b/.github/workflows/notification.yaml
@@ -0,0 +1,18 @@
+name: Discord Pull Request Notification
+
+on:
+ pull_request:
+ types: [opened, reopened]
+
+jobs:
+ notify:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: joelwmale/webhook-action@master
+ with:
+ url: ${{ secrets.DISCORD_WEBHOOK_URL }}
+ body: |
+ {
+ "content": "New Pull Request: ${{ github.event.pull_request.title }}\nBy: ${{ github.event.pull_request.user.login }}\n\n${{ github.event.pull_request.html_url }}",
+ "avatar_url": "https://avatars.githubusercontent.com/u/193271640"
+ }
diff --git a/app/(auth)/(tabs)/(favorites)/_layout.tsx b/app/(auth)/(tabs)/(favorites)/_layout.tsx
new file mode 100644
index 00000000..f96cd516
--- /dev/null
+++ b/app/(auth)/(tabs)/(favorites)/_layout.tsx
@@ -0,0 +1,24 @@
+import { nestedTabPageScreenOptions } from "@/components/stacks/NestedTabPageStack";
+import { Stack } from "expo-router";
+import { Platform } from "react-native";
+
+export default function SearchLayout() {
+ return (
+
+
+ {Object.entries(nestedTabPageScreenOptions).map(([name, options]) => (
+
+ ))}
+
+ );
+}
diff --git a/app/(auth)/(tabs)/(favorites)/index.tsx b/app/(auth)/(tabs)/(favorites)/index.tsx
new file mode 100644
index 00000000..afeb27a7
--- /dev/null
+++ b/app/(auth)/(tabs)/(favorites)/index.tsx
@@ -0,0 +1,36 @@
+import { Favorites } from "@/components/home/Favorites";
+import { useInvalidatePlaybackProgressCache } from "@/hooks/useRevalidatePlaybackProgressCache";
+import React, { useCallback, useState } from "react";
+import { RefreshControl, ScrollView, View } from "react-native";
+import { useSafeAreaInsets } from "react-native-safe-area-context";
+
+export default function favorites() {
+ const invalidateCache = useInvalidatePlaybackProgressCache();
+
+ const [loading, setLoading] = useState(false);
+ const refetch = useCallback(async () => {
+ setLoading(true);
+ await invalidateCache();
+ setLoading(false);
+ }, []);
+ const insets = useSafeAreaInsets();
+
+ return (
+
+ }
+ contentContainerStyle={{
+ paddingLeft: insets.left,
+ paddingRight: insets.right,
+ paddingBottom: 16,
+ }}
+ >
+
+
+
+
+ );
+}
diff --git a/app/(auth)/(tabs)/(home)/_layout.tsx b/app/(auth)/(tabs)/(home)/_layout.tsx
index c9b47bc4..c36a3347 100644
--- a/app/(auth)/(tabs)/(home)/_layout.tsx
+++ b/app/(auth)/(tabs)/(home)/_layout.tsx
@@ -1,6 +1,6 @@
import { Chromecast } from "@/components/Chromecast";
import { nestedTabPageScreenOptions } from "@/components/stacks/NestedTabPageStack";
-import { Feather } from "@expo/vector-icons";
+import { Feather, Ionicons } from "@expo/vector-icons";
import { Stack, useRouter } from "expo-router";
import { Platform, TouchableOpacity, View } from "react-native";
import { useTranslation } from "react-i18next";
diff --git a/app/(auth)/(tabs)/(home)/index.tsx b/app/(auth)/(tabs)/(home)/index.tsx
index 262cc249..f8403a38 100644
--- a/app/(auth)/(tabs)/(home)/index.tsx
+++ b/app/(auth)/(tabs)/(home)/index.tsx
@@ -110,9 +110,9 @@ export default function index() {
setIsConnected(state.isConnected);
});
- cleanCacheDirectory()
- .then(r => console.log("Cache directory cleaned"))
- .catch(e => console.error("Something went wrong cleaning cache directory"))
+ cleanCacheDirectory().catch((e) =>
+ console.error("Something went wrong cleaning cache directory")
+ );
return () => {
unsubscribe();
};
diff --git a/app/(auth)/(tabs)/(home,libraries,search)/actors/[actorId].tsx b/app/(auth)/(tabs)/(home,libraries,search,favorites)/actors/[actorId].tsx
similarity index 100%
rename from app/(auth)/(tabs)/(home,libraries,search)/actors/[actorId].tsx
rename to app/(auth)/(tabs)/(home,libraries,search,favorites)/actors/[actorId].tsx
diff --git a/app/(auth)/(tabs)/(home,libraries,search)/albums/[albumId].tsx b/app/(auth)/(tabs)/(home,libraries,search,favorites)/albums/[albumId].tsx
similarity index 100%
rename from app/(auth)/(tabs)/(home,libraries,search)/albums/[albumId].tsx
rename to app/(auth)/(tabs)/(home,libraries,search,favorites)/albums/[albumId].tsx
diff --git a/app/(auth)/(tabs)/(home,libraries,search)/artists/[artistId].tsx b/app/(auth)/(tabs)/(home,libraries,search,favorites)/artists/[artistId].tsx
similarity index 100%
rename from app/(auth)/(tabs)/(home,libraries,search)/artists/[artistId].tsx
rename to app/(auth)/(tabs)/(home,libraries,search,favorites)/artists/[artistId].tsx
diff --git a/app/(auth)/(tabs)/(home,libraries,search)/artists/index.tsx b/app/(auth)/(tabs)/(home,libraries,search,favorites)/artists/index.tsx
similarity index 100%
rename from app/(auth)/(tabs)/(home,libraries,search)/artists/index.tsx
rename to app/(auth)/(tabs)/(home,libraries,search,favorites)/artists/index.tsx
diff --git a/app/(auth)/(tabs)/(home,libraries,search)/collections/[collectionId].tsx b/app/(auth)/(tabs)/(home,libraries,search,favorites)/collections/[collectionId].tsx
similarity index 100%
rename from app/(auth)/(tabs)/(home,libraries,search)/collections/[collectionId].tsx
rename to app/(auth)/(tabs)/(home,libraries,search,favorites)/collections/[collectionId].tsx
diff --git a/app/(auth)/(tabs)/(home,libraries,search)/items/page.tsx b/app/(auth)/(tabs)/(home,libraries,search,favorites)/items/page.tsx
similarity index 100%
rename from app/(auth)/(tabs)/(home,libraries,search)/items/page.tsx
rename to app/(auth)/(tabs)/(home,libraries,search,favorites)/items/page.tsx
diff --git a/app/(auth)/(tabs)/(home,libraries,search)/jellyseerr/page.tsx b/app/(auth)/(tabs)/(home,libraries,search,favorites)/jellyseerr/page.tsx
similarity index 92%
rename from app/(auth)/(tabs)/(home,libraries,search)/jellyseerr/page.tsx
rename to app/(auth)/(tabs)/(home,libraries,search,favorites)/jellyseerr/page.tsx
index edf91697..0be85e92 100644
--- a/app/(auth)/(tabs)/(home,libraries,search)/jellyseerr/page.tsx
+++ b/app/(auth)/(tabs)/(home,libraries,search,favorites)/jellyseerr/page.tsx
@@ -4,7 +4,7 @@ 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 { TouchableOpacity, View} from "react-native";
import { Ionicons } from "@expo/vector-icons";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { OverviewText } from "@/components/OverviewText";
@@ -16,7 +16,7 @@ import { Button } from "@/components/Button";
import {
BottomSheetBackdrop,
BottomSheetBackdropProps,
- BottomSheetModal,
+ BottomSheetModal, BottomSheetTextInput,
BottomSheetView,
} from "@gorhom/bottom-sheet";
import {
@@ -24,7 +24,6 @@ import {
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 JellyseerrSeasons from "@/components/series/JellyseerrSeasons";
import { JellyserrRatings } from "@/components/Ratings";
@@ -274,17 +273,22 @@ const Page: React.FC = () => {
-
+
+
+