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