import React, { useState, useRef, useImperativeHandle, forwardRef } from "react"; import { View, TextInput, StyleSheet, Animated } from "react-native"; import { useTVEventHandler } from "react-native"; import { ThemedText } from "@/components/ThemedText"; import { SettingsSection } from "./SettingsSection"; import { useSettingsStore } from "@/stores/settingsStore"; import { useRemoteControlStore } from "@/stores/remoteControlStore"; import { useButtonAnimation } from "@/hooks/useAnimation"; interface LiveStreamSectionProps { onChanged: () => void; onFocus?: () => void; onBlur?: () => void; } export interface LiveStreamSectionRef { setInputValue: (value: string) => void; } export const LiveStreamSection = forwardRef( ({ onChanged, onFocus, onBlur }, ref) => { const { m3uUrl, setM3uUrl, remoteInputEnabled } = useSettingsStore(); const { serverUrl } = useRemoteControlStore(); const [isInputFocused, setIsInputFocused] = useState(false); const [isSectionFocused, setIsSectionFocused] = useState(false); const inputRef = useRef(null); const inputAnimationStyle = useButtonAnimation(isSectionFocused, 1.01); const handleUrlChange = (url: string) => { setM3uUrl(url); onChanged(); }; useImperativeHandle(ref, () => ({ setInputValue: (value: string) => { setM3uUrl(value); onChanged(); }, })); const handleSectionFocus = () => { setIsSectionFocused(true); onFocus?.(); }; const handleSectionBlur = () => { setIsSectionFocused(false); onBlur?.(); }; const handleTVEvent = React.useCallback( (event: any) => { if (isSectionFocused && event.eventType === "select") { inputRef.current?.focus(); } }, [isSectionFocused] ); useTVEventHandler(handleTVEvent); return ( 直播源地址 {remoteInputEnabled && serverUrl && ( 用手机访问 {serverUrl},可远程输入 )} setIsInputFocused(true)} onBlur={() => setIsInputFocused(false)} /> ); } ); LiveStreamSection.displayName = "LiveStreamSection"; const styles = StyleSheet.create({ titleContainer: { flexDirection: "row", alignItems: "center", marginBottom: 8, }, sectionTitle: { fontSize: 16, fontWeight: "bold", marginRight: 12, }, subtitle: { fontSize: 12, color: "#888", fontStyle: "italic", }, inputContainer: { marginBottom: 12, }, input: { height: 50, borderWidth: 2, borderRadius: 8, paddingHorizontal: 15, fontSize: 16, backgroundColor: "#3a3a3c", color: "white", borderColor: "transparent", }, inputFocused: { borderColor: "#007AFF", shadowColor: "#007AFF", shadowOffset: { width: 0, height: 0 }, shadowOpacity: 0.8, shadowRadius: 10, elevation: 5, }, });