Skip to content

Instantly share code, notes, and snippets.

@whoisthisstud
Forked from TWithers/alpine-livewire-errors.js
Last active August 11, 2022 18:58
Show Gist options
  • Select an option

  • Save whoisthisstud/b676e075afa16c89fd7f5223f9eb6ff5 to your computer and use it in GitHub Desktop.

Select an option

Save whoisthisstud/b676e075afa16c89fd7f5223f9eb6ff5 to your computer and use it in GitHub Desktop.
Alpine Livewire Errors
<h1>List</h1>
<ul
x-data="{items: @entangle('items').defer, newItem:'', errors:{}}"
@validation.window="errors = $event.detail">
<template x-for="(item, index) in items">
<li x-bind:class="errors['item.'+index'] ? 'text-danger' : ''">
<span x-text="item"></span>
<i x-show="errors['item.'+index']"
x-text="errors['item.'+index] ? errors['item.'+index].join(' ') : ''"
>
</i>
</li>
</template>
</ul>
<input type="text" x-model="newItem" placeholder="Enter something">
<button type="button" @click="items.push(newItem)">Append</button>
<button type="button" @click="$wire.persistItems()">Persist</button>
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