| import { AgentListResponse } from 'librechat-data-provider'; |
| import React, { useState, useEffect } from 'react'; |
|
|
| interface SmartLoaderProps { |
| |
| isLoading: boolean; |
| |
| hasData: boolean; |
| |
| delay?: number; |
| |
| loadingComponent: React.ReactNode; |
| |
| children: React.ReactNode; |
| |
| className?: string; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| export const SmartLoader: React.FC<SmartLoaderProps> = ({ |
| isLoading, |
| hasData, |
| delay = 150, |
| loadingComponent, |
| children, |
| className = '', |
| }) => { |
| const [shouldShowLoading, setShouldShowLoading] = useState(false); |
|
|
| useEffect(() => { |
| let timeoutId: NodeJS.Timeout; |
|
|
| if (isLoading && !hasData) { |
| |
| timeoutId = setTimeout(() => { |
| setShouldShowLoading(true); |
| }, delay); |
| } else { |
| |
| setShouldShowLoading(false); |
| } |
|
|
| return () => { |
| if (timeoutId) { |
| clearTimeout(timeoutId); |
| } |
| }; |
| }, [isLoading, hasData, delay]); |
|
|
| |
| if (shouldShowLoading) { |
| return <div className={className}>{loadingComponent}</div>; |
| } |
|
|
| |
| return <div className={className}>{children}</div>; |
| }; |
|
|
| |
| |
| |
| |
| export const useHasData = (data: AgentListResponse | undefined): boolean => { |
| if (!data) return false; |
|
|
| |
| if (typeof data === 'object' && data !== null) { |
| |
| if ('agents' in data) { |
| const agents = (data as any).agents; |
| return Array.isArray(agents) && agents.length > 0; |
| } |
|
|
| |
| if ('id' in data || 'name' in data) { |
| return true; |
| } |
| } |
|
|
| |
| if (Array.isArray(data)) { |
| return data.length > 0; |
| } |
|
|
| return false; |
| }; |
|
|
| export default SmartLoader; |
|
|