"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.
>
)}
>
);
}
export default function ServerListingPage() {
const servers = useLiveQuery(() => db.servers.toArray());
const router = useRouter();
return (
Servers
);
}