From c3471a2f95afded8d511dbc2c8a2fcdebd521e92 Mon Sep 17 00:00:00 2001 From: Tom Hazledine Date: Tue, 13 Feb 2024 11:52:32 +0000 Subject: [PATCH 1/4] refactoring markup and utils (and tests) --- src/js/Picobel.js | 250 +----------------- src/js/PicobelData.js | 52 ---- src/js/PicobelMarkup.js | 110 -------- src/js/audio-functions.js | 142 ++++++++++ src/js/data.js | 48 ++++ .../PicobelData.test.js => js/data.test.js} | 20 +- src/js/events.js | 76 ++++++ src/js/helpers.js | 63 ----- src/js/markup/index.js | 97 +++++++ src/js/markup/markup.test.js | 104 ++++++++ src/js/markup/slider.test.js | 30 +++ src/js/markup/utils.test.js | 25 ++ src/js/utils/helpers.js | 35 +++ src/js/utils/helpers.test.js | 30 +++ src/js/web-component.js | 1 - src/tests/PicobelMarkup.test.js | 163 ------------ src/tests/helpers.test.js | 64 ----- 17 files changed, 605 insertions(+), 705 deletions(-) delete mode 100644 src/js/PicobelData.js delete mode 100644 src/js/PicobelMarkup.js create mode 100644 src/js/audio-functions.js create mode 100644 src/js/data.js rename src/{tests/PicobelData.test.js => js/data.test.js} (87%) create mode 100644 src/js/events.js delete mode 100644 src/js/helpers.js create mode 100644 src/js/markup/index.js create mode 100644 src/js/markup/markup.test.js create mode 100644 src/js/markup/slider.test.js create mode 100644 src/js/markup/utils.test.js create mode 100644 src/js/utils/helpers.js create mode 100644 src/js/utils/helpers.test.js delete mode 100644 src/tests/PicobelMarkup.test.js delete mode 100644 src/tests/helpers.test.js diff --git a/src/js/Picobel.js b/src/js/Picobel.js index 39709aa..5ef483f 100644 --- a/src/js/Picobel.js +++ b/src/js/Picobel.js @@ -1,7 +1,8 @@ -import _helpers from "./helpers"; import { parseOptions } from "./PicobelSetup"; -import PicobelData from "./PicobelData"; -import PicobelMarkup from "./PicobelMarkup"; +import { findAudio, getRawData } from "./data"; +import { generateMarkup, elementHooks } from "./markup"; +import { _setupLocalListeners } from "./events"; +import { canplaythrough } from "./audio-functions"; /** * --------------------------------------------------------------------------- @@ -48,243 +49,13 @@ export const picobel = (rawOptions = {}) => { }); }; - const _setupLocalListeners = nodes => - nodes.map((node, key) => { - // Audio event listeners - node.addEventListener( - "timeupdate", - PicobelAudio.triggerUpdateProgress, - false - ); - node.addEventListener( - "canplaythrough", - PicobelAudio.canplaythrough, - false - ); - node.addEventListener( - "error", - () => PicobelAudio.errors(key), - false - ); - - // DOM interaction event listeners - if (node.elements.playPauseButton) { - node.elements.playPauseButton.addEventListener( - "click", - PicobelAudio.triggerPlayPauseAudio, - false - ); - } - if (node.elements.progressBar) { - node.elements.progressBar.addEventListener( - "input", - PicobelAudio.sliderScrub, - false - ); - } - if (node.elements.progressBar) { - node.elements.progressBar.addEventListener( - "focus", - e => PicobelAudio.sliderFocus(e, true), - false - ); - } - if (node.elements.progressBar) { - node.elements.progressBar.addEventListener( - "blur", - e => PicobelAudio.sliderFocus(e, false), - false - ); - } - if (node.elements.volumeControl) { - node.elements.volumeControl.addEventListener( - "input", - PicobelAudio.volume, - false - ); - } - if (node.elements.volumeControl) { - node.elements.volumeControl.addEventListener( - "focus", - e => PicobelAudio.volumeFocus(e, true), - false - ); - } - if (node.elements.volumeControl) { - node.elements.volumeControl.addEventListener( - "blur", - e => PicobelAudio.volumeFocus(e, false), - false - ); - } - if (node.elements.muteButton) { - node.elements.muteButton.addEventListener( - "click", - PicobelAudio.muteUnmuteAudio, - false - ); - } - return node; - }); - - const PicobelAudio = { - pauseAll: () => { - state.audioNodes.forEach(node => { - PicobelAudio.pause(node); - }); - }, - triggerPlayPauseAudio: event => { - let index = _helpers.findParentIndex(event.srcElement); - let node = state.audioNodes.find(node => node.key == index); - PicobelAudio.playPauseAudio(node); - }, - playPauseAudio: node => { - if (node.paused || node.currentTime === 0) { - PicobelAudio.pauseAll(); - PicobelAudio.play(node); - } else { - PicobelAudio.pause(node); - } - }, - play: node => { - node.play(); - const button = node.elements.playPauseButton; - const buttonText = node.elements.playPauseButtonText; - button.classList.remove("paused"); - buttonText.innerHTML = "Pause"; - button.classList.add("playing"); - }, - pause: node => { - node.pause(); - const button = node.elements.playPauseButton; - const buttonText = node.elements.playPauseButtonText; - button.classList.remove("playing"); - buttonText.innerHTML = "Play"; - button.classList.add("paused"); - }, - stop: node => { - node.pause(); - const button = node.elements.playPauseButton; - const buttonText = node.elements.playPauseButtonText; - button.classList.remove("playing"); - buttonText.innerHTML = "Play"; - }, - triggerUpdateProgress: event => - PicobelAudio.updateProgress(event.srcElement), - - updateProgress: node => { - let progress = node.currentTime; - let duration = node.duration; - if (node.elements.playTimer) { - let progressParsed = _helpers.parseTime(progress); - node.elements.playTimer.innerHTML = progressParsed; - } - if (progress >= duration) { - PicobelAudio.stop(node); - } - let progressPercent = ((progress / duration) * 100).toFixed(2); - if (node.elements.progressBar) { - node.elements.progressBar.value = progressPercent; - node.elements.indicator.style.width = progressPercent + "%"; - node.elements.playhead.style.left = progressPercent + "%"; - } - }, - canplaythrough: function () { - PicobelMarkup.setLengthDisplay(this); - this.elements.wrapper.classList.remove("loading"); - let meta = PicobelData.getMeta(this); - PicobelMarkup.setMeta(meta, this.elements); - }, - errors: i => { - const { elements } = state.audioNodes[i]; - elements.wrapper.classList.add("error"); - elements.wrapper.classList.remove("loading"); - elements.wrapper.innerHTML = `
Error loading audio file
`; - }, - sliderScrub: event => { - let index = _helpers.findParentIndex(event.srcElement); - let activeNode = state.audioNodes.find(node => node.key == index); - let duration = activeNode.duration; - let targetTime = duration * (event.srcElement.value / 100); - targetTime = targetTime.toFixed(2); - activeNode.currentTime = targetTime; - PicobelAudio.updateProgress(activeNode); - }, - sliderFocus: (event, focus) => { - let index = _helpers.findParentIndex(event.srcElement); - let node = state.audioNodes.find(node => node.key == index); - node.elements.progressWrapper.classList.toggle("focus", focus); - }, - volume: event => { - let index = _helpers.findParentIndex(event.srcElement); - let node = state.audioNodes.find(node => node.key == index); - let volume = event.srcElement.value; - node.tmpVolume = node.volume; - node.mute = false; - PicobelAudio.mute(node); - PicobelAudio.setVolume(node, volume); - }, - volumeFocus: (event, focus) => { - let index = _helpers.findParentIndex(event.srcElement); - let node = state.audioNodes.find(node => node.key == index); - node.elements.volumeWrapper.classList.toggle("focus", focus); - }, - setVolume: (node, value) => { - let valueMapped = value * 10; - let volumePercent = value * 100; - node.volume = value; - console.log; - if (node.elements.volumeDisplay) { - node.elements.volumeDisplay.innerHTML = valueMapped; - } - if (node.elements.volumeControl) { - node.elements.volumeControl.value = value; - } - if (node.elements.volumeIndicator) { - node.elements.volumeIndicator.style.width = volumePercent + "%"; - } - if (node.elements.volumePlayhead) { - node.elements.volumePlayhead.style.left = volumePercent + "%"; - } - }, - muteUnmuteAudio: event => { - let index = _helpers.findParentIndex(event.srcElement); - let node = state.audioNodes.find(node => node.key == index); - node.mute = !node.mute; - PicobelAudio.mute(node); - }, - mute: node => { - const button = node.elements.muteButton; - - if (node.mute) { - node.tmpVolume = node.volume; - PicobelAudio.setVolume(node, 0); - button.classList.add("muted"); - button.classList.remove("unmuted"); - button.innerHTML = "Unmute"; - } else { - if ( - typeof node.tmpVolume != "undefined" && - node.tmpVolume > 0 - ) { - PicobelAudio.setVolume(node, node.tmpVolume); - } else { - PicobelAudio.setVolume(node, 1); - } - button.classList.remove("muted"); - button.classList.add("unmuted"); - button.innerHTML = "Mute"; - } - } - }; - // Get audio elements from page, and save their details to state. - state.audioNodes = PicobelData.findAudio(options.context); + state.audioNodes = findAudio(options.context); - state.audioNodes = PicobelData.getRawData(state.audioNodes); + state.audioNodes = getRawData(state.audioNodes); // Build markup for each element, based on `components` - const markup = PicobelMarkup.generateMarkup( + const markup = generateMarkup( state.audioNodes, state.components, state.theme @@ -294,7 +65,7 @@ export const picobel = (rawOptions = {}) => { _replaceNodes(state.audioNodes, markup); // Save new DOM elements to our node list - state.audioNodes = PicobelMarkup.elementHooks( + state.audioNodes = elementHooks( state.audioNodes, options.context, state.theme @@ -307,12 +78,11 @@ export const picobel = (rawOptions = {}) => { state.audioNodes.forEach(node => { const { readyState } = node; if (readyState === 4) { - PicobelAudio.canplaythrough.call(node); + canplaythrough(node); } }); return { - state, - PicobelAudio + state }; }; diff --git a/src/js/PicobelData.js b/src/js/PicobelData.js deleted file mode 100644 index 6c71dcd..0000000 --- a/src/js/PicobelData.js +++ /dev/null @@ -1,52 +0,0 @@ -import _helpers from "./helpers"; - -const PicobelData = { - // Return an array of all the