import { useState, useRef, useEffect } from 'react'
import { Box, Button, Card, Link, Input, Text, Flex, Image } from 'theme-ui'
import Icon from '@hackclub/icons'
import JSConfetti from 'js-confetti'
import { FilloutStandardEmbed } from '@fillout/react'
import '@fillout/react/style.css'
import theme from '../../lib/theme'
const ReplitForm = ({ cssDark }) => {
const [currentStep, setCurrentStep] = useState(1)
const [isSubmitted, setIsSubmitted] = useState(false)
const [buttonText, setButtonText] = useState('Submit')
const [formData, setFormData] = useState({})
const [stickerPositions, setStickerPositions] = useState([])
let jsConfetti = useRef()
let draggedSticker = useRef()
useEffect(() => {
stickers.forEach((_, idx) => {
stickerPositions.push({
rotation: `${(Math.random() - 0.5) * 80}deg`,
position: getRandomPointOnUnitSquare()
})
})
setStickerPositions(stickerPositions)
jsConfetti.current = new JSConfetti()
document.onmousedown = e => {
if (e.target.classList.contains('sticker')) {
const rect = e.target.getBoundingClientRect()
const stickerCentreX = rect.left + rect.width / 2
const stickerCentreY = rect.top + rect.height / 2
e.target.dataset.offsetX = e.clientX - stickerCentreX
e.target.dataset.offsetY = e.clientY - stickerCentreY
document.body.appendChild(e.target)
draggedSticker.current = e.target
draggedSticker.current.style.left = `${e.pageX - draggedSticker.current.dataset.offsetX}px`
draggedSticker.current.style.top = `${e.pageY - draggedSticker.current.dataset.offsetY}px`
setTimeout(() => draggedSticker.current.classList.add('dragged'), 0)
}
}
document.onmousemove = e => {
if (draggedSticker.current) {
draggedSticker.current.style.left = `${e.pageX - draggedSticker.current.dataset.offsetX}px`
draggedSticker.current.style.top = `${e.pageY - draggedSticker.current.dataset.offsetY}px`
}
}
document.onmouseup = () => {
if (draggedSticker.current) {
draggedSticker.current.classList.remove('dragged')
draggedSticker.current = null
}
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
const handleInputChange = e => {
const { name, value } = e.target
setFormData(prev => ({ ...prev, [name]: value }))
}
const submitForm = async () => {
setIsSubmitted(true)
try {
const res = await fetch('/api/replit/signup', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(formData)
})
const data = await res.json()
if (res.ok) {
setButtonText(data.message)
if (data.success) {
localStorage.setItem('token', formData.token)
jsConfetti.current.addConfetti({
confettiColors: [
theme.colors.red,
theme.colors.orange,
theme.colors.yellow,
theme.colors.green,
theme.colors.cyan,
theme.colors.blue,
theme.colors.purple
]
})
setCurrentStep(3)
}
} else {
setButtonText('Error')
console.error('Error', res, data)
}
} catch (error) {
console.error('Error:', error)
} finally {
setIsSubmitted(false)
}
}
const stickers = [
'/stickers/orpheus-having-boba.png',
'/stickers/find out.png',
'/stickers/hackers,_assemble!.png',
'/stickers/mo’ parts mo’ problems.png',
'/stickers/orphmoji_peefest.png',
'/stickers/skullpup_boba.png',
'/stickers/hackers,_assemble!.png',
'/stickers/orphmoji_yippee.png'
// '/replit/replit-fire.png'
]
const fieldStyle = ({ disabled }) => ({
border: '1px solid #0002',
cursor: disabled ? 'not-allowed' : 'auto',
opacity: disabled ? 0.5 : 1
})
const buttonStyle = ({ disabled }) => ({
backgroundColor: cssDark,
cursor: disabled ? 'not-allowed' : 'pointer',
opacity: disabled ? 0.5 : 1
})
const StepIndicator = ({ step }) => (
currentStep ? 0.25 : 1
}}
>
)
const boxStyle = {
display: 'flex',
flexDirection: 'column',
gap: '.5em',
alignItems: 'flex-start',
position: 'relative'
}
const step1 = () => {
const fieldDisabled = currentStep !== 1 || isSubmitted
const buttonDisabled = fieldDisabled || !formData.email
return (
Email
{' '}
)
}
const step2 = () => {
const fieldDisabled = currentStep !== 2 || isSubmitted
const backButtonDisabled = fieldDisabled
const submitButtonDisabled =
fieldDisabled || !formData.email || !formData.token
return (
Replit connect.sid token{' '}
How do I find this?
{' '}
)
}
const step3 = () => (
Stickers
Get free stickers! The first 5,000 people to use this tool get access to
a free sticker pack!
{stickers.map((sticker, idx) => {
return (
)
})}
)
function getRandomPointOnUnitSquare() {
const side = Math.floor(Math.random() * 4)
const position = Math.random()
const margin = 0.1
switch (side) {
case 0:
return [-margin, position]
case 1:
return [position, 1 + margin]
case 2:
return [1 + margin, 1 - position]
case 3:
return [1 - position, 0]
}
}
return (
{step1()}
{step2()}
{step3()}
)
}
export default ReplitForm