webamp/js/reducers/tracks.ts
2018-10-10 22:15:08 -07:00

103 lines
2.3 KiB
TypeScript

import { PlaylistTrack, Action } from "../types";
import {
SET_MEDIA,
SET_MEDIA_TAGS,
SET_MEDIA_DURATION,
MEDIA_TAG_REQUEST_INITIALIZED,
MEDIA_TAG_REQUEST_FAILED,
ADD_TRACK_FROM_URL
} from "../actionTypes";
import { MEDIA_TAG_REQUEST_STATUS } from "../constants";
import * as TrackUtils from "../trackUtils";
export interface TracksState {
[id: string]: PlaylistTrack;
}
const defaultPlaylistState: TracksState = {};
const tracks = (
state: TracksState = defaultPlaylistState,
action: Action
): TracksState => {
switch (action.type) {
case ADD_TRACK_FROM_URL:
return {
...state,
[action.id]: {
id: action.id,
defaultName: action.defaultName || null,
duration: action.duration == null ? null : action.duration,
url: action.url,
mediaTagsRequestStatus: MEDIA_TAG_REQUEST_STATUS.INITIALIZED
}
};
case SET_MEDIA: {
const newTrack = {
...state[action.id],
duration: action.length
};
return {
...state,
[action.id]: newTrack
};
}
case SET_MEDIA_TAGS: {
return {
...state,
[action.id]: {
...state[action.id],
mediaTagsRequestStatus: MEDIA_TAG_REQUEST_STATUS.COMPLETE,
title: action.title,
artist: action.artist,
album: action.album,
albumArtUrl: action.albumArtUrl
}
};
}
case MEDIA_TAG_REQUEST_INITIALIZED:
return {
...state,
[action.id]: {
...state[action.id],
mediaTagsRequestStatus: MEDIA_TAG_REQUEST_STATUS.INITIALIZED
}
};
case MEDIA_TAG_REQUEST_FAILED:
return {
...state,
[action.id]: {
...state[action.id],
mediaTagsRequestStatus: MEDIA_TAG_REQUEST_STATUS.FAILED
}
};
case SET_MEDIA_DURATION: {
return {
...state,
[action.id]: {
...state[action.id],
duration: action.duration
}
};
}
default:
return state;
}
};
export default tracks;
export const getTrackDisplayName = (
state: TracksState,
id: number | null = null
): string | null => {
if (id == null) {
return null;
}
const track = state[id];
if (track == null) {
return null;
}
return TrackUtils.trackName(track);
};