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 && (