"use client"; import { useState } from "react"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { autoMapDeviceSlots } from "@/lib/buttplug/device-remap"; import type { RecordingDeviceSlot } from "@/lib/db/schema"; import type { ConnectedDeviceInfo } from "@/lib/buttplug/types"; interface DeviceRemapDialogProps { open: boolean; deviceSlots: RecordingDeviceSlot[]; connectedDevices: ConnectedDeviceInfo[]; onCancel: () => void; onConfirm: (mapping: Map) => void; } export function DeviceRemapDialog({ open, deviceSlots, connectedDevices, onCancel, onConfirm, }: DeviceRemapDialogProps) { const autoMapped = autoMapDeviceSlots(deviceSlots, connectedDevices); const [assignments, setAssignments] = useState>( Object.fromEntries(deviceSlots.map((slot, i) => [slot.sourceSessionDeviceId, autoMapped[i]?.matchedDeviceIndex ?? null])), ); const allAssigned = deviceSlots.every((s) => assignments[s.sourceSessionDeviceId] !== null); function handleConfirm() { const mapping = new Map(); for (const slot of deviceSlots) { const deviceIndex = assignments[slot.sourceSessionDeviceId]; if (deviceIndex !== null && deviceIndex !== undefined) mapping.set(slot.sourceSessionDeviceId, deviceIndex); } onConfirm(mapping); } return ( !o && onCancel()}> Match devices for replay Web Bluetooth doesn't expose a stable device id across sessions, so match each recorded device to a currently-connected one. Two identically-named devices can't be told apart automatically.
{deviceSlots.map((slot) => (
{slot.slotLabel}
))}
); }