/** * 로딩 상태를 쉽게 사용할 수 있는 컴포저블 * 로딩 카운터 방식으로 여러 비동기 작업을 안전하게 관리합니다. */ export const useLoading = () => { const loadingStore = useLoadingStore(); /** * 로딩 상태와 함께 비동기 함수를 실행합니다. * 함수 실행 중에는 자동으로 로딩 카운터가 증가하고, 완료되면 감소합니다. * * @param asyncFn 실행할 비동기 함수 * @param message 로딩 메시지 (선택사항) * @returns Promise 비동기 함수의 결과 */ const withLoading = async ( asyncFn: () => Promise, message?: string ): Promise => { loadingStore.startLoading(message); try { return await asyncFn(); } finally { loadingStore.stopLoading(message); } }; /** * 로딩 상태를 수동으로 관리할 때 사용합니다. * * @param message 로딩 메시지 (선택사항) * @returns 로딩 종료 함수 */ const startLoading = (message?: string) => { loadingStore.startLoading(message); return () => loadingStore.stopLoading(message); }; /** * 특정 메시지로 로딩을 시작하고, 해당 메시지로 종료할 수 있는 함수를 반환합니다. * * @param message 로딩 메시지 * @returns 로딩 종료 함수 */ const withMessage = (message: string) => { loadingStore.startLoading(message); return () => loadingStore.stopLoading(message); }; return { // 상태 isLoading: computed(() => loadingStore.isLoading), loadingCount: computed(() => loadingStore.loadingCount), currentMessage: computed(() => loadingStore.currentMessage), loadingMessages: computed(() => loadingStore.loadingMessages), // 액션 startLoading, stopLoading: loadingStore.stopLoading, withLoading, withMessage, clearAll: loadingStore.clearAllLoading, reset: loadingStore.reset, }; };