本项目已收到哔哩哔哩(bilibili)律师函,要求停止对 B 站 API 的调用及相关仿制行为。

为尊重知识产权及相关法律法规,本仓库即日起停止后续维护与更新,不再接受新的 Issue 和 Pull Request。

现有代码仅作学习参考保留,请勿将本项目用于任何商业或违法用途。

感谢所有支持过本项目的朋友。
This commit is contained in:
Developer
2026-05-12 21:29:45 +08:00
parent 53c67079a1
commit 6e0dc2729c
16 changed files with 1304 additions and 453 deletions

View File

@@ -0,0 +1,42 @@
import { useEffect, useRef, useState } from "react";
import { Animated } from "react-native";
/**
* 控制底部 Sheet 的"挂载 + 滑入 / 滑出 + 卸载"时序。
*
* 用法:
* const { rendered, slideAnim } = useSheetTransition(visible, sheetH);
* if (!rendered) return null;
* <Animated.View style={{ transform: [{ translateY: slideAnim }] }}>…</Animated.View>
*
* 关键行为:
* - visible=true 时立刻 rendered=true 并触发"由下往上"滑入
* - visible=false 时先反向滑出 240ms结束才把 rendered 置 false卸载 Modal
* - 中途反复切换 visible 不会错乱:被打断的 timing.start() 回调拿到的 finished=false
* 所以 rendered 不会在动画未完成时意外清掉。
*/
export function useSheetTransition(visible: boolean, sheetH: number) {
const [rendered, setRendered] = useState(visible);
const slideAnim = useRef(new Animated.Value(visible ? 0 : sheetH)).current;
useEffect(() => {
if (visible) {
setRendered(true);
Animated.timing(slideAnim, {
toValue: 0,
duration: 240,
useNativeDriver: true,
}).start();
} else {
Animated.timing(slideAnim, {
toValue: sheetH,
duration: 240,
useNativeDriver: true,
}).start(({ finished }) => {
if (finished) setRendered(false);
});
}
}, [visible, sheetH]);
return { rendered, slideAnim };
}