diff --git a/src/features/comparison/components/result-dashboard.tsx b/src/features/comparison/components/result-dashboard.tsx index 7572dac..93b5292 100644 --- a/src/features/comparison/components/result-dashboard.tsx +++ b/src/features/comparison/components/result-dashboard.tsx @@ -1,9 +1,9 @@ "use client"; -import { useMemo } from "react"; +import { useMemo, useState, useRef } from "react"; import Link from "next/link"; import type { Route } from "next"; -import { Check, Copy, ExternalLink, Trophy } from "lucide-react"; +import { Check, Copy, ExternalLink, Trophy, Share2, XCircle } from "lucide-react"; import { useSearchParams } from "next/navigation"; import { useClipboardCopy } from "@/hooks"; import { Avatar } from "@/components/layout/avatar"; @@ -63,6 +63,34 @@ export function ResultDashboard({ const { t } = useTranslation(); const searchParams = useSearchParams(); const { copied, copy } = useClipboardCopy(); + const { copy: copyShare } = useClipboardCopy(); + const [shareState, setShareState] = useState<"idle" | "success" | "error">("idle"); + const shareTimerRef = useRef | null>(null); + + const setShareFeedback = (state: "success" | "error") => { + setShareState(state); + if (shareTimerRef.current) clearTimeout(shareTimerRef.current); + shareTimerRef.current = setTimeout(() => setShareState("idle"), 2000); + }; + + const handleShare = async () => { + const url = window.location.href; + try { + if (navigator.share) { + await navigator.share({ url }); + setShareFeedback("success"); + } else { + const success = await copyShare(url); + setShareFeedback(success ? "success" : "error"); + } + } catch (err: unknown) { + if (err instanceof Error && err.name === "AbortError") { + return; + } + setShareFeedback("error"); + } + }; + const methodologyHref = useMemo(() => { const query = searchParams.toString(); return query ? `/scoring-methodology?${query}` : "/scoring-methodology"; @@ -454,7 +482,31 @@ export function ResultDashboard({ ) : null} -
+
+