freeCodeCamp/client/epics/mouse-trap-epic.js

53 lines
1.1 KiB
JavaScript

import { Observable } from 'rx';
import MouseTrap from 'mousetrap';
import { push } from 'redux-first-router';
import {
toggleNightMode,
hardGoTo
} from '../../common/app/redux';
import {
aboutUrl,
donateUrl,
forumUrl,
githubUrl
} from '../../common/utils/constantStrings.json';
function bindKey(key, actionCreator) {
return Observable.fromEventPattern(
h => MouseTrap.bind(key, h),
h => MouseTrap.unbind(key, h)
)
.map(actionCreator);
}
const softRedirects = {
'g n n': '/challenges/next-challenge',
'g n m': '/map',
'g n o': '/settings'
};
export default function mouseTrapSaga(actions) {
const traps = [
...Object.keys(softRedirects)
.map(key => bindKey(key, () => push(softRedirects[key]))),
bindKey(
'g n a',
() => hardGoTo(aboutUrl)
),
bindKey(
'g n r',
() => hardGoTo(githubUrl)
),
bindKey(
'g n d',
() => hardGoTo(donateUrl)
),
bindKey(
'g n w',
() => hardGoTo(forumUrl)
),
bindKey('g t n', toggleNightMode)
];
return Observable.merge(traps).takeUntil(actions.last());
}