11import { HeroBanner } from "@/components/banner" ;
2- import { ServerTemplateDialog } from "@/components/server/dialog/ServerTemplateDialog" ;
2+ import { ServerList } from "@/components/server" ;
3+ import { Tabs , TabsContent , TabsList , TabsTrigger } from "@/components/ui/tabs" ;
4+ import { api } from "@/lib/api" ;
5+ import { useQuery } from "@tanstack/react-query" ;
36import { useState } from "react" ;
4- import { useTranslation } from "react-i18next" ;
57
6- // Import refactored components
7- import { DiscoveryHeader } from "@/components/discovery/DiscoveryHeader" ;
8- import { InfiniteScrollServers } from "@/components/discovery/InfiniteScrollServers" ;
9- import { ScrollToBottomButton } from "@/components/discovery/ScrollToBottomButton" ;
10- import { useServerDiscovery } from "@/hooks/useServerDiscovery" ;
8+ const tabs = [
9+ { key : "is_official" , label : "Official Servers" } ,
10+ { key : "github_stars" , label : "Most GitHub Stars" } ,
11+ { key : "must_have" , label : "Must Have" } ,
12+ { key : "featured" , label : "Featured" } ,
13+ { key : "best_new" , label : "Best New" } ,
14+ { key : "editors_choice" , label : "Editors Choice" } ,
15+ { key : "developer_tools" , label : "Developer Tools" } ,
16+ ] ;
1117
12- import { useAuth } from "@/hooks/useAuth" ;
13- import { useNavigate } from "react-router-dom" ;
1418export default function Discovery ( ) {
15- const { t } = useTranslation ( ) ;
16- const [ isSell , setIsSell ] = useState ( false ) ;
17- const [ isDialogOpen , setIsDialogOpen ] = useState ( false ) ;
19+ const [ selectedTab , setSelectedTab ] = useState < string > ( "is_official" ) ;
1820
19- const navigate = useNavigate ( ) ;
20- const { user } = useAuth ( ) ;
21-
22- // Use our custom hook for server discovery logic
23- const {
24- allServers,
25- isLoading,
26- isFetching,
27- loadMoreRef,
28- hasNext,
29- sort,
30- direction,
31- handleSortChange,
32- loadMore,
33- scrollToLoadMore,
34- } = useServerDiscovery ( ) ;
35-
36- // Dialog handlers
37- const handleAddServer = ( ) => {
38- setIsSell ( false ) ;
39- setIsDialogOpen ( true ) ;
40- } ;
41-
42- const handleSellServer = ( ) => {
43- // Check if user is authenticated before allowing server selling
44- if ( ! user ) {
45- navigate ( "/auth" ) ;
46- return ;
47- }
48-
49- // User is authenticated, proceed with sell server dialog
50- setIsSell ( true ) ;
51- setIsDialogOpen ( true ) ;
52- } ;
21+ const { data : discoverServers , isLoading, error } = useQuery ( {
22+ queryKey : [ "discover-servers" , selectedTab ] ,
23+ queryFn : async ( ) => {
24+ const res = await api . get ( `/servers/discover?tab=${ selectedTab } ` ) ;
25+ return res . data ;
26+ } ,
27+ } ) ;
5328
5429 return (
55- < div className = "p-8" >
56- < h1 className = "text-3xl font-bold mb-8 text-gray-900 dark:text-gray-100 sr-only" >
57- { t ( "nav.discover" ) }
58- </ h1 >
59-
60- { /* Hero banner */ }
30+ < div className = "p-8 space-y-4" >
6131 < HeroBanner />
62-
63- { /* Header with sorting and action buttons */ }
64- < DiscoveryHeader
65- sort = { sort }
66- direction = { direction }
67- onSortChange = { handleSortChange }
68- onAddServer = { handleAddServer }
69- onSellServer = { handleSellServer }
70- isAuthenticated = { ! ! user }
71- />
72-
73- { /* Server list with infinite scrolling */ }
74- < InfiniteScrollServers
75- servers = { allServers }
76- isLoading = { isLoading }
77- isFetching = { isFetching }
78- hasNext = { hasNext }
79- loadMoreRef = { loadMoreRef }
80- onLoadMore = { loadMore }
81- />
82-
83- { /* Scroll to bottom button */ }
84- < ScrollToBottomButton onClick = { scrollToLoadMore } />
85-
86- { /* Server template dialog */ }
87- < ServerTemplateDialog
88- isOpen = { isDialogOpen }
89- setIsDialogOpen = { setIsDialogOpen }
90- isSell = { isSell }
91- />
32+ < Tabs defaultValue = "is_official" onValueChange = { ( val ) => setSelectedTab ( val ) } >
33+ < TabsList className = "mb-8 flex flex-wrap gap-2" >
34+ { tabs . map ( ( tab ) => (
35+ < TabsTrigger key = { tab . key } value = { tab . key }
36+ className = "rounded-md border px-4 py-2 text-sm font-medium transition-colors hover:bg-muted data-[state=active]:bg-primary data-[state=active]:text-white"
37+ >
38+ { tab . label }
39+ </ TabsTrigger >
40+ ) ) }
41+ </ TabsList >
42+ < TabsContent value = { selectedTab } >
43+ { isLoading && < div > Loading...</ div > }
44+ { error && < div > Error loading servers.</ div > }
45+ { ! isLoading && ! error && < ServerList mcpServers = { discoverServers ?? [ ] } /> }
46+ </ TabsContent >
47+ </ Tabs >
9248 </ div >
9349 ) ;
94- }
50+ }
0 commit comments