Merge pull request #16 from Pasithea0/main

Added bookmarks to card thingy
This commit is contained in:
Captain Jack Sparrow 2024-05-03 13:32:57 -04:00 committed by GitHub
commit dbd7b13407
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 55 additions and 1 deletions

View File

@ -18,7 +18,7 @@ export const SearchBarInput = forwardRef<HTMLInputElement, SearchBarProps>(
const [focused, setFocused] = useState(false); const [focused, setFocused] = useState(false);
function setSearch(value: string) { function setSearch(value: string) {
props.onChange(value, false); props.onChange(value, true);
} }
return ( return (

View File

@ -0,0 +1,44 @@
import { useCallback, useMemo } from "react";
import { Icons } from "@/components/Icon";
import { useBookmarkStore } from "@/stores/bookmarks";
import { PlayerMeta } from "@/stores/player/slices/source";
import { MediaItem } from "@/utils/mediaTypes";
import { IconPatch } from "../buttons/IconPatch";
interface MediaBookmarkProps {
media: MediaItem;
}
export function MediaBookmarkButton({ media }: MediaBookmarkProps) {
const addBookmark = useBookmarkStore((s) => s.addBookmark);
const removeBookmark = useBookmarkStore((s) => s.removeBookmark);
const bookmarks = useBookmarkStore((s) => s.bookmarks);
const meta: PlayerMeta | undefined = useMemo(() => {
return media.year !== undefined
? {
type: media.type,
title: media.title,
tmdbId: media.id,
releaseYear: media.year,
poster: media.poster,
}
: undefined;
}, [media]);
const isBookmarked = !!bookmarks[meta?.tmdbId ?? ""];
const toggleBookmark = useCallback(() => {
if (!meta) return;
if (isBookmarked) removeBookmark(meta.tmdbId);
else addBookmark(meta);
}, [isBookmarked, meta, addBookmark, removeBookmark]);
return (
<IconPatch
onClick={toggleBookmark}
icon={isBookmarked ? Icons.BOOKMARK : Icons.BOOKMARK_OUTLINE}
className="p-3 opacity-80 transition-opacity duration-200 hover:opacity-100"
/>
);
}

View File

@ -6,8 +6,10 @@ import { Link } from "react-router-dom";
import { mediaItemToId } from "@/backend/metadata/tmdb"; import { mediaItemToId } from "@/backend/metadata/tmdb";
import { DotList } from "@/components/text/DotList"; import { DotList } from "@/components/text/DotList";
import { Flare } from "@/components/utils/Flare"; import { Flare } from "@/components/utils/Flare";
import { useSearchQuery } from "@/hooks/useSearchQuery";
import { MediaItem } from "@/utils/mediaTypes"; import { MediaItem } from "@/utils/mediaTypes";
import { MediaBookmarkButton } from "./MediaBookmark";
import { IconPatch } from "../buttons/IconPatch"; import { IconPatch } from "../buttons/IconPatch";
import { Icons } from "../Icon"; import { Icons } from "../Icon";
@ -56,6 +58,8 @@ function MediaCardContent({
const dotListContent = [t(`media.types.${media.type}`)]; const dotListContent = [t(`media.types.${media.type}`)];
const [searchQuery] = useSearchQuery();
if (media.year) { if (media.year) {
dotListContent.push(media.year.toFixed()); dotListContent.push(media.year.toFixed());
} }
@ -141,6 +145,12 @@ function MediaCardContent({
</> </>
) : null} ) : null}
{canLink && searchQuery.length > 0 ? (
<div className="absolute" onClick={(e) => e.preventDefault()}>
<MediaBookmarkButton media={media} />
</div>
) : null}
<div <div
className={`absolute inset-0 flex items-center justify-center bg-mediaCard-badge bg-opacity-80 transition-opacity duration-500 ${ className={`absolute inset-0 flex items-center justify-center bg-mediaCard-badge bg-opacity-80 transition-opacity duration-500 ${
closable ? "opacity-100" : "pointer-events-none opacity-0" closable ? "opacity-100" : "pointer-events-none opacity-0"