diff --git a/packages/frontend/src/app.tsx b/packages/frontend/src/app.tsx index 39e0680..12f5b66 100644 --- a/packages/frontend/src/app.tsx +++ b/packages/frontend/src/app.tsx @@ -7,13 +7,21 @@ import { Repertoire } from "@/routes/Repertoire"; import { Repertoires } from "@/routes/Repertoires"; import { Root } from "@/routes/Root"; import { Settings } from "@/routes/Settings"; -import { lazy, StrictMode } from "react"; +import { AttachmentId, PieceId, RepertoireId } from "common"; +import { Effect, pipe } from "effect"; +import { ListMusic, Music3, SettingsIcon, Users } from "lucide-react"; +import { lazy, ReactNode, StrictMode } from "react"; import { createRoot } from "react-dom/client"; -import { createBrowserRouter, RouterProvider } from "react-router-dom"; +import { createBrowserRouter, Params, RouterProvider } from "react-router-dom"; +import { pieceCache, repertoireCache } from "./cache"; import "./style.css"; const Attachment = lazy(() => import("@/routes/Attachment")); +export interface Handle { + readonly breadcrumb?: (params: Params) => Effect.Effect; +} + const router = createBrowserRouter([ { path: "/", @@ -25,6 +33,12 @@ const router = createBrowserRouter([ }, { path: "piece", + handle: { + breadcrumb: () => Effect.succeed(<> + +
Utwory
+ ), + }, children: [ { index: true, @@ -32,6 +46,13 @@ const router = createBrowserRouter([ }, { path: ":pieceId", + handle: { + breadcrumb: (params: Params) => pipe( + PieceId.make(params.pieceId!), + pieceCache.get, + Effect.map((piece) => piece.name), + ), + }, children: [ { index: true, @@ -39,6 +60,17 @@ const router = createBrowserRouter([ }, { path: "attachment/:attachmentId", + handle: { + breadcrumb: (params: Params) => Effect.gen(function* () { + const pieceId = PieceId.make(params.pieceId!); + const attachmentId = AttachmentId.make(params.attachmentId!); + + const piece = yield* pieceCache.get(pieceId); + const attachment = piece.attachments.find((attachment) => attachment.attachmentId === attachmentId)!; + + return attachment.filename; + }), + }, Component: Attachment, }, ], @@ -47,6 +79,12 @@ const router = createBrowserRouter([ }, { path: "repertoire", + handle: { + breadcrumb: () => Effect.succeed(<> + +
Repertuary
+ ), + }, children: [ { index: true, @@ -54,16 +92,35 @@ const router = createBrowserRouter([ }, { path: ":repertoireId", + handle: { + breadcrumb: (params: Params) => pipe( + RepertoireId.make(params.repertoireId!), + repertoireCache.get, + Effect.map((repertoire) => repertoire.name), + ), + }, Component: Repertoire, }, ], }, { path: "settings", + handle: { + breadcrumb: () => Effect.succeed(<> + +
Ustawienia
+ ), + }, Component: Settings, }, { path: "admin", + handle: { + breadcrumb: () => Effect.succeed(<> + +
Administracja
+ ), + }, Component: Admin, } ], diff --git a/packages/frontend/src/components/ui/breadcrumb.tsx b/packages/frontend/src/components/ui/breadcrumb.tsx new file mode 100644 index 0000000..bbb0064 --- /dev/null +++ b/packages/frontend/src/components/ui/breadcrumb.tsx @@ -0,0 +1,111 @@ +import { cn } from "@/lib/utils"; +import { Slot } from "@radix-ui/react-slot"; +import { ChevronRight, MoreHorizontal } from "lucide-react"; +import * as React from "react"; + +const Breadcrumb = React.forwardRef< + HTMLElement, + React.ComponentPropsWithoutRef<"nav"> & { + separator?: React.ReactNode + } +>(({ ...props }, ref) =>