mirror of
https://github.com/zimplexing/OrionTV.git
synced 2026-02-04 03:36:29 +08:00
- Add Logger utility with tagged output and environment-based control - Configure Babel to remove console calls in production builds - Replace all console.* calls across stores, services, and components with Logger - Enable development-only logging with formatted output and component tags - Optimize production builds by eliminating all logging code
98 lines
2.8 KiB
TypeScript
98 lines
2.8 KiB
TypeScript
import React from "react";
|
|
import { View, Text, StyleSheet, Modal, FlatList } from "react-native";
|
|
import { StyledButton } from "./StyledButton";
|
|
import useDetailStore from "@/stores/detailStore";
|
|
import usePlayerStore from "@/stores/playerStore";
|
|
import Logger from '@/utils/Logger';
|
|
|
|
const logger = Logger.withTag('SourceSelectionModal');
|
|
|
|
export const SourceSelectionModal: React.FC = () => {
|
|
const { showSourceModal, setShowSourceModal, loadVideo, currentEpisodeIndex, status } = usePlayerStore();
|
|
const { searchResults, detail, setDetail } = useDetailStore();
|
|
|
|
const onSelectSource = (index: number) => {
|
|
logger.debug("onSelectSource", index, searchResults[index].source, detail?.source);
|
|
if (searchResults[index].source !== detail?.source) {
|
|
const newDetail = searchResults[index];
|
|
setDetail(newDetail);
|
|
|
|
// Reload the video with the new source, preserving current position
|
|
const currentPosition = status?.isLoaded ? status.positionMillis : undefined;
|
|
loadVideo({
|
|
source: newDetail.source,
|
|
id: newDetail.id.toString(),
|
|
episodeIndex: currentEpisodeIndex,
|
|
title: newDetail.title,
|
|
position: currentPosition
|
|
});
|
|
}
|
|
setShowSourceModal(false);
|
|
};
|
|
|
|
const onClose = () => {
|
|
setShowSourceModal(false);
|
|
};
|
|
|
|
return (
|
|
<Modal visible={showSourceModal} transparent={true} animationType="slide" onRequestClose={onClose}>
|
|
<View style={styles.modalContainer}>
|
|
<View style={styles.modalContent}>
|
|
<Text style={styles.modalTitle}>选择播放源</Text>
|
|
<FlatList
|
|
data={searchResults}
|
|
numColumns={3}
|
|
contentContainerStyle={styles.sourceList}
|
|
keyExtractor={(item, index) => `source-${item.source}-${index}`}
|
|
renderItem={({ item, index }) => (
|
|
<StyledButton
|
|
text={item.source_name}
|
|
onPress={() => onSelectSource(index)}
|
|
isSelected={detail?.source === item.source}
|
|
hasTVPreferredFocus={detail?.source === item.source}
|
|
style={styles.sourceItem}
|
|
textStyle={styles.sourceItemText}
|
|
/>
|
|
)}
|
|
/>
|
|
</View>
|
|
</View>
|
|
</Modal>
|
|
);
|
|
};
|
|
|
|
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",
|
|
},
|
|
sourceList: {
|
|
justifyContent: "flex-start",
|
|
},
|
|
sourceItem: {
|
|
paddingVertical: 2,
|
|
margin: 4,
|
|
marginLeft: 10,
|
|
marginRight: 8,
|
|
width: "30%",
|
|
},
|
|
sourceItemText: {
|
|
fontSize: 14,
|
|
},
|
|
});
|