From ad0c04bd203dcc8b39acf49d8a6b95e340668002 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Thu, 4 Dec 2025 00:07:26 +0100 Subject: [PATCH] tag management --- .../media/media-details-sidebar.tsx | 50 +++++++++++++++++-- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/libertas-frontend/src/components/media/media-details-sidebar.tsx b/libertas-frontend/src/components/media/media-details-sidebar.tsx index 10e18be..a144fa1 100644 --- a/libertas-frontend/src/components/media/media-details-sidebar.tsx +++ b/libertas-frontend/src/components/media/media-details-sidebar.tsx @@ -1,6 +1,6 @@ import type { FaceRegion, Media, MediaMetadata } from "@/domain/types"; import { useGetMediaDetails } from "@/features/media/use-media"; -import { useListMediaTags } from "@/features/tags/use-tags"; +import { useListMediaTags, useAddMediaTags, useRemoveMediaTag } from "@/features/tags/use-tags"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Accordion, @@ -13,6 +13,10 @@ import { PersonFaceBadge } from "@/components/people/person-face-badge"; import { Skeleton } from "@/components/ui/skeleton"; import { format, parseISO } from "date-fns"; import { Separator } from "../ui/separator"; +import { useState } from "react"; +import { Input } from "@/components/ui/input"; +import { Button } from "@/components/ui/button"; +import { Plus, X } from "lucide-react"; type MediaDetailsSidebarProps = { media: Media; @@ -42,6 +46,23 @@ export function MediaDetailsSidebar({ media.id ); const { data: tags, isLoading: isLoadingTags } = useListMediaTags(media.id); + const addTags = useAddMediaTags(media.id); + const removeTag = useRemoveMediaTag(media.id); + const [newTag, setNewTag] = useState(""); + + const handleAddTag = () => { + if (!newTag.trim()) return; + addTags.mutate( + { tags: [newTag.trim()] }, + { + onSuccess: () => setNewTag(""), + } + ); + }; + + const handleRemoveTag = (tagName: string) => { + removeTag.mutate(tagName); + }; const displayDate = media.date_taken ? format(parseISO(media.date_taken), "MMMM d, yyyy 'at' h:mm a") @@ -102,14 +123,35 @@ export function MediaDetailsSidebar({ Tags - - {/* TODO: Add input to add tags */} + +
+ setNewTag(e.target.value)} + onKeyDown={(e) => { + if (e.key === "Enter") handleAddTag(); + }} + className="h-8" + /> + +
+ {isLoadingTags && } {tags && tags.length > 0 && (
{tags.map((tag) => ( - + {tag.name} + ))}