<template> <div class="w-full border border-white border-opacity-10 rounded-xl p-4 my-2" :class="notification.enabled ? 'bg-primary bg-opacity-25' : 'bg-error bg-opacity-5'"> <div class="flex flex-wrap items-center"> <p class="text-base md:text-lg font-semibold pr-4">{{ eventName }}</p> <div class="flex-grow" /> <ui-btn v-if="eventName === 'onTest' && notification.enabled" :loading="testing" small class="mr-2" @click.stop="fireTestEventAndSucceed">Fire onTest Event</ui-btn> <ui-btn v-if="eventName === 'onTest' && notification.enabled" :loading="testing" small class="mr-2" color="red-600" @click.stop="fireTestEventAndFail">Fire & Fail</ui-btn> <!-- <ui-btn v-if="eventName === 'onTest' && notification.enabled" :loading="testing" small class="mr-2" @click.stop="rapidFireTestEvents">Rapid Fire</ui-btn> --> <ui-btn v-else-if="notification.enabled" :loading="sendingTest" small class="mr-2" @click.stop="sendTestClick">Test</ui-btn> <ui-btn v-else :loading="enabling" small color="success" class="mr-2" @click="enableNotification">Enable</ui-btn> <ui-icon-btn :size="7" icon-font-size="1.1rem" icon="edit" class="mr-2" @click="editNotification" /> <ui-icon-btn bg-color="error" :size="7" icon-font-size="1.2rem" icon="delete" @click="deleteNotificationClick" /> </div> <div class="pt-4"> <p class="text-gray-300 text-xs md:text-sm mb-2">{{ notification.urls.join(', ') }}</p> <p v-if="lastFiredAt && lastAttemptFailed" class="text-red-300 text-xs">Last attempt failed {{ $dateDistanceFromNow(lastFiredAt) }} ({{ numConsecutiveFailedAttempts }} attempt{{ numConsecutiveFailedAttempts === 1 ? '' : 's' }})</p> <p v-else-if="lastFiredAt" class="text-gray-400 text-xs">Last fired {{ $dateDistanceFromNow(lastFiredAt) }}</p> </div> </div> </template> <script> export default { props: { notification: { type: Object, default: () => {} } }, data() { return { sendingTest: false, enabling: false, deleting: false, testing: false } }, computed: { eventName() { return this.notification ? this.notification.eventName : null }, lastFiredAt() { return this.notification ? this.notification.lastFiredAt : null }, lastAttemptFailed() { return this.notification ? this.notification.lastAttemptFailed : null }, numConsecutiveFailedAttempts() { return this.notification ? this.notification.numConsecutiveFailedAttempts : null } }, methods: { // For testing using the onTest event fireTestEventAndFail() { this.fireTestEvent(true) }, fireTestEventAndSucceed() { this.fireTestEvent(false) }, fireTestEvent(intentionallyFail = false) { this.testing = true this.$axios .$get(`/api/notifications/test?fail=${intentionallyFail ? 1 : 0}`) .then(() => { this.$toast.success('Triggered onTest Event') }) .catch((error) => { console.error('Failed', error) const errorMsg = error.response ? error.response.data : null this.$toast.error(`Failed: ${errorMsg}` || 'Failed to trigger onTest event') }) .finally(() => { this.testing = false }) }, rapidFireTestEvents() { this.testing = true var numFired = 0 var interval = setInterval(() => { this.fireTestEvent() numFired++ if (numFired > 25) { this.testing = false clearInterval(interval) } }, 100) }, // End testing functions sendTestClick() { const payload = { message: `Trigger this notification with test data?`, callback: (confirmed) => { if (confirmed) { this.sendTest() } }, type: 'yesNo' } this.$store.commit('globals/setConfirmPrompt', payload) }, sendTest() { this.sendingTest = true this.$axios .$get(`/api/notifications/${this.notification.id}/test`) .then(() => { this.$toast.success('Triggered test notification') }) .catch((error) => { console.error('Failed', error) const errorMsg = error.response ? error.response.data : null this.$toast.error(`Failed: ${errorMsg}` || 'Failed to trigger test notification') }) .finally(() => { this.sendingTest = false }) }, enableNotification() { this.enabling = true const payload = { id: this.notification.id, enabled: true } this.$axios .$patch(`/api/notifications/${this.notification.id}`, payload) .then((updatedSettings) => { this.$emit('update', updatedSettings) this.$toast.success('Notification enabled') }) .catch((error) => { console.error('Failed to update notification', error) this.$toast.error('Failed to update notification') }) .finally(() => { this.enabling = false }) }, deleteNotificationClick() { const payload = { message: `Are you sure you want to delete this notification?`, callback: (confirmed) => { if (confirmed) { this.deleteNotification() } }, type: 'yesNo' } this.$store.commit('globals/setConfirmPrompt', payload) }, deleteNotification() { this.deleting = true this.$axios .$delete(`/api/notifications/${this.notification.id}`) .then((updatedSettings) => { this.$emit('update', updatedSettings) this.$toast.success('Deleted notification') }) .catch((error) => { console.error('Failed', error) this.$toast.error('Failed to delete notification') }) .finally(() => { this.deleting = false }) }, editNotification() { this.$emit('edit', this.notification) } }, mounted() {} } </script>