diff --git a/.eslintrc.js b/.eslintrc.js index 0b5c9787..bc6eae8f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -84,5 +84,7 @@ module.exports = { HTMLDivElement: false, FormData: false, FileReader: false, + Audio: false, + CustomEvent: false, }, }; diff --git a/package-lock.json b/package-lock.json index 1debfa58..14ef7a9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -963,6 +963,12 @@ "integrity": "sha512-cS5owqtwzLN5kY+l+KgKdRJ/Cee8tlmQoGQuIE9tWnSmS3JMKzmxo2HIAk2wODMifGwO20d62xZQLYz+RLfXmw==", "dev": true }, + "@types/howler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/howler/-/howler-2.1.1.tgz", + "integrity": "sha512-YLwc9L853r85WqZk4xCiROGGodmlAYlKb0rQWABt4opLd6QHn2QLXIApa6vRNqjZxkzbiPs6eZskaRGOw5fDAA==", + "dev": true + }, "@types/json-schema": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", diff --git a/package.json b/package.json index d31bef63..10e351c8 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "@babel/cli": "^7.6.3", "@babel/preset-env": "^7.6.3", "@babel/types": "7.5.5", + "@types/howler": "^2.1.1", "@types/react-router": "^5.0.3", "autoresponsive-react": "^1.1.31", "awesome-typescript-loader": "^5.2.1", diff --git a/src/components/node/Comment/index.tsx b/src/components/node/Comment/index.tsx index ddc4b241..16af2215 100644 --- a/src/components/node/Comment/index.tsx +++ b/src/components/node/Comment/index.tsx @@ -54,7 +54,14 @@ const Comment: FC = ({ comment, is_empty, is_loading, className, photo, {groupped.audio && (
{groupped.audio.map(file => ( -
Player.setSrc(getURL(file.url))}> +
{ + Player.set(getURL(file.url)); + Player.load(); + Player.play(); + }} + > {file.name}
))} diff --git a/src/utils/player.ts b/src/utils/player.ts index 121c20ca..9077c6ca 100644 --- a/src/utils/player.ts +++ b/src/utils/player.ts @@ -1,10 +1,55 @@ -import { Howl } from 'howler'; +// import { Howl } from 'howler'; +// import { store } from '~/redux/store'; -Howl.prototype.setSrc = function setSrc(src) { - this.unload(); - this._src = src; - this.load(); - this.play(); -}; +// export const Player: HTMLAudioElement = new Audio(); +// +// console.log(Player); -export const Player = new Howl({ src: [''] }); +export class PlayerClass { + public constructor() { + this.element.addEventListener('timeupdate', () => { + const { duration: total, currentTime: current } = this.element; + const progress = (current / total) * 100; + + this.element.dispatchEvent( + new CustomEvent('playprogress', { + detail: { current, total, progress }, + }) + ); + }); + } + + public element: HTMLAudioElement = new Audio(); + + public duration: number = 0; + + public set = (src: string): void => { + this.element.src = src; + }; + + public on = (type: string, callback) => { + this.element.addEventListener(type, callback); + }; + + public off = (type: string, callback) => { + this.element.removeEventListener(type, callback); + }; + + public load = () => { + this.element.load(); + }; + + public play = () => { + this.element.play(); + }; + + public getDuration = () => { + return this.element.currentTime; + }; +} + +const Player = new PlayerClass(); + +Player.element.addEventListener('playprogress', ({ detail }: CustomEvent) => console.log(detail)); + +export { Player };