/** * WordPress dependencies */ import { 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, KEY_INDICATORS, } from './constants'; import type { BlockAttributes } from './constants'; function View( props: BlockAttributes ) { const [ settings, setSettings ] = useState( 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 keyIndicatorAttr = domNode.getAttribute( 'data-key-indicator' ); const keyIndicator = KEY_INDICATORS.find( ( { value } ) => value === keyIndicatorAttr )?.value ?? DEFAULT_SETTINGS.keyIndicator; const synthesizerSetting = domNode.getAttribute( 'data-synthesizer-setting' ); const parsedSynthesizerSetting = synthesizerSetting ? JSON.parse( synthesizerSetting ) : {}; const { oscillator, envelope } = parsedSynthesizerSetting; const parseEnvelopeValue = ( value: unknown, defaultValue: number ): number => { if ( value === null || value === undefined ) { return defaultValue; } const parsed = parseFloat( value as string ); return Number.isNaN( parsed ) ? defaultValue : parsed; }; const normalizedSynthesizerSetting = { oscillator: { type: oscillator?.type || DEFAULT_OSCILLATOR_TYPE, }, envelope: { attack: parseEnvelopeValue( envelope?.attack, DEFAULT_ENVELOPE.attack ), decay: parseEnvelopeValue( envelope?.decay, DEFAULT_ENVELOPE.decay ), sustain: parseEnvelopeValue( envelope?.sustain, DEFAULT_ENVELOPE.sustain ), release: parseEnvelopeValue( envelope?.release, DEFAULT_ENVELOPE.release ), }, }; const viewProps = { volume, useSustainPedal, octaveOffset, instrument: allowedInstrument.value, keyLayout, keyIndicator, synthesizerSetting: normalizedSynthesizerSetting, showOnFront: true, }; const root = createRoot( domNode ); root.render( ); } ); } );