/** * 전역 로딩 상태 관리 스토어 (로딩 카운터 방식) * 여러 비동기 작업이 동시에 진행되어도 안전하게 로딩 상태를 관리합니다. */ export const useLoadingStore = defineStore( "loading", () => { // 로딩 카운터 - 0보다 크면 로딩 중 const loadingCount = ref(0); // 현재 로딩 중인 작업들의 메시지 const loadingMessages = ref([]); // 로딩 상태 (카운터가 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, // 로딩 상태는 새로고침 시 초기화되어야 함 } );