From c9842f9f1e56789c004770724f20af785f3ea5c0 Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Thu, 13 Jul 2023 15:51:33 +0000 Subject: [PATCH] added `track` likes logic --- .../src/contexts/WithPlayerContext/index.jsx | 5 +++ packages/app/src/cores/player/player.core.js | 44 +++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/packages/app/src/contexts/WithPlayerContext/index.jsx b/packages/app/src/contexts/WithPlayerContext/index.jsx index 1039feb9..9d784b30 100644 --- a/packages/app/src/contexts/WithPlayerContext/index.jsx +++ b/packages/app/src/contexts/WithPlayerContext/index.jsx @@ -12,6 +12,7 @@ export const DefaultContextValues = { bpm: 0, syncMode: false, syncModeLocked: false, + liked: false, } export const Context = React.createContext(DefaultContextValues) @@ -29,6 +30,7 @@ export class WithPlayerContext extends React.Component { bpm: app.cores.player.getState("trackBPM") ?? 0, syncMode: app.cores.player.getState("syncModeLocked"), syncModeLocked: app.cores.player.getState("syncMode"), + liked: app.cores.player.getState("liked"), } events = { @@ -64,6 +66,9 @@ export class WithPlayerContext extends React.Component { }, "player.coverColorAnalysis.update": (data) => { this.setState({ coverColorAnalysis: data }) + }, + "player.toggle.like": (data) => { + this.setState({ liked: data }) } } diff --git a/packages/app/src/cores/player/player.core.js b/packages/app/src/cores/player/player.core.js index 4f51026f..710672a5 100755 --- a/packages/app/src/cores/player/player.core.js +++ b/packages/app/src/cores/player/player.core.js @@ -158,9 +158,12 @@ class MediaSession { // TODO: Check if source playing is a stream. Also handle if it's a stream resuming after a pause will seek to the last position export default class Player extends Core { static dependencies = [ + "api", "settings" ] + static websocketListen = "music" + static refName = "player" static namespace = "player" @@ -205,6 +208,7 @@ export default class Player extends Core { syncMode: false, syncModeLocked: false, startingNew: false, + liked: false, }) public = { @@ -300,6 +304,7 @@ export default class Player extends Core { return this.state }.bind(this), + toggleCurrentTrackLike: this.toggleCurrentTrackLike.bind(this), seek: this.seek.bind(this), duration: this.duration.bind(this), velocity: this.velocity.bind(this), @@ -309,6 +314,16 @@ export default class Player extends Core { setSampleRate: this.setSampleRate.bind(this), } + wsEvents = { + "music:self:track:toggle:like": (data) => { + const to = data.action === "liked" + + if (this.state.liked !== to) { + this.state.liked = to + } + } + } + async initializeAudioProcessors() { if (this.audioProcessors.length > 0) { console.log("Destroying audio processors") @@ -480,9 +495,15 @@ export default class Player extends Core { } case "syncModeLocked": { app.eventBus.emit("player.syncModeLocked.update", change.object.syncModeLocked) + break } case "syncMode": { app.eventBus.emit("player.syncMode.update", change.object.syncMode) + break + } + case "liked": { + app.eventBus.emit("player.toggle.like", change.object.liked) + break } } } @@ -497,6 +518,10 @@ export default class Player extends Core { } async initializeBeforeRuntimeInitialize() { + for (const [eventName, eventHandler] of Object.entries(this.wsEvents)) { + app.cores.api.listenEvent(eventName, eventHandler, Player.websocketListen) + } + if (app.isMobile) { this.state.audioVolume = 1 } @@ -506,6 +531,23 @@ export default class Player extends Core { // UI Methods // + async toggleCurrentTrackLike() { + if (!this.currentAudioInstance) { + console.error("No track playing") + return false + } + + const currentId = this.currentAudioInstance.manifest._id + + const result = await PlaylistModel.toggleTrackLike(currentId).catch((err) => { + return null + }) + + if (result) { + this.state.liked = result.action === "liked" + } + } + attachPlayerComponent() { if (this.currentDomWindow) { console.warn("EmbbededMediaPlayer already attached") @@ -834,6 +876,8 @@ export default class Player extends Core { this.state.currentAudioManifest = instance.manifest + this.state.liked = instance.manifest.liked + // set time to 0 this.currentAudioInstance.audioElement.currentTime = 0