From 87c67bb70df3ee23b1a98f46f8bca4ab98b67f09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Goszczy=C5=84ski?= Date: Wed, 19 Mar 2025 13:14:48 +0100 Subject: [PATCH] feat: save secret state on ticket upgrade --- apps/www/components/LaunchWeek/14/LwView.tsx | 4 +-- .../components/LaunchWeek/14/TicketCanvas.tsx | 25 +++++++++++++---- .../LaunchWeek/14/hooks/use-registration.ts | 28 ++++++++++++++++++- 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/apps/www/components/LaunchWeek/14/LwView.tsx b/apps/www/components/LaunchWeek/14/LwView.tsx index ab8a90132d2..b192dd9744f 100644 --- a/apps/www/components/LaunchWeek/14/LwView.tsx +++ b/apps/www/components/LaunchWeek/14/LwView.tsx @@ -29,9 +29,9 @@ export const LwView = () => { const partymode = usePartymode() const [state] = useConfData() - const register = useRegistration() + return ( @@ -42,7 +42,7 @@ export const LwView = () => { - + {state.claimFormState === 'visible' && ( diff --git a/apps/www/components/LaunchWeek/14/TicketCanvas.tsx b/apps/www/components/LaunchWeek/14/TicketCanvas.tsx index 6c32d96b5e3..264a4bdad34 100644 --- a/apps/www/components/LaunchWeek/14/TicketCanvas.tsx +++ b/apps/www/components/LaunchWeek/14/TicketCanvas.tsx @@ -1,7 +1,7 @@ import { cn } from 'ui' import { useThreeJS } from './helpers' -import { useCallback, useEffect, useRef, useState } from 'react' -import SceneRenderer, { BaseScene } from './utils/SceneRenderer' +import { useCallback, useEffect, useRef } from 'react' +import SceneRenderer from './utils/SceneRenderer' import TicketScene from './scenes/TicketScene' import TunnelScene from './scenes/TunnelScene' import useConfData from './hooks/use-conf-data' @@ -9,13 +9,15 @@ import HUDScene from './scenes/HUDScene' interface TicketCanvasProps { className?: string + onUpgradeToSecret?: () => void } -const TicketCanvas = ({ className }: TicketCanvasProps) => { +const TicketCanvas = ({ className, onUpgradeToSecret }: TicketCanvasProps) => { const sceneRef = useRef(null) const tunnelRef = useRef(null) const hudRef = useRef(null) const initQueue = useRef<{ init: Promise; renderer: SceneRenderer }[]>([]) + const onUpgradeToSecretRef = useRef(onUpgradeToSecret) const [state, dispatch] = useConfData() const userData = state.userTicketData const initialSceneDataRef = useRef({ @@ -45,6 +47,7 @@ const TicketCanvas = ({ className }: TicketCanvasProps) => { onSeatChartButtonClicked: () => { scene.showBackSide() scene.upgradeToSecret() + onUpgradeToSecretRef.current?.() }, onGoBackButtonClicked: () => { scene.showFrontSide() @@ -75,7 +78,7 @@ const TicketCanvas = ({ className }: TicketCanvasProps) => { hudRef.current.setPeopleOnline(baseCount + randomOffset) } - hudRef.current.setOxygenLevel(0.60) + hudRef.current.setOxygenLevel(0.6) hudRef.current.setShieldIntegrity(0.99) // Example: Set fuel level based on user data @@ -98,12 +101,18 @@ const TicketCanvas = ({ className }: TicketCanvasProps) => { sceneRef.current.setVisible(state.ticketVisibility) sceneRef.current.setTicketNumber(state.userTicketData.ticket_number ?? 0) sceneRef.current.setUserName(state.userTicketData.name ?? '') + if (state.userTicketData.secret) sceneRef.current.upgradeToSecret() sceneRef.current.reloadTextures() - if(state.ticketVisibility) { + if (state.ticketVisibility) { hudRef.current?.dimmHud() } } - }, [state.ticketVisibility, state.userTicketData.name, state.userTicketData.ticket_number]) + }, [ + state.ticketVisibility, + state.userTicketData.name, + state.userTicketData.secret, + state.userTicketData.ticket_number, + ]) useEffect(() => { if (!hudRef.current || !userData) return @@ -122,6 +131,10 @@ const TicketCanvas = ({ className }: TicketCanvasProps) => { hudRef.current.setFuelLevel(fuelLevel) }, [userData]) + useEffect(() => { + onUpgradeToSecretRef.current = onUpgradeToSecret + }, [onUpgradeToSecret]) + const { containerRef } = useThreeJS(setup) return (
{ }) return () => subscription.unsubscribe() - }, []) + }, [dispatch]) + + const upgradeTicket = async () => { + if (userData.id) { + if(userData.secret) { + console.log('User already has a secret ticket') + return + } + + const { error } = await supabase + .from('tickets') + .update({ game_won_at: new Date() }) + .eq('launch_week', 'lw14') + .eq('username', userData.username) + + if (error) { + return console.error('Failed to upgrade user ticket', error) + } + + // Trigger og-image ticket generation + await fetch(`/api-v2/ticket-og?username=${userData.username}&secret=true`) + + } else { + console.warn('Cannot upgrade ticket without user data') + } + } return { realtimeChannel, signIn: handleGithubSignIn, + upgradeTicket, } }