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"; import { m } from "@localizations/messages.js"; 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(m.mount_get_state_error({ error: 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(m.mount_unmount_error({ error: response.error.message })); } else { syncRemoteVirtualMediaState(); } }); }; const renderGridCardContent = () => { if (!remoteVirtualMediaState) { return (

{m.mount_no_mounted_media()}

{m.mount_add_file_to_get_started()}

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

{m.mount_streaming_from_url()}

{formatters.truncateMiddle(url, 55)}

{formatters.truncateMiddle(filename, 30)}

{formatters.bytes(size ?? 0)}

); case "Storage": return (

{m.mount_mounted_from_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 ? (
{m.mount_mounted_as()}{" "} {remoteVirtualMediaState.mode === "Disk" ? m.mount_mode_disk() : m.mount_mode_cdrom()}
) : null}
{!remoteVirtualMediaState && (
)}
); }); MountPopopover.displayName = "MountSidebarRoute"; export default MountPopopover;