| | 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; |
| |
|