76 lines
2.1 KiB
TypeScript
76 lines
2.1 KiB
TypeScript
/**
|
|
* 전역 로딩 상태 관리 스토어 (로딩 카운터 방식)
|
|
* 여러 비동기 작업이 동시에 진행되어도 안전하게 로딩 상태를 관리합니다.
|
|
*/
|
|
export const useLoadingStore = defineStore(
|
|
"loading",
|
|
() => {
|
|
// 로딩 카운터 - 0보다 크면 로딩 중
|
|
const loadingCount = ref(0);
|
|
|
|
// 현재 로딩 중인 작업들의 메시지
|
|
const loadingMessages = ref<string[]>([]);
|
|
|
|
// 로딩 상태 (카운터가 0보다 크면 true)
|
|
const isLoading = computed(() => loadingCount.value > 0);
|
|
|
|
// 현재 로딩 메시지 (가장 최근 메시지 또는 기본 메시지)
|
|
const currentMessage = computed(
|
|
() =>
|
|
loadingMessages.value[loadingMessages.value.length - 1] || "로딩 중..."
|
|
);
|
|
|
|
// 로딩 시작
|
|
const startLoading = (message?: string) => {
|
|
loadingCount.value++;
|
|
if (message) {
|
|
loadingMessages.value.push(message);
|
|
}
|
|
};
|
|
|
|
// 로딩 종료
|
|
const stopLoading = (message?: string) => {
|
|
loadingCount.value = Math.max(0, loadingCount.value - 1);
|
|
|
|
if (message && loadingMessages.value.length > 0) {
|
|
const index = loadingMessages.value.lastIndexOf(message);
|
|
if (index > -1) {
|
|
loadingMessages.value.splice(index, 1);
|
|
}
|
|
} else if (loadingMessages.value.length > 0) {
|
|
// 메시지가 지정되지 않으면 가장 최근 메시지 제거
|
|
loadingMessages.value.pop();
|
|
}
|
|
};
|
|
|
|
// 모든 로딩 강제 종료
|
|
const clearAllLoading = () => {
|
|
loadingCount.value = 0;
|
|
loadingMessages.value = [];
|
|
};
|
|
|
|
// 로딩 상태 리셋
|
|
const reset = () => {
|
|
loadingCount.value = 0;
|
|
loadingMessages.value = [];
|
|
};
|
|
|
|
return {
|
|
// 상태
|
|
loadingCount: readonly(loadingCount),
|
|
loadingMessages: readonly(loadingMessages),
|
|
isLoading,
|
|
currentMessage,
|
|
|
|
// 액션
|
|
startLoading,
|
|
stopLoading,
|
|
clearAllLoading,
|
|
reset,
|
|
};
|
|
},
|
|
{
|
|
persist: false, // 로딩 상태는 새로고침 시 초기화되어야 함
|
|
}
|
|
);
|