computer-scienceangular-roadmapbackend-roadmapblockchain-roadmapdba-roadmapdeveloper-roadmapdevops-roadmapfrontend-roadmapgo-roadmaphactoberfestjava-roadmapjavascript-roadmapnodejs-roadmappython-roadmapqa-roadmapreact-roadmaproadmapstudy-planvue-roadmapweb3-roadmap
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
3.0 KiB
88 lines
3.0 KiB
import { Copy, Heart } from 'lucide-react'; |
|
import { useAuth } from '../../hooks/use-auth'; |
|
import { useCopyText } from '../../hooks/use-copy-text'; |
|
import { cn } from '../../lib/classname'; |
|
import { CheckIcon } from '../ReactIcons/CheckIcon'; |
|
import { TrophyEmoji } from '../ReactIcons/TrophyEmoji.tsx'; |
|
|
|
type InviteFriendsProps = { |
|
refByUserCount: number; |
|
}; |
|
|
|
export function InviteFriends(props: InviteFriendsProps) { |
|
const { refByUserCount } = props; |
|
|
|
const user = useAuth(); |
|
const { copyText, isCopied } = useCopyText(); |
|
|
|
const referralLink = new URL( |
|
`/signup?rc=${user?.id}`, |
|
import.meta.env.DEV ? 'http://localhost:3000' : 'https://roadmap.sh', |
|
).toString(); |
|
|
|
return ( |
|
<div className="-mx-4 mt-6 flex flex-col border-t border-dashed border-t-slate-600 px-4 pt-5 text-center text-sm"> |
|
<p className="text-slate-500">Invite people to join roadmap.sh</p> |
|
|
|
<div className="flex flex-col items-center rounded-lg bg-slate-900/40 pb-4 pt-5 my-4"> |
|
<p className="text-xs text-slate-500"> |
|
{refByUserCount === 0 && <>You haven't invited anyone yet.</>} |
|
{refByUserCount > 0 && refByUserCount < 10 && ( |
|
<>{refByUserCount} of 10 users joined</> |
|
)} |
|
</p> |
|
|
|
{refByUserCount >= 10 && <>🎉 You've invited {refByUserCount} users</>} |
|
|
|
<div className="my-3 flex flex-row items-center justify-center gap-1"> |
|
{Array.from({ length: 10 }).map((_, index) => ( |
|
<Heart |
|
key={index} |
|
className={cn( |
|
'size-[23px] fill-current', |
|
index < refByUserCount ? 'text-yellow-300' : 'text-slate-700', |
|
)} |
|
/> |
|
))} |
|
</div> |
|
<p className={'mb-3 text-xs text-slate-500'}> |
|
Share the link below with anyone you think would benefit from using |
|
roadmap.sh |
|
</p> |
|
<p className="text-slate-500"> |
|
<button |
|
onClick={() => { |
|
copyText(referralLink); |
|
}} |
|
className={cn( |
|
'rounded-md hover:bg-slate-500/80 hover:text-slate-100 px-3 py-1 text-xs text-slate-300 bg-slate-600', |
|
{ |
|
'bg-green-500 text-black hover:text-black hover:bg-green-500': isCopied, |
|
}, |
|
)} |
|
> |
|
{!isCopied ? 'Copy Invite Link' : 'Invite Link Copied'}{' '} |
|
{!isCopied && ( |
|
<Copy |
|
className="relative -top-[1.25px] ml-1.5 inline-block size-3" |
|
strokeWidth={3} |
|
/> |
|
)} |
|
{isCopied && ( |
|
<CheckIcon additionalClasses="relative ml-1.5 -top-[1.25px] inline-block size-3" /> |
|
)} |
|
</button> |
|
</p> |
|
</div> |
|
|
|
<p className="text-center text-xs"> |
|
<a |
|
href="/leaderboard" |
|
className="text-purple-400 underline-offset-2 hover:underline" |
|
> |
|
See how you rank on the leaderboard |
|
</a> |
|
</p> |
|
</div> |
|
); |
|
}
|
|
|