parent
10b688049d
commit
a36bca2f42
4 changed files with 148 additions and 10 deletions
After Width: | Height: | Size: 203 B |
After Width: | Height: | Size: 1.3 KiB |
@ -0,0 +1,135 @@ |
|||||||
|
import { Check, Copy, Facebook, Linkedin, Share2, Twitter } from 'lucide-react'; |
||||||
|
import { useRef, useState } from 'react'; |
||||||
|
import { useOutsideClick } from '../hooks/use-outside-click.ts'; |
||||||
|
import { useCopyText } from '../hooks/use-copy-text.ts'; |
||||||
|
import { cn } from '../lib/classname.ts'; |
||||||
|
|
||||||
|
type ShareRoadmapButtonProps = { |
||||||
|
description: string; |
||||||
|
pageUrl: string; |
||||||
|
}; |
||||||
|
|
||||||
|
export function ShareRoadmapButton(props: ShareRoadmapButtonProps) { |
||||||
|
const { description, pageUrl } = props; |
||||||
|
|
||||||
|
const { isCopied, copyText } = useCopyText(); |
||||||
|
|
||||||
|
const containerRef = useRef<HTMLDivElement>(null); |
||||||
|
const [isDropdownOpen, setIsDropdownOpen] = useState(false); |
||||||
|
|
||||||
|
const twitterUrl = `https://twitter.com/intent/tweet?text=${description}&url=${pageUrl}`; |
||||||
|
const fbUrl = `https://www.facebook.com/sharer/sharer.php?quote=${description}&u=${pageUrl}`; |
||||||
|
const hnUrl = `https://news.ycombinator.com/submitlink?t=${description}&u=${pageUrl}`; |
||||||
|
const redditUrl = `https://www.reddit.com/submit?title=${description}&url=${pageUrl}`; |
||||||
|
const linkedinUrl = `https://www.linkedin.com/shareArticle?mini=true&url=${pageUrl}&title=${description}`; |
||||||
|
|
||||||
|
useOutsideClick(containerRef, () => { |
||||||
|
setIsDropdownOpen(false); |
||||||
|
}); |
||||||
|
|
||||||
|
return ( |
||||||
|
<div className="relative" ref={containerRef}> |
||||||
|
<button |
||||||
|
onClick={() => setIsDropdownOpen(!isDropdownOpen)} |
||||||
|
className={cn( |
||||||
|
'inline-flex items-center justify-center rounded-md bg-yellow-400 px-3 py-1.5 text-xs font-medium hover:bg-yellow-500 sm:text-sm', |
||||||
|
{ |
||||||
|
'bg-yellow-500': isDropdownOpen, |
||||||
|
'bg-green-400': isCopied, |
||||||
|
}, |
||||||
|
)} |
||||||
|
aria-label="Share Roadmap" |
||||||
|
> |
||||||
|
{!isCopied && ( |
||||||
|
<> |
||||||
|
<Share2 size="15px" /> |
||||||
|
<span className="ml-2 hidden sm:inline">Share</span> |
||||||
|
</> |
||||||
|
)} |
||||||
|
{isCopied && ( |
||||||
|
<> |
||||||
|
<Check size="15px" /> |
||||||
|
<span className="ml-2 hidden sm:inline">Copied</span> |
||||||
|
</> |
||||||
|
)} |
||||||
|
</button> |
||||||
|
|
||||||
|
{isDropdownOpen && ( |
||||||
|
<div className="absolute left-0 z-50 mt-1 w-44 rounded-md bg-slate-800 text-sm text-white shadow-lg ring-1 ring-black ring-opacity-5"> |
||||||
|
<div className="flex flex-col px-1 py-1"> |
||||||
|
<button |
||||||
|
onClick={() => { |
||||||
|
copyText(pageUrl); |
||||||
|
setIsDropdownOpen(false); |
||||||
|
}} |
||||||
|
className="flex w-full items-center gap-2 px-2 py-2 text-sm text-slate-100 hover:bg-slate-700" |
||||||
|
> |
||||||
|
<div className="flex w-[20px] items-center justify-center"> |
||||||
|
<Copy size="15px" className="text-slate-400" /> |
||||||
|
</div> |
||||||
|
Copy Link |
||||||
|
</button> |
||||||
|
<a |
||||||
|
href={twitterUrl} |
||||||
|
target={'_blank'} |
||||||
|
className="mt-1 flex w-full items-center gap-2 px-2 py-2 text-sm text-slate-100 hover:bg-slate-700" |
||||||
|
> |
||||||
|
<div className="flex w-[20px] items-center justify-center"> |
||||||
|
<Twitter size="16px" className="text-slate-400" /> |
||||||
|
</div> |
||||||
|
Share on Twitter |
||||||
|
</a> |
||||||
|
<a |
||||||
|
href={fbUrl} |
||||||
|
target={'_blank'} |
||||||
|
className="flex w-full items-center gap-2 px-2 py-2 text-sm text-slate-100 hover:bg-slate-700" |
||||||
|
> |
||||||
|
<div className="flex w-[20px] items-center justify-center"> |
||||||
|
<Facebook size="16px" className="text-slate-400" /> |
||||||
|
</div> |
||||||
|
Facebook |
||||||
|
</a> |
||||||
|
<a |
||||||
|
href={hnUrl} |
||||||
|
target={'_blank'} |
||||||
|
className="flex w-full items-center gap-2 px-2 py-2 text-sm text-slate-100 hover:bg-slate-700" |
||||||
|
> |
||||||
|
<div className="flex w-[20px] items-center justify-center"> |
||||||
|
<img |
||||||
|
alt={'hackernews logo'} |
||||||
|
src={'/images/hackernews.svg'} |
||||||
|
className="h-5 w-5" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
Hacker News |
||||||
|
</a> |
||||||
|
<a |
||||||
|
href={redditUrl} |
||||||
|
target={'_blank'} |
||||||
|
className="flex w-full items-center gap-2 px-2 py-2 text-sm text-slate-100 hover:bg-slate-700" |
||||||
|
> |
||||||
|
<div className="flex w-[20px] items-center justify-center"> |
||||||
|
<img |
||||||
|
alt={'reddit logo'} |
||||||
|
src={'/images/reddit.svg'} |
||||||
|
className="h-5 w-5" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
Reddit |
||||||
|
</a> |
||||||
|
<a |
||||||
|
href={linkedinUrl} |
||||||
|
target={'_blank'} |
||||||
|
className="flex w-full items-center gap-2 px-2 py-2 text-sm text-slate-100 hover:bg-slate-700" |
||||||
|
> |
||||||
|
<div className="flex w-[20px] items-center justify-center"> |
||||||
|
<Linkedin size="16px" className="text-slate-400" /> |
||||||
|
</div> |
||||||
|
LinkedIn |
||||||
|
</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
)} |
||||||
|
</div> |
||||||
|
); |
||||||
|
} |
Loading…
Reference in new issue