From 4f69b36c7bdc3bd0c9328f66e759d4405f23511a Mon Sep 17 00:00:00 2001
From: austinried <4966622+austinried@users.noreply.github.com>
Date: Thu, 22 Jul 2021 11:23:18 +0900
Subject: [PATCH] impl async storage for extra queue data
finally fixes shuffle (ugh)
---
app/components/TrackPlayerState.tsx | 4 +-
app/screens/NowPlayingLayout.tsx | 8 +-
app/state/trackplayer.ts | 214 ++++++++++++++++++----------
yarn.lock | 6 +-
4 files changed, 148 insertions(+), 84 deletions(-)
diff --git a/app/components/TrackPlayerState.tsx b/app/components/TrackPlayerState.tsx
index d488b21..aed4356 100644
--- a/app/components/TrackPlayerState.tsx
+++ b/app/components/TrackPlayerState.tsx
@@ -135,10 +135,10 @@ const ProgressState = () => {
}
const Debug = () => {
- const value = useAtomValue(currentTrackAtom)
+ const value = useAtomValue(queueAtom)
useEffect(() => {
- // ToastAndroid.show(value?.title || 'undefined', 1)
+ console.log(value.map(t => t.title))
}, [value])
return <>>
diff --git a/app/screens/NowPlayingLayout.tsx b/app/screens/NowPlayingLayout.tsx
index d261eb3..420599b 100644
--- a/app/screens/NowPlayingLayout.tsx
+++ b/app/screens/NowPlayingLayout.tsx
@@ -12,11 +12,13 @@ import {
currentTrackAtom,
playerStateAtom,
queueNameAtom,
+ queueShuffledAtom,
useNext,
usePause,
usePlay,
usePrevious,
useProgress,
+ useToggleShuffle,
} from '@app/state/trackplayer'
import colors from '@app/styles/colors'
import font from '@app/styles/font'
@@ -206,6 +208,8 @@ const PlayerControls = () => {
const pause = usePause()
const next = useNext()
const previous = usePrevious()
+ const shuffle = useAtomValue(queueShuffledAtom)
+ const toggleShuffle = useToggleShuffle()
let playPauseIcon: string
let playPauseAction: undefined | (() => void)
@@ -253,8 +257,8 @@ const PlayerControls = () => {
-
-
+ toggleShuffle()} disabled={disabled}>
+
diff --git a/app/state/trackplayer.ts b/app/state/trackplayer.ts
index 5404081..67e157b 100644
--- a/app/state/trackplayer.ts
+++ b/app/state/trackplayer.ts
@@ -1,15 +1,14 @@
+import { Song } from '@app/models/music'
+import atomWithAsyncStorage from '@app/storage/atomWithAsyncStorage'
+import PromiseQueue from '@app/util/PromiseQueue'
import equal from 'fast-deep-equal'
import { atom } from 'jotai'
import { useAtomCallback, useAtomValue, useUpdateAtom } from 'jotai/utils'
-import { useEffect } from 'react'
+import { useCallback, useEffect } from 'react'
import TrackPlayer, { State, Track } from 'react-native-track-player'
-import { Song } from '@app/models/music'
-import PromiseQueue from '@app/util/PromiseQueue'
type TrackExt = Track & {
id: string
- queueName: string
- queueIndex?: number
artworkThumb?: string
}
@@ -21,6 +20,42 @@ type Progress = {
buffered: number
}
+type QueueExt = {
+ name?: string
+ shuffleOrder?: number[]
+}
+
+const queueExtAtom = atomWithAsyncStorage('@queue', {})
+
+export const queueNameAtom = atom(get => get(queueExtAtom).name)
+export const queueShuffledAtom = atom(get => get(queueExtAtom).shuffleOrder !== undefined)
+
+const queueShuffleOrderAtom = atom(
+ get => get(queueExtAtom).shuffleOrder,
+ (get, set, update) => {
+ const queueExt = get(queueExtAtom)
+ if (!equal(queueExt.shuffleOrder, update)) {
+ set(queueExtAtom, {
+ ...queueExt,
+ shuffleOrder: update,
+ })
+ }
+ },
+)
+
+const queueNameWriteAtom = atom(
+ get => get(queueExtAtom).name,
+ (get, set, update) => {
+ const queueExt = get(queueExtAtom)
+ if (!equal(queueExt.name, update)) {
+ set(queueExtAtom, {
+ ...queueExt,
+ name: update,
+ })
+ }
+ },
+)
+
const playerState = atom(State.None)
export const playerStateAtom = atom(
get => get(playerState),
@@ -51,26 +86,6 @@ export const queueAtom = atom(
},
)
-export const queueNameAtom = atom(get => {
- const queue = get(_queue)
- return queue.length > 0 ? queue[0].queueName : undefined
-})
-
-export const queueShuffledAtom = atom(get => {
- const queue = get(_queue)
- return queue.length > 0 ? queue[0].queueIndex !== undefined : false
-})
-
-export const orderedQueueAtom = atom(get => {
- const queue = get(_queue)
-
- if (queue.length === 0 || queue[0].queueIndex === undefined) {
- return queue
- }
-
- return queue.map(t => t.queueIndex as number).map(i => queue[i])
-})
-
const _progress = atom