Frontend added table shortener copy button with transition

pull/3/head
TZGyn 2 years ago
parent 1e3c010f62
commit 7788505a75
Signed by: TZGyn
GPG Key ID: 122EAF77AE81FD4A

@ -33,7 +33,14 @@ import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
import { Toaster } from '@/components/ui/toaster' import { Toaster } from '@/components/ui/toaster'
import { useToast } from '@/components/ui/use-toast' import { useToast } from '@/components/ui/use-toast'
import { Copy, Loader2, MoreHorizontal, Settings, User } from 'lucide-react' import {
Check,
Copy,
Loader2,
MoreHorizontal,
Settings,
User,
} from 'lucide-react'
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import { useNavigate } from 'react-router-dom' import { useNavigate } from 'react-router-dom'
@ -191,15 +198,8 @@ const ShortenerTable = ({
isLoading: boolean isLoading: boolean
getShorteners: () => Promise<void> getShorteners: () => Promise<void>
}) => { }) => {
const { toast } = useToast()
const copyLinkToClipboard = async (code: string) => {
await navigator.clipboard.writeText(backend_url + '/' + code)
toast({
title: 'Link Copied',
description: `Copied ${backend_url + '/' + code} To Clipboard`,
})
}
const navigate = useNavigate() const navigate = useNavigate()
return ( return (
<Card> <Card>
<CardHeader> <CardHeader>
@ -233,15 +233,13 @@ const ShortenerTable = ({
shorteners.map((shortener) => ( shorteners.map((shortener) => (
<TableRow key={shortener.id}> <TableRow key={shortener.id}>
<TableCell>{shortener.link}</TableCell> <TableCell>{shortener.link}</TableCell>
<TableCell <TableCell className='flex cursor-pointer select-none gap-2'>
className='cursor-pointer select-none' <div className='w-full rounded bg-secondary/70 p-2'>
onClick={() =>
copyLinkToClipboard(shortener.code)
}>
<div className='flex justify-between gap-4 rounded bg-secondary/70 p-2'>
{shortener.code} {shortener.code}
<Copy className='h-[1.2rem] w-[1.2rem]' />
</div> </div>
<ShortenerCopyButton
code={shortener.code}
/>
</TableCell> </TableCell>
<TableCell className='text-right'> <TableCell className='text-right'>
{shortener.visitor_count} {shortener.visitor_count}
@ -287,3 +285,41 @@ const ShortenerTable = ({
</Card> </Card>
) )
} }
const ShortenerCopyButton = ({ code }: { code: string }) => {
const { toast } = useToast()
const copyLinkToClipboard = async (code: string) => {
await navigator.clipboard.writeText(backend_url + '/' + code)
toast({
title: 'Link Copied',
description: `Copied ${backend_url + '/' + code} To Clipboard`,
})
}
const [isCopy, setIsCopy] = useState<boolean>(false)
const onClick = () => {
setIsCopy(true)
copyLinkToClipboard(code)
setTimeout(() => setIsCopy(false), 2000)
}
return (
<Button
type='submit'
size='sm'
onClick={onClick}>
<span className='sr-only'>Copy</span>
<div className='h-4 w-4'></div>
<Check
className={
'absolute h-4 w-4 transition-opacity ' +
(isCopy ? 'opacity-100' : 'opacity-0')
}
/>
<Copy
className={
'absolute h-4 w-4 transition-opacity ' +
(isCopy ? 'opacity-0' : 'opacity-100')
}
/>{' '}
</Button>
)
}

Loading…
Cancel
Save