Files
seasonedShows/client/app/components/SearchRequest.jsx

230 lines
7.0 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React from 'react';
import MovieObject from './MovieObject.jsx';
// StyleComponents
import searchStyle from './styles/searchRequestStyle.jsx';
import URI from 'urijs';
// TODO add option for searching multi, movies or tv shows
class SearchRequest extends React.Component {
constructor(props){
super(props)
// Constructor with states holding the search query and the element of reponse.
this.state = {
searchQuery: '',
responseMovieList: null,
movieFilter: true,
showFilter: false,
discoverType: '',
page: 1
}
this.allowedDiscoverTypes = [
'discover', 'popular', 'nowplaying', 'upcoming'
]
// this.baseUrl = 'https://apollo.kevinmidboe.com/api/v1/';
this.baseUrl = 'http://localhost:31459/api/v1/tmdb/';
this.URLs = {
// request: 'https://apollo.kevinmidboe.com/api/v1/plex/request?page='+this.state.page+'&query=',
request: 'http://localhost:31459/api/v1/plex/request?page='+this.state.page+'&query=',
// upcoming: 'https://apollo.kevinmidboe.com/api/v1/tmdb/upcoming',
upcoming: 'http://localhost:31459/api/v1/tmdb/upcoming',
// sendRequest: 'https://apollo.kevinmidboe.com/api/v1/plex/request?query='
sendRequest: 'http://localhost:31459/api/v1/plex/request?query='
}
}
componentDidMount(){
var that = this;
// this.setState({responseMovieList: null})
this.fetchDiscover('upcoming');
}
// Handles all errors of the response of a fetch call
handleErrors(response) {
if (!response.ok) {
throw Error(response.status);
}
return response;
}
fetchDiscover(queryDiscoverType) {
if (this.allowedDiscoverTypes.indexOf(queryDiscoverType) === -1)
throw Error('Invalid discover type: ' + queryDiscoverType);
var uri = new URI(this.baseUrl);
uri.segment(queryDiscoverType)
uri = uri.setSearch('page', this.state.page);
if (this.state.showFilter)
uri = uri.addSearch('type', 'show');
console.log(uri)
this.setState({
responseMovieList: 'Loading...'
});
fetch(uri)
// Check if the response is ok
.then(response => this.handleErrors(response))
.then(response => response.json()) // Convert to json object and pass to next then
.then(data => { // Parse the data of the JSON response
// If it is something here it updates the state variable with the HTML list of all
// movie objects that where returned by the search request
if (data.results.length > 0) {
this.setState({
responseMovieList: data.results.map(item => this.createMovieObjects(item))
})
}
})
// If the --------
.catch(error => {
console.log(error)
this.setState({
responseMovieList: <h1>Not Found</h1>
})
console.log('Error submit: ', error.toString());
});
}
fetchQuery() {
let url = this.URLs.request + this.state.searchQuery
if (this.state.showFilter) {
url = url + '&type=tv'
}
fetch(url)
// Check if the response is ok
.then(response => this.handleErrors(response))
.then(response => response.json()) // Convert to json object and pass to next then
.then(data => { // Parse the data of the JSON response
// If it is something here it updates the state variable with the HTML list of all
// movie objects that where returned by the search request
console.log(data)
if (data.length > 0) {
this.setState({
responseMovieList: data.map(item => this.createMovieObjects(item))
})
}
})
// If the --------
.catch(error => {
console.log(error)
this.setState({
responseMovieList: <h1>Not Found</h1>
})
console.log('Error submit: ', error.toString());
});
}
// Updates the internal state of the query search field.
updateQueryState(event){
this.setState({
searchQuery: event.target.value
});
}
// For checking if the enter key was pressed in the search field.
_handleQueryKeyPress(e) {
if (e.key === 'Enter') {
this.fetchQuery();
}
}
// When called passes the variable to MovieObject and calls it's interal function for
// generating the wanted HTML
createMovieObjects(item) {
let movie = new MovieObject(item);
return movie.getElement();
}
toggleFilter(filterType) {
if (filterType == 'movies') {
this.setState({
movieFilter: !this.state.movieFilter
})
console.log(this.state.movieFilter);
}
else if (filterType == 'shows') {
this.setState({
showFilter: !this.state.showFilter
})
console.log(this.state.showFilter);
}
}
pageBackwards() {
if (this.state.page > 1) {
console.log('backwards');
this.state.page--;
this.getUpcoming();
}
console.log(this.state.page)
}
pageForwards() {
this.state.page++;
this.getUpcoming();
console.log('forwards');
console.log(this.state.page)
}
render(){
return(
<div style={searchStyle.body}>
<button onClick={() => {this.fetchDiscover('discover')}}>Discover</button>
<button onClick={() => {this.fetchDiscover('popular')}}>Popular</button>
<button onClick={() => {this.fetchDiscover('nowplaying')}}>Nowplaying</button>
<button onClick={() => {this.fetchDiscover('upcoming')}}>Upcoming</button>
<div className='backgroundHeader' style={searchStyle.backgroundHeader}>
<div className='pageTitle' style={searchStyle.pageTitle}>
<span style={searchStyle.pageTitleSpan}>Request new movies or tv shows</span>
</div>
<div className='box' style={searchStyle.box}>
<div style={searchStyle.container}>
<span style={searchStyle.searchIcon}><i className="fa fa-search"></i></span>
<input style={searchStyle.searchBar} type="text" id="search" placeholder="Search for new content..."
onKeyPress={(event) => this._handleQueryKeyPress(event)}
onChange={event => this.updateQueryState(event)}
value={this.state.searchQuery}/>
<span style={searchStyle.searchFilter}
className="search_category hvrUnderlineFromCenter"
onClick={() => {this.toggleFilter('movies')}}
id="category_active">Movies</span>
<span style={searchStyle.searchFilter}
className="search_category hvrUnderlineFromCenter"
onClick={() => {this.toggleFilter('shows')}}
id="category_inactive">TV Shows</span>
</div>
</div>
</div>
<div id='requestMovieList' ref='requestMovieList' style={searchStyle.requestWrapper}>
{this.state.responseMovieList}
</div>
<div>
<button onClick={() => {this.pageBackwards()}}>Back</button>
<button onClick={() => {this.pageForwards()}}>Forward</button>
</div>
</div>
)
}
}
export default SearchRequest;