refactor: 提取 useShare hook,统一分享和剪贴板逻辑

新增 useShare(Web Share API + clipboard fallback),
消除 QrInviteModal、BlindboxRoomPage、ShareCardModal 三处重复的分享代码。
This commit is contained in:
2026-02-26 19:25:44 +08:00
parent 1229bb849b
commit c9e20d4c95
4 changed files with 70 additions and 64 deletions
+39
View File
@@ -0,0 +1,39 @@
"use client";
import { useCallback } from "react";
import { useToast } from "@/hooks/useToast";
export function useShare() {
const toast = useToast();
const copyToClipboard = useCallback(
async (text: string, successMsg = "已复制") => {
try {
await navigator.clipboard.writeText(text);
toast.show(successMsg);
} catch {
toast.show("复制失败,请手动复制");
}
},
[toast],
);
/** Try the native Web Share API; calls `fallback` if unavailable. Returns true if native share was triggered. */
const share = useCallback(
async (data: ShareData, fallback?: () => void): Promise<boolean> => {
try {
if (navigator.share && navigator.canShare?.(data)) {
await navigator.share(data);
return true;
}
} catch (e) {
if (e instanceof Error && e.name === "AbortError") return true;
}
fallback?.();
return false;
},
[],
);
return { share, copyToClipboard };
}