Skip to content

Commit 873dddb

Browse files
committed
Added custom event callback
1 parent 34888b6 commit 873dddb

File tree

5 files changed

+34
-5
lines changed

5 files changed

+34
-5
lines changed

src/notifications.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,12 @@ class NotificationComponent extends HTMLElement {
108108
private handleActionButtonClick: EventListener = (e: Event) => {
109109
const target = e.currentTarget as HTMLElement;
110110
const index = parseInt(target.dataset.index);
111-
this.settings.buttons[index].callback();
111+
this.settings.buttons?.[index]?.callback();
112+
if (this.settings.buttons?.[index]?.event !== null) {
113+
window.dispatchEvent(new CustomEvent(this.settings.buttons[index].event, {
114+
detail: this.settings.buttons[index]?.eventData ?? null,
115+
}));
116+
}
112117
this.remove();
113118
};
114119

src/snackbar.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,12 @@ class SnackbarComponent extends HTMLElement {
8080
private handleActionButtonClick: EventListener = (e: Event) => {
8181
const target = e.currentTarget as HTMLElement;
8282
const index = parseInt(target.dataset.index);
83-
this.settings.buttons[index].callback();
83+
this.settings.buttons?.[index]?.callback();
84+
if (this.settings.buttons[index]?.event !== null) {
85+
window.dispatchEvent(new CustomEvent(this.settings.buttons[index].event, {
86+
detail: this.settings.buttons[index]?.eventData ?? null,
87+
}));
88+
}
8489
this.remove();
8590
};
8691

src/sonner.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ class Sonner extends HTMLElement {
120120
callback: ()=>{},
121121
label: "",
122122
classes: "",
123+
event: null,
124+
eventData: null,
123125
},
124126
}, settings);
125127

@@ -131,7 +133,6 @@ class Sonner extends HTMLElement {
131133
toast.classes = [toast.classes];
132134
}
133135
if (typeof toast.button?.callback !== "function") {
134-
console.warn("Sonner callback must be a function");
135136
toast.button.callback = ()=>{};
136137
}
137138
if (!toast.button?.classes) {
@@ -208,6 +209,11 @@ class SonnerToast extends HTMLElement {
208209
if (buttonEl) {
209210
buttonEl.addEventListener("click", ()=>{
210211
this.settings.button.callback();
212+
if (this.settings.button?.event !== null) {
213+
window.dispatchEvent(new CustomEvent(this.settings.button.event, {
214+
detail: this.settings.button?.eventData ?? null,
215+
}));
216+
}
211217
this.delete();
212218
});
213219
}

src/types.d.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
export type NotificationButton = {
22
label: string;
3-
callback: Function;
3+
callback?: Function;
44
ariaLabel?: string;
55
classes?: string[];
66
autofocus?: boolean;
7+
event: string;
8+
eventData: any;
79
};
810

911
export type SnackbarNotification = {
@@ -46,9 +48,11 @@ export type SonnerNotification = {
4648
duration: number,
4749
classes: Array<string>|string,
4850
button: {
49-
callback: Function,
51+
callback?: Function,
5052
label: string,
5153
classes: Array<string>|string,
54+
event?: string;
55+
eventData?: any;
5256
}
5357
}
5458

test/index.html

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,20 @@
4444

4545
let count = 0;
4646

47+
window.addEventListener("test-event", (e)=>{
48+
alert(e.detail);
49+
});
50+
4751
const sonner2 = document.body.querySelector(".js-sonner2");
4852
sonner2.addEventListener("click", ()=>{
4953
const event = new CustomEvent("notify:sonner", {
5054
detail: {
5155
message: `Example sonner toast message.`,
56+
button: {
57+
label: "Test",
58+
event: "test-event",
59+
eventData: "Hi mom!",
60+
}
5261
}
5362
});
5463
window.dispatchEvent(event);

0 commit comments

Comments
 (0)