import type { NativeSyntheticEvent } from "react-native"; import type { ContextMenuOnPressNativeEvent } from "react-native-context-menu-view"; import { useCallback } from "react"; import { Keyboard, TouchableOpacity } from "react-native"; import ContextMenu from "react-native-context-menu-view"; import { useRouter } from "expo-router"; import { Image, Text, View } from "tamagui"; import { useToast } from "~/hooks/useToast"; import { usePlayerStore } from "~/stores/player/store"; import { useBookmarkStore, useWatchHistoryStore } from "~/stores/settings"; export interface ItemData { id: string; title: string; type: "movie" | "tv"; season?: number; episode?: number; year: number; release_date?: Date; posterUrl: string; } enum ContextMenuActions { Bookmark = "Bookmark", RemoveBookmark = "Remove Bookmark", Download = "Download", RemoveWatchHistoryItem = "Remove from Continue Watching", } function checkReleased(media: ItemData): boolean { const isReleasedYear = Boolean( media.year && media.year <= new Date().getFullYear(), ); const isReleasedDate = Boolean( media.release_date && media.release_date <= new Date(), ); // If the media has a release date, use that, otherwise use the year const isReleased = media.release_date ? isReleasedDate : isReleasedYear; return isReleased; } export default function Item({ data }: { data: ItemData }) { const resetVideo = usePlayerStore((state) => state.resetVideo); const router = useRouter(); const { isBookmarked, addBookmark, removeBookmark } = useBookmarkStore(); const { hasWatchHistoryItem, removeFromWatchHistory } = useWatchHistoryStore(); const { showToast } = useToast(); const { title, type, year, posterUrl } = data; const isReleased = useCallback(() => checkReleased(data), [data]); const handlePress = () => { if (!isReleased()) { showToast("This media is not released yet", { burntOptions: { preset: "error" }, }); return; } resetVideo(); Keyboard.dismiss(); router.push({ pathname: "/videoPlayer", params: { data: JSON.stringify(data) }, }); }; const contextMenuActions = [ { title: isBookmarked(data) ? ContextMenuActions.RemoveBookmark : ContextMenuActions.Bookmark, }, ...(type === "movie" ? [{ title: ContextMenuActions.Download }] : []), ...(hasWatchHistoryItem(data) ? [{ title: ContextMenuActions.RemoveWatchHistoryItem }] : []), ]; const onContextMenuPress = ( e: NativeSyntheticEvent, ) => { if (e.nativeEvent.name === ContextMenuActions.Bookmark) { addBookmark(data); showToast("Added to bookmarks", { burntOptions: { preset: "done" }, }); } else if (e.nativeEvent.name === ContextMenuActions.RemoveBookmark) { removeBookmark(data); showToast("Removed from bookmarks", { burntOptions: { preset: "done" }, }); } else if (e.nativeEvent.name === ContextMenuActions.Download) { router.push({ pathname: "/videoPlayer", params: { data: JSON.stringify(data), download: "true" }, }); } else if ( e.nativeEvent.name === ContextMenuActions.RemoveWatchHistoryItem ) { removeFromWatchHistory(data); showToast("Removed from Continue Watching", { burntOptions: { preset: "done" }, }); } }; return ( {}} style={{ width: "100%" }} > {title} {type === "tv" ? "Show" : "Movie"} {isReleased() ? year : "Unreleased"} ); }