From 6d0152cf703eec85d5241620a56d048567f3fd31 Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Mon, 18 Dec 2017 08:54:56 -0800 Subject: [PATCH] Fix shift-select --- js/reducers/playlist.js | 7 ++++--- js/reducers/playlist.test.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 js/reducers/playlist.test.js diff --git a/js/reducers/playlist.js b/js/reducers/playlist.js index 5e47138a..661b457b 100644 --- a/js/reducers/playlist.js +++ b/js/reducers/playlist.js @@ -61,11 +61,12 @@ const playlist = (state = defaultPlaylistState, action) => { const clickedIndex = action.index; const start = Math.min(clickedIndex, state.lastSelectedIndex); const end = Math.max(clickedIndex, state.lastSelectedIndex); + const selected = new Set(state.trackOrder.slice(start, end + 1)); return { ...state, - tracks: state.trackOrder.map((trackId, i) => ({ - ...state.tracks[trackId], - selected: i >= start && i <= end + tracks: mapObject(state.tracks, (track, trackId) => ({ + ...track, + selected: selected.has(Number(trackId)) })) }; case SELECT_ALL: diff --git a/js/reducers/playlist.test.js b/js/reducers/playlist.test.js new file mode 100644 index 00000000..d0a7bdd0 --- /dev/null +++ b/js/reducers/playlist.test.js @@ -0,0 +1,32 @@ +import reducer from "./playlist"; +import { SHIFT_CLICKED_TRACK } from "../actionTypes"; + +describe("playlist reducer", () => { + it("can handle shift-click", () => { + const initialState = { + tracks: { + 0: { selected: false }, + 1: { selected: false }, + 2: { selected: false }, + 3: { selected: false } + }, + trackOrder: [3, 2, 1, 0], + lastSelectedIndex: 1 + }; + + const nextState = reducer(initialState, { + type: SHIFT_CLICKED_TRACK, + index: 3 + }); + expect(nextState).toEqual({ + lastSelectedIndex: 1, + tracks: { + 0: { selected: true }, + 1: { selected: true }, + 2: { selected: true }, + 3: { selected: false } + }, + trackOrder: [3, 2, 1, 0] + }); + }); +});