38 lines
1.2 KiB
JavaScript
38 lines
1.2 KiB
JavaScript
(function() {
|
|
htmx.defineExtension("hx-redirect-toast", {
|
|
isInlineSwap: function(swapStyle) {
|
|
return swapStyle === "hx-redirect-toast";
|
|
},
|
|
handleSwap: function(swapStyle, target, fragment, settleInfo, htmxConfig) {
|
|
var xhr = htmxConfig.xhr;
|
|
var hxRedirect = xhr.getResponseHeader("HX-Redirect");
|
|
var hxTrigger = xhr.getResponseHeader("HX-Trigger");
|
|
|
|
// Redirect immediately (toast will be shown on the new page)
|
|
if (hxRedirect) {
|
|
window.location.href = hxRedirect;
|
|
}
|
|
|
|
// Only dispatch HX-Trigger events for toasts when not redirecting
|
|
if (!hxRedirect && hxTrigger) {
|
|
var triggers = JSON.parse(hxTrigger);
|
|
var events = Array.isArray(triggers) ? triggers : [triggers];
|
|
events.forEach(function(triggerObj) {
|
|
Object.entries(triggerObj).forEach(function(entry) {
|
|
var name = entry[0];
|
|
var detail = entry[1];
|
|
try { detail = JSON.parse(detail); } catch(e) {}
|
|
target.dispatchEvent(new CustomEvent(name, {
|
|
detail: detail,
|
|
bubbles: true,
|
|
cancelable: true
|
|
}));
|
|
});
|
|
});
|
|
}
|
|
// Return null to prevent any DOM swap
|
|
return null;
|
|
}
|
|
});
|
|
})();
|