/**
* WordPress dependencies
*/
import { render, createRoot, useState } from '@wordpress/element';
import domReady from '@wordpress/dom-ready';
/**
* Internal dependencies
*/
import Piano from './components/piano';
import {
DEFAULT_ENVELOPE,
DEFAULT_OSCILLATOR_TYPE,
DEFAULT_SETTINGS,
INSTRUMENTS,
} from './constants';
import type { BlockAttributes } from './constants';
function View( props: BlockAttributes ) {
const [ settings, setSettings ] = useState< BlockAttributes >( props );
const onChange = ( newSettings: Partial< BlockAttributes > ) => {
setSettings( {
...settings,
...newSettings,
} );
};
return ;
}
domReady( function () {
const domNodes = document.querySelectorAll( '.wp-block-piano-block-piano' );
if ( domNodes.length === 0 ) {
return;
}
domNodes.forEach( ( domNode ) => {
const instrument = domNode.getAttribute( 'data-instrument' ) || DEFAULT_SETTINGS.instrument;
const allowedInstrument = INSTRUMENTS.find( ( { value } ) => value === instrument );
if ( ! allowedInstrument ) {
return;
}
const volume = parseFloat( domNode.getAttribute( 'data-volume' ) || '' );
const useSustainPedal = domNode.getAttribute( 'data-use-sustain-pedal' ) === '1';
const octaveOffset = parseFloat( domNode.getAttribute( 'data-octave-offset' ) || '' );
const keyLayout = domNode.getAttribute( 'data-key-layout' ) || DEFAULT_SETTINGS.keyLayout;
const keyIndicator =
domNode.getAttribute( 'data-key-indicator' ) || DEFAULT_SETTINGS.keyIndicator;
const synthesizerSetting = domNode.getAttribute( 'data-synthesizer-setting' );
const parsedSynthesizerSetting = synthesizerSetting ? JSON.parse( synthesizerSetting ) : {};
const { oscillator, envelope } = parsedSynthesizerSetting;
const normalizedSynthesizerSetting = {
oscillator: {
type: oscillator?.type || DEFAULT_OSCILLATOR_TYPE,
},
envelope: {
attack: envelope?.attack ? parseFloat( envelope.attack ) : DEFAULT_ENVELOPE.attack,
decay: envelope?.decay ? parseFloat( envelope.decay ) : DEFAULT_ENVELOPE.decay,
sustain: envelope?.sustain ? parseFloat( envelope.sustain ) : DEFAULT_ENVELOPE.sustain,
release: envelope?.release ? parseFloat( envelope.release ) : DEFAULT_ENVELOPE.release,
},
};
const viewProps = {
volume,
useSustainPedal,
octaveOffset,
instrument: allowedInstrument.value,
keyLayout,
keyIndicator,
synthesizerSetting: normalizedSynthesizerSetting,
showOnFront: true,
};
// If version is less than 18 use `render` to render the app
// otherwise use `createRoot` to render the app
if ( createRoot === undefined ) {
render( , domNode );
} else {
const root = createRoot( domNode );
root.render( );
}
} );
} );