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 { Button } from './components/ui/button'
3import { LinkForm } from './components/LinkForm'
4import { LinkList } from './components/LinkList'
5import { AuthForms } from './components/AuthForms'
6import { AuthProvider, useAuth } from './context/AuthContext'
7import { useState } from 'react'
8import { Toaster } from './components/ui/toaster'
9
10function AppContent() {
11 const { user, logout } = useAuth()
12 const [refreshCounter, setRefreshCounter] = useState(0)
13
14 const handleLinkCreated = () => {
15 // Increment refresh counter to trigger list refresh
16 setRefreshCounter(prev => prev + 1)
17 }
18
19 return (
20 <div className="min-h-screen flex flex-col">
21 <div className="container max-w-6xl mx-auto py-8 flex-1 flex flex-col">
22 <div className="space-y-8 flex-1 flex flex-col justify-center">
23 <div className="flex items-center justify-between">
24 <h1 className="text-3xl font-bold">SimpleLink</h1>
25 {user ? (
26 <div className="flex items-center gap-4">
27 <p className="text-sm text-muted-foreground">Welcome, {user.email}</p>
28 <Button variant="outline" onClick={logout}>
29 Logout
30 </Button>
31 </div>
32 ) : (
33 <div className="flex items-center gap-4">
34 <p className="text-sm text-muted-foreground">A link shortening and tracking service</p>
35 </div>
36 )}
37 </div>
38
39 {user ? (
40 <>
41 <LinkForm onSuccess={handleLinkCreated} />
42 <LinkList refresh={refreshCounter} />
43 </>
44 ) : (
45 <AuthForms />
46 )}
47 </div>
48 </div>
49 </div>
50 )
51}
52
53function App() {
54 return (
55 <ThemeProvider defaultTheme="dark" storageKey="vite-ui-theme">
56 <AuthProvider>
57 <AppContent />
58 <Toaster />
59 </AuthProvider>
60 </ThemeProvider>
61 )
62}
63
64export default App