@@ -13,7 +13,7 @@ import React, {
1313import { useInView } from 'react-intersection-observer' ;
1414import FigureLabels from '../common/FigureLabels' ;
1515import FileUploader from '../common/FileUploader' ;
16- import { useSearchZone } from '../common/Storage' ;
16+ import { useAudioSettings , useSearchZone } from '../common/Storage' ;
1717import BrowserEditor from './BrowserEditor' ;
1818import FolderStructure from './FolderStructure' ;
1919import MenuBar from './MenuBar' ;
@@ -71,14 +71,14 @@ function ScrollSpy(props) {
7171
7272
7373const FilesList = memo ( ( props : any ) => {
74- const { structure, setDirty, selectFile} = props ;
74+ const { structure, setDirty, selectFile, webAudio } = props ;
7575
7676 return (
7777 < ul className = "files-browser" > {
7878 structure . files . length === 0 ?
7979 < li className = "status" > { gettext ( "Empty folder" ) } </ li > : (
8080 < > { structure . files . map ( file => (
81- < li key = { file . id } onClick = { ( ) => selectFile ( file ) } > < Figure { ...file } /> </ li >
81+ < li key = { file . id } onClick = { ( ) => selectFile ( file ) } > < Figure { ...file } webAudio = { webAudio } /> </ li >
8282 ) ) }
8383 { structure . offset !== null && < ScrollSpy key = { structure . offset } setDirty = { setDirty } /> }
8484 </ >
@@ -101,13 +101,29 @@ const FileSelectDialog = forwardRef((props: any, forwardedRef) => {
101101 const [ isDirty , setDirty ] = useState ( false ) ;
102102 const ref = useRef ( null ) ;
103103 const uploaderRef = useRef ( null ) ;
104+ const [ audioSettings ] = useAudioSettings ( ) ;
105+ const [ webAudio , setWebAudio ] = useState ( null ) ;
104106 const menuBarRef = useRef ( null ) ;
105107 const [ uploadedFile , setUploadedFile ] = useState ( null ) ;
106108 const [ currentFolderElement , setCurrentFolderElement ] = useState ( null ) ;
107109 const [ searchZone , setSearchZone ] = useSearchZone ( 'current' ) ;
108110
109111 useImperativeHandle ( forwardedRef , ( ) => ( { scrollToCurrentFolder, dismissAndClose} ) ) ;
110112
113+ useEffect ( ( ) => {
114+ const context = new window . AudioContext ( ) ;
115+ const gainNode = context . createGain ( ) ;
116+ gainNode . connect ( context . destination ) ;
117+ gainNode . gain . value = audioSettings . volume ;
118+ setWebAudio ( { context, gainNode} ) ;
119+
120+ return ( ) => {
121+ if ( webAudio ) {
122+ webAudio . context . close ( ) ;
123+ }
124+ } ;
125+ } , [ ] ) ;
126+
111127 useEffect ( ( ) => {
112128 if ( structure . root_folder === null ) {
113129 initializeStructure ( ) ;
@@ -279,6 +295,7 @@ const FileSelectDialog = forwardRef((props: any, forwardedRef) => {
279295 setSearchQuery = { setSearchQuery }
280296 searchZone = { searchZone }
281297 setSearchZone = { changeSearchZone }
298+ webAudio = { webAudio }
282299 />
283300 < div className = "browser-body" >
284301 < nav className = "folder-structure" >
@@ -308,6 +325,7 @@ const FileSelectDialog = forwardRef((props: any, forwardedRef) => {
308325 structure = { structure }
309326 setDirty = { setDirty }
310327 selectFile = { selectFile }
328+ webAudio = { webAudio }
311329 />
312330 } </ FileUploader >
313331 </ div >
0 commit comments