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 } } }, []) 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 ( orpheus dinosaur labelled 'hackers assemble' ) })} ) 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