webamp/js/actionCreators.js
2017-03-20 23:14:15 +00:00

183 lines
3.8 KiB
JavaScript

import MyFile from "./myFile";
import skinParser from "./skinParser";
import { BANDS } from "./constants";
import { clamp } from "./utils";
import {
CLOSE_WINAMP,
LOAD_AUDIO_FILE,
LOAD_AUDIO_URL,
OPEN_FILE_DIALOG,
SEEK_TO_PERCENT_COMPLETE,
SET_BALANCE,
SET_BAND_VALUE,
SET_SKIN_DATA,
SET_VOLUME,
START_LOADING,
STOP,
TOGGLE_REPEAT,
TOGGLE_SHUFFLE
} from "./actionTypes";
export function play() {
return (dispatch, getState) => {
const { status } = getState().media;
dispatch({ type: status === "PLAYING" ? "STOP" : "PLAY" });
};
}
export function pause() {
return (dispatch, getState) => {
const { status } = getState().media;
dispatch({ type: status === "PLAYING" ? "PAUSE" : "PLAY" });
};
}
export function stop() {
return { type: STOP };
}
export function seekForward(seconds) {
return function(dispatch, getState) {
const { media } = getState();
const { timeElapsed, length } = media;
const newTimeElapsed = timeElapsed + seconds;
const newPercentComplete = newTimeElapsed / length;
dispatch({ type: SEEK_TO_PERCENT_COMPLETE, percent: newPercentComplete });
};
}
export function seekBackward(seconds) {
return seekForward(-seconds);
}
export function close() {
return dispatch => {
dispatch({ type: STOP });
dispatch({ type: CLOSE_WINAMP });
};
}
export function setVolume(volume) {
return {
type: SET_VOLUME,
volume: clamp(volume, 0, 100)
};
}
export function adjustVolume(volumeDiff) {
return (dispatch, getState) => {
const currentVolume = getState().media.volume;
return dispatch(setVolume(currentVolume + volumeDiff));
};
}
export function setBalance(balance) {
balance = clamp(balance, -100, 100);
// The balance clips to the center
if (Math.abs(balance) < 25) {
balance = 0;
}
return {
type: SET_BALANCE,
balance
};
}
export function toggleRepeat() {
return { type: TOGGLE_REPEAT };
}
export function toggleShuffle() {
return { type: TOGGLE_SHUFFLE };
}
const SKIN_FILENAME_MATCHER = new RegExp("(wsz|zip)$", "i");
export function loadFileFromReference(fileReference) {
return dispatch => {
const file = new MyFile();
file.setFileReference(fileReference);
if (SKIN_FILENAME_MATCHER.test(fileReference.name)) {
dispatch(setSkinFromFile(file));
} else {
dispatch({ type: LOAD_AUDIO_FILE, file });
}
};
}
export function loadMediaFromUrl(url, name) {
return dispatch => {
dispatch({ type: LOAD_AUDIO_URL, url, name });
};
}
export function setSkinFromFile(skinFile) {
return dispatch => {
dispatch({ type: START_LOADING });
skinParser(skinFile).then(skinData =>
dispatch({
type: SET_SKIN_DATA,
skinImages: skinData.images,
skinColors: skinData.colors,
skinPlaylistStyle: skinData.playlistStyle
}));
};
}
export function setSkinFromUrl(url) {
const skinFile = new MyFile();
skinFile.setUrl(url);
return setSkinFromFile(skinFile);
}
export function setSkinFromFilename(filename) {
const url = `https://cdn.rawgit.com/captbaritone/winamp-skins/master/v2/${filename}`;
return setSkinFromUrl(url);
}
export function openFileDialog(fileInput) {
fileInput.click();
// No reducers currently respond to this.
return { type: OPEN_FILE_DIALOG };
}
export function setEqBand(band, value) {
return {
type: SET_BAND_VALUE,
band,
value
};
}
function _setEqTo(value) {
return dispatch => {
Object.keys(BANDS).forEach(key => {
const band = BANDS[key];
dispatch({
type: SET_BAND_VALUE,
value,
band
});
});
};
}
export function setEqToMax() {
return _setEqTo(100);
}
export function setEqToMid() {
return _setEqTo(50);
}
export function setEqToMin() {
return _setEqTo(0);
}
export function setPreamp(value) {
return {
type: SET_BAND_VALUE,
band: "preamp",
value
};
}