From bf07b6da4f791c0413ebba193e08fb50dc73d40e Mon Sep 17 00:00:00 2001 From: john Date: Sun, 18 May 2025 22:49:06 +0200 Subject: [PATCH] copy to clipboard --- .../subpages/SignupCodesManagementPage.tsx | 60 ++++++++++++++++++- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/src/app/admin/pages/subpages/SignupCodesManagementPage.tsx b/src/app/admin/pages/subpages/SignupCodesManagementPage.tsx index a04bb7f..693ebd6 100644 --- a/src/app/admin/pages/subpages/SignupCodesManagementPage.tsx +++ b/src/app/admin/pages/subpages/SignupCodesManagementPage.tsx @@ -1,5 +1,5 @@ import { AuthService } from '../../../auth/authService.ts' -import { useEffect, useState, useRef } from 'react' +import { useEffect, useState, useRef, MouseEvent } from 'react' import { SignupCode } from '../../../auth/signupCode.ts' import { Temporal } from '@js-temporal/polyfill' import Button from '../../../../components/buttons/Button.tsx' @@ -16,6 +16,8 @@ export default function SignupCodesManagementPage({ authService }: SignupCodesMa const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState(null) const dialogRef = useRef(null) + const [tooltipPosition, setTooltipPosition] = useState<{ x: number; y: number } | null>(null) + const [activeCode, setActiveCode] = useState(null) const fetchCodes = async () => { try { @@ -61,7 +63,6 @@ export default function SignupCodesManagementPage({ authService }: SignupCodesMa const formatDate = (date: Temporal.Instant | null) => { if (!date) return 'Never' try { - // Convert Temporal.Instant to a JavaScript Date for formatting const jsDate = new Date(date.epochMilliseconds) // Format as: "Jan 1, 2023, 12:00 PM" @@ -78,6 +79,36 @@ export default function SignupCodesManagementPage({ authService }: SignupCodesMa } } + const copyCodeToClipboard = (code: string, e: MouseEvent) => { + e.preventDefault() + const host = window.location.origin + const url = `${host}?c=${code}` + navigator.clipboard.writeText(url) + .then(() => { + // Optional: Show a success message or notification + console.log('Copied to clipboard:', url) + }) + .catch(err => { + console.error('Failed to copy:', err) + }) + setTooltipPosition(null) + setActiveCode(null) + } + + const showTooltip = (code: string, e: MouseEvent) => { + const rect = (e.currentTarget as HTMLElement).getBoundingClientRect() + setTooltipPosition({ + x: rect.left + rect.width / 2, + y: rect.top - 10 + }) + setActiveCode(code) + } + + const hideTooltip = () => { + setTooltipPosition(null) + setActiveCode(null) + } + return ( <>
@@ -99,7 +130,14 @@ export default function SignupCodesManagementPage({ authService }: SignupCodesMa {codes.map((code) => ( - {code.code} + {code.email} {code.redeemedBy || 'Not redeemed'} @@ -182,6 +220,22 @@ export default function SignupCodesManagementPage({ authService }: SignupCodesMa
+ + {tooltipPosition && activeCode && ( + + Copy to clipboard + + )} ) }