Skip to content

Commit bc0ccfc

Browse files
committed
updated API with favorites
1 parent 66c5e41 commit bc0ccfc

File tree

6 files changed

+113
-21
lines changed

6 files changed

+113
-21
lines changed

Diff for: api/src/datasources/movies.ts

+40-6
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ interface Movie {
2727
cast?: Credit[];
2828
}
2929

30+
let favoriteMovies: string[] = [];
3031
class MovieDataSource extends RESTDataSource {
3132
apiKey: string = '';
3233
constructor() {
@@ -35,40 +36,73 @@ class MovieDataSource extends RESTDataSource {
3536
this.apiKey = String(process.env.TMDB_API_KEY);
3637
}
3738

39+
// array to save favorite movies
40+
3841
async nowPlaying() {
3942
const response = await this.get(
4043
`movie/now_playing?api_key=${this.apiKey}&language=en-US&page=1`,
4144
);
4245

43-
return response.results || [];
46+
const movies: Movie[] = response.results || [];
47+
48+
return (
49+
movies.map((movie) => ({
50+
...movie,
51+
favorite: favoriteMovies.includes(movie.id),
52+
})) || []
53+
);
4454
}
4555

4656
async popular() {
4757
const response = await this.get(
4858
`movie/popular?api_key=${this.apiKey}&language=en-US&page=1`,
4959
);
5060

51-
return response.results || [];
61+
const movies: Movie[] = response.results || [];
62+
63+
return (
64+
movies.map((movie) => ({
65+
...movie,
66+
favorite: favoriteMovies.includes(movie.id),
67+
})) || []
68+
);
5269
}
5370

54-
async movieById(id: number) {
71+
async movieById(id: string) {
5572
const response = await this.get(
5673
`movie/${id}?api_key=${this.apiKey}&language=en-US`,
5774
);
75+
const movie: Movie = response;
76+
77+
movie.favorite = favoriteMovies.includes(id);
5878

5979
return response;
6080
}
6181

62-
async getCredits(id: number) {
82+
async getCredits(id: string) {
6383
const response = await this.get(
6484
`movie/${id}/credits?api_key=${this.apiKey}&language=en-US`,
6585
);
6686

6787
return response;
6888
}
6989

70-
toggleFavorite(id: number) {
71-
// implement me
90+
async toggleFavorite(id: string) {
91+
const movie: Movie = await this.movieById(id);
92+
if (favoriteMovies.includes(id)) {
93+
console.log('setting favorite to false for id', id);
94+
favoriteMovies = favoriteMovies.filter((movieId) => movieId !== id);
95+
console.log('this.favorite', favoriteMovies);
96+
97+
movie.favorite = false;
98+
} else {
99+
console.log('setting favorite to true for id', id);
100+
movie.favorite = true;
101+
favoriteMovies.push(id);
102+
console.log('this.favorite', favoriteMovies);
103+
}
104+
105+
return movie;
72106
}
73107
}
74108

Diff for: apollo.config.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module.exports = {
44
name: 'now playing app',
55
url: 'http://localhost:4000/graphql',
66
},
7-
includes: ['./app/src/**/graphql.ts'], // array of glob patterns
7+
includes: ['./app/src/**/graphql.ts', './app/src/**/*.tsx'], // array of glob patterns
88
excludes: ['./app/**/src/generated/**'],
99
},
1010
};

Diff for: app/src/components/slider/MoviePoster.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import React, { useContext } from 'react';
22
import cx from 'classnames';
33
import { CarouselContext } from './CarouselContext';
4-
import { MovieFragmentFragment } from '../../generated/graphql';
4+
import { MovieFragment } from '../../generated/graphql';
55

66
import './MoviePoster.scss';
77
import FavoriteIcon from '@material-ui/icons/Favorite';
88

99
type MoviePosterProps = {
10-
movie: MovieFragmentFragment; // TODO: use the fragment type
10+
movie: MovieFragment; // TODO: use the fragment type
1111
};
1212

1313
export function MoviePoster(props: MoviePosterProps) {

Diff for: app/src/generated/graphql.tsx

+56-9
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,18 @@ export type ToggleFavoriteMutation = (
9999
)> }
100100
);
101101

102-
export type MovieFragmentFragment = (
102+
export type NowPlayingQueryQueryVariables = Exact<{ [key: string]: never; }>;
103+
104+
105+
export type NowPlayingQueryQuery = (
106+
{ __typename?: 'Query' }
107+
& { nowPlaying?: Maybe<Array<(
108+
{ __typename?: 'Movie' }
109+
& Pick<Movie, 'id' | 'title' | 'overview'>
110+
)>> }
111+
);
112+
113+
export type MovieFragment = (
103114
{ __typename?: 'Movie' }
104115
& Pick<Movie, 'id' | 'title' | 'overview' | 'poster_path' | 'backdrop_path' | 'favorite' | 'popularity'>
105116
& { cast?: Maybe<Array<(
@@ -115,7 +126,7 @@ export type NowPlayingQuery = (
115126
{ __typename?: 'Query' }
116127
& { nowPlaying?: Maybe<Array<(
117128
{ __typename?: 'Movie' }
118-
& MovieFragmentFragment
129+
& MovieFragment
119130
)>> }
120131
);
121132

@@ -126,12 +137,12 @@ export type PopularQuery = (
126137
{ __typename?: 'Query' }
127138
& { popular?: Maybe<Array<(
128139
{ __typename?: 'Movie' }
129-
& MovieFragmentFragment
140+
& MovieFragment
130141
)>> }
131142
);
132143

133-
export const MovieFragmentFragmentDoc = gql`
134-
fragment MovieFragment on Movie {
144+
export const MovieFragmentDoc = gql`
145+
fragment Movie on Movie {
135146
id
136147
title
137148
overview
@@ -222,13 +233,49 @@ export function useToggleFavoriteMutation(baseOptions?: Apollo.MutationHookOptio
222233
export type ToggleFavoriteMutationHookResult = ReturnType<typeof useToggleFavoriteMutation>;
223234
export type ToggleFavoriteMutationResult = Apollo.MutationResult<ToggleFavoriteMutation>;
224235
export type ToggleFavoriteMutationOptions = Apollo.BaseMutationOptions<ToggleFavoriteMutation, ToggleFavoriteMutationVariables>;
236+
export const NowPlayingQueryDocument = gql`
237+
query nowPlayingQuery {
238+
nowPlaying {
239+
id
240+
title
241+
overview
242+
}
243+
}
244+
`;
245+
246+
/**
247+
* __useNowPlayingQueryQuery__
248+
*
249+
* To run a query within a React component, call `useNowPlayingQueryQuery` and pass it any options that fit your needs.
250+
* When your component renders, `useNowPlayingQueryQuery` returns an object from Apollo Client that contains loading, error, and data properties
251+
* you can use to render your UI.
252+
*
253+
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
254+
*
255+
* @example
256+
* const { data, loading, error } = useNowPlayingQueryQuery({
257+
* variables: {
258+
* },
259+
* });
260+
*/
261+
export function useNowPlayingQueryQuery(baseOptions?: Apollo.QueryHookOptions<NowPlayingQueryQuery, NowPlayingQueryQueryVariables>) {
262+
const options = {...defaultOptions, ...baseOptions}
263+
return Apollo.useQuery<NowPlayingQueryQuery, NowPlayingQueryQueryVariables>(NowPlayingQueryDocument, options);
264+
}
265+
export function useNowPlayingQueryLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<NowPlayingQueryQuery, NowPlayingQueryQueryVariables>) {
266+
const options = {...defaultOptions, ...baseOptions}
267+
return Apollo.useLazyQuery<NowPlayingQueryQuery, NowPlayingQueryQueryVariables>(NowPlayingQueryDocument, options);
268+
}
269+
export type NowPlayingQueryQueryHookResult = ReturnType<typeof useNowPlayingQueryQuery>;
270+
export type NowPlayingQueryLazyQueryHookResult = ReturnType<typeof useNowPlayingQueryLazyQuery>;
271+
export type NowPlayingQueryQueryResult = Apollo.QueryResult<NowPlayingQueryQuery, NowPlayingQueryQueryVariables>;
225272
export const NowPlayingDocument = gql`
226273
query nowPlaying {
227274
nowPlaying {
228-
...MovieFragment
275+
...Movie
229276
}
230277
}
231-
${MovieFragmentFragmentDoc}`;
278+
${MovieFragmentDoc}`;
232279

233280
/**
234281
* __useNowPlayingQuery__
@@ -259,10 +306,10 @@ export type NowPlayingQueryResult = Apollo.QueryResult<NowPlayingQuery, NowPlayi
259306
export const PopularDocument = gql`
260307
query popular {
261308
popular {
262-
...MovieFragment
309+
...Movie
263310
}
264311
}
265-
${MovieFragmentFragmentDoc}`;
312+
${MovieFragmentDoc}`;
266313

267314
/**
268315
* __usePopularQuery__

Diff for: app/src/pages/NowPlaying.tsx

+11
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,17 @@ import React from 'react';
33
import { Carousel } from '../components/slider/Carousel';
44
import { MoviePoster } from '../components/slider/MoviePoster';
55
import { useNowPlayingQuery } from '../generated/graphql';
6+
import { gql } from '@apollo/client';
7+
8+
export const nowPlayingQuery = gql`
9+
query nowPlayingQuery {
10+
nowPlaying {
11+
id
12+
title
13+
overview
14+
}
15+
}
16+
`;
617

718
export const NowPlaying = () => {
819
const { loading, error, data } = useNowPlayingQuery();

Diff for: app/src/pages/graphql.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { gql } from '@apollo/client';
22

33
export const MOVIE_FRAGMENT = gql`
4-
fragment MovieFragment on Movie {
4+
fragment Movie on Movie {
55
id
66
title
77
overview
@@ -18,7 +18,7 @@ export const MOVIE_FRAGMENT = gql`
1818
export const NOW_PLAYING = gql`
1919
query nowPlaying {
2020
nowPlaying {
21-
...MovieFragment
21+
...Movie
2222
}
2323
}
2424
${MOVIE_FRAGMENT}
@@ -27,7 +27,7 @@ export const NOW_PLAYING = gql`
2727
export const POPULAR = gql`
2828
query popular {
2929
popular {
30-
...MovieFragment
30+
...Movie
3131
}
3232
}
3333
${MOVIE_FRAGMENT}

0 commit comments

Comments
 (0)