refactor: 提取 useShare hook,统一分享和剪贴板逻辑
新增 useShare(Web Share API + clipboard fallback), 消除 QrInviteModal、BlindboxRoomPage、ShareCardModal 三处重复的分享代码。
This commit is contained in:
@@ -25,6 +25,7 @@ import { getCachedProfile, isRegistered } from "@/lib/userId";
|
||||
import ShareCardModal from "@/components/ShareCardModal";
|
||||
import Button from "@/components/Button";
|
||||
import { useToast } from "@/hooks/useToast";
|
||||
import { useShare } from "@/hooks/useShare";
|
||||
import { BlindboxRoomSkeleton } from "@/components/Skeleton";
|
||||
import type { UserProfile } from "@/types";
|
||||
|
||||
@@ -391,32 +392,21 @@ export default function BlindboxRoomPage() {
|
||||
setTimeout(frame, 200);
|
||||
};
|
||||
|
||||
const handleCopyCode = async () => {
|
||||
if (!room) return;
|
||||
try {
|
||||
await navigator.clipboard.writeText(room.code);
|
||||
toast.show("房间号已复制");
|
||||
} catch { /* ignore */ }
|
||||
};
|
||||
const { share, copyToClipboard } = useShare();
|
||||
|
||||
const handleShare = async () => {
|
||||
const handleCopyCode = useCallback(
|
||||
() => room ? copyToClipboard(room.code, "房间号已复制") : undefined,
|
||||
[room, copyToClipboard],
|
||||
);
|
||||
|
||||
const handleShare = useCallback(() => {
|
||||
if (!room) return;
|
||||
const url = typeof window !== "undefined" ? `${window.location.origin}/blindbox/${room.code}` : "";
|
||||
const shareData = {
|
||||
title: `周末契约 · ${room.name}`,
|
||||
text: `来和我一起玩周末盲盒吧!房间号:${room.code}`,
|
||||
url,
|
||||
};
|
||||
try {
|
||||
if (navigator.share && navigator.canShare?.(shareData)) {
|
||||
await navigator.share(shareData);
|
||||
return;
|
||||
}
|
||||
} catch (e) {
|
||||
if (e instanceof Error && e.name === "AbortError") return;
|
||||
}
|
||||
handleCopyCode();
|
||||
};
|
||||
share(
|
||||
{ title: `周末契约 · ${room.name}`, text: `来和我一起玩周末盲盒吧!房间号:${room.code}`, url },
|
||||
handleCopyCode,
|
||||
);
|
||||
}, [room, share, handleCopyCode]);
|
||||
|
||||
const isCreator = profile?.id === room?.creatorId;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user