11"use client"
22
3- import { Search , Star } from "lucide-react"
3+ import { SiGithub as Github } from "@icons-pack/react-simple-icons"
4+ import { FileCodeCorner , Plus , Search , Star } from "lucide-react"
45import Image from "next/image"
56import Link from "next/link"
67import { useState } from "react"
@@ -37,7 +38,7 @@ import { CreateUrlDialog } from "./create-url-dialog"
3738import { EditUrlDialog } from "./edit-url-dialog"
3839import { PaginationControls } from "./pagination"
3940import { Toggle } from "./ui/toggle"
40- import { UrlRecordRow } from "./url-record-row"
41+ import { MobileRow , UrlRecordRow } from "./url-record-row"
4142
4243export function Dashboard ( ) {
4344 const [ searchInput , setSearchInput ] = useState ( "" )
@@ -122,11 +123,41 @@ export function Dashboard() {
122123 </ p >
123124 </ div >
124125 < div className = "flex gap-4" >
126+ < a
127+ href = "https://github.com/PoliNetworkOrg/polinet.cc"
128+ className = "underline flex items-center gap-1"
129+ title = "https://github.com/PoliNetworkOrg/polinet.cc"
130+ aria-label = "tmsu.cc github repository by Tommaso Morganti"
131+ target = "_blank"
132+ rel = "noopener noreferrer"
133+ >
134+ < Button size = "icon-lg" variant = "outline" >
135+ < Github />
136+ </ Button >
137+ </ a >
125138 < Link href = "/api" target = "_blank" rel = "noopener noreferral" >
126- < Button variant = "outline" > API Docs</ Button >
139+ < Button variant = "outline" size = "icon-lg" className = "md:hidden" >
140+ < FileCodeCorner />
141+ </ Button >
142+ < Button size = "lg" variant = "outline" className = "max-md:hidden" >
143+ < FileCodeCorner />
144+ < span > API Docs</ span >
145+ </ Button >
127146 </ Link >
128- < Button onClick = { ( ) => setCreateDialogOpen ( true ) } >
129- Create Short URL
147+ < Button
148+ size = "icon-lg"
149+ className = "md:hidden"
150+ onClick = { ( ) => setCreateDialogOpen ( true ) }
151+ >
152+ < Plus />
153+ </ Button >
154+ < Button
155+ size = "lg"
156+ className = "max-md:hidden"
157+ onClick = { ( ) => setCreateDialogOpen ( true ) }
158+ >
159+ < Plus />
160+ < span > Create Short URL</ span >
130161 </ Button >
131162 </ div >
132163 </ div >
@@ -140,8 +171,8 @@ export function Dashboard() {
140171 </ CardHeader >
141172 < CardContent className = "space-y-4" >
142173 { /* Filters */ }
143- < div className = "flex gap-4 items-center" >
144- < div className = "relative flex-1" >
174+ < div className = "flex gap-4 items-center max-md:flex-col " >
175+ < div className = "relative flex-1 max-md:w-full max-md:order-2 " >
145176 < Search className = "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" />
146177 < Input
147178 placeholder = "Search URLs or short codes..."
@@ -150,31 +181,35 @@ export function Dashboard() {
150181 className = "pl-9"
151182 />
152183 </ div >
153- < Select value = { currentSort } onValueChange = { handleSortChange } >
154- < SelectTrigger className = "w-[200px]" >
155- < SelectValue placeholder = "Sort by" />
156- </ SelectTrigger >
157- < SelectContent >
158- < SelectItem value = "created_at-desc" > Newest First</ SelectItem >
159- < SelectItem value = "created_at-asc" > Oldest First</ SelectItem >
160- < SelectItem value = "updated_at-desc" >
161- Recently Updated
162- </ SelectItem >
163- < SelectItem value = "click_count-desc" > Most Clicks</ SelectItem >
164- < SelectItem value = "click_count-asc" > Least Clicks</ SelectItem >
165- < SelectItem value = "short_code-asc" > Short Code A-Z</ SelectItem >
166- < SelectItem value = "short_code-desc" > Short Code Z-A</ SelectItem >
167- </ SelectContent >
168- </ Select >
169- < Toggle
170- pressed = { queryParams . customOnly }
171- onPressedChange = { handleCustomOnlyToggle }
172- variant = "outline"
173- className = "data-[state=on]:*:[svg]:fill-yellow-300 data-[state=on]:*:[svg]:stroke-yellow-300"
174- >
175- < Star className = "h-4 w-4" />
176- Show Custom Only
177- </ Toggle >
184+ < div className = "flex gap-4 items-center justify-between max-md:w-full max-md:order-3" >
185+ < Select value = { currentSort } onValueChange = { handleSortChange } >
186+ < SelectTrigger className = "w-[170px] max-md:flex-1" >
187+ < SelectValue placeholder = "Sort by" />
188+ </ SelectTrigger >
189+ < SelectContent >
190+ < SelectItem value = "created_at-desc" > Newest First</ SelectItem >
191+ < SelectItem value = "created_at-asc" > Oldest First</ SelectItem >
192+ < SelectItem value = "updated_at-desc" >
193+ Recently Updated
194+ </ SelectItem >
195+ < SelectItem value = "click_count-desc" > Most Clicks</ SelectItem >
196+ < SelectItem value = "click_count-asc" > Least Clicks</ SelectItem >
197+ < SelectItem value = "short_code-asc" > Short Code A-Z</ SelectItem >
198+ < SelectItem value = "short_code-desc" >
199+ Short Code Z-A
200+ </ SelectItem >
201+ </ SelectContent >
202+ </ Select >
203+ < Toggle
204+ pressed = { queryParams . customOnly }
205+ onPressedChange = { handleCustomOnlyToggle }
206+ variant = "outline"
207+ className = "data-[state=on]:*:[svg]:fill-yellow-300 data-[state=on]:*:[svg]:stroke-yellow-300"
208+ >
209+ < Star className = "h-4 w-4" />
210+ Show Custom Only
211+ </ Toggle >
212+ </ div >
178213 </ div >
179214
180215 { /* Table */ }
@@ -188,7 +223,20 @@ export function Dashboard() {
188223 </ div >
189224 ) : (
190225 < >
191- < Table >
226+ < div className = "lg:hidden flex flex-col gap-4" >
227+ { urls . map ( ( url : UrlRecord ) => (
228+ < MobileRow
229+ key = { url . id }
230+ url = { url }
231+ onCopy = { ( url ) =>
232+ copyToClipboard ( `https://polinet.cc/${ url . short_code } ` )
233+ }
234+ onDelete = { ( url ) => handleDelete ( url . short_code ) }
235+ onEdit = { ( url ) => setEditDialog ( { open : true , url } ) }
236+ />
237+ ) ) }
238+ </ div >
239+ < Table className = "max-lg:hidden" >
192240 < TableHeader >
193241 < TableRow >
194242 < TableHead className = "w-4" >
@@ -228,6 +276,19 @@ export function Dashboard() {
228276 ) }
229277 </ CardContent >
230278 </ Card >
279+ < div className = "flex text-center items-center justify-center gap-1" >
280+ < p className = "text-muted-foreground text-sm" >
281+ Made with 💙 by{ " " }
282+ < a
283+ href = "https://polinetwork.org"
284+ target = "_blank"
285+ rel = "noreferrer noopener"
286+ className = "underline underline-offset-2"
287+ >
288+ PoliNetwork
289+ </ a >
290+ </ p >
291+ </ div >
231292
232293 < CreateUrlDialog
233294 open = { createDialogOpen }
0 commit comments