// Vip Private Rover Access Card // Purpose: Defines the Vip Private Rover Access Card module and the local helpers/components used in this file. // Scope: Keeps behavior unchanged while isolating this concern into a clear, single-responsibility unit. import { useMemo, useState } from 'react'; import CardFrame from '../CardFrame/index.jsx'; import { flowWrapClass, innerFlowClass } from './constants.js'; import RoverLabel from '../RoverLabel/index.jsx'; export default function VipPrivateRoverAccessCard({ requestableRovers = [], pendingRequests = [], requestPrivateRoverAccess, onMessage, fullWidth = false, }) { const [pendingByRover, setPendingByRover] = useState({}); const pendingMap = useMemo(() => { const next = new Map(); (pendingRequests || []).forEach((entry) => { if (!entry?.roverId) return; next.set(String(entry.roverId), entry); }); return next; }, [pendingRequests]); const wrapClass = fullWidth ? 'w-full' : flowWrapClass; const handleRequest = async (roverId) => { if (!roverId) return; setPendingByRover((prev) => ({ ...prev, [roverId]: true })); onMessage?.(''); try { const response = await requestPrivateRoverAccess?.(roverId); if (response?.existing) { onMessage?.('You already have a pending request for that rover.'); } else { onMessage?.('Private rover access request sent to lockdown admins.'); } } catch (err) { onMessage?.(err.message || 'Failed to send request.'); } finally { setPendingByRover((prev) => ({ ...prev, [roverId]: false })); } }; return (
{requestableRovers.length === 0 ? (

No closed private rovers are available to request right now.

) : (
{requestableRovers.map((rover) => { const roverId = String(rover.id); const inFlight = Boolean(pendingByRover[roverId]); const pending = pendingMap.get(roverId); return (

{roverId}

{pending ? ( Pending ) : ( )}
); })}
)}
); }