diff --git a/amnet-web/src/components/aime-card.tsx b/amnet-web/src/components/aime-card.tsx index 06d09ec..a55784e 100644 --- a/amnet-web/src/components/aime-card.tsx +++ b/amnet-web/src/components/aime-card.tsx @@ -8,20 +8,19 @@ import {AMCard, AMCardActionProps, AMCardDetail} from "@/components/am-card.tsx" export function AimeCardEntry(props: AMCardActionProps & { card: AimeCard, children?: Readonly }) { const isDesktop = useMediaQuery("(min-width: 512px)"); - return ( - + {props.card.lastUsed > 0 && ( - - + )} - - navigator.clipboard.writeText(props.card.id)}/> - {isDesktop - ? props.card.id.match(/.{1,4}/g)?.join(" ") - : `•••• ${props.card.id.substring(props.card.id.length - 4)}`} + navigator.clipboard.writeText(props.card.id)}> + + {isDesktop + ? props.card.id.match(/.{1,4}/g)?.join(" ") + : `•••• ${props.card.id.substring(props.card.id.length - 4)}`} diff --git a/amnet-web/src/components/am-card.tsx b/amnet-web/src/components/am-card.tsx index f22540f..045f3f7 100644 --- a/amnet-web/src/components/am-card.tsx +++ b/amnet-web/src/components/am-card.tsx @@ -1,5 +1,6 @@ import React from "react"; -import {ChevronRight} from "lucide-react"; +import {ChevronRight, LucideIcon} from "lucide-react"; + import {Card} from "@/components/ui/card.tsx"; import {Button} from "@/components/ui/button.tsx"; @@ -18,7 +19,7 @@ export function AMCard(props: AMCardActionProps & { title: string, titlePerforms onClick={() => props.titlePerformsAction && props.actionClicked ? props.actionClicked() : null}> {props.title} -
+
{props.children}
@@ -32,9 +33,10 @@ export function AMCard(props: AMCardActionProps & { title: string, titlePerforms ) } -export function AMCardDetail(props: { children?: Readonly }) { +export function AMCardDetail(props: { icon: LucideIcon, iconClicked?: () => void | Promise, children?: Readonly }) { return (
+ {React.createElement(props.icon, {className: "h-5 w-5", onClick: props.iconClicked})} {props.children}
) diff --git a/amnet-web/src/components/am-server.tsx b/amnet-web/src/components/am-server.tsx new file mode 100644 index 0000000..2f19844 --- /dev/null +++ b/amnet-web/src/components/am-server.tsx @@ -0,0 +1,45 @@ +import {useMemo} from "react"; +import TimeAgo from "react-timeago"; +import {getGameName} from "amnet-shared"; +import {useNavigate} from "react-router-dom"; +import {Earth, History, Joystick, Trash} from "lucide-react"; +import { + ContextMenu, + ContextMenuContent, + ContextMenuItem, + ContextMenuSeparator, + ContextMenuTrigger +} from "@/components/ui/context-menu.tsx"; + +import {AimeServer, db} from "@/lib/database.ts"; +import {AMCard, AMCardDetail} from "@/components/am-card.tsx"; + +export function AMServer(props: { server: AimeServer }) { + const navigate: (p: string) => void = useNavigate(); + const gameName = useMemo(() => props.server.gameId ? getGameName(props.server.gameId) : null, [props.server.gameId]); + + return ( + + + navigate(`/servers/${props.server.id}`)}> + + {props.server.serverAddress} + + + {props.server.lastConnected > 0 ? : + never} + + {gameName && {gameName}} + + + + navigate(`/servers/${props.server.id}`)}> + Select Server + + + db.servers.delete(props.server.id)}> + Remove Server + + + ) +} \ No newline at end of file diff --git a/amnet-web/src/pages/card-in-screen.tsx b/amnet-web/src/pages/card-in-screen.tsx index e564cc9..5ac1080 100644 --- a/amnet-web/src/pages/card-in-screen.tsx +++ b/amnet-web/src/pages/card-in-screen.tsx @@ -1,11 +1,9 @@ import {useLiveQuery} from "dexie-react-hooks"; import {useEffect, useMemo, useState} from "react"; import {useNavigate, useParams} from "react-router-dom"; +import {performCardIn, fetchServerInfo, getGameName} from "amnet-shared"; import {CircleDot, CircleCheckBig, Home, Nfc, Wallet, WifiOff} from "lucide-react"; -import {AimeCard, AimeServer, db} from "@/lib/database"; -import {performCardIn, fetchServerInfo} from "amnet-shared"; - import {Button} from "@/components/ui/button"; import {useToast} from "@/components/ui/use-toast"; import {Alert, AlertDescription, AlertTitle} from "@/components/ui/alert"; @@ -21,6 +19,8 @@ import { AlertDialogTrigger } from "@/components/ui/alert-dialog.tsx"; +import {AimeCard, AimeServer, db} from "@/lib/database"; + import {AMHeader} from "@/components/am-header"; import {AMFooter} from "@/components/am-footer"; import {Separator} from "@/components/ui/separator"; @@ -98,6 +98,7 @@ function ServerCardInPage() { const [connectionError, setConnectionError] = useState(false); const shareUrl = useMemo(() => `${location.origin}/#/servers/add?address=${encodeURIComponent(server?.serverAddress ?? "")}`, [server]); + const gameName = useMemo(() => server?.gameId ? getGameName(server.gameId) : null, [server]); // select newest card useEffect(() => setSelectedCard(cards?.sort((a, b) => b.lastUsed - a.lastUsed)[0] ?? null), [cards]); @@ -170,7 +171,7 @@ function ServerCardInPage() { {server && (
{selectedCard && (<> -

Selected Card

+

{gameName ? `Play ${gameName}` : "Selected Card"}

)} - + {server?.id && (
{location.protocol === "https:" && (<> @@ -252,4 +252,4 @@ function ServerCardInPage() { ); } -export default ServerCardInPage; \ No newline at end of file +export default ServerCardInPage; diff --git a/amnet-web/src/pages/server-listing.tsx b/amnet-web/src/pages/server-listing.tsx index 39919a9..2e050f0 100644 --- a/amnet-web/src/pages/server-listing.tsx +++ b/amnet-web/src/pages/server-listing.tsx @@ -1,21 +1,19 @@ import {z} from "zod"; -import TimeAgo from "react-timeago"; import {useForm} from "react-hook-form"; import {useLiveQuery} from "dexie-react-hooks"; +import {AMNET_API_VERSION} from "amnet-shared"; import React, {useEffect, useState} from "react"; import {useLocation, useNavigate} from 'react-router-dom'; -import {zodResolver} from "@hookform/resolvers/zod"; import { Earth, - History, Plus, ShieldAlert, SquareArrowOutUpRight, - Trash, WalletCards } from "lucide-react"; import {AimeServer, db} from "@/lib/database"; +import {zodResolver} from "@hookform/resolvers/zod"; import {Input} from "@/components/ui/input"; import {Button} from "@/components/ui/button"; @@ -23,26 +21,38 @@ import {LoadingIndicator} from "@/components/loading-indicator"; import {Alert, AlertDescription, AlertTitle} from "@/components/ui/alert"; import {Form, FormControl, FormField, FormItem, FormMessage} from "@/components/ui/form"; import {HttpsMixedModeRequestWarning} from "@/components/https-mixed-mode-request-warning"; -import { - ContextMenu, - ContextMenuContent, - ContextMenuItem, - ContextMenuSeparator, - ContextMenuTrigger -} from "@/components/ui/context-menu"; import {AMFooter} from "@/components/am-footer"; import {AMHeader} from "@/components/am-header"; -import {AMNET_API_VERSION} from "amnet-shared"; -import {AMCard, AMCardDetail} from "@/components/am-card"; +import {AMServer} from "@/components/am-server.tsx"; const serverAdditionSchema = z.object({ address: z.string().startsWith("http") }); -function ServerList(props: { servers: AimeServer[] | undefined }) { +function ServerListing() { const navigate = useNavigate(); + const servers = useLiveQuery(() => db.servers.toArray()); + return ( +
+ + + + +
+ +
+ + +
+ ); +} + +function ServerList(props: { servers: AimeServer[] | undefined }) { if (!props.servers) { return (); } @@ -65,32 +75,7 @@ function ServerList(props: { servers: AimeServer[] | undefined }) { - {props.servers.map(s => - - - navigate(`/servers/${s.id}`)}> - {s.lastConnected > 0 && ( - - - - - )} - - - {s.serverAddress} - - - - - navigate(`/servers/${s.id}`)}> - Select Server - - - db.servers.delete(s.id)}> - Remove Server - - - )} + {props.servers.map(s => )} ); } @@ -224,26 +209,4 @@ function ServerAddForm() { ); } -function ServerListing() { - const navigate = useNavigate(); - const servers = useLiveQuery(() => db.servers.toArray()); - - return ( -
- - - - -
- -
- - -
- ); -} - export default ServerListing;