Project started 🥂

This commit is contained in:
2026-06-02 01:13:22 +03:00
commit 612d0f0125
146 changed files with 15242 additions and 0 deletions
+79
View File
@@ -0,0 +1,79 @@
import { createSlice, type PayloadAction } from '@reduxjs/toolkit';
type QueueSource = 'manual' | 'album' | 'playlist' | 'artist' | 'search';
interface QueueEntry {
trackId: string;
title: string;
artistName: string;
albumTitle: string;
durationMs: number;
albumArtUrl?: string;
}
interface QueueState {
entries: QueueEntry[];
currentIndex: number;
source: QueueSource;
sourceId: string | null;
sourceName: string | null;
}
const initialState: QueueState = {
entries: [],
currentIndex: -1,
source: 'manual',
sourceId: null,
sourceName: null,
};
export const queueSlice = createSlice({
name: 'queue',
initialState,
reducers: {
setQueue(state, action: PayloadAction<{ entries: QueueEntry[]; startIndex?: number; source: QueueSource; sourceId?: string; sourceName?: string }>) {
state.entries = action.payload.entries;
state.currentIndex = action.payload.startIndex ?? 0;
state.source = action.payload.source;
state.sourceId = action.payload.sourceId ?? null;
state.sourceName = action.payload.sourceName ?? null;
},
addToQueue(state, action: PayloadAction<QueueEntry>) {
state.entries.push(action.payload);
},
addNextInQueue(state, action: PayloadAction<QueueEntry>) {
state.entries.splice(state.currentIndex + 1, 0, action.payload);
},
removeFromQueue(state, action: PayloadAction<number>) {
state.entries.splice(action.payload, 1);
if (action.payload < state.currentIndex) state.currentIndex--;
},
moveInQueue(state, action: PayloadAction<{ from: number; to: number }>) {
const { from, to } = action.payload;
const [entry] = state.entries.splice(from, 1);
state.entries.splice(to, 0, entry);
if (state.currentIndex === from) state.currentIndex = to;
else if (from < state.currentIndex && to >= state.currentIndex) state.currentIndex--;
else if (from > state.currentIndex && to <= state.currentIndex) state.currentIndex++;
},
goToIndex(state, action: PayloadAction<number>) {
state.currentIndex = action.payload;
},
nextTrack(state) {
if (state.currentIndex < state.entries.length - 1) state.currentIndex++;
},
prevTrack(state) {
if (state.currentIndex > 0) state.currentIndex--;
},
clearQueue(state) {
state.entries = [];
state.currentIndex = -1;
},
},
});
export const {
setQueue, addToQueue, addNextInQueue, removeFromQueue,
moveInQueue, goToIndex, nextTrack, prevTrack, clearQueue,
} = queueSlice.actions;
export default queueSlice.reducer;