mirror of
https://github.com/supabase/supabase.git
synced 2026-10-16 06:39:09 +03:00
feat: save secret state on ticket upgrade
This commit is contained in:
1 parent
5a53797c32
commit
87c67bb70d
3 files changed
+48
-9
No files matched your search
@@ -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,
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user