diff --git a/src/internal/movies/handlers.go b/src/internal/movies/handlers.go index 70e0e76..f0721d0 100644 --- a/src/internal/movies/handlers.go +++ b/src/internal/movies/handlers.go @@ -1,6 +1,7 @@ package movies import ( + "encoding/json" "errors" "fmt" "net" @@ -113,15 +114,21 @@ func GetDetailsHandler(env *web.Env, w http.ResponseWriter, r *http.Request) err // SearchMovie will search movie func SearchMovie(env *web.Env, w http.ResponseWriter, r *http.Request) error { - key := r.FormValue("key") - if key == "" { + var data struct { + Key string `json:"key"` + } + if err := json.NewDecoder(r.Body).Decode(&data); err != nil { + return err + } + + if data.Key == "" { return env.RenderError(w, errors.New("no given key")) } var movies []*polochon.Movie searchers := env.Config.MovieSearchers for _, searcher := range searchers { - result, err := searcher.SearchMovie(key, env.Log) + result, err := searcher.SearchMovie(data.Key, env.Log) if err != nil { env.Log.Errorf("error while searching movie : %s", err) continue @@ -129,7 +136,7 @@ func SearchMovie(env *web.Env, w http.ResponseWriter, r *http.Request) error { movies = append(movies, result...) } - env.Log.Debugf("got %d movies doing search %q", len(movies), key) + env.Log.Debugf("got %d movies doing search %q", len(movies), data.Key) movieList := []*Movie{} for _, m := range movies { movie := New(m.ImdbID) diff --git a/src/main.go b/src/main.go index cf5fb35..0653411 100644 --- a/src/main.go +++ b/src/main.go @@ -80,7 +80,7 @@ func main() { env.Handle("/movies/{id:tt[0-9]+}/get_details", movies.GetDetailsHandler).WithRole(users.UserRole) env.Handle("/movies/explore", extmedias.Explore) env.Handle("/movies/refresh", extmedias.Refresh) - env.Handle("/movies/search", movies.SearchMovie) + env.Handle("/movies/search", movies.SearchMovie).Methods("POST") // env.Handle("/shows/polochon", shows.FromPolochon).WithRole(users.UserRole) env.Handle("/shows/{id:tt[0-9]+}", shows.GetDetailsHandler) diff --git a/src/public/js/actions/actionCreators.js b/src/public/js/actions/actionCreators.js index e0c1665..06194cb 100644 --- a/src/public/js/actions/actionCreators.js +++ b/src/public/js/actions/actionCreators.js @@ -80,6 +80,13 @@ export function selectMovie(imdbId) { } } +export function searchMovies(search) { + return request( + 'SEARCH_MOVIES', + configureAxios().post('/movies/search', search) + ) +} + export function getMovieDetails(imdbId) { return request( 'MOVIE_GET_DETAILS', diff --git a/src/public/js/app.js b/src/public/js/app.js index b75f21e..8b071cb 100644 --- a/src/public/js/app.js +++ b/src/public/js/app.js @@ -83,6 +83,9 @@ const MovieListPopular = (props) => ( const MovieListPolochon = (props) => ( ) +const MovieListSearch = (props) => ( + +) const ShowListPopular = (props) => ( @@ -100,6 +103,7 @@ ReactDOM.render(( + diff --git a/src/public/js/components/movies/list.js b/src/public/js/components/movies/list.js index c1b4731..111face 100644 --- a/src/public/js/components/movies/list.js +++ b/src/public/js/components/movies/list.js @@ -53,7 +53,24 @@ class MovieButtons extends React.Component { export default class MovieList extends React.Component { componentWillMount() { - this.props.fetchMovies(this.props.moviesUrl); + if (this.props.moviesUrl) { + this.props.fetchMovies(this.props.moviesUrl); + } else if (this.props.params && this.props.params.search != "") { + this.props.searchMovies({ + key: this.props.params.search + }); + } + } + componentWillUpdate(nextProps, nextState) { + if (!nextProps.params || nextProps.params.search === "") { + return + } + if (this.props.params.search === nextProps.params.search) { + return + } + this.props.searchMovies({ + key: nextProps.params.search + }); } render() { const movies = this.props.movieStore.movies; diff --git a/src/public/js/components/navbar.js b/src/public/js/components/navbar.js index fd25207..2fb6907 100644 --- a/src/public/js/components/navbar.js +++ b/src/public/js/components/navbar.js @@ -1,15 +1,28 @@ import React from 'react' -import { Link } from 'react-router' import { store } from '../store' import { isUserLoggedIn } from '../actions/actionCreators' import { Nav, Navbar, NavItem, NavDropdown, MenuItem } from 'react-bootstrap' import { LinkContainer } from 'react-router-bootstrap' +import { Control, Form } from 'react-redux-form'; export default class NavBar extends React.Component { + constructor(props) { + super(props); + this.handleMovieSearch = this.handleMovieSearch.bind(this); + } + handleMovieSearch() { + this.props.router.push(`/movies/search/${encodeURI(this.props.movieStore.search)}`) + } render() { const username = this.props.userStore.username; const isLoggedIn = username !== "" ? true : false; + const location = this.props.router.getCurrentLocation().pathname; + let displayMovieSearch = false; + if (isLoggedIn && location.indexOf("movies") > -1) + { + displayMovieSearch = true; + } return (
@@ -53,6 +66,18 @@ export default class NavBar extends React.Component { } + {displayMovieSearch && + +
this.handleMovieSearch()}> + + +
+ }
diff --git a/src/public/js/reducers/movies.js b/src/public/js/reducers/movies.js index b5bdef6..3c20dec 100644 --- a/src/public/js/reducers/movies.js +++ b/src/public/js/reducers/movies.js @@ -4,6 +4,7 @@ const defaultState = { perPage: 30, selectedImdbId: "", fetchingDetails: false, + search: "", }; export default function movieStore(state = defaultState, action) { @@ -18,6 +19,10 @@ export default function movieStore(state = defaultState, action) { movies: action.payload.data, selectedImdbId: selectedImdbId, }) + case 'SEARCH_MOVIES_FULFILLED': + return Object.assign({}, state, { + movies: action.payload.data, + }) case 'MOVIE_GET_DETAILS_PENDING': return Object.assign({}, state, { fetchingDetails: true,