WIP. A little custom music server
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: move album id route

+19 -8
+3 -1
web/src/pages.gen.ts
··· 6 6 // prettier-ignore 7 7 import type { getConfig as File_Index_getConfig } from './pages/index'; 8 8 // prettier-ignore 9 + import type { getConfig as File_AlbumId_getConfig } from './pages/album/[id]'; 10 + // prettier-ignore 9 11 import type { getConfig as File_About_getConfig } from './pages/about'; 10 12 11 13 // prettier-ignore 12 14 type Page = 13 15 | ({ path: '/' } & GetConfigResponse<typeof File_Index_getConfig>) 14 - | { path: '/album'; render: 'dynamic' } 16 + | ({ path: '/album/[id]' } & GetConfigResponse<typeof File_AlbumId_getConfig>) 15 17 | ({ path: '/about' } & GetConfigResponse<typeof File_About_getConfig>); 16 18 17 19 // prettier-ignore
+16 -7
web/src/pages/album/index.tsx web/src/pages/album/[id].tsx
··· 2 2 import { Console, Data, Effect, Schema } from "effect"; 3 3 import { Struct } from "effect/Schema"; 4 4 import { Link } from "waku"; 5 + import { PageProps } from "waku/router"; 5 6 6 7 async function getMock() { 7 8 return { ··· 65 66 class FetchFailedError extends Data.TaggedError("FetchFailedError")<{ 66 67 message: string; 67 68 cause?: unknown; 68 - }> {} 69 + }> { } 69 70 70 71 class JsonParseError extends Data.TaggedError("JsonParseError")<{ 71 72 message: string; 72 73 cause?: unknown; 73 - }> {} 74 + }> { } 74 75 75 76 const ArtistSchema = Schema.Struct({ 76 77 id: Schema.NonEmptyString, ··· 90 91 }); 91 92 92 93 function fetchAlbum(id: string) { 93 - return Effect.gen(function* () { 94 + return Effect.gen(function*() { 94 95 const request = yield* Effect.tryPromise({ 95 96 try: () => fetch(`http://localhost:3003/album/${id}`), 96 97 catch: (err) => ··· 114 115 }).pipe(Effect.tapError((err) => Console.error(err))); 115 116 } 116 117 117 - export default async function AlbumPage() { 118 + export default async function AlbumPage({ id }: PageProps<'/album/[id]'>) { 118 119 return await Effect.runPromise( 119 - Effect.gen(function* () { 120 + Effect.gen(function*() { 120 121 const data = yield* Effect.tryPromise(() => getMock()); 121 122 122 - const album = yield* fetchAlbum("019950fd-d124-7007-934a-49bc1fed41a2"); 123 + const album = yield* fetchAlbum(id); 123 124 124 125 return ( 125 126 <div className="grid grid-cols-1 lg:grid-cols-[1fr_4fr] max-w-6xl w-full gap-x-8 px-8 py-12"> ··· 172 173 </div> 173 174 </div> 174 175 ); 175 - }), 176 + }).pipe(Effect.catchAll(() => Effect.succeed("Not found"))), 176 177 ); 177 178 } 179 + 180 + 181 + export async function getConfig() { 182 + return { 183 + render: "dynamic" // TODO: Change to static with staticPaths:[''], 184 + } as const 185 + } 186 +