diff --git a/src/components/CopyableCode.tsx b/src/components/CopyableCode.tsx new file mode 100644 index 0000000..a8d9d04 --- /dev/null +++ b/src/components/CopyableCode.tsx @@ -0,0 +1,45 @@ +import { useState } from 'react' + +interface Props { + code: string + prefix?: string +} + +export default function CopyableCode({ code, prefix }: Props) { + const [copied, setCopied] = useState(false) + + const handleCopy = async (e: React.MouseEvent) => { + e.stopPropagation() + try { + await navigator.clipboard.writeText(code) + setCopied(true) + setTimeout(() => setCopied(false), 1500) + } catch { + // fallback: select text + } + } + + return ( + + {prefix}{code} + {copied && ( + ✓ + )} + + ) +} diff --git a/src/pages/MeetingDetailPage.tsx b/src/pages/MeetingDetailPage.tsx index 08df180..5af76eb 100644 --- a/src/pages/MeetingDetailPage.tsx +++ b/src/pages/MeetingDetailPage.tsx @@ -3,6 +3,7 @@ import { useParams, useNavigate } from 'react-router-dom' import api from '@/services/api' import { useAuth } from '@/hooks/useAuth' import dayjs from 'dayjs' +import CopyableCode from '@/components/CopyableCode' interface MeetingItem { id: number @@ -153,7 +154,7 @@ export default function MeetingDetailPage() {
{project.description || 'No description'}
{project.repo &&📦 {project.repo}
}