@@ -6,17 +6,27 @@ import Link from "next/link";
6
6
import { usePathname } from "next/navigation" ;
7
7
import ccLogo from "../assets/codechef_logo.svg" ;
8
8
import ModeToggle from "@/components/toggle-theme" ;
9
- import { Button } from "@/components/ui/button" ;
10
9
import { ArrowDownLeftIcon , Pin , ArrowUpRight } from "lucide-react" ;
11
10
import NavDropdownButton from "./NavDropdownButton" ;
12
11
import FloatingNavbar from "./FloatingNavbar" ;
13
12
import PWAInstallButton from "./ui/PWAInstallButton" ;
13
+ import SearchBarChild from "./Searchbar/searchbar-child" ;
14
14
15
15
function Navbar ( ) {
16
16
const pathname = usePathname ( ) ;
17
17
const [ open , setOpen ] = useState ( false ) ;
18
+ const [ subjects , setSubjects ] = useState < string [ ] > ( [ ] ) ;
18
19
const dropdownContainerRef = useRef < HTMLDivElement > ( null ) ;
19
20
21
+ useEffect ( ( ) => {
22
+ async function getSubjects ( ) {
23
+ const res = await fetch ( "/api/course-list" ) ;
24
+ const data = await res . json ( ) ;
25
+ setSubjects ( data . map ( ( course : { name : string } ) => course . name ) ) ;
26
+ }
27
+ if ( pathname === "/catalogue" ) getSubjects ( ) ;
28
+ } , [ pathname ] ) ;
29
+
20
30
useEffect ( ( ) => {
21
31
function handleClickOutside ( event : MouseEvent ) {
22
32
if (
@@ -36,11 +46,29 @@ function Navbar() {
36
46
} ;
37
47
} , [ open ] ) ;
38
48
49
+
50
+ const renderHomePageButtons = ( ) => (
51
+ < >
52
+ < Link href = "/pinned" >
53
+ < div className = "ml-2 flex items-center gap-2 rounded-full border bg-[#e8e9ff] dark:bg-black border-[#3A3745] px-4 py-2 text-sm font-semibold dark:text-white transition hover:bg-slate-50 text-gray-700 dark:hover:bg-[#1A1823] h-10" >
54
+ < Pin className = "h-4 w-4" />
55
+ Pinned Subjects
56
+ </ div >
57
+ </ Link >
58
+ < Link href = "/request" >
59
+ < div className = "ml-2 flex items-center gap-2 rounded-full border bg-[#e8e9ff] dark:bg-black border-[#3A3745] px-4 py-2 text-sm font-semibold dark:text-white transition hover:bg-slate-50 text-gray-700 dark:hover:bg-[#1A1823] h-10" >
60
+ < ArrowUpRight className = "h-4 w-4" />
61
+ Paper Request
62
+ </ div >
63
+ </ Link >
64
+ </ >
65
+ ) ;
66
+
39
67
return (
40
68
< div className = "sticky top-0 z-10 w-full bg-[#B2B8FF] px-4 py-4 dark:bg-[#130E1F] md:px-8 md:py-5" >
41
69
< div className = "flex items-center justify-between" >
42
- < div className = "flex items-center gap-4" >
43
- < Link href = "https://www.codechefvit.com/" target = "_blank" >
70
+ < div className = "flex items-center gap-4 relative " >
71
+ < Link href = "https://www.codechefvit.com/" target = "_blank" >
44
72
< Image
45
73
src = { ccLogo as HTMLImageElement }
46
74
alt = "codechef-logo"
@@ -56,37 +84,65 @@ function Navbar() {
56
84
Papers
57
85
</ Link >
58
86
59
- < div className = "mt-3 hidden md:flex" >
60
- < Link href = "/pinned" >
61
- < div className = "ml-2 flex items-center gap-2 rounded-full border bg-[#e8e9ff] dark:bg-black border-[#3A3745] px-4 py-2 text-sm font-semibold dark:text-white transition hover:bg-slate-50 text-gray-700 dark:hover:bg-[#1A1823]" >
62
- < Pin className = "h-4 w-4" />
63
- Pinned Subjects
64
- </ div >
65
- </ Link >
66
- < div className = "ml-2 hidden md:flex" >
67
- < Link href = "/request" >
68
- < div className = "ml-2 flex items-center gap-2 rounded-full border bg-[#e8e9ff] dark:bg-black border-[#3A3745] px-4 py-2 text-sm font-semibold dark:text-white transition hover:bg-slate-50 text-gray-700 dark:hover:bg-[#1A1823]" >
69
- < ArrowUpRight className = "h-4 w-4" />
70
- Paper Request
87
+ { pathname === "/catalogue" ? (
88
+ < div
89
+ ref = { dropdownContainerRef }
90
+ className = "ml-4 hidden md:block relative"
91
+ >
92
+ < NavDropdownButton
93
+ isOpen = { open }
94
+ onClick = { ( ) => setOpen ( ( prev ) => ! prev ) }
95
+ variant = "default"
96
+ />
97
+ { open && (
98
+ < div className = "absolute left-0 mt-3 w-56 rounded-2xl bg-[#4B22D1] shadow-2xl border border-[rgba(255,255,255,0.1)] z-50 overflow-hidden backdrop-blur-sm" >
99
+ < div className = "py-2" >
100
+ < Link href = "/pinned" >
101
+ < button
102
+ onClick = { ( ) => setOpen ( false ) }
103
+ className = "w-full px-4 py-3 text-left text-white hover:bg-[rgba(255,255,255,0.1)] transition-all duration-200 flex items-center gap-3 group"
104
+ >
105
+ < Pin className = "h-4 w-4 transition-transform duration-200 group-hover:scale-110" />
106
+ < span className = "font-medium" > Pinned Subjects</ span >
107
+ </ button >
108
+ </ Link >
109
+ < Link href = "/request" >
110
+ < button
111
+ onClick = { ( ) => setOpen ( false ) }
112
+ className = "w-full px-4 py-3 text-left text-white hover:bg-[rgba(255,255,255,0.1)] transition-all duration-200 flex items-center gap-3 group"
113
+ >
114
+ < ArrowUpRight className = "h-4 w-4 transition-transform duration-200 group-hover:scale-110" />
115
+ < span className = "font-medium" > Paper Request</ span >
116
+ </ button >
117
+ </ Link >
118
+ </ div >
71
119
</ div >
72
- </ Link >
120
+ ) }
73
121
</ div >
74
- </ div >
75
-
76
- { /* Desktop: Create Paper Request button */ }
122
+ ) : (
123
+ < div className = "hidden md:flex items-center h-10" >
124
+ { renderHomePageButtons ( ) }
125
+ </ div >
126
+ ) }
77
127
</ div >
78
128
129
+ { pathname === "/catalogue" && (
130
+ < div className = "hidden md:flex flex-1 justify-center mx-4" >
131
+ < div className = "w-full max-w-[700px]" >
132
+ < SearchBarChild initialSubjects = { subjects } />
133
+ </ div >
134
+ </ div >
135
+ ) }
136
+
79
137
< div className = "hidden items-center gap-4 md:flex" >
80
138
< div className = "rounded-full border border-[#3A3745] p-1" >
81
139
< ModeToggle />
82
140
</ div >
83
-
84
141
< div className = "hidden max-w-[200px] md:block" >
85
142
< PWAInstallButton />
86
143
</ div >
87
-
88
144
< Link href = { pathname === "/upload" ? "/" : "/upload" } >
89
- < div className = "flex items-center gap-2 rounded-full border bg-[#e8e9ff] dark:bg-black border-[#3A3745] px-4 py-2 text-sm font-semibold dark:text-white transition hover:bg-slate-50 text-gray-700 dark:hover:bg-[#1A1823]" >
145
+ < div className = "flex items-center gap-2 rounded-full border bg-[#e8e9ff] dark:bg-black border-[#3A3745] px-4 py-2 text-sm font-semibold dark:text-white transition hover:bg-slate-50 text-gray-700 dark:hover:bg-[#1A1823] h-10 " >
90
146
< ArrowDownLeftIcon className = "h-4 w-4 rotate-90" />
91
147
< span >
92
148
{ pathname === "/upload" ? "Search Papers" : "Upload Papers" }
@@ -95,16 +151,15 @@ function Navbar() {
95
151
</ Link >
96
152
</ div >
97
153
98
- { /* Mobile: Create Paper Request button inside dropdown */ }
99
154
< div className = "md:hidden" ref = { dropdownContainerRef } >
100
155
< NavDropdownButton
101
156
isOpen = { open }
102
157
onClick = { ( ) => setOpen ( ( prev ) => ! prev ) }
158
+ variant = "default"
103
159
/>
104
160
< div
105
- className = { `transition-all duration-300 ease-in-out ${
106
- open ? "block" : "hidden"
107
- } `}
161
+ className = { `transition-all duration-300 ease-in-out ${ open ? "block" : "hidden"
162
+ } `}
108
163
>
109
164
< FloatingNavbar onNavigate = { ( ) => setOpen ( false ) } />
110
165
</ div >
0 commit comments