const mapDispatchToProps = (dispatch, {block, song}) => ({ onClickAdd() { const index = song.blocks.indexOf(block.id) dispatch(songs.actions.createBlockAt(song.id, index + 1)) }, onClickDupe() { const index = song.blocks.indexOf(block.id) const blockId = dispatch(blocks.actions.deepCopy(block.id)).payload.copy.id dispatch(songs.actions.addBlockAt(song.id, blockId, index + 1)) }, onClickDestroy() { if (!song.blocks.includes(block.id)) return const prevBlock = before(song.blocks, block.id) const nextBlock = after(song.blocks, block.id) if (!isNil(prevBlock)) { dispatch(url.actions.setBrowserUrl( '/blocks/' + prevBlock , {replaceState: true} )) } else if (!isNil(nextBlock)) { dispatch(url.actions.setBrowserUrl( '/blocks/' + nextBlock, {replaceState: true} )) } else { dispatch(url.actions.setBrowserUrl( '/songs/' + song.id, {replaceState: true} )) } dispatch(blocks.actions.destroy(block.id)) }, })
tickSong() { this.store.dispatch(songPlayer.actions.tick()) const state = this.store.getState() const {beats, currentBeat, loop} = state.songPlayer const song = songPlayer.selectors.getCurrentSong(state) const totalBeats = song.blocks.length * beats const nBlock = Math.floor(currentBeat / beats) const nBlip = currentBeat % beats if (!isNil(song.blocks[nBlock])) { const block = blocks.selectors.getById(song.blocks[nBlock])(state) const channels = blocks.selectors.getEnabledChannels(block.id)(state) channels.forEach((channel) => { this.playBlip(state, channel.blips[nBlip]) }) } if (currentBeat >= totalBeats - 1) { if (loop) { this.store.dispatch(songPlayer.actions.restart()) } else { this.stopSong() } } }
playBlip(state, blipId, stateTransform=identity) { if (isNil(blipId)) return const blip = blips.selectors.getById(blipId)(state) const mixable = mixables.selectors.getById(blip.mixable)(state) this.audioService.play( stateTransform({...blip, ...mixable}) ) }
tick() { this.store.dispatch(player.actions.tick()) const state = this.store.getState() const block = player.selectors.getCurrentBlock(state) if (isNil(block)) return blocks.selectors.getEnabledChannels(block.id)(state).forEach((channel) => { this.playBlip(state, channel.blips[state.player.currentBeat]) }) }
it("Checks if a value is undefined.", () => { expect(isNil(undefined)).toBe(true) let a expect(isNil(a)).toBe(true) let d = {} expect(isNil(d.foo)).toBe(true) expect(isNil(d)).toBe(false) expect(isNil(1)).toBe(false) expect(isNil('a')).toBe(false) expect(isNil('undefined')).toBe(false) expect(isNil(0)).toBe(false) })
const create = (state) => (dispatch) => { let mixableId = state.mixable // Creates a new mixable if one isn't provided if (isNil(mixableId)) { mixableId = dispatch(id.actions.gen()) dispatch(mixables.actions.create({ id: mixableId, sample: state.sample, })) } return dispatch({ type: actionTypes.CREATE, payload: { id: dispatch(id.actions.gen(state)), mixable: mixableId, ...state, } }) }
{channel.blips.filter(id => !isNil(id)).map((id) => (
it("Checks if a value is null.", () => { expect(isNil(null)).toBe(true) })