Single repertoire view WIP
This commit is contained in:
41
packages/frontend/src/routes/Repertoire.tsx
Normal file
41
packages/frontend/src/routes/Repertoire.tsx
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import { Piece, repertoireCache } from "@/cache";
|
||||||
|
import { useLoadingEffect } from "@/hooks/useLoading";
|
||||||
|
import { mapProp, Update } from "@/hooks/useStore";
|
||||||
|
import { RepertoireId } from "common";
|
||||||
|
import { Cause, Effect } from "effect";
|
||||||
|
import { useCallback } from "react";
|
||||||
|
import { useParams } from "react-router-dom";
|
||||||
|
|
||||||
|
export function Repertoire() {
|
||||||
|
|
||||||
|
const id = RepertoireId(useParams().repertoireId!);
|
||||||
|
|
||||||
|
const { isLoading, error, data, setData } = useLoadingEffect(Effect.uninterruptible(repertoireCache.get(id)), [id]);
|
||||||
|
|
||||||
|
const setEntries = useCallback((action: Update<readonly Piece[]>) => {
|
||||||
|
setData!(mapProp("entries", action));
|
||||||
|
Effect.runFork(repertoireCache.invalidate(id));
|
||||||
|
}, [setData]);
|
||||||
|
|
||||||
|
if (isLoading) {
|
||||||
|
return (
|
||||||
|
<div className="w-full h-full overflow-hidden flex items-center justify-center">
|
||||||
|
<div>Ładowanie…</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="p-4 overflow-y-auto flex flex-wrap items-start gap-4">
|
||||||
|
{error !== null ? (
|
||||||
|
Cause.isUnknownException(error) ? "Wystąpił nieznany błąd" : `Wystąpił błąd: ${error.value}`
|
||||||
|
) : (<>
|
||||||
|
<div className="flex flex-col gap-4 p-4 border rounded">
|
||||||
|
<h3 className="font-bold">Repertuar</h3>
|
||||||
|
<RepertoireForm repertoire={data} />
|
||||||
|
</div>
|
||||||
|
<Entries repertoireId={id} entries={data.entries} setData={setData} />
|
||||||
|
</>)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user