working on backing tracks

This commit is contained in:
Nuwan 2026-01-08 21:07:55 +05:30
parent ce30f5aabb
commit c2a6e0f4d3
3 changed files with 200 additions and 3 deletions

View File

@ -0,0 +1,177 @@
import React, { useState, useEffect } from 'react';
import { useMixersContext } from '../../context/MixersContext';
import { useJamClient } from '../../context/JamClientContext';
import usePanHelpers from '../../hooks/usePanHelpers';
import SessionTrackVU from './SessionTrackVU';
import SessionTrackGain from './SessionTrackGain';
import TrackDiagnostics from './TrackDiagnostics';
import JKSessionPanModal from './JKSessionPanModal';
import { UncontrolledTooltip } from 'reactstrap';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faTimes } from '@fortawesome/free-solid-svg-icons';
import './JKSessionMyTrack.css';
const JKSessionBackingTrack = ({
backingTrack,
mixers,
onClose
}) => {
const mixerHelper = useMixersContext();
const jamClient = useJamClient();
const { convertPanToPercent } = usePanHelpers();
const [pan, setPan] = useState(0);
const [showMenu, setShowMenu] = useState(false);
const [showPanModal, setShowPanModal] = useState(false);
console.log('JKSessionBackingTrack backingTrack:', backingTrack);
useEffect(() => {
if (mixers?.mixer) {
setPan(mixers.mixer.pan || 0);
}
}, [mixers]);
const trackClasses = `session-track backing-track has-mixer`;
const panStyle = {
transform: `rotate(${pan}deg)`,
WebkitTransform: `rotate(${pan}deg)`
};
const handleClose = () => {
console.log('JKSessionBackingTrack: Close clicked');
if (onClose) {
onClose();
}
};
const getFileName = (backingTrack) => {
if (!backingTrack) return 'Unknown File';
// Extract filename from path or use provided name
if (backingTrack.shortFilename) {
return backingTrack.shortFilename;
}
if (backingTrack.filename) {
return backingTrack.filename.split('/').pop().split('\\').pop();
}
return 'Audio File';
};
return (
<div className={trackClasses}>
<div className="disabled-track-overlay" />
<div className="session-track-contents">
{/* Backing Track Header with Close Icon */}
<div className="name" style={{
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
fontWeight: 'bold',
color: '#495057',
marginBottom: '8px'
}}>
<span>Backing Track</span>
<a
href="#"
onClick={(e) => {
e.preventDefault();
handleClose();
}}
style={{
color: '#6c757d',
textDecoration: 'none',
fontSize: '1.2em',
cursor: 'pointer'
}}
title="Close Backing Track"
>
<FontAwesomeIcon icon={faTimes} />
</a>
</div>
{/* File Name - centered where user name would be */}
<div style={{
textAlign: 'center',
fontSize: '14px',
color: '#495057',
marginBottom: '8px',
wordWrap: 'break-word',
lineHeight: '1.2',
minHeight: '40px', // Space for avatar area
display: 'flex',
alignItems: 'center',
justifyContent: 'center'
}}>
{getFileName(backingTrack)}
</div>
{/* Instrument Icon */}
<div
className="track-instrument"
style={{
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
marginBottom: '8px'
}}
>
<img
height="45"
src={backingTrack.instrumentIcon || "/assets/content/icon_recording.png"}
width="45"
alt="instrument"
/>
</div>
{/* Controls */}
<div className="track-controls">
<div className="vu-and-gain" style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>
<SessionTrackVU
orientation="horizontal"
lightCount={11}
lightWidth={17}
lightHeight={12}
side="best"
mixers={mixers}
/>
<SessionTrackGain mixers={mixers?.mixer} gainType="track" controlGroup="track" orientation="vertical" />
</div>
<div className="track-buttons">
<div className="track-menu-container">
<div className="track-menu-button" onClick={() => setShowMenu(!showMenu)}>
...
</div>
{showMenu && (
<div className="track-menu">
<div
onClick={() => {
setShowPanModal(true);
setShowMenu(false);
}}
>
Pan...
</div>
</div>
)}
</div>
</div>
<br className="clearall" />
</div>
<br className="clearall" />
</div>
{/* Pan Modal */}
{showPanModal && (
<JKSessionPanModal
isOpen={showPanModal}
toggle={() => setShowPanModal(false)}
mixers={mixers}
/>
)}
</div>
);
};
export default JKSessionBackingTrack;

View File

@ -45,7 +45,7 @@ const JKSessionMyTrack = ({
const [showProfilePanel, setShowProfilePanel] = useState(false);
const [profileUser, setProfileUser] = useState(null);
console.log('JKSessionMyTrack instrumentIcon:', instrumentIcon);
//console.log('JKSessionMyTrack instrumentIcon:', instrumentIcon);
useEffect(() => {
if (mixers?.mixer) {

View File

@ -41,6 +41,7 @@ import JKSessionJamTrackStems from './JKSessionJamTrackStems.js';
import JKSessionOpenMenu from './JKSessionOpenMenu.js';
import WindowPortal from '../common/WindowPortal.js';
import JKSessionBackingTrackPlayer from './JKSessionBackingTrackPlayer.js';
import JKSessionBackingTrack from './JKSessionBackingTrack.js';
import JKPopupMediaControls from '../popups/JKPopupMediaControls.js';
import { SESSION_PRIVACY_MAP } from '../../helpers/globals.js';
import { toast } from 'react-toastify';
@ -84,7 +85,7 @@ const JKSessionScreen = () => {
const { globalObject, metronomeState, closeMetronome, resetMetronome } = useGlobalContext();
const { getCurrentRecordingState, reset: resetRecordingState, currentlyRecording } = useRecordingHelpers();
const { SessionPageEnter } = useSessionUtils();
const { mediaSummary, openBackingTrack, openMetronome, loadJamTrack } = useMediaContext();
const { mediaSummary, openBackingTrack, openMetronome, loadJamTrack, closeMedia } = useMediaContext();
// Use the session model hook
const sessionModel = useSessionModel(app, server, null); // sessionScreen is null for now
@ -140,6 +141,12 @@ const JKSessionScreen = () => {
setBackingTrackData(null);
}, []);
// Stable callback for backing track close in main screen
const handleBackingTrackMainClose = useCallback(() => {
console.log('JKSessionScreen: Backing Track main screen close requested');
closeMedia();
}, [closeMedia]);
//state for media controls popup
const [showMediaControlsPopup, setShowMediaControlsPopup] = useState(false);
const [mediaControlsOpened, setMediaControlsOpened] = useState(false);
@ -997,6 +1004,20 @@ const JKSessionScreen = () => {
</>
)}
{/* Backing Track Section */}
{mixerHelper.backingTracks && mixerHelper.backingTracks.length > 0 && (
<>
<div style={{ borderLeft: '1px solid #ddd', paddingLeft: '1rem' }}></div>
<div className='backingTrack'>
<JKSessionBackingTrack
backingTrack={mixerHelper.backingTracks[0]}
mixers={mixerHelper.backingTracks[0].mixers}
onClose={handleBackingTrackMainClose}
/>
</div>
</>
)}
</div>
{/* Connection Status Alerts */}
@ -1269,4 +1290,3 @@ const JKSessionScreen = () => {
}
export default memo(JKSessionScreen)