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.
 
 
 
 
 
 

96 lines
2.6 KiB

'use client'
import { useState, useEffect } from 'react'
import {
Dialog,
DialogContent,
DialogHeader,
DialogTitle,
} from '@/components/ui/dialog'
import { Button } from '@/components/ui/button'
import { ExternalLinks } from '@/config/external-links'
// Constants for localStorage keys and timing
const STORAGE_KEYS = {
LAST_SHOWN: 'discord_modal_last_shown',
HAS_JOINED: 'discord_modal_has_joined',
}
const SHOW_INTERVAL = 1 * 24 * 60 * 60 * 1000 // 1 days in milliseconds
const RANDOM_CHANCE = 0.2 // 20% chance to show when eligible
export const JoinCommunityModal = () => {
const [isOpen, setIsOpen] = useState(false)
useEffect(() => {
const checkAndShowModal = () => {
const hasJoined = localStorage.getItem(STORAGE_KEYS.HAS_JOINED) === 'true'
if (hasJoined) return
const lastShown = localStorage.getItem(STORAGE_KEYS.LAST_SHOWN)
const now = Date.now()
if (!lastShown || now - parseInt(lastShown) >= SHOW_INTERVAL) {
if (Math.random() < RANDOM_CHANCE) {
setIsOpen(true)
localStorage.setItem(STORAGE_KEYS.LAST_SHOWN, now.toString())
}
}
}
// Check when component mounts
checkAndShowModal()
// Also check when tab becomes visible
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'visible') {
checkAndShowModal()
}
})
}, [])
const handleJoined = () => {
localStorage.setItem(STORAGE_KEYS.HAS_JOINED, 'true')
setIsOpen(false)
}
const handleRemindLater = () => {
setIsOpen(false)
}
return (
<Dialog open={isOpen} onOpenChange={setIsOpen}>
<DialogContent className='sm:max-w-xl'>
<DialogHeader>
<DialogTitle>Join Our Discord Community!</DialogTitle>
</DialogHeader>
<div className='py-4'>
<p className='text-muted-foreground'>
Join our Discord community to connect with other users, get help,
and stay updated with the latest announcements!
</p>
</div>
<div className='flex flex-col gap-3 sm:flex-row sm:justify-end'>
<Button variant='outline' onClick={handleRemindLater}>
Remind Me Later
</Button>
<Button variant='outline' onClick={handleJoined} className='gap-2'>
I&apos;ve Already Joined
</Button>
<Button
variant='default'
onClick={() => {
window.open(ExternalLinks.discord, '_blank')
handleJoined()
}}
className='gap-2'
>
Join Discord
</Button>
</div>
</DialogContent>
</Dialog>
)
}