66 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			66 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * 로딩 상태를 쉽게 사용할 수 있는 컴포저블
							 | 
						||
| 
								 | 
							
								 * 로딩 카운터 방식으로 여러 비동기 작업을 안전하게 관리합니다.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								export const useLoading = () => {
							 | 
						||
| 
								 | 
							
								  const loadingStore = useLoadingStore();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * 로딩 상태와 함께 비동기 함수를 실행합니다.
							 | 
						||
| 
								 | 
							
								   * 함수 실행 중에는 자동으로 로딩 카운터가 증가하고, 완료되면 감소합니다.
							 | 
						||
| 
								 | 
							
								   *
							 | 
						||
| 
								 | 
							
								   * @param asyncFn 실행할 비동기 함수
							 | 
						||
| 
								 | 
							
								   * @param message 로딩 메시지 (선택사항)
							 | 
						||
| 
								 | 
							
								   * @returns Promise<T> 비동기 함수의 결과
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  const withLoading = async <T>(
							 | 
						||
| 
								 | 
							
								    asyncFn: () => Promise<T>,
							 | 
						||
| 
								 | 
							
								    message?: string
							 | 
						||
| 
								 | 
							
								  ): Promise<T> => {
							 | 
						||
| 
								 | 
							
								    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,
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								};
							 |