|
|
|
@ -1,8 +1,10 @@
@@ -1,8 +1,10 @@
|
|
|
|
|
import { useCallback } from "react"; |
|
|
|
|
|
|
|
|
|
import { IconPatch } from "@/components/buttons/IconPatch"; |
|
|
|
|
import { Icons } from "@/components/Icon"; |
|
|
|
|
import { useBookmarkStore } from "@/stores/bookmarks"; |
|
|
|
|
import { usePlayerStore } from "@/stores/player/store"; |
|
|
|
|
import { MediaItem } from "@/utils/mediaTypes"; |
|
|
|
|
|
|
|
|
|
import { VideoPlayerButton } from "./Button"; |
|
|
|
|
|
|
|
|
@ -28,3 +30,39 @@ export function BookmarkButton() {
@@ -28,3 +30,39 @@ export function BookmarkButton() {
|
|
|
|
|
/> |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function MediaCardBookmarkButton(props: { media: MediaItem }) { |
|
|
|
|
const addBookmark = useBookmarkStore((s) => s.addBookmark); |
|
|
|
|
const removeBookmark = useBookmarkStore((s) => s.removeBookmark); |
|
|
|
|
const bookmarks = useBookmarkStore((s) => s.bookmarks); |
|
|
|
|
const isBookmarked = !!bookmarks[props.media.id]; |
|
|
|
|
|
|
|
|
|
const toggleBookmark = useCallback( |
|
|
|
|
(event: React.MouseEvent<HTMLDivElement, MouseEvent>) => { |
|
|
|
|
event.preventDefault(); |
|
|
|
|
if (!props.media.year) return; |
|
|
|
|
if (isBookmarked) { |
|
|
|
|
removeBookmark(props.media.id); |
|
|
|
|
} else { |
|
|
|
|
addBookmark({ |
|
|
|
|
tmdbId: props.media.id, |
|
|
|
|
title: props.media.title, |
|
|
|
|
releaseYear: props.media.year, |
|
|
|
|
type: props.media.type, |
|
|
|
|
poster: props.media.poster, |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
[isBookmarked, props.media, addBookmark, removeBookmark], |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
if (!props.media.year) return null; |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
<IconPatch |
|
|
|
|
clickable |
|
|
|
|
onClick={toggleBookmark} |
|
|
|
|
icon={isBookmarked ? Icons.BOOKMARK : Icons.BOOKMARK_OUTLINE} |
|
|
|
|
/> |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|