import { PlusCircleIcon } from "@heroicons/react/20/solid"; import { forwardRef, useEffect, useCallback } from "react"; import { LuLink, LuPlus, LuRadioReceiver, } from "react-icons/lu"; import { useClose } from "@headlessui/react"; import { useLocation } from "react-router-dom"; import { Button } from "@components/Button"; import Card, { GridCard } from "@components/Card"; import { formatters } from "@/utils"; import { RemoteVirtualMediaState, useMountMediaStore } from "@/hooks/stores"; import { SettingsPageHeader } from "@components/SettingsPageheader"; import { JsonRpcResponse, useJsonRpc } from "@/hooks/useJsonRpc"; import { useDeviceUiNavigation } from "@/hooks/useAppNavigation"; import notifications from "@/notifications"; const MountPopopover = forwardRef((_props, ref) => { const { send } = useJsonRpc(); const { remoteVirtualMediaState, setModalView, setRemoteVirtualMediaState } = useMountMediaStore(); const syncRemoteVirtualMediaState = useCallback(() => { send("getVirtualMediaState", {}, (response: JsonRpcResponse) => { if ("error" in response) { notifications.error( `Failed to get virtual media state: ${response.error.message}`, ); } else { setRemoteVirtualMediaState(response.result as unknown as RemoteVirtualMediaState); } }); }, [send, setRemoteVirtualMediaState]); const handleUnmount = () => { send("unmountImage", {}, (response: JsonRpcResponse) => { if ("error" in response) { notifications.error(`Failed to unmount image: ${response.error.message}`); } else { syncRemoteVirtualMediaState(); } }); }; const renderGridCardContent = () => { if (!remoteVirtualMediaState) { return (

No mounted media

Add a file to get started

); } const { source, filename, size, url, path } = remoteVirtualMediaState; switch (source) { case "HTTP": return (

Streaming from URL

{formatters.truncateMiddle(url, 55)}

{formatters.truncateMiddle(filename, 30)}

{formatters.bytes(size ?? 0)}

); case "Storage": return (

Mounted from JetKVM Storage

{formatters.truncateMiddle(path, 50)}

{formatters.truncateMiddle(filename, 30)}

{formatters.bytes(size ?? 0)}

); default: return null; } }; const close = useClose(); const location = useLocation(); useEffect(() => { syncRemoteVirtualMediaState(); }, [syncRemoteVirtualMediaState, location.pathname]); const { navigateTo } = useDeviceUiNavigation(); return (
{renderGridCardContent()}
{remoteVirtualMediaState ? (
Mounted as{" "} {remoteVirtualMediaState.mode === "Disk" ? "Disk" : "CD-ROM"}
) : null}
{!remoteVirtualMediaState && (
)}
); }); MountPopopover.displayName = "MountSidebarRoute"; export default MountPopopover;