From 96ac6a2a6fa0f4d236e2f024bcb128751b2c9594 Mon Sep 17 00:00:00 2001 From: Matthias Nannt Date: Tue, 25 Apr 2023 16:26:15 +0200 Subject: [PATCH] add delete action functionality --- .../events/EventActivityTab.tsx | 4 +-- .../events/EventSettingsTab.tsx | 32 ++++++++++++++++++- apps/web/components/shared/ModalWithTabs.tsx | 8 ++++- apps/web/lib/eventClasses/eventClasses.ts | 14 ++++++++ .../event-classes/[eventClassId]/index.ts | 2 +- packages/ui/components/Button.tsx | 4 +-- 6 files changed, 57 insertions(+), 7 deletions(-) diff --git a/apps/web/app/environments/[environmentId]/events/EventActivityTab.tsx b/apps/web/app/environments/[environmentId]/events/EventActivityTab.tsx index 48252da61a..757dad9b64 100644 --- a/apps/web/app/environments/[environmentId]/events/EventActivityTab.tsx +++ b/apps/web/app/environments/[environmentId]/events/EventActivityTab.tsx @@ -61,13 +61,13 @@ export default function EventActivityTab({ environmentId, eventClassId }: Activi

- {convertDateTimeStringShort(eventClass.createdAt.toString())} + {convertDateTimeStringShort(eventClass.createdAt?.toString())}

{" "}

- {convertDateTimeStringShort(eventClass.updatedAt.toString())} + {convertDateTimeStringShort(eventClass.updatedAt?.toString())}

diff --git a/apps/web/app/environments/[environmentId]/events/EventSettingsTab.tsx b/apps/web/app/environments/[environmentId]/events/EventSettingsTab.tsx index 8ca3519930..6b57cca27a 100644 --- a/apps/web/app/environments/[environmentId]/events/EventSettingsTab.tsx +++ b/apps/web/app/environments/[environmentId]/events/EventSettingsTab.tsx @@ -4,7 +4,7 @@ import { ErrorComponent } from "@formbricks/ui"; import { Input } from "@formbricks/ui"; import { Label } from "@formbricks/ui"; import { RadioGroup, RadioGroupItem } from "@formbricks/ui"; -import { useEventClass, useEventClasses } from "@/lib/eventClasses/eventClasses"; +import { deleteEventClass, useEventClass, useEventClasses } from "@/lib/eventClasses/eventClasses"; import { useEventClassMutation } from "@/lib/eventClasses/mutateEventClasses"; import { Controller, useForm } from "react-hook-form"; import type { NoCodeConfig, Event } from "@formbricks/types/events"; @@ -12,6 +12,8 @@ import { testURLmatch } from "./testURLmatch"; import { useState } from "react"; import { toast } from "react-hot-toast"; import clsx from "clsx"; +import { TrashIcon } from "@heroicons/react/24/outline"; +import DeleteDialog from "@/components/shared/DeleteDialog"; interface EventSettingsTabProps { environmentId: string; @@ -21,6 +23,7 @@ interface EventSettingsTabProps { export default function EventSettingsTab({ environmentId, eventClassId, setOpen }: EventSettingsTabProps) { const { eventClass, isLoadingEventClass, isErrorEventClass } = useEventClass(environmentId, eventClassId); + const [openDeleteDialog, setOpenDeleteDialog] = useState(false); const { register, handleSubmit, control, watch } = useForm({ defaultValues: { @@ -255,6 +258,17 @@ export default function EventSettingsTab({ environmentId, eventClassId, setOpen
+ {eventClass.type !== "automatic" && ( + + )} + @@ -268,6 +282,22 @@ export default function EventSettingsTab({ environmentId, eventClassId, setOpen )}
+ { + setOpen(false); + try { + await deleteEventClass(environmentId, eventClass.id); + mutateEventClasses(); + toast.success("Action deleted successfully"); + } catch (error) { + toast.error("Something went wrong. Please try again."); + } + }} + />
); } diff --git a/apps/web/components/shared/ModalWithTabs.tsx b/apps/web/components/shared/ModalWithTabs.tsx index c1dd2ce0ba..31a3510182 100644 --- a/apps/web/components/shared/ModalWithTabs.tsx +++ b/apps/web/components/shared/ModalWithTabs.tsx @@ -1,5 +1,5 @@ import Modal from "@/components/shared/Modal"; -import { useState } from "react"; +import { useEffect, useState } from "react"; interface ModalWithTabsProps { open: boolean; @@ -22,6 +22,12 @@ export default function ModalWithTabs({ open, setOpen, tabs, icon, label, descri setActiveTab(index); }; + useEffect(() => { + if (!open) { + setActiveTab(0); + } + }, [open]); + return (
diff --git a/apps/web/lib/eventClasses/eventClasses.ts b/apps/web/lib/eventClasses/eventClasses.ts index bb9be68eec..bef865a7c4 100644 --- a/apps/web/lib/eventClasses/eventClasses.ts +++ b/apps/web/lib/eventClasses/eventClasses.ts @@ -43,3 +43,17 @@ export const createEventClass = async (environmentId, eventClass: Event) => { return response.json(); }; + +export const deleteEventClass = async (environmentId: string, eventClassId: string) => { + try { + const res = await fetch(`/api/v1/environments/${environmentId}/event-classes/${eventClassId}`, { + method: "DELETE", + }); + if (!res.ok) { + throw Error(`deleteEventClass: unable to delete eventClass: ${res.statusText}`); + } + } catch (error) { + console.error(error); + throw Error(`deleteEventClass: unable to delete eventClass: ${error.message}`); + } +}; diff --git a/apps/web/pages/api/v1/environments/[environmentId]/event-classes/[eventClassId]/index.ts b/apps/web/pages/api/v1/environments/[environmentId]/event-classes/[eventClassId]/index.ts index 62fd217f8e..3482e4ec69 100644 --- a/apps/web/pages/api/v1/environments/[environmentId]/event-classes/[eventClassId]/index.ts +++ b/apps/web/pages/api/v1/environments/[environmentId]/event-classes/[eventClassId]/index.ts @@ -139,7 +139,7 @@ export default async function handle(req: NextApiRequest, res: NextApiResponse) return res.status(403).json({ message: "Automatic event classes cannot be deleted" }); } - const prismaRes = await prisma.survey.delete({ + const prismaRes = await prisma.eventClass.delete({ where: { id: eventClassId }, }); return res.json(prismaRes); diff --git a/packages/ui/components/Button.tsx b/packages/ui/components/Button.tsx index 2dd60ba624..7412a67002 100644 --- a/packages/ui/components/Button.tsx +++ b/packages/ui/components/Button.tsx @@ -111,8 +111,8 @@ export const Button: React.ForwardRefExoticComponent< {StartIcon && (