diff --git a/src/app/access/[method]/[step]/page.tsx b/src/app/access/[method]/[step]/page.tsx index d09d537..21d40d3 100644 --- a/src/app/access/[method]/[step]/page.tsx +++ b/src/app/access/[method]/[step]/page.tsx @@ -1,7 +1,7 @@ "use client"; import { useState, useTransition, useEffect, use } from "react"; -import { Asterisk, CheckCircle2, Camera, CameraOff, PartyPopper, ExternalLink, ArrowLeft, Copy } from "lucide-react"; +import { Asterisk, CheckCircle2, Camera, CameraOff, PartyPopper, ExternalLink, ArrowLeft, Copy, Gift } from "lucide-react"; import { Button } from "@/components/ui/button"; import { InputOTP, InputOTPGroup, InputOTPSlot } from "@/components/ui/input-otp"; import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"; @@ -52,6 +52,12 @@ export default function AccessPage({ params }: PageProps) { const [copied, setCopied] = useState(false); const [profileData, setProfileData] = useState<{ avatarUrl: string; gamertag: string } | null>(null); + // Survey State + const [minecraftUsername, setMinecraftUsername] = useState(""); + const [isSubmitting, setIsSubmitting] = useState(false); + const [rewardQueued, setRewardQueued] = useState(false); + const [surveyStatus, setSurveyStatus] = useState<{ ok: boolean; message?: string }>({ ok: false }); + // Loading state to prevent premature redirects const [isLoading, setIsLoading] = useState(true); @@ -62,6 +68,8 @@ export default function AccessPage({ params }: PageProps) { router.push(`/access/${method}/verify`); } else if (step === 'success' && !whitelistSuccess) { router.push(`/access/${method}/verify`); + } else if (step === 'survey' && !whitelistSuccess) { + router.push(`/access/${method}/verify`); } } }, [step, verified, whitelistSuccess, method, router, isLoading]); @@ -91,6 +99,8 @@ export default function AccessPage({ params }: PageProps) { const savedJavaName = localStorage.getItem(`${prefix}java-name`); const savedBedrockName = localStorage.getItem(`${prefix}bedrock-name`); const savedPreference = localStorage.getItem(`${prefix}preference`); + const savedMinecraftUsername = localStorage.getItem(`${prefix}minecraft-username`); + const savedRewardQueued = localStorage.getItem(`${prefix}reward-queued`); if (savedVerified === 'true') { setVerified(true); @@ -110,6 +120,12 @@ export default function AccessPage({ params }: PageProps) { if (savedPreference) { setPreference(savedPreference as "java" | "bedrock" | "both"); } + if (savedMinecraftUsername) { + setMinecraftUsername(savedMinecraftUsername); + } + if (savedRewardQueued === 'true') { + setRewardQueued(true); + } // Fetch profile data for success step if (step === 'success') { @@ -151,6 +167,16 @@ export default function AccessPage({ params }: PageProps) { localStorage.setItem(`${prefix}preference`, preference); }, [preference, method]); + useEffect(() => { + const prefix = method === 'qr' ? 'frg-qr-' : 'frg-'; + localStorage.setItem(`${prefix}minecraft-username`, minecraftUsername); + }, [minecraftUsername, method]); + + useEffect(() => { + const prefix = method === 'qr' ? 'frg-qr-' : 'frg-'; + localStorage.setItem(`${prefix}reward-queued`, rewardQueued.toString()); + }, [rewardQueued, method]); + useEffect(() => { const fetchConfig = async () => { try { @@ -371,17 +397,63 @@ export default function AccessPage({ params }: PageProps) { localStorage.removeItem(`${prefix}java-name`); localStorage.removeItem(`${prefix}bedrock-name`); localStorage.removeItem(`${prefix}preference`); + localStorage.removeItem(`${prefix}minecraft-username`); + localStorage.removeItem(`${prefix}reward-queued`); setVerified(false); setWhitelistSuccess(false); setCode(""); setJavaName(""); setBedrockName(""); + setMinecraftUsername(""); + setRewardQueued(false); setStatus({ ok: false }); router.push(`/access/${method}/verify`); }; + const handleSurveyReward = async () => { + if (!minecraftUsername.trim()) return; + + setIsSubmitting(true); + setSurveyStatus({ ok: false }); + + try { + const response = await fetch("/api/reward", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + player: minecraftUsername, + }), + }); + + const result = await response.json(); + + if (response.ok && result.success) { + setRewardQueued(true); + setSurveyStatus({ + ok: true, + message: result.message || "Successfully queued diamonds!", + }); + } else { + setSurveyStatus({ + ok: false, + message: result.error || "Failed to queue reward", + }); + } + } catch (error) { + console.error("Error queuing reward:", error); + setSurveyStatus({ + ok: false, + message: "We couldn't reach the server. Double-check your connection and try again.", + }); + } finally { + setIsSubmitting(false); + } + }; + // Render different steps if (step === 'verify') { return ( @@ -675,8 +747,8 @@ export default function AccessPage({ params }: PageProps) { {/* Actions */}
+ Help us improve your server experience! Complete this survey to receive 2 diamonds as a thank you. +
+2 diamonds queued for {minecraftUsername}!
+
+ {surveyStatus.ok &&
+ Want to help us improve even more? Take our full survey after claiming your diamonds. +
+ +
Help us improve your server experience! Complete this survey to receive 2 diamonds as a thank you.
-
-
-
- Enter your Minecraft username to queue 2 diamonds for when you join the server:
- 2 diamonds queued for {minecraftUsername}!
+ {status.ok &&
- Help us improve the server by sharing your thoughts and preferences.
-
+ Want to help us improve even more? Take our full survey after claiming your diamonds.
+ Get Your Diamonds
+
+ Take the Full Survey
-