More work with the queue

This commit is contained in:
Violet Caulfield
2024-10-12 09:49:03 -05:00
parent 2e42fb0ea7
commit e1eefe3c97
4 changed files with 90 additions and 15 deletions

View File

@@ -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;
}

View File

@@ -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<void> {{
/**
* 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<void> {
return AsyncStorage.setItem(AsyncStorageKeys.PlayQueue, JSON.stringify(queue));
}}
}
/**
* 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<JellifyTrack[]> {
let storedQueue = await AsyncStorage.getItem(AsyncStorageKeys.PlayQueue);
return storedQueue != null ? JSON.parse(storedQueue as string) : [];
}

View File

@@ -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);

View File

@@ -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";
import { JellifyTrack } from "../../../types/JellifyTrack";
import { QueryKeys } from "../../../enums/query-keys";
export const useStoredQueue: UseQueryResult<JellifyTrack[]> = useQuery({
queryKey: [QueryKeys.PlayQueue],
queryFn: (() => {
return AsyncStorage.getItem(AsyncStorageKeys.PlayQueue);
})
});