From efc7e5c7995fc580df2b8ffcdd2a0f4ff9a86314 Mon Sep 17 00:00:00 2001 From: austinried <4966622+austinried@users.noreply.github.com> Date: Wed, 4 Aug 2021 17:59:43 +0900 Subject: [PATCH] impl scrobble & scrobble setting works even in background thanks zustand --- app/models/settings.ts | 1 + app/playbackservice.ts | 43 +++++++++++++++++++++++++++++++------- app/screens/ServerView.tsx | 26 +++++++++++++++++++---- app/state/settings.ts | 8 ++++++- app/state/trackplayer.ts | 21 ++++++++++++++++++- app/subsonic/api.ts | 10 +++++++++ app/subsonic/params.ts | 10 +++++++++ 7 files changed, 106 insertions(+), 13 deletions(-) diff --git a/app/models/settings.ts b/app/models/settings.ts index af7ce2c..cc9c288 100644 --- a/app/models/settings.ts +++ b/app/models/settings.ts @@ -4,6 +4,7 @@ export interface Server { username: string token: string salt: string + scrobble: boolean } export interface AppSettings { diff --git a/app/playbackservice.ts b/app/playbackservice.ts index cd9aaa5..50dd85c 100644 --- a/app/playbackservice.ts +++ b/app/playbackservice.ts @@ -1,8 +1,36 @@ -import { getCurrentTrack, getPlayerState, trackPlayerCommands } from '@app/state/trackplayer' -import TrackPlayer, { Event } from 'react-native-track-player' +import { getCurrentTrack, getPlayerState, TrackExt, trackPlayerCommands } from '@app/state/trackplayer' +import TrackPlayer, { Event, State } from 'react-native-track-player' import { useStore } from './state/store' +import { unstable_batchedUpdates } from 'react-native' + +const reset = () => { + unstable_batchedUpdates(() => { + useStore.getState().reset() + }) +} + +const setPlayerState = (state: State) => { + unstable_batchedUpdates(() => { + useStore.getState().setPlayerState(state) + }) +} + +const setCurrentTrackIdx = (idx?: number) => { + unstable_batchedUpdates(() => { + useStore.getState().setCurrentTrackIdx(idx) + }) +} module.exports = async function () { + const unsubCurrentTrack = useStore.subscribe( + (currentTrack?: TrackExt) => { + if (currentTrack) { + useStore.getState().scrobbleTrack(currentTrack.id) + } + }, + state => state.currentTrack, + ) + TrackPlayer.addEventListener(Event.RemotePlay, () => trackPlayerCommands.enqueue(TrackPlayer.play)) TrackPlayer.addEventListener(Event.RemotePause, () => trackPlayerCommands.enqueue(TrackPlayer.pause)) @@ -27,30 +55,31 @@ module.exports = async function () { }) TrackPlayer.addEventListener(Event.RemoteStop, () => { - useStore.getState().reset() + unsubCurrentTrack() + reset() trackPlayerCommands.enqueue(TrackPlayer.destroy) }) TrackPlayer.addEventListener(Event.PlaybackState, () => { trackPlayerCommands.enqueue(async () => { - useStore.getState().setPlayerState(await getPlayerState()) + setPlayerState(await getPlayerState()) }) }) TrackPlayer.addEventListener(Event.PlaybackTrackChanged, () => { useStore.getState().setProgress({ position: 0, duration: 0, buffered: 0 }) trackPlayerCommands.enqueue(async () => { - useStore.getState().setCurrentTrackIdx(await getCurrentTrack()) + setCurrentTrackIdx(await getCurrentTrack()) }) }) TrackPlayer.addEventListener(Event.PlaybackQueueEnded, () => { trackPlayerCommands.enqueue(async () => { - useStore.getState().setCurrentTrackIdx(await getCurrentTrack()) + setCurrentTrackIdx(await getCurrentTrack()) }) }) TrackPlayer.addEventListener(Event.PlaybackMetadataReceived, () => { - useStore.getState().setCurrentTrackIdx(useStore.getState().currentTrackIdx) + setCurrentTrackIdx(useStore.getState().currentTrackIdx) }) } diff --git a/app/screens/ServerView.tsx b/app/screens/ServerView.tsx index 086f2d8..130a666 100644 --- a/app/screens/ServerView.tsx +++ b/app/screens/ServerView.tsx @@ -32,6 +32,7 @@ const ServerView: React.FC<{ const [address, setAddress] = useState(server?.address || '') const [username, setUsername] = useState(server?.username || '') const [password, setPassword] = useState(server?.token ? 'password' : '') + const [scrobble, setScrobble] = useState(server?.scrobble || false) const validate = useCallback(() => { return !!address && !!username && !!password @@ -49,7 +50,7 @@ const ServerView: React.FC<{ } }, [navigation]) - const save = () => { + const save = useCallback(() => { if (!validate()) { return } @@ -68,6 +69,7 @@ const ServerView: React.FC<{ username, salt, token, + scrobble, } if (server) { @@ -87,7 +89,20 @@ const ServerView: React.FC<{ } exit() - } + }, [ + activeServer, + address, + exit, + id, + password, + scrobble, + server, + servers, + setActiveServer, + setServers, + username, + validate, + ]) const remove = useCallback(() => { if (!canRemove()) { @@ -140,14 +155,17 @@ const ServerView: React.FC<{ value={password} onChangeText={setPassword} /> - +