import { Plus, RotateCcw, RotateCw, Volume2, VolumeX, X } from "lucide-react" import { useState } from "react" import { useTranslation } from "react-i18next" import { Button } from "@/components/ui/button" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Slider } from "@/components/ui/slider" import { cn } from "@/lib/utils" import { AudioBus, ChannelSend } from "../../services/bus-router" interface SendPanelProps { channelId: string sends: ChannelSend[] availableBuses: AudioBus[] onCreateSend: (destinationBusId: string, level: number, isPre: boolean) => void onUpdateSendLevel: (sendId: string, level: number) => void onToggleSendPre: (sendId: string, isPre: boolean) => void onToggleSendEnabled: (sendId: string, enabled: boolean) => void onDeleteSend: (sendId: string) => void className?: string } export function SendPanel({ channelId, sends, availableBuses, onCreateSend, onUpdateSendLevel, onToggleSendPre, onToggleSendEnabled, onDeleteSend, className, }: SendPanelProps) { const { t } = useTranslation() const [newSendBusId, setNewSendBusId] = useState("") const [newSendLevel, setNewSendLevel] = useState(50) const [newSendIsPre, setNewSendIsPre] = useState(false) // Получаем доступные шины (исключаем master и уже используемые) const usedBusIds = sends.map((send) => send.destinationBusId) const availableForSend = availableBuses.filter((bus) => bus.id !== "master" && !usedBusIds.includes(bus.id)) const handleCreateSend = () => { if (newSendBusId) { onCreateSend(newSendBusId, newSendLevel / 100, newSendIsPre) setNewSendBusId("") setNewSendLevel(50) setNewSendIsPre(false) } } const convertToDb = (level: number): string => { if (level === 0) return "-∞" const db = 20 * Math.log10(level) return `${db.toFixed(1)} dB` } return (

{t("fairlightAudio.sendPanel.title")} - {channelId}

{sends.length} {t("fairlightAudio.sendPanel.active")}
{/* Existing Sends */}
{sends.map((send) => { const bus = availableBuses.find((b) => b.id === send.destinationBusId) return (
{/* Send Header */}
→ {bus?.name || send.destinationBusId} ({bus?.type || t("fairlightAudio.sendPanel.unknown")})
{/* Pre/Post Toggle */} {/* Enable/Disable Toggle */} {/* Delete Send */}
{/* Send Level Control */}
{t("fairlightAudio.sendPanel.level")} {convertToDb(send.level)}
onUpdateSendLevel(send.id, value / 100)} min={0} max={100} step={1} disabled={!send.isEnabled} className={cn("w-full", !send.isEnabled && "opacity-50")} />
-∞ 0 dB
{/* Send Info */}
{send.isPre ? t("fairlightAudio.sendPanel.preFader") : t("fairlightAudio.sendPanel.postFader")} • {send.isEnabled ? ` ${t("fairlightAudio.sendPanel.enabled")}` : ` ${t("fairlightAudio.sendPanel.disabled")}`}
) })}
{/* Add New Send */} {availableForSend.length > 0 && (
{t("fairlightAudio.sendPanel.addSend")}
{/* Bus Selection */} {/* Level and Pre/Post */}
{t("fairlightAudio.sendPanel.levelPercent")} {newSendLevel}%
setNewSendLevel(value)} min={0} max={100} step={5} className="w-full" />
{/* Create Button */}
)} {/* No Available Buses */} {availableForSend.length === 0 && sends.length === 0 && (
{t("fairlightAudio.sendPanel.noAvailableBuses")}
{t("fairlightAudio.sendPanel.createBusesFirst")}
)}
) }