From fe75ce0f3f35e3f0aab2896b95b3faad80acfdc0 Mon Sep 17 00:00:00 2001 From: aoi-dev-0411 Date: Sat, 11 Apr 2026 11:48:32 +0900 Subject: [PATCH] feat: add Copy Result button with clipboard support Closes #35 --- components/result-dashboard.tsx | 51 ++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/components/result-dashboard.tsx b/components/result-dashboard.tsx index 6e89d31..0ed4f3f 100644 --- a/components/result-dashboard.tsx +++ b/components/result-dashboard.tsx @@ -1,3 +1,6 @@ +"use client"; + +import { useState } from "react"; import { ComparisonTable } from "./comparison-table"; import { ComparisonChart } from "./comparison-chart"; import { BreakdownBars } from "./breakdown-bars"; @@ -5,7 +8,7 @@ import { TopList } from "./top-list"; import { InsightsList } from "./insights-list"; import { ScoreCard } from "./score-card"; import { Card, CardContent } from "./ui/card"; -import { Trophy } from "lucide-react"; +import { Trophy, Copy, Check } from "lucide-react"; import { UserResult } from "@/types/user-result"; type Props = { @@ -14,12 +17,39 @@ type Props = { }; export function ResultDashboard({ user1, user2 }: Props) { + const [copied, setCopied] = useState(false); + const winner = user1.finalScore === user2.finalScore ? null : user1.finalScore > user2.finalScore ? user1 : user2; + + const handleCopy = async () => { + const summary = { + winner: winner?.username ?? "Tie", + users: [ + { + username: user1.username, + finalScore: user1.finalScore, + repoScore: user1.repoScore, + prScore: user1.prScore, + contributionScore: user1.contributionScore, + }, + { + username: user2.username, + finalScore: user2.finalScore, + repoScore: user2.repoScore, + prScore: user2.prScore, + contributionScore: user2.contributionScore, + }, + ], + }; + await navigator.clipboard.writeText(JSON.stringify(summary, null, 2)); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + }; const loser = winner === user1 ? user2 : user1; const diffPct = winner ? Math.round( @@ -128,6 +158,25 @@ export function ResultDashboard({ user1, user2 }: Props) { + +
+ +
); }