feat: save secret state on ticket upgrade

This commit is contained in:
Piotr Goszczyński committed 2025-03-19 13:14:48 +01:00
1 parent 5a53797c32
commit 87c67bb70d
3 files changed
+48 -9

No files matched your search

+2 -2
View File
@@ -29,9 +29,9 @@ export const LwView = () => {
const partymode = usePartymode()
const [state] = useConfData()
const register = useRegistration()
return (
<DefaultLayout className='font-["Departure_Mono"]'>
<SectionContainer id="ticket" className="relative !max-w-none lw-nav-anchor !pt-0">
@@ -42,7 +42,7 @@ export const LwView = () => {
<TicketHeaderDate />
</TicketHeader>
<TicketLayoutCanvas>
<TicketCanvas />
<TicketCanvas onUpgradeToSecret={register.upgradeTicket}/>
{state.claimFormState === 'visible' && (
<TicketClaim>
<TicketClaimLogo />
@@ -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<TicketScene | null>(null)
const tunnelRef = useRef<TunnelScene | null>(null)
const hudRef = useRef<HUDScene | null>(null)
const initQueue = useRef<{ init: Promise<void>; 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 (
<div
@@ -167,10 +167,36 @@ export const useRegistration = (props?: RegistrationProps) => {
})
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,
}
}