Move through posters with keyboard \o/

This commit is contained in:
Lucas BEE 2018-08-15 22:15:23 +08:00
parent 866d3f08d6
commit 6f17a8ccf8

View File

@ -1,5 +1,6 @@
import React from "react" import React from "react"
import { Map } from "immutable"
import fuzzy from "fuzzy"; import fuzzy from "fuzzy";
import InfiniteScroll from "react-infinite-scroller"; import InfiniteScroll from "react-infinite-scroller";
@ -103,7 +104,7 @@ export default class ListPosters extends React.PureComponent {
hasMore={this.state.hasMore} hasMore={this.state.hasMore}
loadMore={this.loadMore} loadMore={this.loadMore}
selectedImdbId={this.props.selectedImdbId} selectedImdbId={this.props.selectedImdbId}
onClick={this.props.onClick} selectPoster={this.props.onClick}
/> />
</div> </div>
); );
@ -114,6 +115,47 @@ class Posters extends React.PureComponent {
constructor(props) { constructor(props) {
super(props); super(props);
} }
move(event) {
// Detect which direction to go
const keyToDiff = Map({
"ArrowRight": 1,
"l": 1,
"ArrowLeft": -1,
"h": -1,
"ArrowUp": -6,
"k": -6,
"ArrowDown": 6,
"j": 6,
});
if (! keyToDiff.has(event.key) ) {
return;
}
var diff = keyToDiff.get(event.key);
// Don't scroll when changing poster
event.preventDefault();
// Get the index of the currently selected item
const idx = this.props.elmts.keySeq().findIndex(k => k === this.props.selectedImdbId);
var newIdx = idx + diff;
// Handle edge cases
if (newIdx > this.props.elmts.size -1) {
newIdx = this.props.elmts.size -1;
} else if (newIdx < 0) {
newIdx = 0;
}
// Get the imdbID of the newly selected item
var selectedImdb = Object.keys(this.props.elmts.toJS())[newIdx];
// Select the movie
this.props.selectPoster(selectedImdb);
}
render() { render() {
if (this.props.loading) { if (this.props.loading) {
return (<Loader />); return (<Loader />);
@ -128,7 +170,9 @@ class Posters extends React.PureComponent {
} }
return ( return (
<div> <div tabIndex="0"
onKeyDown={(event) => this.move(event)}
>
<InfiniteScroll <InfiniteScroll
hasMore={this.props.hasMore} hasMore={this.props.hasMore}
loadMore={this.props.loadMore} loadMore={this.props.loadMore}
@ -154,7 +198,7 @@ class Posters extends React.PureComponent {
data={movie} data={movie}
key={`poster-${imdbId}`} key={`poster-${imdbId}`}
selected={selected} selected={selected}
onClick={() => this.props.onClick(imdbId)} onClick={() => this.props.selectPoster(imdbId)}
/> />
</div> </div>
) )