mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-07-02 02:22:51 +01:00
Revert "feat: add favorites functionality with FavoriteButton component and layout"
This reverts commit 468f58e531.
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -35,6 +35,4 @@ credentials.json
|
|||||||
*.ipa
|
*.ipa
|
||||||
.continuerc.json
|
.continuerc.json
|
||||||
|
|
||||||
.vscode/
|
.vscode/
|
||||||
|
|
||||||
bun.lockb
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
import { Chromecast } from "@/components/Chromecast";
|
|
||||||
import { nestedTabPageScreenOptions } from "@/components/stacks/NestedTabPageStack";
|
|
||||||
import { Feather } from "@expo/vector-icons";
|
|
||||||
import { Stack, useRouter } from "expo-router";
|
|
||||||
import { Platform, TouchableOpacity, View } from "react-native";
|
|
||||||
import { Menu, Divider, Provider } from "react-native-paper";
|
|
||||||
import {useState} from "react";
|
|
||||||
|
|
||||||
|
|
||||||
export default function IndexLayout() {
|
|
||||||
const router = useRouter();
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Provider>
|
|
||||||
<Stack>
|
|
||||||
<Stack.Screen
|
|
||||||
name="index"
|
|
||||||
options={{
|
|
||||||
headerShown: true,
|
|
||||||
headerLargeTitle: true,
|
|
||||||
headerTitle: "Favorites",
|
|
||||||
headerBlurEffect: "prominent",
|
|
||||||
headerTransparent: Platform.OS === "ios" ? true : false,
|
|
||||||
headerShadowVisible: false,
|
|
||||||
headerRight: () => (
|
|
||||||
<View className="flex flex-row items-center space-x-2">
|
|
||||||
<Chromecast />
|
|
||||||
</View>
|
|
||||||
),
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</Stack>
|
|
||||||
</Provider>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
import { useAtom } from "jotai";
|
|
||||||
import { useEffect, useState } from "react";
|
|
||||||
import { View, Text, FlatList } from "react-native";
|
|
||||||
import { apiAtom, userAtom } from "@/providers/JellyfinProvider";
|
|
||||||
import { getItemsApi } from "@jellyfin/sdk/lib/utils/api";
|
|
||||||
|
|
||||||
export default function Favorites() {
|
|
||||||
const [favorites, setFavorites] = useState([]);
|
|
||||||
const [api] = useAtom(apiAtom);
|
|
||||||
const [user] = useAtom(userAtom);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const fetchFavorites = async () => {
|
|
||||||
if (api && user) {
|
|
||||||
const response = await getItemsApi(api).getItems({
|
|
||||||
userId: user.Id,
|
|
||||||
isFavorite: true,
|
|
||||||
});
|
|
||||||
if (response.data.Items) {
|
|
||||||
setFavorites(response.data.Items);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
fetchFavorites();
|
|
||||||
}, [api, user]);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<View>
|
|
||||||
</View>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -3,19 +3,10 @@ import { nestedTabPageScreenOptions } from "@/components/stacks/NestedTabPageSta
|
|||||||
import { Feather } from "@expo/vector-icons";
|
import { Feather } from "@expo/vector-icons";
|
||||||
import { Stack, useRouter } from "expo-router";
|
import { Stack, useRouter } from "expo-router";
|
||||||
import { Platform, TouchableOpacity, View } from "react-native";
|
import { Platform, TouchableOpacity, View } from "react-native";
|
||||||
import { Menu, Divider, Provider } from "react-native-paper";
|
|
||||||
import {useState} from "react";
|
|
||||||
|
|
||||||
|
|
||||||
export default function IndexLayout() {
|
export default function IndexLayout() {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const [menuVisible, setMenuVisible] = useState(false);
|
|
||||||
|
|
||||||
const openMenu = () => setMenuVisible(true);
|
|
||||||
const closeMenu = () => setMenuVisible(false);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Provider>
|
|
||||||
<Stack>
|
<Stack>
|
||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
name="index"
|
name="index"
|
||||||
@@ -29,23 +20,6 @@ export default function IndexLayout() {
|
|||||||
headerRight: () => (
|
headerRight: () => (
|
||||||
<View className="flex flex-row items-center space-x-2">
|
<View className="flex flex-row items-center space-x-2">
|
||||||
<Chromecast />
|
<Chromecast />
|
||||||
<Menu
|
|
||||||
visible={menuVisible}
|
|
||||||
onDismiss={closeMenu}
|
|
||||||
anchor={
|
|
||||||
<TouchableOpacity onPress={openMenu}>
|
|
||||||
<Feather name="menu" color={"white"} size={22} />
|
|
||||||
</TouchableOpacity>
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<Menu.Item
|
|
||||||
onPress={() => {
|
|
||||||
closeMenu();
|
|
||||||
router.push("/(auth)/(favorites)");
|
|
||||||
}}
|
|
||||||
title="Favorites"
|
|
||||||
/>
|
|
||||||
</Menu>
|
|
||||||
<TouchableOpacity
|
<TouchableOpacity
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
router.push("/(auth)/settings");
|
router.push("/(auth)/settings");
|
||||||
@@ -89,6 +63,5 @@ export default function IndexLayout() {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Stack>
|
</Stack>
|
||||||
</Provider>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import { NextUp } from "@/components/series/NextUp";
|
|||||||
import { SeasonPicker } from "@/components/series/SeasonPicker";
|
import { SeasonPicker } from "@/components/series/SeasonPicker";
|
||||||
import { SeriesActions } from "@/components/series/SeriesActions";
|
import { SeriesActions } from "@/components/series/SeriesActions";
|
||||||
import { SeriesHeader } from "@/components/series/SeriesHeader";
|
import { SeriesHeader } from "@/components/series/SeriesHeader";
|
||||||
import { FavoriteButton} from "@/components/series/FavoriteButton";
|
|
||||||
import { apiAtom, userAtom } from "@/providers/JellyfinProvider";
|
import { apiAtom, userAtom } from "@/providers/JellyfinProvider";
|
||||||
import { getBackdropUrl } from "@/utils/jellyfin/image/getBackdropUrl";
|
import { getBackdropUrl } from "@/utils/jellyfin/image/getBackdropUrl";
|
||||||
import { getLogoImageUrlById } from "@/utils/jellyfin/image/getLogoImageUrlById";
|
import { getLogoImageUrlById } from "@/utils/jellyfin/image/getLogoImageUrlById";
|
||||||
@@ -84,10 +83,6 @@ const page: React.FC = () => {
|
|||||||
!isLoading &&
|
!isLoading &&
|
||||||
allEpisodes &&
|
allEpisodes &&
|
||||||
allEpisodes.length > 0 && (
|
allEpisodes.length > 0 && (
|
||||||
<>
|
|
||||||
<View className="flex flex-row items-center space-x-2 right-3">
|
|
||||||
{item && <FavoriteButton seriesId={seriesId} />}
|
|
||||||
</View>
|
|
||||||
<View className="flex flex-row items-center space-x-2">
|
<View className="flex flex-row items-center space-x-2">
|
||||||
<DownloadItems
|
<DownloadItems
|
||||||
title="Download Series"
|
title="Download Series"
|
||||||
@@ -104,7 +99,6 @@ const page: React.FC = () => {
|
|||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
</View>
|
</View>
|
||||||
</>
|
|
||||||
),
|
),
|
||||||
});
|
});
|
||||||
}, [allEpisodes, isLoading]);
|
}, [allEpisodes, isLoading]);
|
||||||
|
|||||||
@@ -1,70 +0,0 @@
|
|||||||
import Ionicons from '@expo/vector-icons/Ionicons';
|
|
||||||
import { useAtom } from "jotai";
|
|
||||||
import { useCallback, useState, useEffect } from "react";
|
|
||||||
import { View } from "react-native";
|
|
||||||
import { apiAtom, userAtom } from "@/providers/JellyfinProvider";
|
|
||||||
import { getItemsApi, getUserLibraryApi } from "@jellyfin/sdk/lib/utils/api";
|
|
||||||
import { RoundButton } from "../RoundButton";
|
|
||||||
|
|
||||||
interface Props {
|
|
||||||
seriesId: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const FavoriteButton: React.FC<Props> = ({ seriesId }) => {
|
|
||||||
const [isFavorited, setIsFavorited] = useState(false);
|
|
||||||
const [api] = useAtom(apiAtom);
|
|
||||||
const [user] = useAtom(userAtom);
|
|
||||||
|
|
||||||
const checkIfFavorited = useCallback(async () => {
|
|
||||||
if (api && user) {
|
|
||||||
const response = await getItemsApi(api).getItems({
|
|
||||||
userId: user.Id,
|
|
||||||
isFavorite: true,
|
|
||||||
recursive: true,
|
|
||||||
});
|
|
||||||
if (!response.data.Items) return;
|
|
||||||
const isFavorite = response.data.Items.some((x: any) => x.Id === seriesId);
|
|
||||||
setIsFavorited(isFavorite);
|
|
||||||
}
|
|
||||||
}, [api, user, seriesId]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
checkIfFavorited();
|
|
||||||
}, [checkIfFavorited]);
|
|
||||||
|
|
||||||
const markFavorite = useCallback(async () => {
|
|
||||||
if (api && user) {
|
|
||||||
await getUserLibraryApi(api).markFavoriteItem({
|
|
||||||
userId: user.Id,
|
|
||||||
itemId: seriesId,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, [api, user, seriesId]);
|
|
||||||
|
|
||||||
const unmarkFavorite = useCallback(async () => {
|
|
||||||
if (api && user) {
|
|
||||||
await getUserLibraryApi(api).unmarkFavoriteItem({
|
|
||||||
userId: user.Id,
|
|
||||||
itemId: seriesId,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, [api, user, seriesId]);
|
|
||||||
|
|
||||||
const onFavorite = useCallback(async () => {
|
|
||||||
if (isFavorited) {
|
|
||||||
setIsFavorited(false);
|
|
||||||
await unmarkFavorite();
|
|
||||||
} else {
|
|
||||||
setIsFavorited(true);
|
|
||||||
await markFavorite();
|
|
||||||
}
|
|
||||||
}, [isFavorited, markFavorite, unmarkFavorite]);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<View>
|
|
||||||
<RoundButton onPress={onFavorite}>
|
|
||||||
<Ionicons name={isFavorited ? "heart-sharp" : "heart-outline"} size={22} color={isFavorited ? "purple" : "white"} />
|
|
||||||
</RoundButton>
|
|
||||||
</View>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -85,7 +85,6 @@
|
|||||||
"react-native-ios-utilities": "^4.5.1",
|
"react-native-ios-utilities": "^4.5.1",
|
||||||
"react-native-mmkv": "^2.12.2",
|
"react-native-mmkv": "^2.12.2",
|
||||||
"react-native-pager-view": "6.3.0",
|
"react-native-pager-view": "6.3.0",
|
||||||
"react-native-paper": "^5.12.5",
|
|
||||||
"react-native-progress": "^5.0.1",
|
"react-native-progress": "^5.0.1",
|
||||||
"react-native-reanimated": "~3.10.1",
|
"react-native-reanimated": "~3.10.1",
|
||||||
"react-native-reanimated-carousel": "4.0.0-canary.15",
|
"react-native-reanimated-carousel": "4.0.0-canary.15",
|
||||||
|
|||||||
Reference in New Issue
Block a user