From 39fdfff514d46cb70b7ba60cde303a5826749d29 Mon Sep 17 00:00:00 2001 From: Nikita Barinov Date: Tue, 4 Aug 2026 12:43:52 +0400 Subject: [PATCH 1/2] fix(test): make custom toast dismiss test actually verify dismissal --- test/src/app/page.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/test/src/app/page.tsx b/test/src/app/page.tsx index 975268b..28eed2e 100644 --- a/test/src/app/page.tsx +++ b/test/src/app/page.tsx @@ -148,6 +148,7 @@ export default function Home({ searchParams }: any) { ), { id: undefined, + duration: Infinity, }, ) } From ff3e94ac208da45ce8a7c615ec351a127aaa5208 Mon Sep 17 00:00:00 2001 From: Nikita Barinov Date: Tue, 4 Aug 2026 12:49:11 +0400 Subject: [PATCH 2/2] feat: expose toast.subscribe for toast lifecycle events --- src/state.ts | 2 +- test/src/app/page.tsx | 16 ++++++++++++++++ test/tests/basic.spec.ts | 12 ++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/state.ts b/src/state.ts index 29d70b8..b1bd917 100644 --- a/src/state.ts +++ b/src/state.ts @@ -360,5 +360,5 @@ export const toast = Object.assign( dismiss: ToastState.dismiss, loading: ToastState.loading, }, - { getHistory, getToasts }, + { getHistory, getToasts, subscribe: ToastState.subscribe }, ); diff --git a/test/src/app/page.tsx b/test/src/app/page.tsx index 28eed2e..edd3277 100644 --- a/test/src/app/page.tsx +++ b/test/src/app/page.tsx @@ -23,6 +23,20 @@ export default function Home({ searchParams }: any) { const [isFinally, setIsFinally] = React.useState(false); const [showAriaLabels, setShowAriaLabels] = React.useState(false); const [historySize, setHistorySize] = React.useState(null); + const [subscribeEvents, setSubscribeEvents] = React.useState(0); + const [subscribeDismissed, setSubscribeDismissed] = React.useState(0); + const dismissedIds = React.useRef(new Set()); + + React.useEffect(() => { + return toast.subscribe((t) => { + setSubscribeEvents((count) => count + 1); + + if ('dismiss' in t && t.dismiss) { + dismissedIds.current.add(t.id); + setSubscribeDismissed(dismissedIds.current.size); + } + }); + }, []); return ( <> @@ -33,6 +47,8 @@ export default function Home({ searchParams }: any) { + {subscribeEvents} + {subscribeDismissed} diff --git a/test/tests/basic.spec.ts b/test/tests/basic.spec.ts index 5b93a48..226af1b 100644 --- a/test/tests/basic.spec.ts +++ b/test/tests/basic.spec.ts @@ -473,4 +473,16 @@ test.describe('Basic functionality', () => { await expect(toast).toHaveCount(0); }); + + test('toast.subscribe notifies about lifecycle events', async ({ page }) => { + await expect(page.getByTestId('subscribe-events')).toHaveText('0'); + + await page.getByTestId('close-button').click(); + await expect(page.getByTestId('subscribe-events')).toHaveText('1'); + await expect(page.getByTestId('subscribe-dismissed')).toHaveText('0'); + + await page.locator('[data-sonner-toast]').hover(); + await page.getByLabel('Close toast').click(); + await expect(page.getByTestId('subscribe-dismissed')).toHaveText('1'); + }); });