Skip to content

Instantly share code, notes, and snippets.

@TWithers
Created July 23, 2022 18:33
Show Gist options
  • Save TWithers/c36aebd60e8f5219e99b10fddd0b05d2 to your computer and use it in GitHub Desktop.
Save TWithers/c36aebd60e8f5219e99b10fddd0b05d2 to your computer and use it in GitHub Desktop.
let alpineLoaded = false;
let livewireLoaded = false;
document.addEventListener('alpine:init', () => {
alpineLoaded = true;
setupLivewireErrorListener();
});
document.addEventListener('livewire:load', () => {
livewireLoaded = true;
setupLivewireErrorListener();
});
function setupLivewireErrorListener() {
if (!alpineLoaded || !livewireLoaded) {
return;
}
//Because errorBag is a global Alpine.reactive, it can be accessed inside alpine
//via $watch(() => window.errorBag, val => errors = val.errors)
window.errorBag = Alpine.reactive({errors:{}});
window.Livewire.hook("message.processed", (message, component) => {
let errorEvent;
if (Array.isArray(message.response.serverMemo.errors) && message.response.serverMemo.errors.length === 0) {
window.errorBag.errors = {};
errorEvent = new CustomEvent('validation', {detail: {}});
} else {
window.errorBag.errors = message.response.serverMemo.errors
errorEvent = new CustomEvent('validation', {detail: message.response.serverMemo.errors});
}
//dispatch custom validation event so it can be listened for via @validation.window or via @validation on the root level node
window.dispatchEvent(errorEvent);
component.el.dispatchEvent(errorEvent);
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment