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")}
)}
)
}