Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | 33x 32x 32x 32x 32x 4x 3x 3x 3x 1x 32x 1x 1x 32x 5x 5x 32x 4x 4x 32x 1x 1x 32x 12x 20x 20x | import BasicLayout from "main/layouts/BasicLayout/BasicLayout";
import { useBackend, useBackendMutation } from "main/utils/useBackend";
import ReviewTable from "main/components/Reviews/ReviewTable";
import { useNavigate } from "react-router";
import { useState } from "react";
import { Modal, Button } from "react-bootstrap";
import { toast } from "react-toastify";
export default function MyReviewsIndexPage() {
const navigate = useNavigate();
const { data, isLoading, error } = useBackend(
// Stryker disable next-line all: don't test internal caching of React Query
["/api/reviews/userReviews"],
// Stryker disable next-line all: default method is get, so replacing with an empty string will do nothing
{ method: "GET", url: `/api/reviews/userReviews` },
);
const [showDeleteModal, setShowDeleteModal] = useState(false);
const [pendingDelete, setPendingDelete] = useState(null);
const deleteMutation = useBackendMutation(
(review) => ({
url: "/api/reviews/reviewer",
method: "DELETE",
params: { id: review.id },
}),
{
onSuccess: () => {
toast.success("Review deleted");
setShowDeleteModal(false);
setPendingDelete(null);
},
onError: () => {
toast.error("Error deleting review");
},
},
// Stryker disable next-line all : don't test internal caching of React Query
["/api/reviews/userReviews"],
);
const onEdit = (cell) => {
const id = cell.row.original.id;
navigate(`/myreviews/edit/${id}`);
};
const onDelete = (cell) => {
setPendingDelete(cell.row.original);
setShowDeleteModal(true);
};
const handleDeleteConfirm = () => {
// Stryker disable next-line all : don't test guard clause of pendingDelete
Iif (!pendingDelete) return;
deleteMutation.mutate(pendingDelete);
};
const handleDeleteCancel = () => {
setShowDeleteModal(false);
setPendingDelete(null);
};
if (isLoading) {
return (
<BasicLayout>
<p>Loading...</p>
</BasicLayout>
);
}
// Stryker disable next-line all : Don't mutate error block
Iif (error) {
return (
<BasicLayout>
<p>Error loading reviews.</p>
</BasicLayout>
);
}
return (
<BasicLayout>
<h1>My Reviews</h1>
<ReviewTable
data={data}
userOptions={true}
moderatorOptions={false}
onEdit={onEdit}
onDelete={onDelete}
/>
<Modal
show={showDeleteModal}
onHide={handleDeleteCancel}
data-testid="delete-modal"
>
<Modal.Header closeButton>
<Modal.Title>Confirm Delete</Modal.Title>
</Modal.Header>
<Modal.Body>Are you sure you want to delete this review?</Modal.Body>
<Modal.Footer>
<Button variant="secondary" onClick={handleDeleteCancel}>
Cancel
</Button>
<Button
variant="danger"
onClick={handleDeleteConfirm}
disabled={deleteMutation.isLoading}
>
{deleteMutation.isLoading ? "Deleting..." : "Delete"}
</Button>
</Modal.Footer>
</Modal>
</BasicLayout>
);
}
|