Phyks (Lucas Verney)
9717bdc47b
Invalidate the store at logout, emptying cached items such as artists, albums and songs and then preventing them from quickly reappearing when reconnecting with the same or a different account. Closes #5.
51 lines
1.6 KiB
JavaScript
51 lines
1.6 KiB
JavaScript
import Immutable from "immutable";
|
|
|
|
import { createReducer } from "../utils";
|
|
import { stateRecord } from "../models/paginate";
|
|
import { INVALIDATE_STORE } from "../actions";
|
|
|
|
const initialState = new stateRecord();
|
|
|
|
// Creates a reducer managing pagination, given the action types to handle,
|
|
// and a function telling how to extract the key from an action.
|
|
export default function paginate(types) {
|
|
if (!Array.isArray(types) || types.length !== 3) {
|
|
throw new Error("Expected types to be an array of three elements.");
|
|
}
|
|
if (!types.every(t => typeof t === "string")) {
|
|
throw new Error("Expected types to be strings.");
|
|
}
|
|
|
|
const [ requestType, successType, failureType ] = types;
|
|
|
|
return createReducer(initialState, {
|
|
[requestType]: (state) => {
|
|
return (
|
|
state
|
|
.set("isFetching", true)
|
|
.set("error", null)
|
|
);
|
|
},
|
|
[successType]: (state, payload) => {
|
|
return (
|
|
state
|
|
.set("isFetching", false)
|
|
.set("items", new Immutable.List(payload.items))
|
|
.set("error", null)
|
|
.set("nPages", payload.nPages)
|
|
.set("currentPage", payload.currentPage)
|
|
);
|
|
},
|
|
[failureType]: (state, payload) => {
|
|
return (
|
|
state
|
|
.set("isFetching", false)
|
|
.set("error", payload.error)
|
|
);
|
|
},
|
|
[INVALIDATE_STORE]: () => {
|
|
return new stateRecord();
|
|
}
|
|
});
|
|
}
|