Skip to content
Snippets Groups Projects
Commit 9270eb3c authored by Trym Grande's avatar Trym Grande
Browse files

Merge branch 'trym' into 'master'

Search on exact title works

See merge request it2810-h21/team-54/project-3!5
parents a6254558 cc55000e
Branches
No related tags found
No related merge requests found
...@@ -9847,6 +9847,24 @@ ...@@ -9847,6 +9847,24 @@
"minimist": "^1.2.5" "minimist": "^1.2.5"
} }
}, },
"mobx": {
"version": "6.3.5",
"resolved": "https://registry.npmjs.org/mobx/-/mobx-6.3.5.tgz",
"integrity": "sha512-MeDfqtiSbhVoJgXqQsrJwvq2klj7Xk9pPdMThCdFiwFt33vgWJe82ATppPwVzQoz0AI3QpSSwQzcp3TBDK4syg=="
},
"mobx-react": {
"version": "7.2.1",
"resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-7.2.1.tgz",
"integrity": "sha512-LZS99KFLn75VWDXPdRJhILzVQ7qLcRjQbzkK+wVs0Qg4kWw5hOI2USp7tmu+9zP9KYsVBmKyx2k/8cTTBfsymw==",
"requires": {
"mobx-react-lite": "^3.2.0"
}
},
"mobx-react-lite": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.2.1.tgz",
"integrity": "sha512-hwURgfmP2apX3HQrB55V9DN47kuN3C6KlQvI5UIfJRibXma72C/JudcNt2r9dWjAdFMrcZoz1ivvtXMCkJ2aQA=="
},
"move-concurrently": { "move-concurrently": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
......
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
"@types/react": "^17.0.28", "@types/react": "^17.0.28",
"@types/react-dom": "^17.0.9", "@types/react-dom": "^17.0.9",
"dotenv": "^10.0.0", "dotenv": "^10.0.0",
"mobx": "^6.3.5",
"mobx-react": "^7.2.1",
"react": "^17.0.2", "react": "^17.0.2",
"react-dom": "^17.0.2", "react-dom": "^17.0.2",
"react-scripts": "4.0.3", "react-scripts": "4.0.3",
......
...@@ -13,9 +13,9 @@ ...@@ -13,9 +13,9 @@
} }
} }
.App-header { .header {
background-color: #282c34; background-color: gray;
min-height: 100vh; min-height: 5vh;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
......
import './App.css'; import './App.css';
import Movies from './components/Movies' import Movies from './components/Movies'
import Header from './components/Header'
import { MoviesStore } from "./components/MoviesStore";
function App() { function App() {
return ( return (
<div className="App"> <div className="App">
<Movies /> <Header moviesStore={MoviesStore}/>
<Movies moviesStore={MoviesStore}/>
</div> </div>
); );
} }
......
import React, { Component } from 'react'
import { MoviesStoreImplementation } from "./MoviesStore";
import { inject, observer } from 'mobx-react';
import * as services from './services';
type MyState = {
input: string
};
interface MoviesProps {
moviesStore: MoviesStoreImplementation
}
class Header extends React.Component<MoviesProps, MyState> {
constructor(props: any) {
super(props);
this.state = {
input: ''
}
}
render() {
return (
<div className="header">
<input type="text" placeholder="Search for movies..." onChange={this.handleChange}></input>
<button onClick={this.search}>Search</button>
</div>
)
}
handleChange = (e: any) => {
this.setState({ input: e.target.value })
}
search = () => {
this.getMovieByColumnType(services.ColumnType.Title, this.state.input, 'id title genre description');
}
getMovieByColumnType(columnType : services.ColumnType, value: string, neededData: string) {
services.queryFetch(services.generateQuery(columnType, value, neededData) , 'POST')
.then(res => res.json())
.then(res => this.props.moviesStore.setMovies(res.data.getMovieByColumnType))
}
}
export default inject('moviesStore')(observer(Header))
\ No newline at end of file
import React from 'react'; import React from 'react';
import './movies.css'; import { MoviesStore, MoviesStoreImplementation } from "./MoviesStore";
import { inject, observer } from 'mobx-react';
import * as services from './services';
type MyProps = {}; type MyProps = {};
type MyState = { type MyState = {
movies: any movies: any
}; };
enum ColumnType{ interface MoviesProps {
Id, moviesStore: MoviesStoreImplementation
Title,
Genre,
Rating,
Year,
DirectorFirstName,
DirectorLastName,
Description
} }
class Movies extends React.Component<MyProps, MyState> { // interface movie {
constructor(props: any) {
super(props);
this.state = { // }
movies: []
}
}
class Movies extends React.Component<MoviesProps, MyState> {
constructor(props: any) {
super(props);
getAllMoviesQuery = ` // this.state = {
query { // movies: []
getAllMovies { // }
id,title,genre,rating_dice_throw,year,director_first_name,director_last_name,description,cover_image
} }
}`
createMovieQuery = `
mutation {
createMovie(title: "testing", genre: "gaming", rating_dice_throw: 1, year: '2000', director_first_name: "torje", director_last_name: "the_gamer", description: "amazing", cover_image: "url123") {
id
}
}`
getAllMovies() { getAllMovies() {
this.queryFetch(this.getAllMoviesQuery, 'POST') services.queryFetch(services.getAllMoviesQuery, 'POST')
.then(res => res.json()) .then(res => res.json())
.then(res => this.setState({ movies: res.data.getAllMovies })) .then(res => this.props.moviesStore.setMovies(res.data.getAllMovies))
.then(res => console.log(this.state.movies))
}
generateQuery(columnType: ColumnType, value: string, neededData: string){
let column = '';
switch(columnType){
case ColumnType.Title:
column = 'title';
break;
case ColumnType.Genre:
column = 'genre';
break;
case ColumnType.Rating:
column = 'rating_dice_throw';
break;
case ColumnType.Year:
column = 'year';
break;
case ColumnType.DirectorFirstName:
column = 'director_first_name';
break;
case ColumnType.DirectorLastName:
column = 'director_last_name';
break;
case ColumnType.Description:
column = 'description';
break;
default:
column = 'id';
break;
} }
return `
query {
getMovieByColumnType(${column}: "${value}") {
${neededData}
}
}`;
}
getMovieByColumnType(columnType : ColumnType, value: string, neededData: string) { getMovieByColumnType(columnType : services.ColumnType, value: string, neededData: string) {
this.queryFetch(this.generateQuery(columnType, value, neededData) , 'POST') services.queryFetch(services.generateQuery(columnType, value, neededData) , 'POST')
.then(res => res.json()) .then(res => res.json())
.then(res => this.setState({ movies: res.data.getMovieByColumnType })) .then(res => this.props.moviesStore.setMovies(res))
.then(res => console.log(this.state.movies))
} }
componentDidMount() { componentDidMount() {
//this.getAllMovies(); this.getAllMovies();
this.getMovieByColumnType(ColumnType.Genre, 'Drama', 'id title genre description'); // this.getMovieByColumnType(services.ColumnType.Genre, 'Drama', 'id title genre description');
}
queryFetch(query: String, method: string) {
return fetch('/graphql', {
method: method,
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
query: query,
// variables: variables
})
})
} }
render() { render() {
return ( return (
<ul> <ul>
{this.state.movies.map((movie: any) => <li key={movie.title}>{JSON.stringify(movie)}</li>)} {/* {this.state.movies.map((movie: any) => <li key={movie.title}>{JSON.stringify(movie)}</li>)} */}
{/* {this.props.moviesStore.movies.map((movie: any) => <li key={movie.id}>{JSON.stringify(movie)}</li>)} */}
{JSON.stringify(MoviesStore.movies)}
</ul> </ul>
); );
} }
} }
export default Movies;
export default inject('moviesStore')(observer(Movies))
import { action, makeObservable, observable } from "mobx";
interface Movie {
}
export class MoviesStoreImplementation {
movies: Movie[] = [];
constructor() {
makeObservable(this, {
movies: observable,
setMovies: action
});
}
setMovies(movies: any) {
this.movies = movies;
}
}
export const MoviesStore = new MoviesStoreImplementation();
\ No newline at end of file
.App {
margin: auto
}
.App-header {
height: auto
}
\ No newline at end of file
//@ts-nocheck export function queryFetch(query: String, method: string) {
// const continentSelect = document.getElementById('continent-select') return fetch('/graphql', {
// const countryList = document.getElementById('countries-list') method: method,
headers: { "Content-Type": "application/json" },
// queryFetch(` body: JSON.stringify({
// query { query: query,
// continents {
// name
// code
// }
// }
// `)
// .then(data => {
// data.data.movies.forEach(movie => {
// option.innerText = continent.name
// continentSelect.append(option)
// })
// })
// continentSelect.addEventListener('change', async e => {
// const continentCode = e.target.value
// const countries = await getContinentCountries(continentCode)
// countryList.innerHTML = ''
// countries.forEach(country => {
// const element = document.createElement('div')
// element.innerText = country.name
// countryList.append(element)
// })
// })
// function getContinentCountries(continentCode) {
// return queryFetch(`
// query getCountries($code: String) {
// continent(code: $code) {
// countries {
// name
// }
// }
// }
// `, { code: continentCode }).then(data => {
// return data.data.continent.countries
// })
// }
// export function queryFetch(query, variables) {
// return fetch('https://countries.trevorblades.com/', {
// method: 'POST',
// headers: { "Content-Type": "application/json" },
// body: JSON.stringify({
// query: query,
// variables: variables // variables: variables
// }) })
// }).then(res => res.json()) })
// } }
export {}
\ No newline at end of file export enum ColumnType{
Id,
Title,
Genre,
Rating,
Year,
DirectorFirstName,
DirectorLastName,
Description
}
export function generateQuery(columnType: ColumnType, value: string, neededData: string){
let column = '';
switch(columnType){
case ColumnType.Title:
column = 'title';
break;
case ColumnType.Genre:
column = 'genre';
break;
case ColumnType.Rating:
column = 'rating_dice_throw';
break;
case ColumnType.Year:
column = 'year';
break;
case ColumnType.DirectorFirstName:
column = 'director_first_name';
break;
case ColumnType.DirectorLastName:
column = 'director_last_name';
break;
case ColumnType.Description:
column = 'description';
break;
default:
column = 'id';
break;
}
return `
query {
getMovieByColumnType(${column}: "${value}") {
${neededData}
}
}`;
}
export const getAllMoviesQuery = `
query {
getAllMovies {
id,title,genre,rating_dice_throw,year,director_first_name,director_last_name,description,cover_image
}
}`
export const createMovieQuery = `
mutation {
createMovie(title: "testing", genre: "gaming", rating_dice_throw: 1, year: '2000', director_first_name: "torje", director_last_name: "the_gamer", description: "amazing", cover_image: "url123") {
id
}
}`
...@@ -38,7 +38,7 @@ const RootQuery = new GraphQLObjectType({ ...@@ -38,7 +38,7 @@ const RootQuery = new GraphQLObjectType({
getMovieByColumnType: { getMovieByColumnType: {
type: new GraphQLList(MovieType), type: new GraphQLList(MovieType),
args: { args: {
id: { type: GraphQLString }, id: { type: GraphQLInt },
title: { type: GraphQLString }, title: { type: GraphQLString },
genre: { type: GraphQLString }, genre: { type: GraphQLString },
rating_dice_throw: { type: GraphQLInt }, rating_dice_throw: { type: GraphQLInt },
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment