diff --git a/src/Components/GridComp/GridComp.jsx b/src/Components/GridComp/GridComp.jsx index 580b3f6..f569699 100644 --- a/src/Components/GridComp/GridComp.jsx +++ b/src/Components/GridComp/GridComp.jsx @@ -2,6 +2,7 @@ import React from 'react' import Card from '@mui/material/Card' import { CardContent, CardMedia, Grid } from '@mui/material' import Typography from '@mui/material/Typography' +import { PropTypes } from 'prop-types' import styles from './GridComp.module.css' // const Rand = (min, max) => Math.floor(Math.random() * (max - min + 1) + min) @@ -18,7 +19,10 @@ export default function GridComp({ name, data }) { {(data || []).map((item) => ( - +
@@ -43,17 +47,32 @@ export default function GridComp({ name, data }) { - - {item.Ru_title} - + + {item.Ru_title} + + + - {item.Orig_title} + {(item.Countries || []).map((e) => ( + + {e.country} + + ))} ) } + +GridComp.propTypes = { + data: PropTypes.arrayOf(PropTypes.objectOf(PropTypes.any)), + name: PropTypes.string, +} diff --git a/src/Components/GridComp/GridComp.module.css b/src/Components/GridComp/GridComp.module.css index 136c3af..4707e9e 100644 --- a/src/Components/GridComp/GridComp.module.css +++ b/src/Components/GridComp/GridComp.module.css @@ -1,19 +1,20 @@ -.title{ +.title { word-break: break-all; + color: #000; } -.title:hover{ +.title:hover { color: aqua; } -.aboximg{ - display:inline-flex; +.aboximg { + display: inline-flex; width: 100%; } -.MediaCard{ - width: 100%; +.MediaCard { + width: 100%; position: relative; } -.divbgimg{ +.divbgimg { display: inline-block; max-width: 100%; overflow: hidden; @@ -21,12 +22,12 @@ box-sizing: border-box; margin: 0; } -.divbgimg2{ +.divbgimg2 { box-sizing: border-box; display: block; max-width: 100%; } -.imgBg{ +.imgBg { max-width: 100%; display: block; margin: 0; @@ -34,7 +35,7 @@ padding: 0; } -.imgPreViev{ +.imgPreViev { position: absolute; top: 0; left: 0; @@ -45,12 +46,12 @@ min-height: 100%; max-height: 100%; } -.Janres{ +.Janres { margin-right: 5px; display: inline-block; color: black; text-decoration: none; } -.Janres:hover{ +.Janres:hover { color: blueviolet; } diff --git a/src/Components/ItemComp/ItemComp.jsx b/src/Components/ItemComp/ItemComp.jsx new file mode 100644 index 0000000..ba1e504 --- /dev/null +++ b/src/Components/ItemComp/ItemComp.jsx @@ -0,0 +1,124 @@ +import React from 'react' +import { PropTypes } from 'prop-types' +import { Grid, Card, Typography } from '@mui/material' +import styles from './ItemComp.module.css' + +export default function ItemComp({ + Id, + Rutitle, + OrigTitle, + PosterUrl, + Countries, + Genres, + KinopoiskId, + RatingKinopoisk, + RatingImdbVoteCount, + RatingKinopoiskVoteCount, + RatingImdb, + Year, + Description, +}) { + return ( +
+ + {' '} + {Rutitle} / {OrigTitle} /{Year} + + + + +
+ dsa +
+
+ {/* {Rutitle} */} +
+ + + Название + {`: ${Rutitle}`} + + + Оригинальное + {`: ${OrigTitle}`} + + + Год {`: ${Year}`} + + + Страна{': '} + {Countries.map((item) => ( + {`${item.country} `} + ))} + + + Жанры{': '} + {Genres.map((item) => ( + {`${item.genre} `} + ))} + + + KinopoiskId {`: ${KinopoiskId}`} + + + Рейтинг {`: ${RatingKinopoisk}`} + + + РейтингIMDB {`: ${RatingImdb}`} + + + Голосов {`: ${RatingKinopoiskVoteCount}`} + + + ГолосовIMDB {`: ${RatingImdbVoteCount}`} + + + + Описание +

{Description}

+
+
+ + {console.log( + Id, + Rutitle, + PosterUrl, + Countries, + Genres, + Year, + Description + )} +
+ ) +} + +ItemComp.propTypes = { + Id: PropTypes.number, + Rutitle: PropTypes.string, + OrigTitle: PropTypes.string, + PosterUrl: PropTypes.string, + KinopoiskId: PropTypes.number, + RatingKinopoisk: PropTypes.number, + RatingImdbVoteCount: PropTypes.number, + RatingKinopoiskVoteCount: PropTypes.number, + RatingImdb: PropTypes.number, + Countries: PropTypes.arrayOf(PropTypes.objectOf(PropTypes.any)), + Genres: PropTypes.arrayOf(PropTypes.objectOf(PropTypes.any)), + Year: PropTypes.number, + Description: PropTypes.string, +} diff --git a/src/Components/ItemComp/ItemComp.module.css b/src/Components/ItemComp/ItemComp.module.css new file mode 100644 index 0000000..8140df2 --- /dev/null +++ b/src/Components/ItemComp/ItemComp.module.css @@ -0,0 +1,18 @@ +.GridContainer { + margin-left: 50px; +} +.title { + color: #1976d2; + font-weight: 700; +} +.genres { + color: #1976d2; +} +.genres:hover { + text-decoration: underline; +} +.discription { + margin: 25%; + font-weight: 700; + color: #1976d2; +} diff --git a/src/Components/LoadComp/LoadComp.jsx b/src/Components/LoadComp/LoadComp.jsx new file mode 100644 index 0000000..ed9bc4c --- /dev/null +++ b/src/Components/LoadComp/LoadComp.jsx @@ -0,0 +1,15 @@ +import React from 'react' +import Stack from '@mui/material/Stack' +import CircularProgress from '@mui/material/CircularProgress' + +export default function LoadComp() { + return ( +
+ + + + + +
+ ) +} diff --git a/src/Pages/FilmItem.jsx b/src/Pages/FilmItem.jsx new file mode 100644 index 0000000..de77b33 --- /dev/null +++ b/src/Pages/FilmItem.jsx @@ -0,0 +1,33 @@ +import React from 'react' +import { useQuery } from 'react-query' +import { useParams } from 'react-router-dom' +import HeaderComp from '../Components/HeaderComp/HeaderComp' +import ItemComp from '../Components/ItemComp/ItemComp' +import api from '../utils/api' +import Load from './Load' + +export default function FilmItem() { + const { id } = useParams() + const { data, isLoading } = useQuery(`/${id}`, api) + if (isLoading) return + return ( +
+ + +
+ ) +} diff --git a/src/Pages/Films.jsx b/src/Pages/Films.jsx index f4a49d9..f929b89 100644 --- a/src/Pages/Films.jsx +++ b/src/Pages/Films.jsx @@ -1,18 +1,38 @@ -import { Container, Pagination } from '@mui/material' +import { Container, Pagination, PaginationItem } from '@mui/material' import React from 'react' +import { useQuery } from 'react-query' +import { Link, useLocation } from 'react-router-dom' import GridComp from '../Components/GridComp/GridComp' import HeaderComp from '../Components/HeaderComp/HeaderComp' +import api from '../utils/api' export default function Films() { + const location = useLocation() + const query = new URLSearchParams(location.search) + const { data } = useQuery( + `/page/${query.get('page') === null ? '1' : query.get('page')}`, + api + ) return (
- + ( + + )} />
diff --git a/src/Pages/Load.jsx b/src/Pages/Load.jsx new file mode 100644 index 0000000..d8ce632 --- /dev/null +++ b/src/Pages/Load.jsx @@ -0,0 +1,12 @@ +import React from 'react' +import HeaderComp from '../Components/HeaderComp/HeaderComp' +import LoadComp from '../Components/LoadComp/LoadComp' + +export default function Load() { + return ( +
+ + +
+ ) +} diff --git a/src/Pages/Main.jsx b/src/Pages/Main.jsx index 48b1f0e..23f8bb6 100644 --- a/src/Pages/Main.jsx +++ b/src/Pages/Main.jsx @@ -4,20 +4,14 @@ import { Container, Button } from '@mui/material/' // eslint-disable-next-line import/no-extraneous-dependencies import { useQuery } from 'react-query' // eslint-disable-next-line import/no-extraneous-dependencies - -import axios from 'axios' import GridComp from '../Components/GridComp/GridComp' import HeaderComp from '../Components/HeaderComp/HeaderComp' import ErrorPage from './ErrorPage' - -const test = async () => { - const res = await axios.get('http://localhost:8050/api/films/last/') - return res.data -} +import api from '../utils/api' export default function Main() { // eslint-disable-next-line no-shadow - const { data, error } = useQuery('repoData', test) + const { data, error } = useQuery('/last/', api) if (error) return return (
diff --git a/src/Pages/Series.jsx b/src/Pages/Series.jsx index e69de29..e22c37a 100644 --- a/src/Pages/Series.jsx +++ b/src/Pages/Series.jsx @@ -0,0 +1,10 @@ +import React from 'react' +import ItemComp from '../Components/ItemComp/ItemComp' + +export default function Series() { + return ( +
+ +
+ ) +} diff --git a/src/Router/Routers.jsx b/src/Router/Routers.jsx index 59ec84c..500b5b7 100644 --- a/src/Router/Routers.jsx +++ b/src/Router/Routers.jsx @@ -3,6 +3,7 @@ import React from 'react' import { QueryClientProvider, QueryClient } from 'react-query' // eslint-disable-next-line import/no-extraneous-dependencies import { BrowserRouter, Route, Routes } from 'react-router-dom' +import FilmItem from '../Pages/FilmItem' import Films from '../Pages/Films' import Main from '../Pages/Main' // eslint-disable-next-line import/no-extraneous-dependencies @@ -21,7 +22,24 @@ export default function Routers() { } /> - } /> + + + + } + /> + + + + } + /> ) diff --git a/src/utils/api.js b/src/utils/api.js new file mode 100644 index 0000000..eb87a7c --- /dev/null +++ b/src/utils/api.js @@ -0,0 +1,8 @@ +import axios from 'axios' + +export default async function api({ queryKey }) { + const res = await axios.get( + `http://192.168.1.35:8050/api/films${queryKey[0]}` + ) + return res.data +}