Add delete piece button

This commit is contained in:
Szymon Nowakowski
2024-12-24 14:20:24 +01:00
parent 96800cc443
commit d8a1f3aa80

View File

@@ -14,7 +14,7 @@ import { Cause, Effect, Option } from "effect";
import { constant } from "effect/Function"; import { constant } from "effect/Function";
import { Download, Loader2, Trash, UploadCloud } from "lucide-react"; import { Download, Loader2, Trash, UploadCloud } from "lucide-react";
import { DragEventHandler, FormEventHandler, MouseEvent, useCallback, useId, useState } from "react"; import { DragEventHandler, FormEventHandler, MouseEvent, useCallback, useId, useState } from "react";
import { Link, useParams } from "react-router-dom"; import { Link, useNavigate, useParams } from "react-router-dom";
export function Piece() { export function Piece() {
@@ -60,6 +60,8 @@ namespace PieceForm {
function PieceForm(props: PieceForm.Props) { function PieceForm(props: PieceForm.Props) {
const navigate = useNavigate();
const [name, setName] = useState(props.piece.name); const [name, setName] = useState(props.piece.name);
const [composer, setComposer] = useState(() => Option.getOrElse(props.piece.composer, constant(""))); const [composer, setComposer] = useState(() => Option.getOrElse(props.piece.composer, constant("")));
const [lyricist, setLyricist] = useState(() => Option.getOrElse(props.piece.lyricist, constant(""))); const [lyricist, setLyricist] = useState(() => Option.getOrElse(props.piece.lyricist, constant("")));
@@ -70,14 +72,15 @@ function PieceForm(props: PieceForm.Props) {
const lyricistId = useId(); const lyricistId = useId();
const arrangerId = useId(); const arrangerId = useId();
const [isLoading, setIsLoading] = useState(false); const [isSaving, setIsSaving] = useState(false);
const [isDeleting, setIsDeleting] = useState(false);
const onSubmit: FormEventHandler<HTMLFormElement> = async (e) => { const onSubmit: FormEventHandler<HTMLFormElement> = async (e) => {
e.preventDefault(); e.preventDefault();
const delay = timeout(250); const delay = timeout(250);
try { try {
setIsLoading(true); setIsSaving(true);
const { error } = await client.piece({ pieceId: props.piece.pieceId }).put({ const { error } = await client.piece({ pieceId: props.piece.pieceId }).put({
name, name,
@@ -92,10 +95,30 @@ function PieceForm(props: PieceForm.Props) {
} }
} finally { } finally {
await delay; await delay;
setIsLoading(false); setIsSaving(false);
} }
};
const doDelete = useCallback(async () => {
try {
setIsDeleting(true);
const { error } = await client
.piece({ pieceId: props.piece.pieceId })
.delete();
if (error !== null) {
console.error(error.value);
return;
} }
Effect.runFork(pieceCache.invalidate(props.piece.pieceId));
navigate("..");
} finally {
setIsDeleting(false);
}
}, [props.piece.pieceId, navigate]);
return ( return (
<form className="flex flex-col gap-4" onSubmit={onSubmit}> <form className="flex flex-col gap-4" onSubmit={onSubmit}>
<div className="grid items-baseline grid-cols-4 gap-4"> <div className="grid items-baseline grid-cols-4 gap-4">
@@ -133,9 +156,13 @@ function PieceForm(props: PieceForm.Props) {
onChange={(e) => setArranger(e.target.value)} onChange={(e) => setArranger(e.target.value)}
/> />
</div> </div>
<div className="flex flex-col-reverse items-end"> <div className="flex justify-between">
<Button type="submit" disabled={isLoading}> <Button type="button" variant="destructive" disabled={isDeleting} onClick={doDelete}>
{isLoading && <Loader2 className="animate-spin" />} {isDeleting && <Loader2 className="animate-spin" />}
Usuń
</Button>
<Button type="submit" disabled={isSaving}>
{isSaving && <Loader2 className="animate-spin" />}
Zapisz Zapisz
</Button> </Button>
</div> </div>