Skip to content

Commit 20ec5c0

Browse files
authored
Merge pull request #35 from piashcse/artist-movies-and-tvseries
Implemented artist movies and tv series
2 parents b3e3e5f + b9a3f81 commit 20ec5c0

File tree

9 files changed

+118
-17
lines changed

9 files changed

+118
-17
lines changed

src/components/see-more/SeeMoreText.tsx

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,28 @@ const SeeMoreText: React.FC<ReadMoreTextProps> = ({
1919
textStyle,
2020
numberOfLines = 3,
2121
}: ReadMoreTextProps) => {
22-
const [showMoreButton, setShowMoreButton] = useState(false);
22+
const [showMoreButton, setShowMoreButton] = useState(true);
2323
const [textShown, setTextShown] = useState(false);
2424
const [numLines, setNumLines] = useState<number | undefined>(numberOfLines);
2525

2626
const toggleTextShown = () => {
27-
setTextShown(!textShown);
27+
setTextShown((prev) => !prev);
2828
};
2929

3030
useEffect(() => {
31-
setNumLines(textShown ? undefined : numLines);
32-
}, [textShown]);
31+
setNumLines(textShown ? undefined : numberOfLines);
32+
}, [textShown, numberOfLines]);
3333

3434
const onTextLayout = useCallback(
3535
(e: NativeSyntheticEvent<TextLayoutEventData>) => {
36-
if (e.nativeEvent.lines.length > 3 && !textShown) {
36+
const linesCount = e.nativeEvent.lines.length;
37+
console.log('Total lines in text:', linesCount);
38+
39+
if (linesCount > numberOfLines && !showMoreButton) {
3740
setShowMoreButton(true);
38-
setNumLines(numberOfLines);
3941
}
4042
},
41-
[textShown]
43+
[numberOfLines, showMoreButton]
4244
);
4345

4446
return (
@@ -51,11 +53,12 @@ const SeeMoreText: React.FC<ReadMoreTextProps> = ({
5153
>
5254
{text}
5355
</Text>
54-
{showMoreButton ? (
56+
57+
{showMoreButton && (
5558
<Text onPress={toggleTextShown} style={readMoreStyle}>
5659
{textShown ? 'See Less' : 'See More'}
5760
</Text>
58-
) : null}
61+
)}
5962
</>
6063
);
6164
};

src/localization/AppString.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ export const AppString = {
1010
min: 'min',
1111
title: 'Remove Favorite',
1212
message: 'Are you want to remove this item?',
13+
artistMoviesAndTvSeries: 'Artist Movies & Tv Series',
1314
};

src/localization/locale-json/bn.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@
99
"artist": "Artist",
1010
"min": "min",
1111
"Remove Favorite": "ফেবারিট রিমুভ",
12-
"Are you want to remove this item?": "আপনি কি এ আইটেমটি রিমুভ করতে চাচ্ছেন?"
12+
"Are you want to remove this item?": "আপনি কি এ আইটেমটি রিমুভ করতে চাচ্ছেন?",
13+
"Artist Movies & Tv Series": "Artist Movies & Tv Series"
1314
}

src/localization/locale-json/en.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@
99
"artist": "Artist",
1010
"min": "min",
1111
"Remove Favorite": "Remove Favorite",
12-
"Are you want to remove this item?": "Are you want to remove this item?"
12+
"Are you want to remove this item?": "Are you want to remove this item?":,
13+
"Artist Movies & Tv Series": "Artist Movies & Tv Series"
1314
}

src/redux/query/RTKQuery.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { createApi } from '@reduxjs/toolkit/query/react';
22
import { MovieResult } from '../../types/MovieResult.ts';
33
import { MovieItem } from '../../types/MovieItem.ts';
44
import { MovieDetail } from '../../types/MovieDetail.ts';
5-
import { CastAndCrew } from '../../types/ArtistAndCrew.ts';
5+
import { Cast, CastAndCrew } from '../../types/ArtistAndCrew.ts';
66
import { ArtistDetail } from '../../types/ArtistDetail.ts';
77
import { TvSeriesResult } from '../../types/TvSeriesResult.ts';
88
import { TvSeriesItem } from '../../types/TvSeriesItem.ts';
@@ -14,6 +14,7 @@ import {
1414
import baseQuery from './BaseQuery.ts';
1515
import { Pagination } from '../../types/ApiRequest/ApiRequest.ts';
1616
import { Celebrity, CelebrityItem } from '../../types/Celebrity.ts';
17+
import { CombinedCredit } from '../../types/CombinedCredit.ts';
1718

1819
export const movieApi = createApi({
1920
reducerPath: 'movieApi',
@@ -138,6 +139,12 @@ export const movieApi = createApi({
138139
}),
139140
transformResponse: (response: Celebrity) => response.results,
140141
}),
142+
artistMoviesAndTvSeries: builder.query<Cast[], number>({
143+
query: (personId: number) => ({
144+
url: `person/${personId}/combined_credits`,
145+
}),
146+
transformResponse: (response: CombinedCredit) => response.cast,
147+
}),
141148
}),
142149
});
143150

@@ -160,4 +167,5 @@ export const {
160167
useSearchMovieTvSeriesQuery,
161168
useLazyPopularCelebrityQuery,
162169
useLazyTrendingCelebrityQuery,
170+
useLazyArtistMoviesAndTvSeriesQuery,
163171
} = movieApi;

src/screens/artist-detail/ArtistDetail.style.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,5 +78,6 @@ const styles = StyleSheet.create({
7878
marginBottom: 8,
7979
color: colors.black,
8080
},
81+
seeMoreTextStyle: { color: colors.primaryColor },
8182
});
8283
export default styles;

src/screens/artist-detail/ArtistDetail.tsx

Lines changed: 72 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,69 @@
1-
import React from 'react';
1+
import React, { useEffect } from 'react';
22
import styles from './ArtistDetail.style.ts';
3-
import { Image, ScrollView, Text, View } from 'react-native';
3+
import {
4+
FlatList,
5+
Image,
6+
ScrollView,
7+
Text,
8+
TouchableOpacity,
9+
View,
10+
} from 'react-native';
411
import { AppConstants } from '../../constant/AppConstants';
5-
import { useArtistDetailQuery } from '../../redux/query/RTKQuery.ts';
6-
import { RouteProp, useRoute } from '@react-navigation/native';
12+
import {
13+
useArtistDetailQuery,
14+
useLazyArtistMoviesAndTvSeriesQuery,
15+
} from '../../redux/query/RTKQuery.ts';
16+
import {
17+
NavigationProp,
18+
RouteProp,
19+
useNavigation,
20+
useRoute,
21+
} from '@react-navigation/native';
722
import { SharedElement } from 'react-navigation-shared-element';
23+
import { useLocalization } from '../../hooks/useLocalization.ts';
24+
import { Cast } from '../../types/ArtistAndCrew.ts';
25+
import { RootStackParam } from '../../types/navigation/NavigationTypes.ts';
26+
import SeeMoreText from '../../components/see-more/SeeMoreText.tsx';
827

928
type RouteParams = {
1029
personId: string;
1130
};
31+
type MovieDetailNavigationProp = NavigationProp<RootStackParam, 'MovieDetail'>;
1232

1333
const ArtistDetail = () => {
34+
const localization = useLocalization();
35+
const navigation = useNavigation<MovieDetailNavigationProp>();
1436
const route = useRoute<RouteProp<{ params: RouteParams }, 'params'>>();
1537
const { personId } = route.params;
1638
const { data: artistDetail } = useArtistDetailQuery(Number(personId));
39+
const [fetchArtistMovieAndTvSeries, { data: artistData }] =
40+
useLazyArtistMoviesAndTvSeriesQuery();
41+
42+
useEffect(() => {
43+
fetchArtistMovieAndTvSeries(1);
44+
}, []);
45+
46+
const artistMovieAndTvSeriesItem = ({ item }: { item: Cast }) => {
47+
return (
48+
<TouchableOpacity
49+
style={styles.movieItemContainer}
50+
onPress={() => {
51+
if (item.media_type == 'movie') {
52+
navigation.navigate('MovieDetail', { movieId: item.id });
53+
} else {
54+
navigation.navigate('TvSeriesDetail', { tvSeriesId: item.id });
55+
}
56+
}}
57+
>
58+
<Image
59+
style={styles.similarImageView}
60+
source={{
61+
uri: `${AppConstants.IMAGE_URL}${item.poster_path}`,
62+
}}
63+
/>
64+
</TouchableOpacity>
65+
);
66+
};
1767

1868
return (
1969
<ScrollView style={styles.mainView}>
@@ -55,7 +105,24 @@ const ArtistDetail = () => {
55105
</View>
56106
</View>
57107
<Text style={styles.biography}>Biography</Text>
58-
<Text>{artistDetail?.biography}</Text>
108+
<SeeMoreText
109+
text={artistDetail?.biography ?? ''}
110+
numberOfLines={3}
111+
readMoreStyle={styles.seeMoreTextStyle}
112+
/>
113+
{artistData?.length && (
114+
<Text style={styles.description}>
115+
{localization.artistMoviesAndTvSeries}
116+
</Text>
117+
)}
118+
<FlatList
119+
style={styles.flatListContainer}
120+
data={artistData}
121+
renderItem={artistMovieAndTvSeriesItem}
122+
keyExtractor={(item, index) => index.toString()}
123+
horizontal={true}
124+
showsHorizontalScrollIndicator={false}
125+
/>
59126
</ScrollView>
60127
);
61128
};

src/types/ArtistAndCrew.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,18 @@ export interface Cast {
1717
character: string;
1818
credit_id: string;
1919
order: number;
20+
backdrop_path?: string;
21+
genre_ids: number[];
22+
original_language: string;
23+
original_title: string;
24+
overview: string;
25+
poster_path?: string;
26+
release_date: string;
27+
title: string;
28+
video: boolean;
29+
vote_average: number;
30+
vote_count: number;
31+
media_type: string;
2032
}
2133

2234
export interface Crew {

src/types/CombinedCredit.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { Cast, Crew } from './ArtistAndCrew.ts';
2+
3+
export interface CombinedCredit {
4+
cast: Cast[];
5+
crew: Crew[];
6+
id: number;
7+
}

0 commit comments

Comments
 (0)