import { Loader2, Music } from "lucide-react" import { useEffect, useState } from "react" import { useTranslation } from "react-i18next" import { Button } from "@/components/ui/button" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { useModal } from "@/features/modals/services" import { useMidi } from "../../hooks/use-midi" import { MidiDevice, MidiMessage } from "../../services/midi/midi-engine" export function MidiLearnModal() { const { t } = useTranslation() const { modalData, closeModal } = useModal() const { startLearning } = useMidi() const { devices = [], onComplete } = (modalData || {}) as { devices?: MidiDevice[] onComplete?: (device: MidiDevice, message: MidiMessage, targetParameter: string) => void } const PARAMETER_OPTIONS = [ { value: "channel.1.volume", label: t("fairlightAudio.midi.learnDialog.parameters.channel1Volume") }, { value: "channel.1.pan", label: t("fairlightAudio.midi.learnDialog.parameters.channel1Pan") }, { value: "channel.2.volume", label: t("fairlightAudio.midi.learnDialog.parameters.channel2Volume") }, { value: "channel.2.pan", label: t("fairlightAudio.midi.learnDialog.parameters.channel2Pan") }, { value: "channel.3.volume", label: t("fairlightAudio.midi.learnDialog.parameters.channel3Volume") }, { value: "channel.3.pan", label: t("fairlightAudio.midi.learnDialog.parameters.channel3Pan") }, { value: "channel.4.volume", label: t("fairlightAudio.midi.learnDialog.parameters.channel4Volume") }, { value: "channel.4.pan", label: t("fairlightAudio.midi.learnDialog.parameters.channel4Pan") }, { value: "master.volume", label: t("fairlightAudio.midi.learnDialog.parameters.masterVolume") }, { value: "master.limiter.threshold", label: t("fairlightAudio.midi.learnDialog.parameters.masterLimiterThreshold"), }, ] const [selectedDevice, setSelectedDevice] = useState("") const [targetParameter, setTargetParameter] = useState("") const [isListening, setIsListening] = useState(false) const [receivedMessage, setReceivedMessage] = useState(null) useEffect(() => { // Reset state when modal opens setSelectedDevice("") setTargetParameter("") setIsListening(false) setReceivedMessage(null) }, [modalData]) useEffect(() => { if (isListening) { const stopLearning = startLearning((message) => { setReceivedMessage(message) setIsListening(false) }) return stopLearning } }, [isListening, startLearning]) const handleStartListening = () => { if (selectedDevice && targetParameter) { setIsListening(true) setReceivedMessage(null) } } const handleComplete = () => { if (selectedDevice && targetParameter && receivedMessage && onComplete) { const device = devices.find((d: MidiDevice) => d.id === selectedDevice) if (device) { onComplete(device, receivedMessage, targetParameter) closeModal() } } } return (
{/* Device Selection */}
{/* Parameter Selection */}
{/* MIDI Learn Status */}
{isListening ? ( <>

{t("fairlightAudio.midi.learnDialog.status.listening")}

{t("fairlightAudio.midi.learnDialog.status.listeningHint")}

) : receivedMessage ? ( <>

{t("fairlightAudio.midi.learnDialog.status.received")}

{t("fairlightAudio.midi.learnDialog.info.type")} {receivedMessage.type.toUpperCase()}

{receivedMessage.data.controller !== undefined && (

{t("fairlightAudio.midi.learnDialog.info.controller")} {receivedMessage.data.controller}

)}

{t("fairlightAudio.midi.learnDialog.info.channel")} {receivedMessage.channel}

) : ( <>

{t("fairlightAudio.midi.learnDialog.status.ready")}

{t("fairlightAudio.midi.learnDialog.status.readyHint")}

)}
{!receivedMessage ? ( ) : ( )}
) }