import React from "react"; import { View, Text, StyleSheet, Modal, FlatList, Pressable } from "react-native"; import { StyledButton } from "./StyledButton"; import usePlayerStore from "@/stores/playerStore"; import { useState } from "react"; interface Episode { title?: string; url: string; } interface EpisodeSelectionModalProps {} export const EpisodeSelectionModal: React.FC = () => { const { showEpisodeModal, episodes, currentEpisodeIndex, playEpisode, setShowEpisodeModal } = usePlayerStore(); const [episodeGroupSize] = useState(30); const [selectedEpisodeGroup, setSelectedEpisodeGroup] = useState(Math.floor(currentEpisodeIndex / episodeGroupSize)); const onSelectEpisode = (index: number) => { playEpisode(index); setShowEpisodeModal(false); }; const onClose = () => { setShowEpisodeModal(false); }; return ( 选择剧集 {episodes.length > episodeGroupSize && ( {Array.from({ length: Math.ceil(episodes.length / episodeGroupSize) }, (_, groupIndex) => ( setSelectedEpisodeGroup(groupIndex)} isSelected={selectedEpisodeGroup === groupIndex} style={styles.episodeGroupButton} textStyle={styles.episodeGroupButtonText} /> ))} )} `episode-${selectedEpisodeGroup * episodeGroupSize + index}`} renderItem={({ item, index }) => { const absoluteIndex = selectedEpisodeGroup * episodeGroupSize + index; return ( onSelectEpisode(absoluteIndex)} isSelected={currentEpisodeIndex === absoluteIndex} hasTVPreferredFocus={currentEpisodeIndex === absoluteIndex} style={styles.episodeItem} textStyle={styles.episodeItemText} /> ); }} /> ); }; const styles = StyleSheet.create({ modalContainer: { flex: 1, flexDirection: "row", justifyContent: "flex-end", backgroundColor: "transparent", }, modalContent: { width: 600, height: "100%", backgroundColor: "rgba(0, 0, 0, 0.85)", padding: 20, }, modalTitle: { color: "white", marginBottom: 12, textAlign: "center", fontSize: 18, fontWeight: "bold", }, episodeList: { justifyContent: "flex-start", }, episodeItem: { paddingVertical: 2, margin: 4, width: "18%", }, episodeItemText: { fontSize: 14, }, episodeGroupContainer: { flexDirection: "row", flexWrap: "wrap", justifyContent: "center", paddingHorizontal: 10, }, episodeGroupButton: { paddingHorizontal: 6, margin: 8, }, episodeGroupButtonText: { fontSize: 12, }, });