diff --git a/jam-ui/src/components/client/JKSessionBackingTrack.js b/jam-ui/src/components/client/JKSessionBackingTrack.js index 8a9a88ea8..452e2b59f 100644 --- a/jam-ui/src/components/client/JKSessionBackingTrack.js +++ b/jam-ui/src/components/client/JKSessionBackingTrack.js @@ -10,6 +10,7 @@ import { UncontrolledTooltip } from 'reactstrap'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faTimes } from '@fortawesome/free-solid-svg-icons'; import './JKSessionMyTrack.css'; +import backingTrackIcon from "../../icons/instruments/icon_instrument_default.svg" const JKSessionBackingTrack = ({ backingTrack, @@ -62,7 +63,21 @@ const JKSessionBackingTrack = ({
- {/* Track display - header removed, now shown in parent */} + {/* Track filename */} +
+ {getFileName(backingTrack)} +
{/* Instrument Icon */}
instrument @@ -88,8 +103,8 @@ const JKSessionBackingTrack = ({ diff --git a/jam-ui/src/components/client/JKSessionMetronome.js b/jam-ui/src/components/client/JKSessionMetronome.js index a2ae5b776..8d3924834 100644 --- a/jam-ui/src/components/client/JKSessionMetronome.js +++ b/jam-ui/src/components/client/JKSessionMetronome.js @@ -4,6 +4,7 @@ import { useJamClient } from '../../context/JamClientContext'; import SessionTrackVU from './SessionTrackVU'; import SessionTrackGain from './SessionTrackGain'; import './JKSessionMyTrack.css'; +import computerIcon from '../../assets/img/instruments/icon_instrument_computer45_inverted.svg' const JKSessionMetronome = ({ mixers, @@ -28,7 +29,7 @@ const JKSessionMetronome = ({
{/* Metronome Title */} -
+
Metronome
@@ -39,12 +40,12 @@ const JKSessionMetronome = ({ display: 'flex', justifyContent: 'center', alignItems: 'center', - marginBottom: '12px' + marginBottom: '65px' }} > metronome { // Fallback if metronome icon doesn't exist - e.target.src = "/assets/content/icon_recording.png"; + e.target.src = {computerIcon}; }} />
{/* 0db Label */} -
+ {/*
0db -
+
*/} {/* Track Controls */}
@@ -72,8 +73,8 @@ const JKSessionMetronome = ({ diff --git a/jam-ui/src/components/client/JKSessionOpenMenu.js b/jam-ui/src/components/client/JKSessionOpenMenu.js index 7b18c08e2..f8254747f 100644 --- a/jam-ui/src/components/client/JKSessionOpenMenu.js +++ b/jam-ui/src/components/client/JKSessionOpenMenu.js @@ -5,18 +5,43 @@ import { useAuth } from '../../context/UserAuth'; import { toast } from 'react-toastify'; import openIcon from '../../assets/img/client/open.svg'; -const JKSessionOpenMenu = ({ onBackingTrackSelected, onJamTrackSelected, onMetronomeSelected }) => { +const JKSessionOpenMenu = ({ + onBackingTrackSelected, + onJamTrackSelected, + onMetronomeSelected, + isBackingTrackOpen = false, + isJamTrackOpen = false, + isMetronomeOpen = false +}) => { const [isOpen, setIsOpen] = useState(false); const buttonRef = useRef(null); const menuRef = useRef(null); const jamClient = useJamClient(); + // Check if any media player is currently open + const isAnyMediaOpen = isBackingTrackOpen || isJamTrackOpen || isMetronomeOpen; + + // Get the name of currently open media for tooltip/message + const getOpenMediaName = () => { + if (isBackingTrackOpen) return 'Backing Track'; + if (isJamTrackOpen) return 'JamTrack'; + if (isMetronomeOpen) return 'Metronome'; + return null; + }; + const toggle = () => setIsOpen(prev => !prev); const handleMenuItemClick = async (item) => { console.log(`Selected: ${item}`); setIsOpen(false); + // Check if any media is already open - prevent opening another + if (isAnyMediaOpen) { + const openMediaName = getOpenMediaName(); + toast.warning(`Please close the ${openMediaName} before opening another media.`); + return; + } + if (item === 'JamTracks') { if (onJamTrackSelected) { onJamTrackSelected(); @@ -27,7 +52,8 @@ const JKSessionOpenMenu = ({ onBackingTrackSelected, onJamTrackSelected, onMetro window.JK = window.JK || {}; window.JK.HandleBackingTrackSelectedCallback = (result) => { console.log('Backing track selected:', result); - if (onBackingTrackSelected) { + // Only proceed if a file was actually selected (user didn't cancel) + if (result && result.file && onBackingTrackSelected) { onBackingTrackSelected(result); } }; @@ -115,20 +141,26 @@ const JKSessionOpenMenu = ({ onBackingTrackSelected, onJamTrackSelected, onMetro className="dropdown-menu show" > diff --git a/jam-ui/src/components/client/JKSessionScreen.js b/jam-ui/src/components/client/JKSessionScreen.js index fab70bfcf..3478cc953 100644 --- a/jam-ui/src/components/client/JKSessionScreen.js +++ b/jam-ui/src/components/client/JKSessionScreen.js @@ -1138,6 +1138,12 @@ const JKSessionScreen = () => { // console.log('JKSessionScreen: handleBackingTrackSelected called with:', result); // console.log('JKSessionScreen: Current state - showBackingTrackPopup:', showBackingTrackPopup, 'popupGuard:', popupGuard); + // Don't proceed if no file was selected (user cancelled the dialog) + if (!result || !result.file) { + console.log('JKSessionScreen: No file selected, ignoring'); + return; + } + try { // Use the openBackingTrack action from useMediaActions (already destructured at line 153) // This handles: jamClient call, Redux state update, and server sync @@ -1351,7 +1357,14 @@ const JKSessionScreen = () => { - dispatch(openModal('jamTrack'))} onMetronomeSelected={handleMetronomeSelected} /> + dispatch(openModal('jamTrack'))} + onMetronomeSelected={handleMetronomeSelected} + isBackingTrackOpen={showBackingTrackPlayer} + isJamTrackOpen={showJamTrackPlayer} + isMetronomeOpen={metronomeState.isOpen} + /> { JamTrack: {selectedJamTrack.name} { e.preventDefault(); handleJamTrackClose(); }} - style={{ fontSize: '1.2em', textDecoration: 'none' }} + style={{ fontSize: '1em', textDecoration: 'none' }} title="Close JamTrack" > Close @@ -1453,15 +1466,15 @@ const JKSessionScreen = () => {