chore: better organized "delete announcement" dialog
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|||||||
Reference in New Issue
Block a user