mirror of
https://gh-proxy.org/https://github.com/tiajinsha/JKVideo
synced 2026-07-07 23:18:38 +08:00
设置页面
This commit is contained in:
@@ -20,7 +20,8 @@ import Video, { VideoRef } from "react-native-video";
|
||||
import { Ionicons } from "@expo/vector-icons";
|
||||
import { buildDashMpdUri } from "../utils/dash";
|
||||
import { getPlayUrl, getVideoDetail } from "../services/bilibili";
|
||||
import { proxyImageUrl } from "../utils/imageUrl";
|
||||
import { coverImageUrl } from "../utils/imageUrl";
|
||||
import { useSettingsStore } from "../store/settingsStore";
|
||||
import { formatCount, formatDuration } from "../utils/format";
|
||||
import type { VideoItem } from "../services/types";
|
||||
|
||||
@@ -54,6 +55,7 @@ export const BigVideoCard = React.memo(function BigVideoCard({
|
||||
onPress,
|
||||
}: Props) {
|
||||
const { width: SCREEN_W } = useWindowDimensions();
|
||||
const coverQuality = useSettingsStore(s => s.coverQuality);
|
||||
const THUMB_H = SCREEN_W * 0.5625;
|
||||
const mediaDimensions = { width: SCREEN_W - 8, height: THUMB_H };
|
||||
|
||||
@@ -258,7 +260,7 @@ export const BigVideoCard = React.memo(function BigVideoCard({
|
||||
pointerEvents="none"
|
||||
>
|
||||
<Image
|
||||
source={{ uri: proxyImageUrl(item.pic) }}
|
||||
source={{ uri: coverImageUrl(item.pic, coverQuality) }}
|
||||
style={mediaDimensions}
|
||||
resizeMode="cover"
|
||||
/>
|
||||
|
||||
@@ -20,6 +20,7 @@ interface Props {
|
||||
onToggle: () => void;
|
||||
style?: object | object[];
|
||||
hideHeader?: boolean;
|
||||
isLive?: boolean;
|
||||
maxItems?: number;
|
||||
giftCounts?: Record<string, number>;
|
||||
}
|
||||
@@ -60,6 +61,7 @@ export default function DanmakuList({
|
||||
onToggle,
|
||||
style,
|
||||
hideHeader,
|
||||
isLive,
|
||||
maxItems = 100,
|
||||
giftCounts,
|
||||
}: Props) {
|
||||
@@ -90,7 +92,7 @@ export default function DanmakuList({
|
||||
return;
|
||||
}
|
||||
|
||||
if (hideHeader) {
|
||||
if (isLive) {
|
||||
const newStart = processedIndexRef.current;
|
||||
if (danmakus.length > newStart) {
|
||||
queueRef.current.push(...danmakus.slice(newStart));
|
||||
@@ -105,11 +107,11 @@ export default function DanmakuList({
|
||||
setDisplayedItems([]);
|
||||
setUnseenCount(0);
|
||||
isAtBottomRef.current = true;
|
||||
}, [danmakus, hideHeader]);
|
||||
}, [danmakus, isLive]);
|
||||
|
||||
// Watch currentTime — only used in video mode
|
||||
useEffect(() => {
|
||||
if (!visible || danmakus.length === 0 || hideHeader) return;
|
||||
if (danmakus.length === 0 || isLive) return;
|
||||
|
||||
const prevTime = lastTimeRef.current;
|
||||
lastTimeRef.current = currentTime;
|
||||
@@ -140,12 +142,10 @@ export default function DanmakuList({
|
||||
i++;
|
||||
}
|
||||
processedIndexRef.current = i;
|
||||
}, [currentTime, danmakus, visible, hideHeader]);
|
||||
}, [currentTime, danmakus, isLive]);
|
||||
|
||||
// Drip interval
|
||||
// Drip interval — always running so queue is consumed even when tab is hidden
|
||||
useEffect(() => {
|
||||
if (!visible) return;
|
||||
|
||||
const id = setInterval(
|
||||
() => {
|
||||
if (queueRef.current.length === 0) return;
|
||||
@@ -185,7 +185,7 @@ export default function DanmakuList({
|
||||
);
|
||||
|
||||
return () => clearInterval(id);
|
||||
}, [visible]);
|
||||
}, []);
|
||||
|
||||
const handleScroll = useCallback(
|
||||
(e: NativeSyntheticEvent<NativeScrollEvent>) => {
|
||||
@@ -297,9 +297,9 @@ export default function DanmakuList({
|
||||
ref={flatListRef}
|
||||
data={displayedItems}
|
||||
keyExtractor={keyExtractor}
|
||||
renderItem={hideHeader ? renderLiveItem : renderVideoItem}
|
||||
style={hideHeader ? liveStyles.list : styles.list}
|
||||
contentContainerStyle={hideHeader ? liveStyles.listContent : styles.listContent}
|
||||
renderItem={isLive ? renderLiveItem : renderVideoItem}
|
||||
style={isLive ? liveStyles.list : styles.list}
|
||||
contentContainerStyle={isLive ? liveStyles.listContent : styles.listContent}
|
||||
onScroll={handleScroll}
|
||||
onScrollBeginDrag={handleScrollBeginDrag}
|
||||
scrollEventThrottle={16}
|
||||
|
||||
@@ -10,7 +10,8 @@ import {
|
||||
import { Ionicons } from "@expo/vector-icons";
|
||||
import type { VideoItem } from "../services/types";
|
||||
import { formatCount, formatDuration } from "../utils/format";
|
||||
import { proxyImageUrl } from "../utils/imageUrl";
|
||||
import { coverImageUrl } from "../utils/imageUrl";
|
||||
import { useSettingsStore } from "../store/settingsStore";
|
||||
|
||||
const { width } = Dimensions.get("window");
|
||||
const CARD_WIDTH = (width - 14) / 2;
|
||||
@@ -21,6 +22,7 @@ interface Props {
|
||||
}
|
||||
|
||||
export const VideoCard = React.memo(function VideoCard({ item, onPress }: Props) {
|
||||
const coverQuality = useSettingsStore(s => s.coverQuality);
|
||||
return (
|
||||
<TouchableOpacity
|
||||
style={styles.card}
|
||||
@@ -29,7 +31,7 @@ export const VideoCard = React.memo(function VideoCard({ item, onPress }: Props)
|
||||
>
|
||||
<View style={styles.thumbContainer}>
|
||||
<Image
|
||||
source={{ uri: proxyImageUrl(item.pic) }}
|
||||
source={{ uri: coverImageUrl(item.pic, coverQuality) }}
|
||||
style={styles.thumb}
|
||||
resizeMode="cover"
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user