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 { 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