diff --git a/README.md b/README.md
index 1186f3b..dc1aba1 100644
--- a/README.md
+++ b/README.md
@@ -30,6 +30,10 @@ _Video demo._
- Development: [https://dev.cinejump.lucasgabriel.com.br/](https://dev.cinejump.lucasgabriel.com.br/)
- Storybook: [https://storybook.cinejump.lucasgabriel.com.br/](https://storybook.cinejump.lucasgabriel.com.br/)
+>
+- Figma Layout: [https://www.figma.com/file/um4dcEJCOlEvB6kCe9KCOD](https://www.figma.com/file/um4dcEJCOlEvB6kCe9KCOD)
+- Figma Prototype: [https://www.figma.com/proto/um4dcEJCOlEvB6kCe9KCOD/Cinejump?node-id=7185%3A17&scaling=scale-down-width](https://www.figma.com/proto/um4dcEJCOlEvB6kCe9KCOD/Cinejump?node-id=7185%3A17&scaling=scale-down-width)
+
diff --git a/package.json b/package.json
index 7aaaf5e..4205f8e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,7 @@
{
"name": "cinejump",
"version": "1.2.0",
+ "devVersion": "1.3.0",
"private": true,
"dependencies": {
"@storybook/react": "^6.0.21",
diff --git a/src/components/EnvironmentLabel/index.tsx b/src/components/EnvironmentLabel/index.tsx
index 2fc7741..6bb6c7f 100644
--- a/src/components/EnvironmentLabel/index.tsx
+++ b/src/components/EnvironmentLabel/index.tsx
@@ -1,6 +1,6 @@
import React from 'react';
-import { version } from '../../../package.json';
+import { devVersion } from '../../../package.json';
import { Container } from './styles';
const EnvironmentLabel: React.FC = () => {
@@ -8,7 +8,9 @@ const EnvironmentLabel: React.FC = () => {
return null;
}
- return Versão: {version} | Ambiente: Desenvolvimento;
+ return (
+ Versão: {devVersion} | Ambiente: Desenvolvimento
+ );
};
export default EnvironmentLabel;
diff --git a/src/components/Movie/dtos/ContainerProps.ts b/src/components/Movie/dtos/ContainerProps.ts
new file mode 100644
index 0000000..a543f27
--- /dev/null
+++ b/src/components/Movie/dtos/ContainerProps.ts
@@ -0,0 +1,3 @@
+export default interface ContainerProps {
+ large?: boolean;
+}
diff --git a/src/components/Movie/dtos/index.ts b/src/components/Movie/dtos/index.ts
index 3d26983..b0f10d2 100644
--- a/src/components/Movie/dtos/index.ts
+++ b/src/components/Movie/dtos/index.ts
@@ -1,4 +1,6 @@
-export default interface MovieProps {
+import ContainerProps from './ContainerProps';
+
+export default interface MovieProps extends ContainerProps {
id: number;
favorite: boolean;
poster?: string;
diff --git a/src/components/Movie/index.tsx b/src/components/Movie/index.tsx
index 58837cf..7211598 100644
--- a/src/components/Movie/index.tsx
+++ b/src/components/Movie/index.tsx
@@ -10,7 +10,7 @@ import { Container, IconButton, Poster } from './styles';
import Props from './dtos';
-const Movie: React.FC = ({ ...movie }) => {
+const Movie: React.FC = ({ large = false, ...movie }) => {
const history = useHistory();
const { user } = useAuth();
const { favoriteList = [], UpdateFavorite } = useFavorite();
@@ -49,7 +49,7 @@ const Movie: React.FC = ({ ...movie }) => {
}
return (
-
+
diff --git a/src/components/Movie/styles.ts b/src/components/Movie/styles.ts
index 83f831d..caa7605 100644
--- a/src/components/Movie/styles.ts
+++ b/src/components/Movie/styles.ts
@@ -1,13 +1,16 @@
import styled from 'styled-components';
-import { PosterHeight, PosterWidth, Size } from 'shared/enums';
-export const Container = styled.div`
+import { Color, PosterHeight, PosterWidth, Size } from 'shared/enums';
+import ContainerProps from './dtos/ContainerProps';
+
+export const Container = styled.div`
position: relative;
- width: ${PosterWidth.Default};
- height: ${PosterHeight.Default};
+ width: ${props => (props.large ? PosterWidth.Large : PosterWidth.Default)};
+ height: ${props => (props.large ? PosterHeight.Large : PosterHeight.Default)};
border-radius: ${Size.Smallest};
overflow: hidden;
+ border: ${props => (props.large ? 0 : `1px solid ${Color.FillSecondary}`)};
display: flex;
align-items: center;
justify-content: center;
diff --git a/src/components/Person/dtos/ContainerProps.ts b/src/components/Person/dtos/ContainerProps.ts
new file mode 100644
index 0000000..a543f27
--- /dev/null
+++ b/src/components/Person/dtos/ContainerProps.ts
@@ -0,0 +1,3 @@
+export default interface ContainerProps {
+ large?: boolean;
+}
diff --git a/src/components/Person/dtos/index.ts b/src/components/Person/dtos/index.ts
new file mode 100644
index 0000000..7c57e1d
--- /dev/null
+++ b/src/components/Person/dtos/index.ts
@@ -0,0 +1,8 @@
+import ContainerProps from './ContainerProps';
+
+export default interface PersonProps extends ContainerProps {
+ id: number;
+ profile: string;
+ name: string;
+ character: string;
+}
diff --git a/src/components/Person/index.tsx b/src/components/Person/index.tsx
new file mode 100644
index 0000000..aaf0c7d
--- /dev/null
+++ b/src/components/Person/index.tsx
@@ -0,0 +1,33 @@
+import React, { useCallback } from 'react';
+import { useHistory } from 'react-router-dom';
+
+import Route from 'routes/enums';
+import {
+ Container,
+ Profile,
+ NameContainer,
+ PersonName,
+ CharacterName,
+} from './styles';
+
+import Props from './dtos';
+
+const Person: React.FC = ({ large = false, ...person }) => {
+ const history = useHistory();
+
+ const handleRedirect = useCallback(() => {
+ history.push(`${Route.PERSON}/${person.id}`);
+ }, [history, person.id]);
+
+ return (
+
+
+
+ {person.name}
+ {person.character}
+
+
+ );
+};
+
+export default Person;
diff --git a/src/components/Person/styles.ts b/src/components/Person/styles.ts
new file mode 100644
index 0000000..b34c50c
--- /dev/null
+++ b/src/components/Person/styles.ts
@@ -0,0 +1,61 @@
+import styled from 'styled-components';
+
+import { Color, PosterHeight, PosterWidth, Size } from 'shared/enums';
+import ContainerProps from './dtos/ContainerProps';
+
+export const Container = styled.div`
+ position: relative;
+ width: ${props => (props.large ? PosterWidth.Large : PosterWidth.Default)};
+ height: ${props => (props.large ? PosterHeight.Large : PosterHeight.Default)};
+ border-radius: ${Size.Smallest};
+ overflow: hidden;
+ box-shadow: 0 0 3px rgba(0, 0, 0, 0.5);
+ background: rgba(0, 0, 0, 0.5);
+
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:hover {
+ cursor: pointer;
+
+ img {
+ width: 110%;
+ height: 110%;
+ }
+ }
+`;
+
+export const Profile = styled.img`
+ margin-top: -5rem;
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ transition: width 0.2s, height 0.2s;
+`;
+
+export const NameContainer = styled.div`
+ position: absolute;
+ bottom: 0;
+ height: 7.4rem;
+ width: 100%;
+ background: ${Color.Fill};
+ overflow: hidden;
+ padding: ${Size.Smallest};
+`;
+
+export const PersonName = styled.div`
+ font-size: ${Size.Small};
+ color: ${Color.Secondary};
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+`;
+
+export const CharacterName = styled.div`
+ font-size: ${Size.Small};
+ color: ${Color.Text};
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+`;
diff --git a/src/components/index.ts b/src/components/index.ts
index 4be78bd..b5236b6 100644
--- a/src/components/index.ts
+++ b/src/components/index.ts
@@ -1,6 +1,9 @@
+export { ColumnLayout, RowLayout, Wrapper, Container } from 'components/Layout';
+
export { default as Button } from './Button';
export { default as EnvironmentLabel } from './EnvironmentLabel';
export { default as Input } from './Input';
export { default as Movie } from './Movie';
export { default as MovieHighlight } from './MovieHighlight';
+export { default as Person } from './Person';
export { default as Tooltip } from './Tooltip';
diff --git a/src/containers/PersonList/dtos/index.ts b/src/containers/PersonList/dtos/index.ts
new file mode 100644
index 0000000..62323c6
--- /dev/null
+++ b/src/containers/PersonList/dtos/index.ts
@@ -0,0 +1,10 @@
+import DefaultProps from 'shared/dtos';
+import { Color } from 'shared/enums';
+
+export default interface Props extends DefaultProps {
+ title?: string;
+ data: any[];
+ isLoading?: boolean;
+ loaderColor?: Color;
+ message?: string;
+}
diff --git a/src/containers/PersonList/index.tsx b/src/containers/PersonList/index.tsx
new file mode 100644
index 0000000..33fa697
--- /dev/null
+++ b/src/containers/PersonList/index.tsx
@@ -0,0 +1,61 @@
+import React from 'react';
+
+import { ReactComponent as Loading } from 'assets/loading.svg';
+
+import { Wrapper } from 'components/Layout';
+import Person from 'components/Person';
+import {
+ Container,
+ Title,
+ LoadingContainer,
+ ListContainer,
+ ListContent,
+ MessageContainer,
+} from './styles';
+
+import Props from './dtos';
+
+const PersonList: React.FC = ({
+ theme,
+ background,
+ color,
+ title,
+ data,
+ isLoading = false,
+ loaderColor,
+ message = 'Não há resultados.',
+}) => {
+ return (
+
+
+ {title && (
+
+ {title}
+
+ )}
+
+ {isLoading && (
+
+
+
+ )}
+
+ {!isLoading && data.length > 0 && (
+
+
+ {data.map(person => (
+
+ ))}
+
+
+ )}
+
+ {!isLoading && data.length === 0 && (
+ {message}
+ )}
+
+
+ );
+};
+
+export default PersonList;
diff --git a/src/containers/PersonList/styles.ts b/src/containers/PersonList/styles.ts
new file mode 100644
index 0000000..98b8426
--- /dev/null
+++ b/src/containers/PersonList/styles.ts
@@ -0,0 +1,96 @@
+import styled from 'styled-components';
+
+import DefaultProps from 'shared/dtos';
+import { Container as DefaultContainer } from 'components/Layout';
+import { Color, PosterHeight, Size } from 'shared/enums';
+import { getColor } from 'shared/utils';
+
+interface LoadingProps {
+ loaderColor?: string;
+}
+
+export const Container = styled(DefaultContainer)`
+ padding: ${Size.Medium} 0;
+ display: flex;
+ flex-direction: column;
+`;
+
+export const Title = styled.h2`
+ margin-bottom: ${Size.Small};
+ color: ${props => getColor(props.theme, props.color)};
+
+ @media (max-width: 1280px) {
+ margin-left: ${Size.Medium};
+ }
+`;
+
+export const LoadingContainer = styled.div`
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: calc(${PosterHeight.Default});
+
+ svg {
+ height: ${Size.Largest};
+ width: ${Size.Largest};
+ fill: ${props => getColor(props.theme, props.loaderColor)};
+ }
+`;
+
+export const ListContainer = styled.div`
+ height: calc(${PosterHeight.Default} + 5px);
+ overflow-y: hidden;
+ overflow-x: auto;
+
+ scroll-snap-type: x mandatory;
+ -webkit-overflow-scrolling: touch;
+ scroll-behavior: smooth;
+
+ -ms-overflow-style: none;
+ scrollbar-width: 10px;
+ &::-webkit-scrollbar {
+ /* visibility: visible; */
+ display: none;
+ }
+`;
+
+export const ListContent = styled.div`
+ display: inline-flex;
+ padding: 0 2px;
+
+ @media (max-width: 1280px) {
+ margin-left: ${Size.Medium};
+ margin-right: ${Size.Smallest};
+ }
+
+ & > div {
+ flex: 1 0 auto;
+ scroll-snap-align: start;
+ scroll-margin-left: ${Size.Large};
+ margin-right: ${Size.Medium};
+
+ @media (max-width: 1280px) {
+ scroll-margin-left: ${Size.Medium};
+ margin-right: ${Size.Smallest};
+ }
+ }
+
+ & > div:last-child {
+ margin-right: 0;
+
+ @media (max-width: 1280px) {
+ margin-right: ${Size.Default};
+ }
+ }
+`;
+
+export const MessageContainer = styled.div`
+ display: flex;
+ align-items: center;
+ height: calc(${PosterHeight.Default} / 3);
+ color: ${Color.Text};
+
+ @media (max-width: 1280px) {
+ margin-left: ${Size.Medium};
+ }
+`;
diff --git a/src/containers/index.ts b/src/containers/index.ts
index a1a2bae..d40e035 100644
--- a/src/containers/index.ts
+++ b/src/containers/index.ts
@@ -2,3 +2,4 @@ export { default as Footer } from './Footer';
export { default as Header } from './Header';
export { default as Highlights } from './Highlights';
export { default as MovieList } from './MovieList';
+export { default as PersonList } from './PersonList';
diff --git a/src/domains/Movie/api/Credits/RawResponse.ts b/src/domains/Movie/api/Credits/RawResponse.ts
new file mode 100644
index 0000000..f68b078
--- /dev/null
+++ b/src/domains/Movie/api/Credits/RawResponse.ts
@@ -0,0 +1,25 @@
+export default interface RawResponse {
+ cast: [
+ {
+ cast_id: number;
+ character: string;
+ credit_id: string;
+ gender?: number;
+ id: number;
+ name: string;
+ order: number;
+ profile_path?: string;
+ },
+ ];
+ crew: [
+ {
+ credit_id: string;
+ department: string;
+ gender?: number;
+ id: number;
+ job: string;
+ name: string;
+ profile_path?: string;
+ },
+ ];
+}
diff --git a/src/domains/Movie/api/Credits/Response.ts b/src/domains/Movie/api/Credits/Response.ts
new file mode 100644
index 0000000..cd876fb
--- /dev/null
+++ b/src/domains/Movie/api/Credits/Response.ts
@@ -0,0 +1,7 @@
+import Cast from 'domains/Movie/api/Credits/dtos/Cast';
+import Crew from 'domains/Movie/api/Credits/dtos/Crew';
+
+export default interface Response {
+ cast: Cast[];
+ crew: Crew[];
+}
diff --git a/src/domains/Movie/api/Credits/dtos/Cast.ts b/src/domains/Movie/api/Credits/dtos/Cast.ts
new file mode 100644
index 0000000..a647d31
--- /dev/null
+++ b/src/domains/Movie/api/Credits/dtos/Cast.ts
@@ -0,0 +1,10 @@
+export default interface Cast {
+ castId: number;
+ character: string;
+ creditId: string;
+ gender?: number;
+ id: number;
+ name: string;
+ order: number;
+ profile: string;
+}
diff --git a/src/domains/Movie/api/Credits/dtos/Crew.ts b/src/domains/Movie/api/Credits/dtos/Crew.ts
new file mode 100644
index 0000000..dc1054b
--- /dev/null
+++ b/src/domains/Movie/api/Credits/dtos/Crew.ts
@@ -0,0 +1,9 @@
+export default interface Crew {
+ creditId: string;
+ department: string;
+ gender?: number;
+ id: number;
+ job: string;
+ name: string;
+ profile: string;
+}
diff --git a/src/domains/Movie/api/Details/Params.ts b/src/domains/Movie/api/Details/Params.ts
new file mode 100644
index 0000000..e1d07a0
--- /dev/null
+++ b/src/domains/Movie/api/Details/Params.ts
@@ -0,0 +1,3 @@
+export default interface Params {
+ appendToResponse?: string;
+}
diff --git a/src/domains/Movie/api/Details/RawResponse.ts b/src/domains/Movie/api/Details/RawResponse.ts
index 91f6e41..b7299ed 100644
--- a/src/domains/Movie/api/Details/RawResponse.ts
+++ b/src/domains/Movie/api/Details/RawResponse.ts
@@ -1,3 +1,6 @@
+import Recommendations from 'domains/Movie/api/Recommendations/RawResponse';
+import Credits from 'domains/Movie/api/Credits/RawResponse';
+
export default interface RawResponse {
poster_path?: string;
budget: number;
@@ -9,13 +12,20 @@ export default interface RawResponse {
name: string;
},
];
+ homepage?: string;
id: number;
original_title: string;
original_language: string;
title: string;
backdrop_path?: string;
popularity: number;
+ runtime: number;
vote_count: number;
video: boolean;
vote_average: number;
+ tagline: string;
+ recommendations?: {
+ results: Recommendations[];
+ };
+ credits?: Credits;
}
diff --git a/src/domains/Movie/api/Details/Response.ts b/src/domains/Movie/api/Details/Response.ts
index 0f0a2d9..adbd028 100644
--- a/src/domains/Movie/api/Details/Response.ts
+++ b/src/domains/Movie/api/Details/Response.ts
@@ -1,3 +1,6 @@
+import Recommendations from 'domains/Movie/api/Recommendations/Response';
+import Credits from 'domains/Movie/api/Credits/Response';
+
export default interface Response {
poster?: string;
backdrop?: string;
@@ -10,11 +13,19 @@ export default interface Response {
name: string;
},
];
+ genresNames: string;
+ homepage?: string;
id: number;
originalTitle: string;
title: string;
popularity: number;
+ runtime: string;
voteCount: number;
voteAverage: number;
+ tagline: string;
favorite: boolean;
+
+ recommendations?: Recommendations[];
+ credits?: Credits;
+ directorName?: string;
}
diff --git a/src/domains/Movie/api/Details/index.ts b/src/domains/Movie/api/Details/index.ts
index df86bba..3c7ddcc 100644
--- a/src/domains/Movie/api/Details/index.ts
+++ b/src/domains/Movie/api/Details/index.ts
@@ -1,33 +1,51 @@
import tmdb from 'services/api/tmdb';
+import Params from 'domains/Movie/api/Details/Params';
import RawResponse from 'domains/Movie/api/Details/RawResponse';
import Response from 'domains/Movie/api/Details/Response';
+import Recommendations from 'domains/Movie/api/Recommendations/Response';
+import Credits from 'domains/Movie/api/Credits/Response';
import formatDate from 'shared/utils/formatDate';
import formatTmdbImage from 'shared/utils/formatTmdbImage';
+import Crew from 'domains/Movie/api/Credits/dtos/Crew';
+import Cast from 'domains/Movie/api/Credits/dtos/Cast';
+import { arrayToString } from 'shared/utils';
-const Details = async (movieId: number): Promise => {
- const response = await rawPopular(movieId);
+const Details = async (movieId: number, params?: Params): Promise => {
+ const response = await rawPopular(movieId, params);
return parseResponse(response);
};
-export const rawPopular = async (movieId: number): Promise => {
- const response = await tmdb.get(`/movie/${movieId}`);
+export const rawPopular = async (
+ movieId: number,
+ params?: Params,
+): Promise => {
+ const response = await tmdb.get(`/movie/${movieId}`, {
+ params: { append_to_response: params?.appendToResponse },
+ });
return response.data;
};
const parseResponse = (movie: RawResponse): Response => {
- const parsedMovie = {
+ let parsedMovie = {
overview: movie.overview,
budget: movie.budget,
genres: movie.genres,
+ genresNames: arrayToString(movie.genres, 'name'),
id: movie.id,
originalTitle: movie.original_title,
title: movie.title,
popularity: movie.popularity,
voteCount: movie.vote_count,
voteAverage: movie.vote_average,
+ runtime: `${movie.runtime} min`,
+ tagline: movie.tagline,
+
+ directorName: movie.credits?.crew.find(
+ person => person.job.toUpperCase() === 'DIRECTOR',
+ )?.name,
releaseDate: formatDate({ value: movie.release_date }),
poster: formatTmdbImage({ value: movie.poster_path }),
@@ -35,6 +53,41 @@ const parseResponse = (movie: RawResponse): Response => {
favorite: false,
} as Response;
+ const recommendations = movie.recommendations?.results.map(
+ recommendation => ({
+ poster: formatTmdbImage({ value: recommendation.poster_path }),
+ backdrop: formatTmdbImage({ value: recommendation.poster_path }),
+ id: recommendation.id,
+ title: recommendation.title,
+ favorite: false,
+ }),
+ ) as Recommendations[];
+
+ const cast = movie.credits?.cast.slice(0, 15).map(person => ({
+ order: person.order,
+ id: person.id,
+ name: person.name,
+ character: person.character,
+ castId: person.cast_id,
+ creditId: person.credit_id,
+ gender: person.gender,
+ profile: formatTmdbImage({ value: person.profile_path }),
+ })) as Cast[];
+
+ const crew = movie.credits?.crew.map(person => ({
+ id: person.id,
+ name: person.name,
+ job: person.job,
+ department: person.department,
+ creditId: person.credit_id,
+ gender: person.gender,
+ profile: formatTmdbImage({ value: person.profile_path }),
+ })) as Crew[];
+
+ const credits = { cast, crew } as Credits;
+
+ parsedMovie = { ...parsedMovie, recommendations, credits };
+
return parsedMovie;
};
diff --git a/src/domains/Movie/api/Recommendations/RawResponse.ts b/src/domains/Movie/api/Recommendations/RawResponse.ts
new file mode 100644
index 0000000..63ebf95
--- /dev/null
+++ b/src/domains/Movie/api/Recommendations/RawResponse.ts
@@ -0,0 +1,15 @@
+export default interface RawResponse {
+ poster_path?: string;
+ overview: string;
+ release_date: string;
+ genres_ids: number[];
+ id: number;
+ original_title: string;
+ original_language: string;
+ title: string;
+ backdrop_path?: string;
+ popularity: number;
+ vote_count: number;
+ video: boolean;
+ vote_average: number;
+}
diff --git a/src/domains/Movie/api/Recommendations/Response.ts b/src/domains/Movie/api/Recommendations/Response.ts
new file mode 100644
index 0000000..fd046d8
--- /dev/null
+++ b/src/domains/Movie/api/Recommendations/Response.ts
@@ -0,0 +1,14 @@
+export default interface Response {
+ poster?: string;
+ backdrop?: string;
+ id: number;
+ title: string;
+ favorite: boolean;
+ // overview: string;
+ // releaseDate: string;
+ // genresIds: number[];
+ // originalTitle: string;
+ // popularity: number;
+ // voteCount: number;
+ // voteAverage: number;
+}
diff --git a/src/domains/Movie/api/Recommendations/index.ts b/src/domains/Movie/api/Recommendations/index.ts
new file mode 100644
index 0000000..f61c556
--- /dev/null
+++ b/src/domains/Movie/api/Recommendations/index.ts
@@ -0,0 +1,46 @@
+import tmdb from 'services/api/tmdb';
+
+import RawResponse from 'domains/Movie/api/Recommendations/RawResponse';
+import Response from 'domains/Movie/api/Recommendations/Response';
+import formatDate from 'shared/utils/formatDate';
+import formatTmdbImage from 'shared/utils/formatTmdbImage';
+
+const Recommendations = async (movieId: number): Promise => {
+ const response = await rawPopular(movieId);
+
+ return parseResponse(response);
+};
+
+export const rawPopular = async (movieId: number): Promise => {
+ const response = await tmdb.get(`/movie/${movieId}/recommendations/`);
+
+ return response.data.results;
+};
+
+const parseResponse = (rawResponse: RawResponse[]): Response[] => {
+ let response = [] as Response[];
+
+ rawResponse.forEach(movie => {
+ const parsedMovie = {
+ overview: movie.overview,
+ genresIds: movie.genres_ids,
+ id: movie.id,
+ originalTitle: movie.original_title,
+ title: movie.title,
+ popularity: movie.popularity,
+ voteCount: movie.vote_count,
+ voteAverage: movie.vote_average,
+
+ releaseDate: formatDate({ value: movie.release_date }),
+ poster: formatTmdbImage({ value: movie.poster_path }),
+ backdrop: formatTmdbImage({ value: movie.backdrop_path }),
+ favorite: false,
+ } as Response;
+
+ response = [...response, parsedMovie];
+ });
+
+ return response;
+};
+
+export default Recommendations;
diff --git a/src/domains/Movie/api/index.ts b/src/domains/Movie/api/index.ts
index aeebfaa..48e555a 100644
--- a/src/domains/Movie/api/index.ts
+++ b/src/domains/Movie/api/index.ts
@@ -1,3 +1,4 @@
export { default as Details } from './Details';
export { default as NowPlaying } from './NowPlaying';
export { default as Popular } from './Popular';
+export { default as Recommendations } from './Recommendations';
diff --git a/src/routes/enums/index.ts b/src/routes/enums/index.ts
index 71672ce..7edac3e 100644
--- a/src/routes/enums/index.ts
+++ b/src/routes/enums/index.ts
@@ -3,6 +3,7 @@ enum Route {
LOGIN = '/login',
SIGNUP = '/signup',
MOVIE = '/movie',
+ PERSON = '/person',
PROFILE = '/profile',
FAVORITES = '/favorites',
}
diff --git a/src/routes/index.tsx b/src/routes/index.tsx
index f19dc4e..d05ff3a 100644
--- a/src/routes/index.tsx
+++ b/src/routes/index.tsx
@@ -9,7 +9,7 @@ import { Home, Movie, Login, Signup, Profile, Favorites } from 'screens';
const Routes: React.FC = () => (
-
+
diff --git a/src/screens/Movie/dtos/Params.ts b/src/screens/Movie/dtos/Params.ts
new file mode 100644
index 0000000..09eef17
--- /dev/null
+++ b/src/screens/Movie/dtos/Params.ts
@@ -0,0 +1,3 @@
+export default interface Params {
+ id: string;
+}
diff --git a/src/screens/Movie/index.tsx b/src/screens/Movie/index.tsx
index 9a9e388..b164096 100644
--- a/src/screens/Movie/index.tsx
+++ b/src/screens/Movie/index.tsx
@@ -1,12 +1,113 @@
-import React from 'react';
+import React, { useCallback, useEffect, useState } from 'react';
+import { useParams } from 'react-router-dom';
-import { Container } from './styles';
+import Params from 'screens/Movie/dtos/Params';
+import MovieDetails from 'domains/Movie/api/Details/Response';
+import { Color } from 'shared/enums';
+import { Details } from 'domains/Movie/api';
+
+import { ColumnLayout, Container, Movie as Poster } from 'components';
+import { Header, PersonList, MovieList, Footer } from 'containers';
+import {
+ ContentContainer,
+ MovieContainer,
+ PosterContainer,
+ MovieDetailsContainer,
+ TitleContainer,
+ Title,
+ Subtitle,
+ Tagline,
+ OverviewContainer,
+ OverviewTitle,
+ Overview,
+ VoteAverage,
+ VoteAverageTitle,
+ Director,
+ DirectorTitle,
+ HeaderBackground,
+} from './styles';
+
+const Movie: React.FC = () => {
+ const { id } = useParams();
+ const [movie, setMovie] = useState({} as MovieDetails);
+ const [isLoading, setIsLoading] = useState(false);
+
+ const getMovie = useCallback(async () => {
+ try {
+ setIsLoading(true);
+ const params = {
+ appendToResponse: 'recommendations,credits',
+ };
+
+ const response = await Details(+id, params);
+
+ setMovie(response);
+ return response;
+ } catch (error) {
+ console.log('getMovie -> error', error);
+ } finally {
+ setIsLoading(false);
+ }
+ }, [id]);
+
+ useEffect(() => {
+ window.scrollTo(0, 0);
+ getMovie();
+ }, [getMovie]);
-const Movie: React.FC = () => {
return (
-
- Movie Screen
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {movie.title}
+
+ {movie.releaseDate} | {movie.genresNames} | {movie.runtime}
+
+
+ {movie.tagline && {`"${movie.tagline}"`}}
+
+ Sinopse
+ {movie.overview}
+
+
+ Votação do público:{' '}
+ {movie.voteAverage}
+
+
+ Diretor:
+ {movie.directorName}
+
+
+
+
+
+
+
+
+
+
+
);
};
diff --git a/src/screens/Movie/styles.ts b/src/screens/Movie/styles.ts
index 6ecc195..f4dd3b4 100644
--- a/src/screens/Movie/styles.ts
+++ b/src/screens/Movie/styles.ts
@@ -1,13 +1,124 @@
import styled from 'styled-components';
+import { Color, Size } from 'shared/enums';
-export const Container = styled.div`
- height: 100vh;
+export const Container = styled.div``;
+
+export const HeaderBackground = styled.div`
+ position: absolute;
+ z-index: -1;
+ top: 0;
+ width: 100%;
+ height: 60rem;
+ background: ${Color.Primary};
+ overflow: hidden;
+
+ object-fit: cover;
+
+ img {
+ opacity: 0.1;
+ min-height: 100%;
+ width: 100%;
+ object-fit: cover;
+ }
+`;
+
+export const ContentContainer = styled.div`
+ flex: 1;
+ line-height: 2.8rem;
+`;
+
+export const MovieContainer = styled.div`
+ color: ${Color.Fill};
display: flex;
- flex-direction: column;
- align-items: center;
justify-content: center;
- & > * {
- margin: 20px;
+ @media (max-width: 1280px) {
+ margin-left: ${Size.Medium};
+ margin-right: ${Size.Medium};
+ }
+
+ @media (max-width: 715px) {
+ flex-direction: column;
+ align-items: center;
}
`;
+
+export const PosterContainer = styled.div`
+ /* display: flex;
+ flex: 1; */
+ & > div {
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.5);
+ }
+`;
+
+export const MovieDetailsContainer = styled.div`
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ justify-content: space-between;
+ color: ${Color.Text};
+ margin-top: ${Size.Large};
+ /* padding: ${Size.Medium}; */
+
+ @media (min-width: 715px) {
+ height: 50rem;
+ color: ${Color.Fill};
+ margin-left: ${Size.Large};
+ margin-top: 0;
+ padding: 0;
+ padding-bottom: ${Size.Large};
+ }
+`;
+
+export const TitleContainer = styled.div`
+ margin-bottom: ${Size.Default};
+`;
+
+export const Title = styled.h1`
+ margin-bottom: ${Size.Small};
+ font-weight: 500;
+ line-height: ${Size.Large};
+`;
+
+export const Subtitle = styled.p``;
+
+export const Tagline = styled.p`
+ font-style: italic;
+ margin-bottom: ${Size.Smallest};
+`;
+
+export const OverviewContainer = styled.div`
+ margin-bottom: ${Size.Smallest};
+`;
+
+export const OverviewTitle = styled.h3`
+ font-weight: 500;
+`;
+
+export const Overview = styled.p`
+ text-align: justify;
+
+ @media (min-width: 715px) {
+ display: -webkit-box;
+ -webkit-line-clamp: 6;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+`;
+
+export const VoteAverage = styled.div`
+ margin-bottom: ${Size.Smallest};
+`;
+
+export const VoteAverageTitle = styled.span`
+ font-weight: 500;
+`;
+
+export const Director = styled.div`
+ margin-bottom: ${Size.Smallest};
+`;
+
+export const DirectorTitle = styled.span`
+ font-weight: 500;
+`;
diff --git a/src/shared/enums/PosterHeight.ts b/src/shared/enums/PosterHeight.ts
index f8690d2..621b96f 100644
--- a/src/shared/enums/PosterHeight.ts
+++ b/src/shared/enums/PosterHeight.ts
@@ -1,6 +1,6 @@
enum PosterHeight {
Default = '25.3rem',
- Large = '45.2rem',
+ Large = '55rem',
}
export default PosterHeight;
diff --git a/src/shared/enums/PosterWidth.ts b/src/shared/enums/PosterWidth.ts
index a8834e9..a9556d5 100644
--- a/src/shared/enums/PosterWidth.ts
+++ b/src/shared/enums/PosterWidth.ts
@@ -1,6 +1,6 @@
enum PosterWidth {
Default = '16.5rem',
- Large = '29.5rem',
+ Large = '35.9rem',
}
export default PosterWidth;
diff --git a/src/shared/utils/arrayToString.ts b/src/shared/utils/arrayToString.ts
new file mode 100644
index 0000000..7f250fa
--- /dev/null
+++ b/src/shared/utils/arrayToString.ts
@@ -0,0 +1,25 @@
+const arrayToString = (list: any[], key?: string): string => {
+ let data = '';
+
+ let parsedList = list;
+ if (key) {
+ parsedList = parsedList.map(item => item[key]);
+ }
+
+ parsedList.forEach((item, index) => {
+ data = `${data}${item}`;
+
+ if (index === parsedList.length - 2) {
+ data = `${data} e `;
+ return;
+ }
+
+ if (index !== parsedList.length - 1) {
+ data = `${data}, `;
+ }
+ });
+
+ return data;
+};
+
+export default arrayToString;
diff --git a/src/shared/utils/index.ts b/src/shared/utils/index.ts
index 59a96af..de02a05 100644
--- a/src/shared/utils/index.ts
+++ b/src/shared/utils/index.ts
@@ -1,3 +1,4 @@
+export { default as arrayToString } from './arrayToString';
export { default as formatDate } from './formatDate';
export { default as formatTmdbImage } from './formatTmdbImage';
export { default as getBackground } from './colors/getBackground';
diff --git a/version.json b/version.json
index 191bc00..0c0c3ab 100644
--- a/version.json
+++ b/version.json
@@ -1 +1 @@
-{ "version": "1.2.0" }
+{ "development": "1.3.0", "production": "1.2.0" }
diff --git a/yarn.lock b/yarn.lock
index 8b69d70..0535047 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4042,18 +4042,7 @@
resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.28.3.tgz#387c35f9a6a36b8d3561f6601eb4e72518b92899"
integrity sha512-0Sir2LxOmupF8HBUvpJoZghLmOqKfZsBk1GYlMwSIccLDDUoN04LHvo0KzDp9qxt1IKf9Fudpj35SrJ8VqetkQ==
-"@typescript-eslint/eslint-plugin@^2.10.0":
- version "2.24.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.24.0.tgz#a86cf618c965a462cddf3601f594544b134d6d68"
- integrity sha512-wJRBeaMeT7RLQ27UQkDFOu25MqFOBus8PtOa9KaT5ZuxC1kAsd7JEHqWt4YXuY9eancX0GK9C68i5OROnlIzBA==
- dependencies:
- "@typescript-eslint/experimental-utils" "2.24.0"
- eslint-utils "^1.4.3"
- functional-red-black-tree "^1.0.1"
- regexpp "^3.0.0"
- tsutils "^3.17.1"
-
-"@typescript-eslint/eslint-plugin@^2.29.0":
+"@typescript-eslint/eslint-plugin@^2.10.0", "@typescript-eslint/eslint-plugin@^2.29.0":
version "2.34.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9"
integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==
@@ -4063,15 +4052,6 @@
regexpp "^3.0.0"
tsutils "^3.17.1"
-"@typescript-eslint/experimental-utils@2.24.0":
- version "2.24.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.24.0.tgz#a5cb2ed89fedf8b59638dc83484eb0c8c35e1143"
- integrity sha512-DXrwuXTdVh3ycNCMYmWhUzn/gfqu9N0VzNnahjiDJvcyhfBy4gb59ncVZVxdp5XzBC77dCncu0daQgOkbvPwBw==
- dependencies:
- "@types/json-schema" "^7.0.3"
- "@typescript-eslint/typescript-estree" "2.24.0"
- eslint-scope "^5.0.0"
-
"@typescript-eslint/experimental-utils@2.34.0":
version "2.34.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f"
@@ -4082,17 +4062,7 @@
eslint-scope "^5.0.0"
eslint-utils "^2.0.0"
-"@typescript-eslint/parser@^2.10.0":
- version "2.24.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.24.0.tgz#2cf0eae6e6dd44d162486ad949c126b887f11eb8"
- integrity sha512-H2Y7uacwSSg8IbVxdYExSI3T7uM1DzmOn2COGtCahCC3g8YtM1xYAPi2MAHyfPs61VKxP/J/UiSctcRgw4G8aw==
- dependencies:
- "@types/eslint-visitor-keys" "^1.0.0"
- "@typescript-eslint/experimental-utils" "2.24.0"
- "@typescript-eslint/typescript-estree" "2.24.0"
- eslint-visitor-keys "^1.1.0"
-
-"@typescript-eslint/parser@^2.29.0":
+"@typescript-eslint/parser@^2.10.0", "@typescript-eslint/parser@^2.29.0":
version "2.34.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8"
integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==
@@ -4102,19 +4072,6 @@
"@typescript-eslint/typescript-estree" "2.34.0"
eslint-visitor-keys "^1.1.0"
-"@typescript-eslint/typescript-estree@2.24.0":
- version "2.24.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.24.0.tgz#38bbc8bb479790d2f324797ffbcdb346d897c62a"
- integrity sha512-RJ0yMe5owMSix55qX7Mi9V6z2FDuuDpN6eR5fzRJrp+8in9UF41IGNQHbg5aMK4/PjVaEQksLvz0IA8n+Mr/FA==
- dependencies:
- debug "^4.1.1"
- eslint-visitor-keys "^1.1.0"
- glob "^7.1.6"
- is-glob "^4.0.1"
- lodash "^4.17.15"
- semver "^6.3.0"
- tsutils "^3.17.1"
-
"@typescript-eslint/typescript-estree@2.34.0":
version "2.34.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5"
@@ -6012,15 +5969,10 @@ caniuse-api@^3.0.0:
lodash.memoize "^4.1.2"
lodash.uniq "^4.5.0"
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001035:
- version "1.0.30001035"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz#2bb53b8aa4716b2ed08e088d4dc816a5fe089a1e"
- integrity sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ==
-
-caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125:
- version "1.0.30001128"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001128.tgz#00ea73610bc991a92250e958837c197734be7029"
- integrity sha512-ocjGtRj+4wP6XTEIn2AGn3ebd8nkFN3991GlZ3ubLrjUC/w/YGgBFb5iy7CHr5NaBZ/pfo0SrctGRDVUbGgpzg==
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125:
+ version "1.0.30001151"
+ resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001151.tgz"
+ integrity sha512-Zh3sHqskX6mHNrqUerh+fkf0N72cMxrmflzje/JyVImfpknscMnkeJrlFGJcqTmaa0iszdYptGpWMJCRQDkBVw==
capture-exit@^2.0.0:
version "2.0.0"
@@ -7958,9 +7910,9 @@ eslint-config-airbnb@^18.1.0:
object.entries "^1.1.2"
eslint-config-prettier@^6.11.0:
- version "6.11.0"
- resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1"
- integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==
+ version "6.15.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9"
+ integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==
dependencies:
get-stdin "^6.0.0"
@@ -7979,7 +7931,7 @@ eslint-import-resolver-node@^0.3.2:
debug "^2.6.9"
resolve "^1.13.1"
-eslint-import-resolver-node@^0.3.3:
+eslint-import-resolver-node@^0.3.4:
version "0.3.4"
resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717"
integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==
@@ -7988,9 +7940,9 @@ eslint-import-resolver-node@^0.3.3:
resolve "^1.13.1"
eslint-import-resolver-typescript@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.2.0.tgz#f7b261e41a38b690f3044660f6d496cc312323b0"
- integrity sha512-/NhKEH1gbRlcb9RcaZJe5zRn5eIffGTf1qh3JAyvkEuPli3DEa5HQWWUO5OTfUjj7buUXsDq8lEsdwbbSeqywg==
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.3.0.tgz#0870988098bc6c6419c87705e6b42bee89425445"
+ integrity sha512-MHSXvmj5e0SGOOBhBbt7C+fWj1bJbtSYFAD85Xeg8nvUtuooTod2HQb8bfhE9f5QyyNxEfgzqOYFCvmdDIcCuw==
dependencies:
debug "^4.1.1"
glob "^7.1.6"
@@ -8051,16 +8003,16 @@ eslint-plugin-import@2.20.1:
resolve "^1.12.0"
eslint-plugin-import@^2.20.1:
- version "2.22.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e"
- integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==
+ version "2.22.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702"
+ integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==
dependencies:
array-includes "^3.1.1"
array.prototype.flat "^1.2.3"
contains-path "^0.1.0"
debug "^2.6.9"
doctrine "1.5.0"
- eslint-import-resolver-node "^0.3.3"
+ eslint-import-resolver-node "^0.3.4"
eslint-module-utils "^2.6.0"
has "^1.0.3"
minimatch "^3.0.4"
@@ -8137,20 +8089,20 @@ eslint-plugin-react@7.19.0:
xregexp "^4.3.0"
eslint-plugin-react@^7.19.0:
- version "7.20.5"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.5.tgz#29480f3071f64a04b2c3d99d9b460ce0f76fb857"
- integrity sha512-ajbJfHuFnpVNJjhyrfq+pH1C0gLc2y94OiCbAXT5O0J0YCKaFEHDV8+3+mDOr+w8WguRX+vSs1bM2BDG0VLvCw==
+ version "7.21.5"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.21.5.tgz#50b21a412b9574bfe05b21db176e8b7b3b15bff3"
+ integrity sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g==
dependencies:
array-includes "^3.1.1"
array.prototype.flatmap "^1.2.3"
doctrine "^2.1.0"
has "^1.0.3"
- jsx-ast-utils "^2.4.1"
+ jsx-ast-utils "^2.4.1 || ^3.0.0"
object.entries "^1.1.2"
object.fromentries "^2.0.2"
object.values "^1.1.1"
prop-types "^15.7.2"
- resolve "^1.17.0"
+ resolve "^1.18.1"
string.prototype.matchall "^4.0.2"
eslint-scope@^4.0.3:
@@ -10016,6 +9968,13 @@ is-color-stop@^1.0.0:
rgb-regex "^1.0.1"
rgba-regex "^1.0.0"
+is-core-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d"
+ integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==
+ dependencies:
+ has "^1.0.3"
+
is-data-descriptor@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
@@ -11601,6 +11560,14 @@ jsx-ast-utils@^2.4.1:
array-includes "^3.1.1"
object.assign "^4.1.0"
+"jsx-ast-utils@^2.4.1 || ^3.0.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz#642f1d7b88aa6d7eb9d8f2210e166478444fa891"
+ integrity sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA==
+ dependencies:
+ array-includes "^3.1.1"
+ object.assign "^4.1.1"
+
junit-report-builder@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/junit-report-builder/-/junit-report-builder-2.0.0.tgz#aaf9c8c6848cd9bb9dfb6da8e2f411d72ddf47aa"
@@ -15461,6 +15428,14 @@ resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.2, resolve@^1.8.
dependencies:
path-parse "^1.0.6"
+resolve@^1.18.1:
+ version "1.18.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130"
+ integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==
+ dependencies:
+ is-core-module "^2.0.0"
+ path-parse "^1.0.6"
+
restore-cursor@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"