"use client"; import {z} from "zod"; import Link from "next/link"; import React, {useState} from "react"; import TimeAgo from "react-timeago"; import {useForm} from "react-hook-form"; import {useRouter} from "next/navigation"; import {AppRouterInstance} from "next/dist/shared/lib/app-router-context.shared-runtime"; import { ChevronRight, Earth, History, Plus, ShieldAlert, SquareArrowOutUpRight, Trash, WalletCards } from "lucide-react"; import {useLiveQuery} from "dexie-react-hooks"; import {AimeServer, db} from "@/lib/database"; import {zodResolver} from "@hookform/resolvers/zod"; import {Card} from "@/components/ui/card"; import {Input} from "@/components/ui/input"; import {Button} from "@/components/ui/button"; import {Footer} from "@/components/footer"; import {Separator} from "@/components/ui/separator"; import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuSeparator, ContextMenuTrigger } from "@/components/ui/context-menu"; import {Alert, AlertDescription, AlertTitle} from "@/components/ui/alert"; import {Form, FormControl, FormField, FormItem, FormMessage} from "@/components/ui/form"; import {LoadingIndicator} from "@/components/loading-indicator"; const serverAdditionSchema = z.object({ address: z.string().startsWith("http") }); function redirectToServerPage(router: AppRouterInstance, server: AimeServer) { router.push(`/servers/${server.id}`); } function ServerList(props: { servers: AimeServer[] | undefined }) { const router = useRouter(); if (!props.servers) { return (); } if (!props.servers.length) { return ( <>
No servers found. Add one below!
); } return (<> {props.servers.map(s =>

{s.name}

{s.lastConnected > 0 && (
)}
{s.address}
redirectToServerPage(router, s)}> Select Server db.servers.delete(s.id)}> Remove Server
)} ); } function ServerAddForm() { const router = useRouter(); const form = useForm>({ resolver: zodResolver(serverAdditionSchema), defaultValues: { address: '' } }); const [showHttpsWarning, setHttpsWarning] = useState(false); const [blockSubmit, setBlockSubmit] = useState(true); async function onSubmit(values: z.infer) { const existingServer = await db.servers .where("address") .equalsIgnoreCase(values.address) .limit(1) .first(); // test for duplicate if (!existingServer) { const newId = await db.servers.add({ name: "Server", lastConnected: 0, address: values.address }); // set server name using id await db.servers.update(newId, { name: `Server #${newId}` }); router.push(`/servers/${newId}`); } else { router.push(`/servers/${existingServer.id}`); } } function handleAddressChange(event: React.ChangeEvent, callback: (value: React.ChangeEvent) => void) { try { const address = new URL(event.target.value); setBlockSubmit(false); setHttpsWarning(address.protocol !== "http:"); } catch { setBlockSubmit(true); setHttpsWarning(false); } callback(event); } return ( <> {showHttpsWarning && (<>
HTTPS Warning AimeNet doesn't support HTTPS out-the-box. If you're using HTTPS, ensure a reverse-proxy or HTTP.SYS has been configured and a valid, trusted SSL certificate has been configured. )}
( handleAddressChange(e, field.onChange)}/> )} /> ); } export default function ServerListingPage() { const servers = useLiveQuery(() => db.servers.toArray()); const router = useRouter(); return (

Servers

); }