设置页面

This commit is contained in:
Developer
2026-03-19 16:34:56 +08:00
parent 965a6b411f
commit 462a090599
12 changed files with 586 additions and 156 deletions

View File

@@ -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"
/>

View File

@@ -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}

View File

@@ -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"
/>