A very performant and light (2mb in memory) link shortener and tracker. Written in Rust and React and uses Postgres/SQLite.
1import { SiGithub, SiBluesky } from "@icons-pack/react-simple-icons"
2import { Button } from "@/components/ui/button"
3import { useState } from 'react'
4import { PrivacyModal } from './PrivacyModal'
5
6export function Footer() {
7 const [privacyModalOpen, setPrivacyModalOpen] = useState(false)
8
9 const handlePrivacyModalOpen = () => {
10 setPrivacyModalOpen(true)
11 }
12
13 const handlePrivacyModalClose = () => {
14 setPrivacyModalOpen(false)
15 }
16
17 return (
18 <footer className="border-t">
19 <div className="container max-w-6xl mx-auto flex h-14 items-center justify-between px-4">
20 <p className="text-sm text-muted-foreground">Created by waveringana</p>
21 <div className="flex items-center space-x-4">
22 <nav className="flex items-center space-x-4">
23 <a
24 onClick={handlePrivacyModalOpen}
25 href="#"
26 >
27 Privacy
28 </a>
29 </nav>
30 <div className="flex items-center space-x-2">
31 <Button variant="ghost" size="icon">
32 <a href="https://l.nekomimi.pet/github?source=shortener" target="_blank" rel="noopener noreferrer">
33 <SiGithub className="h-4 w-4" />
34 </a>
35 <span className="sr-only">GitHub</span>
36 </Button>
37
38 <Button variant="ghost" size="icon">
39 <a href="https://l.nekomimi.pet/bsky?source=shortener" target="_blank" rel="noopener noreferrer">
40 <SiBluesky className="h-4 w-4" />
41 </a>
42 <span className="sr-only">Twitter</span>
43 </Button>
44 </div>
45 </div>
46 </div>
47
48 <PrivacyModal
49 isOpen={privacyModalOpen}
50 onClose={handlePrivacyModalClose}
51 />
52 </footer>
53 )
54}