From 43157cef4e7f7a55ad5e865124684c81d0451e76 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Sun, 16 Nov 2025 01:19:17 +0100 Subject: [PATCH] feat: add album and media management features, including album creation, media upload, and routing --- libertas-frontend/.env.example | 1 + .../src/components/albums/album-card.tsx | 36 +++++++ .../components/albums/create-album-dialog.tsx | 90 ++++++++++++++++ .../src/components/layout/sidebar.tsx | 70 ++++++++++++ .../components/media/authenticated-image.tsx | 80 ++++++++++++++ .../src/components/media/media-viewer.tsx | 41 +++++++ .../src/components/media/upload-dialog.tsx | 76 +++++++++++++ .../src/features/albums/use-albums.ts | 30 ++++++ .../src/features/media/use-media.ts | 45 ++++++++ libertas-frontend/src/routeTree.gen.ts | 100 +++++++++++++++++- libertas-frontend/src/routes/__root.tsx | 27 ++++- .../src/routes/albums/$albumId.tsx | 19 ++++ libertas-frontend/src/routes/albums/index.tsx | 34 ++++++ libertas-frontend/src/routes/media/index.tsx | 72 +++++++++++++ libertas-frontend/src/routes/people/index.tsx | 17 +++ .../src/services/album-service.ts | 26 +++++ libertas-frontend/src/services/api-client.ts | 2 +- .../src/services/media-service.ts | 56 ++++++++++ 18 files changed, 814 insertions(+), 8 deletions(-) create mode 100644 libertas-frontend/.env.example create mode 100644 libertas-frontend/src/components/albums/album-card.tsx create mode 100644 libertas-frontend/src/components/albums/create-album-dialog.tsx create mode 100644 libertas-frontend/src/components/layout/sidebar.tsx create mode 100644 libertas-frontend/src/components/media/authenticated-image.tsx create mode 100644 libertas-frontend/src/components/media/media-viewer.tsx create mode 100644 libertas-frontend/src/components/media/upload-dialog.tsx create mode 100644 libertas-frontend/src/features/albums/use-albums.ts create mode 100644 libertas-frontend/src/features/media/use-media.ts create mode 100644 libertas-frontend/src/routes/albums/$albumId.tsx create mode 100644 libertas-frontend/src/routes/albums/index.tsx create mode 100644 libertas-frontend/src/routes/media/index.tsx create mode 100644 libertas-frontend/src/routes/people/index.tsx create mode 100644 libertas-frontend/src/services/album-service.ts create mode 100644 libertas-frontend/src/services/media-service.ts diff --git a/libertas-frontend/.env.example b/libertas-frontend/.env.example new file mode 100644 index 0000000..92f2a1c --- /dev/null +++ b/libertas-frontend/.env.example @@ -0,0 +1 @@ +VITE_API_BASE_URL=http://localhost:8000/api/v1 \ No newline at end of file diff --git a/libertas-frontend/src/components/albums/album-card.tsx b/libertas-frontend/src/components/albums/album-card.tsx new file mode 100644 index 0000000..494ae0d --- /dev/null +++ b/libertas-frontend/src/components/albums/album-card.tsx @@ -0,0 +1,36 @@ +import { type Album } from "@/domain/types"; +import { + Card, + CardContent, + CardFooter, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { Link } from "@tanstack/react-router"; +import { ImageIcon } from "lucide-react"; + +type AlbumCardProps = { + album: Album; +}; + +export function AlbumCard({ album }: AlbumCardProps) { + return ( + + + +
+ {/* TODO: Show album.thumbnail_url here */} + +
+
+ + {album.name} + + + {/* TODO: Show photo count */} +

0 items

+
+
+ + ); +} diff --git a/libertas-frontend/src/components/albums/create-album-dialog.tsx b/libertas-frontend/src/components/albums/create-album-dialog.tsx new file mode 100644 index 0000000..bfbdc29 --- /dev/null +++ b/libertas-frontend/src/components/albums/create-album-dialog.tsx @@ -0,0 +1,90 @@ +import { useState } from "react"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, + DialogFooter, + DialogClose, +} from "@/components/ui/dialog"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Textarea } from "@/components/ui/textarea"; +import { useCreateAlbum } from "@/features/albums/use-albums"; +import { Plus } from "lucide-react"; + +export function CreateAlbumDialog() { + const [isOpen, setIsOpen] = useState(false); + const { mutate: createAlbum, isPending } = useCreateAlbum(); + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + const formData = new FormData(e.currentTarget); + const name = formData.get("name") as string; + const description = formData.get("description") as string; + + if (name) { + createAlbum( + { name, description }, + { + onSuccess: () => { + setIsOpen(false); + // TODO: Add toast + }, + } + ); + } + }; + + return ( + + + + + +
+ + Create New Album + + Give your new album a name and description. + + +
+
+ + +
+
+ +