first commit
This commit is contained in:
57
resources/js/composables/useGlobalLoading.ts
Normal file
57
resources/js/composables/useGlobalLoading.ts
Normal file
@@ -0,0 +1,57 @@
|
||||
import { computed, ref } from 'vue';
|
||||
|
||||
/**
|
||||
* Глобальный индикатор загрузки. Баннер показывается только если операция длится
|
||||
* дольше SHOW_DELAY_MS — чтобы не мигать на быстрых переходах.
|
||||
*
|
||||
* Перенесено из проекта onboard (Composables/useGlobalLoading.js).
|
||||
*/
|
||||
const pending = ref(0);
|
||||
const visible = ref(false);
|
||||
let showTimer: ReturnType<typeof setTimeout> | null = null;
|
||||
|
||||
const SHOW_DELAY_MS = 3000;
|
||||
|
||||
const scheduleShow = (): void => {
|
||||
if (visible.value || showTimer) {
|
||||
return;
|
||||
}
|
||||
|
||||
showTimer = setTimeout(() => {
|
||||
showTimer = null;
|
||||
|
||||
if (pending.value > 0) {
|
||||
visible.value = true;
|
||||
}
|
||||
}, SHOW_DELAY_MS);
|
||||
};
|
||||
|
||||
const cancelScheduledShow = (): void => {
|
||||
if (!showTimer) {
|
||||
return;
|
||||
}
|
||||
|
||||
clearTimeout(showTimer);
|
||||
showTimer = null;
|
||||
};
|
||||
|
||||
export const startGlobalLoading = (): void => {
|
||||
pending.value += 1;
|
||||
scheduleShow();
|
||||
};
|
||||
|
||||
export const stopGlobalLoading = (): void => {
|
||||
pending.value = Math.max(0, pending.value - 1);
|
||||
|
||||
if (pending.value === 0) {
|
||||
cancelScheduledShow();
|
||||
visible.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
export const useGlobalLoading = () => {
|
||||
return {
|
||||
isGlobalLoading: computed(() => visible.value),
|
||||
pendingCount: computed(() => pending.value),
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user