import { useState, type FormEvent } from "react"
import { createFileRoute, Link } from "@tanstack/react-router"
import { ShaderBackground } from "@/components/ShaderBackground"
import { authClient } from "@/lib/auth-client"
import { useAccount } from "jazz-tools/react"
import { ViewerAccount, type SavedUrl } from "@/lib/jazz/schema"
import { Link2, Plus, Trash2, ExternalLink, Video, Settings, LogOut } from "lucide-react"
// Feature flag: only this email can access stream features
const STREAM_ENABLED_EMAIL = "nikita@nikiv.dev"
function LandingPage() {
return (
{/* Hero Section */}
Linsa
Save anything. Share, sell or collaborate. Privately.
Sign up
)
}
function Dashboard() {
const { data: session } = authClient.useSession()
const me = useAccount(ViewerAccount)
const [newUrl, setNewUrl] = useState("")
const [newTitle, setNewTitle] = useState("")
const [isAdding, setIsAdding] = useState(false)
const canAccessStreams = session?.user?.email === STREAM_ENABLED_EMAIL
const root = me.$isLoaded ? me.root : null
const urlList = root?.$isLoaded ? root.savedUrls : null
const savedUrls: SavedUrl[] = urlList?.$isLoaded ? [...urlList] : []
const handleAddUrl = (e: FormEvent) => {
e.preventDefault()
if (!newUrl.trim() || !root?.savedUrls?.$isLoaded) return
root.savedUrls.$jazz.push({
url: newUrl.trim(),
title: newTitle.trim() || null,
createdAt: Date.now(),
})
setNewUrl("")
setNewTitle("")
setIsAdding(false)
}
const handleDeleteUrl = (index: number) => {
if (!root?.savedUrls?.$isLoaded) return
root.savedUrls.$jazz.splice(index, 1)
}
const handleSignOut = async () => {
await authClient.signOut()
window.location.reload()
}
if (!me.$isLoaded || !root?.$isLoaded) {
return (
)
}
return (
{/* Header */}
Welcome back
{session?.user?.email}
{/* Stream Setup - Only for nikita@nikiv.dev */}
{canAccessStreams && (
Stream Setup
Manage your live stream and archive settings.
View Stream
Stream Settings
)}
{/* Saved Links */}
Saved Links
setIsAdding(true)}
className="inline-flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium text-white bg-teal-600 hover:bg-teal-500 transition-colors"
>
Add Link
{isAdding && (
)}
{savedUrls.length === 0 ? (
No saved links yet
Click "Add Link" to save your first bookmark
) : (
{savedUrls.map((item, index) => (
{item.title || item.url}
{item.title && (
{item.url}
)}
handleDeleteUrl(index)}
className="p-2 rounded-lg text-rose-400 hover:text-rose-300 hover:bg-rose-500/10 transition-colors"
>
))}
)}
)
}
function HomePage() {
const { data: session, isPending } = authClient.useSession()
if (isPending) {
return (
)
}
if (session?.user) {
return
}
return
}
export const Route = createFileRoute("/")({
component: HomePage,
ssr: false,
})