mirror of
https://github.com/KuekHaoYang/KVideo.git
synced 2026-08-12 23:33:43 +08:00
80 lines
2.5 KiB
TypeScript
80 lines
2.5 KiB
TypeScript
|
|
import { ResultsHeader } from '@/components/search/ResultsHeader';
|
|
import { SourceBadges } from '@/components/search/SourceBadges';
|
|
import { TypeBadges } from '@/components/search/TypeBadges';
|
|
import { VideoGrid } from '@/components/search/VideoGrid';
|
|
import { useSourceBadges } from '@/lib/hooks/useSourceBadges';
|
|
import { useTypeBadges } from '@/lib/hooks/useTypeBadges';
|
|
import { Video, SourceBadge } from '@/lib/types';
|
|
|
|
interface SearchResultsProps {
|
|
results: Video[];
|
|
availableSources: SourceBadge[];
|
|
loading: boolean;
|
|
isPremium?: boolean;
|
|
latencies?: Record<string, number>;
|
|
}
|
|
|
|
export function SearchResults({
|
|
results,
|
|
availableSources,
|
|
loading,
|
|
isPremium = false,
|
|
latencies = {}
|
|
}: SearchResultsProps) {
|
|
// Source badges hook - filters by video source
|
|
const {
|
|
selectedSources,
|
|
filteredVideos: sourceFilteredVideos,
|
|
toggleSource,
|
|
} = useSourceBadges(results, availableSources);
|
|
|
|
// Type badges hook - auto-collects and filters by type_name
|
|
// Apply on source-filtered results for combined filtering
|
|
const {
|
|
typeBadges,
|
|
selectedTypes,
|
|
filteredVideos: finalFilteredVideos,
|
|
toggleType,
|
|
} = useTypeBadges(sourceFilteredVideos);
|
|
|
|
if (results.length === 0 && !loading) return null;
|
|
|
|
return (
|
|
<div className="animate-fade-in">
|
|
<ResultsHeader
|
|
loading={loading}
|
|
resultsCount={results.length}
|
|
availableSources={availableSources}
|
|
/>
|
|
|
|
{/* Source Badges - Clickable video source filtering */}
|
|
{availableSources.length > 0 && (
|
|
<SourceBadges
|
|
sources={availableSources}
|
|
selectedSources={selectedSources}
|
|
onToggleSource={toggleSource}
|
|
className="mb-6"
|
|
/>
|
|
)}
|
|
|
|
{/* Type Badges - Auto-collected from search results */}
|
|
{typeBadges.length > 0 && (
|
|
<TypeBadges
|
|
badges={typeBadges}
|
|
selectedTypes={selectedTypes}
|
|
onToggleType={toggleType}
|
|
className="mb-6"
|
|
/>
|
|
)}
|
|
|
|
{/* Display filtered videos (both source and type filters applied) */}
|
|
<VideoGrid
|
|
videos={finalFilteredVideos}
|
|
isPremium={isPremium}
|
|
latencies={latencies}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|