refactor: Toast 升级为全局 Context,消除 onToast prop 透传

将 useToast 从独立 state hook 改为 Context-based,在 layout 中
挂载 ToastProvider 全局渲染 Toast。QrInviteModal、RoomManageModal、
ShareCardModal 不再需要 onToast prop,直接 useToast() 调用即可。
父组件 TopNav、MatchResult、profile、blindbox 移除了本地 Toast
渲染和 onToast 传递逻辑。
This commit is contained in:
2026-02-26 17:57:34 +08:00
parent b98920858c
commit d4c6da57a1
10 changed files with 68 additions and 55 deletions
+5 -5
View File
@@ -6,12 +6,12 @@ import { X, Copy, Share2, QrCode } from "lucide-react";
import type { SceneType } from "@/types";
import { getSceneConfig } from "@/lib/sceneConfig";
import Modal from "@/components/Modal";
import { useToast } from "@/hooks/useToast";
interface QrInviteModalProps {
open: boolean;
onClose: () => void;
roomId: string;
onToast: (msg: string) => void;
scene?: SceneType;
}
@@ -19,9 +19,9 @@ export default function QrInviteModal({
open,
onClose,
roomId,
onToast,
scene = "eat",
}: QrInviteModalProps) {
const toast = useToast();
const sceneConfig = getSceneConfig(scene);
const inviteUrl =
typeof window !== "undefined"
@@ -31,11 +31,11 @@ export default function QrInviteModal({
const handleCopy = useCallback(async () => {
try {
await navigator.clipboard.writeText(inviteUrl);
onToast("邀请链接已复制,快去发给朋友吧!");
toast.show("邀请链接已复制,快去发给朋友吧!");
} catch {
onToast("复制失败,请手动复制链接");
toast.show("复制失败,请手动复制链接");
}
}, [inviteUrl, onToast]);
}, [inviteUrl, toast]);
const handleShare = useCallback(async () => {
const shareData = {