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:
@@ -13,6 +13,7 @@ import {
|
||||
import { UserProfile } from "@/types";
|
||||
import { getAvatar, getAvatarBg } from "@/lib/avatars";
|
||||
import Modal from "@/components/Modal";
|
||||
import { useToast } from "@/hooks/useToast";
|
||||
|
||||
interface RoomManageModalProps {
|
||||
open: boolean;
|
||||
@@ -24,7 +25,6 @@ interface RoomManageModalProps {
|
||||
swipeCounts: Record<string, number>;
|
||||
totalCards: number;
|
||||
userProfiles: Record<string, UserProfile>;
|
||||
onToast: (msg: string) => void;
|
||||
}
|
||||
|
||||
export default function RoomManageModal({
|
||||
@@ -37,8 +37,8 @@ export default function RoomManageModal({
|
||||
swipeCounts,
|
||||
totalCards,
|
||||
userProfiles,
|
||||
onToast,
|
||||
}: RoomManageModalProps) {
|
||||
const toast = useToast();
|
||||
const [loading, setLoading] = useState<string | null>(null);
|
||||
const [confirmKick, setConfirmKick] = useState<string | null>(null);
|
||||
const [confirmEnd, setConfirmEnd] = useState(false);
|
||||
@@ -54,33 +54,33 @@ export default function RoomManageModal({
|
||||
});
|
||||
if (!res.ok) {
|
||||
const data = await res.json().catch(() => ({}));
|
||||
onToast(data.error ?? "操作失败");
|
||||
toast.show(data.error ?? "操作失败");
|
||||
return;
|
||||
}
|
||||
switch (action) {
|
||||
case "lock":
|
||||
onToast("房间已锁定,其他人无法加入");
|
||||
toast.show("房间已锁定,其他人无法加入");
|
||||
break;
|
||||
case "unlock":
|
||||
onToast("房间已解锁");
|
||||
toast.show("房间已解锁");
|
||||
break;
|
||||
case "kick":
|
||||
onToast("已将该用户移出房间");
|
||||
toast.show("已将该用户移出房间");
|
||||
setConfirmKick(null);
|
||||
break;
|
||||
case "end_voting":
|
||||
onToast("已结束投票,正在结算结果");
|
||||
toast.show("已结束投票,正在结算结果");
|
||||
setConfirmEnd(false);
|
||||
onClose();
|
||||
break;
|
||||
}
|
||||
} catch {
|
||||
onToast("操作失败,请重试");
|
||||
toast.show("操作失败,请重试");
|
||||
} finally {
|
||||
setLoading(null);
|
||||
}
|
||||
},
|
||||
[roomId, userId, onToast, onClose],
|
||||
[roomId, userId, toast, onClose],
|
||||
);
|
||||
|
||||
const otherUsers = users.filter((u) => u !== userId);
|
||||
|
||||
Reference in New Issue
Block a user