chore: better organized "delete announcement" dialog

This commit is contained in:
redglow
2026-06-21 14:54:33 +02:00
parent 7edb5f4957
commit 3ea13bf9c9
2 changed files with 23 additions and 24 deletions
@@ -6,25 +6,39 @@ import {
DialogContentText, DialogContentText,
DialogTitle, DialogTitle,
} from "@mui/material"; } from "@mui/material";
import { useCallback } from "react";
import { useDeleteAnnouncementMutation } from "../hooks";
import type { Announcement } from "../services"; import type { Announcement } from "../services";
export interface DeleteAnnouncementDialogProps { export interface DeleteAnnouncementDialogProps {
isDeleteConfirmationOpen: boolean; isDeleteConfirmationOpen: boolean;
denyDelete(): void; closeDeleteConfirmation(): void;
confirmDelete(): void;
announcement: Announcement; announcement: Announcement;
} }
export function DeleteAnnouncementDialog({ export function DeleteAnnouncementDialog({
announcement, announcement,
confirmDelete, closeDeleteConfirmation,
denyDelete,
isDeleteConfirmationOpen, isDeleteConfirmationOpen,
}: DeleteAnnouncementDialogProps) { }: DeleteAnnouncementDialogProps) {
const deleteAnnouncementMutation = useDeleteAnnouncementMutation();
const confirmDelete = useCallback(() => {
closeDeleteConfirmation();
if (announcement === undefined) {
throw new Error("Cannot delete announcement without an attempt set.");
}
deleteAnnouncementMutation.mutate(announcement.id);
}, [
announcement,
closeDeleteConfirmation,
deleteAnnouncementMutation.mutate,
]);
return ( return (
<Dialog <Dialog
open={isDeleteConfirmationOpen} open={isDeleteConfirmationOpen}
onClose={denyDelete} onClose={closeDeleteConfirmation}
role="alertdialog" role="alertdialog"
> >
<DialogTitle>Delete announcement</DialogTitle> <DialogTitle>Delete announcement</DialogTitle>
@@ -34,7 +48,7 @@ export function DeleteAnnouncementDialog({
<strong>{announcement.title}</strong>? <strong>{announcement.title}</strong>?
</DialogContentText> </DialogContentText>
<DialogActions> <DialogActions>
<Button onClick={denyDelete} autoFocus> <Button onClick={closeDeleteConfirmation} autoFocus>
No No
</Button> </Button>
<Button onClick={confirmDelete}>Yes</Button> <Button onClick={confirmDelete}>Yes</Button>
+3 -18
View File
@@ -1,11 +1,11 @@
import { Alert, Box, CircularProgress, Typography } from "@mui/material"; import { Alert, Box, CircularProgress, Typography } from "@mui/material";
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from "@tanstack/react-router";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useState } from "react";
import { AnnouncementTable } from "../components/AnnouncementTable"; import { AnnouncementTable } from "../components/AnnouncementTable";
import { DeleteAnnouncementDialog } from "../components/DeleteAnnouncementDialog"; import { DeleteAnnouncementDialog } from "../components/DeleteAnnouncementDialog";
import { RouterButton } from "../components/RouterButton"; import { RouterButton } from "../components/RouterButton";
import { useBoolean } from "../components/use-boolean"; import { useBoolean } from "../components/use-boolean";
import { useAnnouncementsQuery, useDeleteAnnouncementMutation } from "../hooks"; import { useAnnouncementsQuery } from "../hooks";
import type { Announcement } from "../services"; import type { Announcement } from "../services";
export const Route = createFileRoute("/")({ export const Route = createFileRoute("/")({
@@ -15,8 +15,6 @@ export const Route = createFileRoute("/")({
function RouteComponent() { function RouteComponent() {
const announcementsQuery = useAnnouncementsQuery(); const announcementsQuery = useAnnouncementsQuery();
const deleteAnnouncementMutation = useDeleteAnnouncementMutation();
// delete confirmation dialog status // delete confirmation dialog status
const [ const [
isDeleteConfirmationOpen, isDeleteConfirmationOpen,
@@ -39,18 +37,6 @@ function RouteComponent() {
[openDeleteConfirmationDialog], [openDeleteConfirmationDialog],
); );
const confirmDelete = useCallback(() => {
closeDeleteConfirmation();
if (announcementForLatestDeleteAttempt === undefined) {
throw new Error("Cannot delete announcement without an attempt set.");
}
deleteAnnouncementMutation.mutate(announcementForLatestDeleteAttempt?.id);
}, [
announcementForLatestDeleteAttempt,
closeDeleteConfirmation,
deleteAnnouncementMutation.mutate,
]);
// handle loading / error / show values // handle loading / error / show values
return ( return (
<Box sx={{ flexDirection: "column", display: "flex", gap: "3em" }}> <Box sx={{ flexDirection: "column", display: "flex", gap: "3em" }}>
@@ -75,8 +61,7 @@ function RouteComponent() {
{announcementForLatestDeleteAttempt && ( {announcementForLatestDeleteAttempt && (
<DeleteAnnouncementDialog <DeleteAnnouncementDialog
announcement={announcementForLatestDeleteAttempt} announcement={announcementForLatestDeleteAttempt}
confirmDelete={confirmDelete} closeDeleteConfirmation={closeDeleteConfirmation}
denyDelete={closeDeleteConfirmation}
isDeleteConfirmationOpen={isDeleteConfirmationOpen} isDeleteConfirmationOpen={isDeleteConfirmationOpen}
/> />
)} )}