Files
mcma-webui/src/store/slices/player.ts
T
Цвылев Александр Вадимович 9d88d70be0 feat(player): Now Playing overlay + synced lyrics panel (A1/A11, §6.7)
Full-screen overlay expanded from the persistent player: big artwork or a
Lyrics tab. Synced (LRC) lyrics highlight the active line by playback position,
auto-scroll, and seek on tap; plain text is the fallback; missing lyrics offers
a re-fetch. Adds lyrics endpoint + LRC parser + isNowPlayingOpen player state.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 21:04:39 +03:00

83 lines
1.8 KiB
TypeScript

import { createSlice, type PayloadAction } from '@reduxjs/toolkit';
export interface PlayerState {
currentTrackId: string | null;
isPlaying: boolean;
position: number;
duration: number;
volume: number;
muted: boolean;
isQueueOpen: boolean;
isNowPlayingOpen: boolean;
}
export const playerInitialState: PlayerState = {
currentTrackId: null,
isPlaying: false,
position: 0,
duration: 0,
volume: 0.78,
muted: false,
isQueueOpen: false,
isNowPlayingOpen: false,
};
export const playerSlice = createSlice({
name: 'player',
initialState: playerInitialState,
reducers: {
play(state, action: PayloadAction<string>) {
state.currentTrackId = action.payload;
state.isPlaying = true;
state.position = 0;
},
pause(state) {
state.isPlaying = false;
},
resume(state) {
state.isPlaying = true;
},
stop(state) {
state.isPlaying = false;
state.currentTrackId = null;
state.position = 0;
},
setPosition(state, action: PayloadAction<number>) {
state.position = action.payload;
},
setDuration(state, action: PayloadAction<number>) {
state.duration = action.payload;
},
setVolume(state, action: PayloadAction<number>) {
state.volume = action.payload;
},
toggleMute(state) {
state.muted = !state.muted;
},
toggleQueue(state) {
state.isQueueOpen = !state.isQueueOpen;
},
toggleNowPlaying(state) {
state.isNowPlayingOpen = !state.isNowPlayingOpen;
},
setNowPlayingOpen(state, action: PayloadAction<boolean>) {
state.isNowPlayingOpen = action.payload;
},
},
});
export const {
play,
pause,
resume,
stop,
setPosition,
setDuration,
setVolume,
toggleMute,
toggleQueue,
toggleNowPlaying,
setNowPlayingOpen,
} = playerSlice.actions;
export default playerSlice.reducer;