import { Link, useSearchParams } from "expo-router"; import { View, Text, ScrollView, TextInput } from "react-native"; import { NodeResource, ResourceType, useNode } from "../../../hooks/useNode"; import Icon from "@expo/vector-icons/Feather"; import tw from "twrnc"; import { formatBytes } from "../../../lib/helper/format"; import { useMemo, useState } from "react"; import { Gauge } from "../../../components/shared/gauge"; import ProgressBar from "../../../components/shared/progress-bar"; import Card from "../../../components/shared/card"; interface ResourceListItemProps { type: ResourceType; resource: NodeResource; } export function ResourceListItem({ type, resource }: ResourceListItemProps) { return ( {type === "lxc" ? ( ) : ( )} {resource.vmid}: {resource.name} CPUs: {resource.cpus} MEM: {formatBytes(resource.maxmem)} DISK: {formatBytes(resource.maxdisk)} ); } export default function NodePage() { const { node: nodeName } = useSearchParams<{ node: string }>(); const node = useNode(nodeName); const [searchFilter, setSearchFilter] = useState(""); const sortedLXCs = useMemo(() => { if (!node.lxc.isSuccess) return []; const filter = searchFilter.toLocaleLowerCase(); return node.lxc.data .filter( (lxc) => lxc.name.toLowerCase().includes(filter) || lxc.vmid.toString().includes(filter) ) .sort((a, b) => a.vmid - b.vmid); }, [node.lxc.data, searchFilter]); const sortedVMs = useMemo(() => { if (!node.qemu.isSuccess) return []; const filter = searchFilter.toLocaleLowerCase(); return node.qemu.data .filter( (qemu) => qemu.name.toLowerCase().includes(filter) || qemu.vmid.toString().includes(filter) ) .sort((a, b) => a.vmid - b.vmid); }, [node.qemu.data, searchFilter]); return ( {nodeName} {node.status.isSuccess && ( {node.status.data.pveversion} {node.status.data.kversion} )} {node.rddData.isSuccess && ( )} {sortedLXCs.map((lxc) => ( ))} {sortedVMs.map((vm) => ( ))} ); }