+
Metronome
@@ -39,12 +40,12 @@ const JKSessionMetronome = ({
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
- marginBottom: '12px'
+ marginBottom: '65px'
}}
>

{
// Fallback if metronome icon doesn't exist
- e.target.src = "/assets/content/icon_recording.png";
+ e.target.src = {computerIcon};
}}
/>
@@ -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 = () => {