Added request cancel on create
This seems to not be always effective on really low connections, as the cancel request doesn't seem to be instantanneous.
This commit is contained in:
@@ -74,3 +74,14 @@
|
|||||||
@apply bg-background text-foreground;
|
@apply bg-background text-foreground;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.fade-cancel-enter-active,
|
||||||
|
.fade-cancel-leave-active {
|
||||||
|
transition: all .5s ease 1s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fade-cancel-enter-from,
|
||||||
|
.fade-cancel-leave-to {
|
||||||
|
opacity: 0;
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import type { RPGDate } from '~/models/Date';
|
|||||||
import { PhAlarm, PhCircleNotch, PhMapPinArea } from '@phosphor-icons/vue'
|
import { PhAlarm, PhCircleNotch, PhMapPinArea } from '@phosphor-icons/vue'
|
||||||
|
|
||||||
const { eventSkeleton } = storeToRefs(useCalendarEvents())
|
const { eventSkeleton } = storeToRefs(useCalendarEvents())
|
||||||
const { resetSkeleton, submitSkeleton } = useCalendarEvents()
|
const { resetSkeleton, submitSkeleton, cancelLatestRequest } = useCalendarEvents()
|
||||||
const popoverOpen = ref(false)
|
const popoverOpen = ref(false)
|
||||||
const isLoading = ref(false)
|
const isLoading = ref(false)
|
||||||
|
|
||||||
@@ -60,6 +60,14 @@ function handleClosing(e: Event) {
|
|||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Click on the cancel button
|
||||||
|
*/
|
||||||
|
function handleCancel() {
|
||||||
|
cancelLatestRequest()
|
||||||
|
isLoading.value = false
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -143,9 +151,17 @@ function handleClosing(e: Event) {
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="text-right">
|
<div class="flex gap-2 justify-end">
|
||||||
|
<Transition name="fade-cancel">
|
||||||
|
<UiButton v-if="isLoading" type="button" size="sm" variant="destructive" @click.prevent="handleCancel">
|
||||||
|
Annuler
|
||||||
|
</UiButton>
|
||||||
|
</Transition>
|
||||||
|
|
||||||
<UiButton size="sm" :disabled="isLoading">
|
<UiButton size="sm" :disabled="isLoading">
|
||||||
<PhCircleNotch v-if="isLoading" size="20" class="opacity-50 animate-spin"/>
|
<Transition name="fade-cancel">
|
||||||
|
<PhCircleNotch v-if="isLoading" size="20" class="opacity-50 animate-spin"/>
|
||||||
|
</Transition>
|
||||||
|
|
||||||
Sauvegarder
|
Sauvegarder
|
||||||
</UiButton>
|
</UiButton>
|
||||||
|
|||||||
@@ -187,6 +187,8 @@ export const useCalendarEvents = defineStore('calendar-events', () => {
|
|||||||
* EVENT CREATION FUNCTIONS
|
* EVENT CREATION FUNCTIONS
|
||||||
*/
|
*/
|
||||||
const lastActiveEvent = ref<CalendarEvent | null>()
|
const lastActiveEvent = ref<CalendarEvent | null>()
|
||||||
|
let abortController: AbortController | null = null
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dummy event to hold creation data
|
* Dummy event to hold creation data
|
||||||
*/
|
*/
|
||||||
@@ -205,31 +207,52 @@ export const useCalendarEvents = defineStore('calendar-events', () => {
|
|||||||
* We assume it's been sanitized by the caller
|
* We assume it's been sanitized by the caller
|
||||||
*/
|
*/
|
||||||
async function submitSkeleton() {
|
async function submitSkeleton() {
|
||||||
|
abortController = new AbortController()
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const res = await $fetch('/api/calendars/events/create', { method: 'POST', body: { event : eventSkeleton.value, calendarId: calendarId.value }})
|
const res = await $fetch('/api/calendars/events/create', { method: 'POST', body: { event : eventSkeleton.value, calendarId: calendarId.value }, signal: abortController.signal })
|
||||||
|
|
||||||
baseEvents.value.push(res)
|
baseEvents.value.push(res)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log(err)
|
console.log(err)
|
||||||
|
} finally {
|
||||||
|
abortController = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function cancelLatestRequest() {
|
||||||
|
if (abortController) {
|
||||||
|
abortController.abort()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function updateEventFromSkeleton() {
|
async function updateEventFromSkeleton() {
|
||||||
|
abortController = new AbortController()
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const res = await $fetch(`/api/calendars/events/${eventSkeleton.value.id}`, { method: 'PATCH', body: { event : eventSkeleton.value, calendarId: calendarId.value }})
|
const res = await $fetch(`/api/calendars/events/${eventSkeleton.value.id}`, { method: 'PATCH', body: { event : eventSkeleton.value, calendarId: calendarId.value }, signal: abortController.signal })
|
||||||
|
|
||||||
const eventIndex = baseEvents.value.findIndex(e => e.id === eventSkeleton.value.id)
|
const eventIndex = baseEvents.value.findIndex(e => e.id === eventSkeleton.value.id)
|
||||||
baseEvents.value[eventIndex] = res
|
baseEvents.value[eventIndex] = res
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log(err)
|
console.log(err)
|
||||||
|
} finally {
|
||||||
|
abortController = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function deleteEventFromSkeleton() {
|
async function deleteEventFromSkeleton() {
|
||||||
|
abortController = new AbortController()
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await $fetch(`/api/calendars/events/${eventSkeleton.value.id}`, { method: 'DELETE' })
|
await $fetch(`/api/calendars/events/${eventSkeleton.value.id}`, { method: 'DELETE', signal: abortController.signal })
|
||||||
|
|
||||||
const eventIndex = baseEvents.value.findIndex(e => e.id === eventSkeleton.value.id)
|
const eventIndex = baseEvents.value.findIndex(e => e.id === eventSkeleton.value.id)
|
||||||
baseEvents.value.splice(eventIndex, 1)
|
baseEvents.value.splice(eventIndex, 1)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log(err)
|
console.log(err)
|
||||||
|
} finally {
|
||||||
|
abortController = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -239,6 +262,7 @@ export const useCalendarEvents = defineStore('calendar-events', () => {
|
|||||||
currentEvents,
|
currentEvents,
|
||||||
getRelativeEventFromDate,
|
getRelativeEventFromDate,
|
||||||
getRelativeEventFromEvent,
|
getRelativeEventFromEvent,
|
||||||
|
cancelLatestRequest,
|
||||||
eventSkeleton,
|
eventSkeleton,
|
||||||
resetSkeleton,
|
resetSkeleton,
|
||||||
submitSkeleton,
|
submitSkeleton,
|
||||||
|
|||||||
Reference in New Issue
Block a user