Skip to content

Commit 582be90

Browse files
committed
add: prev and next episode button in lanscape mode
1 parent d8e5d06 commit 582be90

File tree

4 files changed

+38
-4
lines changed

4 files changed

+38
-4
lines changed

app/pages/(protected)/anime-stream.tsx

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,12 @@ interface Episode {
3535
}
3636

3737
export default function AnimeStreamPage() {
38-
const { episodeId: id } = useLocalSearchParams();
38+
const { episodeId: id, indexNow, indexMax } = useLocalSearchParams();
3939
const [episodeId, setEpisodeId] = useState(id);
40+
const [episodeIndex, setEpisodeIndex] = useState({
41+
indexNow: Number(indexNow),
42+
indexMax: Number(indexMax),
43+
});
4044
const [animeId, setAnimeId] = useState<string>("");
4145
const [animeTitle, setAnimeTitle] = useState<string>("");
4246

@@ -56,6 +60,10 @@ export default function AnimeStreamPage() {
5660
(item: any) => item.id === episodeId
5761
);
5862
if (activeIndex !== -1) {
63+
setEpisodeIndex({
64+
indexNow: activeIndex,
65+
indexMax: listEpisode.length - 1,
66+
});
5967
flatListRef.current.scrollToIndex({
6068
index: activeIndex,
6169
animated: true,
@@ -159,6 +167,22 @@ export default function AnimeStreamPage() {
159167

160168
// END SHARING BUTTON
161169

170+
const isHaveNextEpisode = () => episodeIndex.indexNow < episodeIndex.indexMax;
171+
172+
const isHavePrevEpisode = () => episodeIndex.indexNow > 0;
173+
174+
const nextEpisode = () => {
175+
if (isHaveNextEpisode()) {
176+
setEpisodeId(listEpisode[episodeIndex.indexNow + 1].id);
177+
}
178+
};
179+
180+
const prevEpisode = () => {
181+
if (isHavePrevEpisode()) {
182+
setEpisodeId(listEpisode[episodeIndex.indexNow - 1].id);
183+
}
184+
};
185+
162186
if (episodeDetail.isLoading && listEpisode.length == 0) {
163187
return <LoadingPage />;
164188
}
@@ -175,6 +199,10 @@ export default function AnimeStreamPage() {
175199
episodeId={episodeDetail.data.id}
176200
title={`${episodeDetail.data.anime?.title} - Episode ${episodeDetail.data.episode}`}
177201
data={episodeDetail.data.stream.direct}
202+
isHaveNextEpisode={isHaveNextEpisode()}
203+
isHavePrevEpisode={isHavePrevEpisode()}
204+
nextEpisode={nextEpisode}
205+
prevEpisode={prevEpisode}
178206
/>
179207
) : (
180208
<VideoLoading />
@@ -251,7 +279,9 @@ export default function AnimeStreamPage() {
251279
keyExtractor={(item) => item.id}
252280
renderItem={({ item: episode, index }) => (
253281
<TouchableOpacity
254-
onPress={() => setEpisodeId(episode.id)}
282+
onPress={() => {
283+
setEpisodeId(episode.id);
284+
}}
255285
key={episode.id}
256286
style={[
257287
styles.cardEpisode,

app/pages/anime-detail.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ export default function TestDetailPage() {
391391
}
392392
data={animeDetail.data.Episode}
393393
keyExtractor={(item) => item.id}
394-
renderItem={({ item: episode }) => (
394+
renderItem={({ item: episode, index }) => (
395395
<Pressable
396396
key={episode.id}
397397
onPress={() =>
@@ -400,6 +400,8 @@ export default function TestDetailPage() {
400400
pathname: "/pages/anime-stream",
401401
params: {
402402
episodeId: episode.id,
403+
indexNow: index,
404+
indexMax: animeDetail.data.Episode.length - 1,
403405
},
404406
})
405407
}

package-lock.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@
6262
"react-native-safe-area-context": "4.10.5",
6363
"react-native-screens": "3.31.1",
6464
"react-native-url-polyfill": "^2.0.0",
65-
"react-native-web": "~0.19.10"
65+
"react-native-web": "~0.19.10",
66+
"expo-keep-awake": "~13.0.2"
6667
},
6768
"devDependencies": {
6869
"@babel/core": "^7.20.0",

0 commit comments

Comments
 (0)