@@ -14,7 +14,8 @@ import { useState, useEffect } from "react";
1414import { useRouter } from "next/navigation" ;
1515import Sidebar from "@/app/components/Sidebar" ;
1616import { colors } from "@/app/lib/colors" ;
17- import { useConfigs , SavedConfig } from "@/app/lib/useConfigs" ;
17+ import { useConfigs } from "@/app/hooks/useConfigs" ;
18+ import { SavedConfig } from "@/app/lib/types/configs" ;
1819import ConfigCard from "@/app/components/ConfigCard" ;
1920import { LoaderBox } from "@/app/components/Loader" ;
2021import { EvalJob } from "@/app/components/types" ;
@@ -26,7 +27,16 @@ export default function ConfigLibraryPage() {
2627 const router = useRouter ( ) ;
2728 const { sidebarCollapsed, setSidebarCollapsed } = useApp ( ) ;
2829 const { activeKey } = useAuth ( ) ;
29- const { configGroups, isLoading, error, refetch, isCached } = useConfigs ( ) ;
30+ const {
31+ configGroups,
32+ isLoading,
33+ error,
34+ refetch,
35+ isCached,
36+ loadMoreConfigs,
37+ hasMoreConfigs,
38+ isLoadingMore,
39+ } = useConfigs ( { pageSize : 10 } ) ;
3040 const [ searchQuery , setSearchQuery ] = useState ( "" ) ;
3141 const [ evaluationCounts , setEvaluationCounts ] = useState <
3242 Record < string , number >
@@ -417,18 +427,67 @@ export default function ConfigLibraryPage() {
417427 ) }
418428 </ div >
419429 ) : (
420- < div className = "grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 gap-4" >
421- { filteredConfigs . map ( ( configGroup ) => (
422- < ConfigCard
423- key = { configGroup . config_id }
424- configGroup = { configGroup }
425- evaluationCount = {
426- evaluationCounts [ configGroup . config_id ] || 0
427- }
428- onUseInEvaluation = { handleUseInEvaluation }
429- />
430- ) ) }
431- </ div >
430+ < >
431+ < div className = "grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 gap-4" >
432+ { filteredConfigs . map ( ( configGroup ) => (
433+ < ConfigCard
434+ key = { configGroup . config_id }
435+ configGroup = { configGroup }
436+ evaluationCount = {
437+ evaluationCounts [ configGroup . config_id ] || 0
438+ }
439+ onUseInEvaluation = { handleUseInEvaluation }
440+ />
441+ ) ) }
442+ </ div >
443+ { hasMoreConfigs && ! searchQuery && (
444+ < div className = "flex justify-center mt-6" >
445+ < button
446+ onClick = { loadMoreConfigs }
447+ disabled = { isLoadingMore }
448+ className = "px-6 py-2.5 rounded-md text-sm font-medium transition-colors flex items-center gap-2"
449+ style = { {
450+ backgroundColor : colors . bg . primary ,
451+ border : `1px solid ${ colors . border } ` ,
452+ color : colors . text . secondary ,
453+ } }
454+ onMouseEnter = { ( e ) => {
455+ if ( ! isLoadingMore ) {
456+ e . currentTarget . style . backgroundColor =
457+ colors . bg . secondary ;
458+ e . currentTarget . style . color = colors . text . primary ;
459+ }
460+ } }
461+ onMouseLeave = { ( e ) => {
462+ e . currentTarget . style . backgroundColor =
463+ colors . bg . primary ;
464+ e . currentTarget . style . color = colors . text . secondary ;
465+ } }
466+ >
467+ { isLoadingMore ? (
468+ < >
469+ < svg
470+ className = "w-4 h-4 animate-spin"
471+ fill = "none"
472+ viewBox = "0 0 24 24"
473+ stroke = "currentColor"
474+ >
475+ < path
476+ strokeLinecap = "round"
477+ strokeLinejoin = "round"
478+ strokeWidth = { 2 }
479+ d = "M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"
480+ />
481+ </ svg >
482+ Loading...
483+ </ >
484+ ) : (
485+ "Load More"
486+ ) }
487+ </ button >
488+ </ div >
489+ ) }
490+ </ >
432491 ) }
433492 </ div >
434493 </ div >
0 commit comments