From bf1551c6c3520446e7cbf64388299a931ead364b Mon Sep 17 00:00:00 2001 From: CrescentLeaf Date: Sat, 13 Dec 2025 12:32:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=81=E8=A3=85=E8=B7=AF=E7=94=B1=E5=AF=B9?= =?UTF-8?q?=E8=AF=9D=E6=A1=86=E5=87=BD=E6=95=B0=20*=20=E5=B9=B6=E4=B8=94?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E7=94=A8=E6=88=B7=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=AF=BC=E8=87=B4=E5=8A=A8=E7=94=BB=E4=B8=A2?= =?UTF-8?q?=E5=A4=B1=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/ui/routers/useRouterDialogRef.ts | 32 +++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 client/ui/routers/useRouterDialogRef.ts diff --git a/client/ui/routers/useRouterDialogRef.ts b/client/ui/routers/useRouterDialogRef.ts new file mode 100644 index 0000000..15a317a --- /dev/null +++ b/client/ui/routers/useRouterDialogRef.ts @@ -0,0 +1,32 @@ +import { Dialog } from "mdui" +import useAsyncEffect from "../../utils/useAsyncEffect" +import sleep from "../../utils/sleep" +import { useBlocker, useNavigate } from "react-router" +import * as React from 'react' + +export default function useRouterDialogRef() { + const dialogRef = React.useRef() + const shouldBlock = React.useRef(true) + const nav = useNavigate() + const blocker = useBlocker(({ currentLocation, nextLocation }) => shouldBlock.current && currentLocation.pathname !== nextLocation.pathname) + + // 避免用户手动返回导致动画丢失 + React.useEffect(() => { + if (blocker.state === "blocked") { + // 这个让姐姐来就好啦 + dialogRef.current!.open = false + } + }, [blocker]) + + useAsyncEffect(async () => { + await sleep(10) + dialogRef.current!.open = true + dialogRef.current!.addEventListener('closed', async () => { + await sleep(10) + // 无论如何, 让姐姐先解除返回限制, 这样才能出去嘛 + shouldBlock.current = false + nav(-1) + }) + }, []) + return dialogRef +}