Skip to content

Commit 81b5c71

Browse files
committed
fix: prevent pointer events on Sonner toast when clicking outside the dialog
1 parent e8d134a commit 81b5c71

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

frontend/src/components/ui/dialog.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@ function DialogContent({
6060
className
6161
)}
6262
{...props}
63+
onPointerDownOutside={(e) => {
64+
if (
65+
e.target instanceof Element &&
66+
e.target.closest("[data-sonner-toast]")
67+
) {
68+
e.preventDefault();
69+
}
70+
}}
6371
>
6472
{children}
6573
{showCloseButton && (

frontend/src/components/ui/sonner.tsx

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
1-
import { useTheme } from "next-themes"
1+
2+
"use client";
3+
4+
import { useTheme } from "next-themes";
5+
import { createPortal } from 'react-dom';
26
import { Toaster as Sonner, type ToasterProps } from "sonner"
37
import { CircleCheckIcon, InfoIcon, TriangleAlertIcon, OctagonXIcon, Loader2Icon } from "lucide-react"
48

59
const Toaster = ({ ...props }: ToasterProps) => {
610
const { theme = "system" } = useTheme()
711

8-
return (
12+
const toasterContent = (
913
<Sonner
1014
theme={theme as ToasterProps["theme"]}
11-
className="toaster group"
15+
className="toaster group pointer-events-auto"
1216
icons={{
1317
success: (
1418
<CircleCheckIcon className="size-4" />
@@ -41,7 +45,11 @@ const Toaster = ({ ...props }: ToasterProps) => {
4145
}}
4246
{...props}
4347
/>
44-
)
48+
);
49+
50+
51+
return createPortal(toasterContent, document.body);
52+
4553
}
4654

4755
export { Toaster }

0 commit comments

Comments
 (0)