From e1eefe3c9766e6db631aefba9e04d4e46bff730b Mon Sep 17 00:00:00 2001 From: Violet Caulfield Date: Sat, 12 Oct 2024 09:49:03 -0500 Subject: [PATCH] More work with the queue --- api/mutators/play-queue/helpers/index.ts | 20 +++++++++ api/mutators/play-queue/helpers/storage.ts | 20 ++++++++- api/mutators/play-queue/play-queue.ts | 47 +++++++++++++++++++--- api/mutators/play-queue/queue.ts | 18 +++++---- 4 files changed, 90 insertions(+), 15 deletions(-) create mode 100644 api/mutators/play-queue/helpers/index.ts diff --git a/api/mutators/play-queue/helpers/index.ts b/api/mutators/play-queue/helpers/index.ts new file mode 100644 index 00000000..2274db03 --- /dev/null +++ b/api/mutators/play-queue/helpers/index.ts @@ -0,0 +1,20 @@ +import { QueuingType } from "../../../../enums/queuing-type"; +import { JellifyTrack } from "../../../../types/JellifyTrack"; + +/** + * Finds and returns the index of the player queue to insert additional tracks into + * @param playQueue The current player queue + * @returns The index to insert songs to play next at + */ +export const findPlayNextIndexStart = (playQueue: JellifyTrack[]) => { + return 1 +} + +/** + * Finds and returns the index of the play queue to insert user queue tracks into + * @param playQueue The current player queue + * @returns The index to insert songs to add to the user queue + */ +export const findPlayQueueIndexStart = (playQueue: JellifyTrack[]) => { + return playQueue.findIndex(queuedTrack => queuedTrack.QueueType === QueuingType.FromSelection) - 1; +} \ No newline at end of file diff --git a/api/mutators/play-queue/helpers/storage.ts b/api/mutators/play-queue/helpers/storage.ts index e79a8e97..ed9d2968 100644 --- a/api/mutators/play-queue/helpers/storage.ts +++ b/api/mutators/play-queue/helpers/storage.ts @@ -2,6 +2,22 @@ import AsyncStorage from "@react-native-async-storage/async-storage"; import { AsyncStorageKeys } from "../../../../enums/async-storage-keys"; import { JellifyTrack } from "../../../../types/JellifyTrack"; -export async function storePlayQueue(queue: JellifyTrack[]) : Promise {{ +/** + * Stores the play queue for referencing in the UI and for loading at launch + * @param queue The queue of tracks to store + * @returns + */ +export async function storePlayQueue(queue: JellifyTrack[]) : Promise { return AsyncStorage.setItem(AsyncStorageKeys.PlayQueue, JSON.stringify(queue)); -}} \ No newline at end of file +} + +/** + * Fetches the stored play queue for referencing in the UI and for loading at launch + * @returns An array of the stored tracks or an empty array if nothing is stored + */ +export async function fetchPlayQueue() : Promise { + + let storedQueue = await AsyncStorage.getItem(AsyncStorageKeys.PlayQueue); + + return storedQueue != null ? JSON.parse(storedQueue as string) : []; +} \ No newline at end of file diff --git a/api/mutators/play-queue/play-queue.ts b/api/mutators/play-queue/play-queue.ts index fa6e1853..8505b2a6 100644 --- a/api/mutators/play-queue/play-queue.ts +++ b/api/mutators/play-queue/play-queue.ts @@ -3,15 +3,52 @@ */ import { useMutation } from "@tanstack/react-query"; -import { useQueue } from "../../queries/queue"; import AsyncStorage from "@react-native-async-storage/async-storage"; import { AsyncStorageKeys } from "../../../enums/async-storage-keys"; import { JellifyTrack } from "../../../types/JellifyTrack"; -import { getQueue, remove } from "react-native-track-player/lib/src/trackPlayer"; -import { storePlayQueue } from "./helpers/storage"; -import { Track } from "react-native-track-player/lib/src/interfaces/Track"; +import { add, getQueue, remove } from "react-native-track-player/lib/src/trackPlayer"; +import { fetchPlayQueue, storePlayQueue } from "./helpers/storage"; +import { findPlayNextIndexStart, findPlayQueueIndexStart } from "./helpers"; -export const removeFromQueue = useMutation({ +/** + * + */ +export const addToPlayNext = useMutation({ + mutationFn: async (tracks: JellifyTrack[]) => { + + let playQueue = await fetchPlayQueue(); + let insertIndex = findPlayNextIndexStart(playQueue); + + add(tracks, insertIndex); + + tracks.forEach(track => { + playQueue.splice(insertIndex, 0, track); + }); + + await storePlayQueue(playQueue) + } +}); + +/** + * Adds additional tracks to the end of the user queue + */ +export const addToPlayQueue = useMutation({ + mutationFn: async (tracks: JellifyTrack[]) => { + + let playQueue = await fetchPlayQueue(); + let insertIndex = findPlayQueueIndexStart(playQueue); + + add(tracks, insertIndex); + + tracks.forEach(track => { + playQueue.splice(insertIndex, 0, track); + }); + + await storePlayQueue(playQueue) + } +}); + +export const removeFromPlayQueue = useMutation({ mutationFn: async (indexes: number[]) => { // Remove from the player first thing remove(indexes); diff --git a/api/mutators/play-queue/queue.ts b/api/mutators/play-queue/queue.ts index 6e08f467..5a920814 100644 --- a/api/mutators/play-queue/queue.ts +++ b/api/mutators/play-queue/queue.ts @@ -1,11 +1,13 @@ -import { useMutation } from "@tanstack/react-query"; -import { MutationKeys } from "../../../enums/mutation-keys"; +import { useQuery, UseQueryResult } from "@tanstack/react-query"; import AsyncStorage from "@react-native-async-storage/async-storage"; import { AsyncStorageKeys } from "../../../enums/async-storage-keys"; -import * as Keychain from "react-native-keychain" -import { useServerUrl } from "../../queries/storage"; -import { Jellyfin } from "@jellyfin/sdk"; -import { client } from "../../queries"; -import { getSystemApi } from "@jellyfin/sdk/lib/utils/api/system-api" -import { JellyfinCredentials } from "../../types/jellyfin-credentials"; \ No newline at end of file +import { JellifyTrack } from "../../../types/JellifyTrack"; +import { QueryKeys } from "../../../enums/query-keys"; + +export const useStoredQueue: UseQueryResult = useQuery({ + queryKey: [QueryKeys.PlayQueue], + queryFn: (() => { + return AsyncStorage.getItem(AsyncStorageKeys.PlayQueue); + }) +}); \ No newline at end of file