import { FocusContext, useFocusable } from '@noriginmedia/norigin-spatial-navigation'; import { Block, createFileRoute } from '@tanstack/react-router'; import DownloadDirectoryOption from '@/mainview/components/options/DownloadDirectoryOption'; import { useIsMutating, useMutation, useQuery } from '@tanstack/react-query'; import { changeDownloadsMutation, downloadDrivesQuery } from '@/mainview/scripts/queries'; import { DownloadsDrive } from '@/shared/constants'; import prettyBytes from 'pretty-bytes'; import classNames from 'classnames'; import { GamePadButtonCode, Shortcut, useShortcuts } from '@/mainview/scripts/shortcuts'; import { Download, FolderOpen, HardDrive, Save, Usb } from 'lucide-react'; import { twMerge } from 'tailwind-merge'; import { OptionSpace } from '@/mainview/components/options/OptionSpace'; import { Button } from '@/mainview/components/options/Button'; import { systemApi } from '@/mainview/scripts/clientApi'; import useActiveControl from '@/mainview/scripts/gamepads'; export const Route = createFileRoute('/settings/directories')({ component: RouteComponent, }); function DriveComponent (data: { drive: DownloadsDrive; downloadsSize: number; refetchDrives: () => void; }) { const { ref, focused, focusKey } = useFocusable({ focusKey: data.drive.device, onFocus: () => (ref.current as HTMLElement)?.scrollIntoView({ block: 'nearest', behavior: 'smooth' }) }); const isMoving = useIsMutating(changeDownloadsMutation); const usedWithoutDownlods = data.drive.used - (data.drive.isCurrentlyUsed ? data.downloadsSize : 0); const usedPercent = usedWithoutDownlods / data.drive.size; const usedPercentRaw = data.drive.used / data.drive.size; const changeDownloads = useMutation({ ...changeDownloadsMutation, onSuccess: data.refetchDrives }); data.drive.unusableReason; const shortcuts: Shortcut[] = []; const valid = !data.drive.unusableReason && isMoving <= 0; const handleAction = () => changeDownloads.mutate(data.drive.mountPoint); if (valid) { shortcuts.push({ label: "Move Downloads", button: GamePadButtonCode.A, action: handleAction }); } useShortcuts(focusKey, () => shortcuts, [shortcuts]); const { isPointer } = useActiveControl(); return
  • {data.drive.isRemovable ? : }{data.drive.label}
    {data.drive.mountPoint}
    {prettyBytes(data.drive.size - data.drive.used)} Free {data.drive.unusableReason === 'not_enough_space' &&

    (Not Enough Space)

    } {data.drive.unusableReason === 'already_used' &&

    (Currently Used)

    } {data.drive.unusableReason !== 'already_used' && data.drive.isCurrentlyUsed &&

    (Custom Path)

    }
    0.8, "progress-error": data.drive.unusableReason === 'not_enough_space', }))}>
    0.8, "bg-error": data.drive.unusableReason === 'not_enough_space', }))} style={{ width: usedPercent.toLocaleString('en-US', { style: 'percent' }) }}>
    {!!data.drive.isCurrentlyUsed &&
    }
    {valid && isPointer && }
  • ; } function RouteComponent () { const { focus } = Route.useSearch(); const { ref, focusKey, focusSelf } = useFocusable({ preferredChildFocusKey: focus }); const isMoving = useIsMutating(changeDownloadsMutation); const { data: drives, refetch } = useQuery({ ...downloadDrivesQuery, refetchInterval: isMoving > 0 ? 1000 : undefined }); return isMoving} withResolver={false} /> ; }