A very performant and light (2mb in memory) link shortener and tracker. Written in Rust and React and uses Postgres/SQLite.
at master 2.3 kB view raw
1import { ThemeProvider } from "@/components/theme-provider" 2import { LinkForm } from './components/LinkForm' 3import { LinkList } from './components/LinkList' 4import { AuthForms } from './components/AuthForms' 5import { Footer } from './components/Footer' 6import { AuthProvider, useAuth } from './context/AuthContext' 7import { Button } from "@/components/ui/button" 8import { Toaster } from './components/ui/toaster' 9import { ModeToggle } from './components/mode-toggle' 10import { useState } from 'react' 11 12function AppContent() { 13 const { user, logout } = useAuth() 14 const [refreshCounter, setRefreshCounter] = useState(0) 15 16 const handleLinkCreated = () => { 17 setRefreshCounter(prev => prev + 1) 18 } 19 20 return ( 21 <div className="min-h-screen bg-background flex flex-col"> 22 <header className="border-b"> 23 <div className="container max-w-6xl mx-auto flex h-16 items-center justify-between px-4"> 24 <h1 className="text-2xl font-bold">SimpleLink</h1> 25 <div className="flex items-center space-x-2 sm:space-x-4"> 26 {user ? ( 27 <> 28 <span className="text-sm text-muted-foreground hidden sm:inline">Welcome, {user.email}</span> 29 <Button variant="outline" size="sm" onClick={logout}> 30 Logout 31 </Button> 32 </> 33 ) : ( 34 <span className="text-sm text-muted-foreground mr-2">A link shortening service</span> 35 )} 36 <ModeToggle /> 37 </div> 38 </div> 39 </header> 40 <main className="flex-1 flex flex-col"> 41 <div className="container max-w-6xl mx-auto px-4 py-8 flex-1 flex flex-col"> 42 <div className="space-y-8 flex-1 flex flex-col justify-center"> 43 {user ? ( 44 <> 45 <LinkForm onSuccess={handleLinkCreated} /> 46 <LinkList refresh={refreshCounter} /> 47 </> 48 ) : ( 49 <AuthForms /> 50 )} 51 </div> 52 </div> 53 </main> 54 <Footer /> 55 </div> 56 ) 57} 58 59function App() { 60 return ( 61 <ThemeProvider defaultTheme="dark" storageKey="vite-ui-theme"> 62 <AuthProvider> 63 <AppContent /> 64 <Toaster /> 65 </AuthProvider> 66 </ThemeProvider> 67 ) 68} 69 70export default App