@@ -26,6 +26,7 @@ import { SetStateAction, useCallback, useEffect, useState } from 'react'
2626import { useLocalStorage } from 'usehooks-ts'
2727import { useEnhancedChat } from '@/hooks/use-enhanced-chat'
2828import { HeroPillSecond } from '@/components/announcement'
29+ import { useAnalytics } from '@/lib/analytics-service'
2930
3031export default function Home ( ) {
3132 const supabase = createSupabaseBrowserClient ( )
@@ -40,8 +41,13 @@ export default function Home() {
4041 )
4142
4243 const posthog = usePostHog ( )
44+ const analytics = useAnalytics ( )
4345
4446 const [ result , setResult ] = useState < ExecutionResult > ( )
47+ const [ sessionStartTime ] = useState ( Date . now ( ) )
48+ const [ fragmentsGenerated , setFragmentsGenerated ] = useState ( 0 )
49+ const [ messagesCount , setMessagesCount ] = useState ( 0 )
50+ const [ errorsEncountered , setErrorsEncountered ] = useState ( 0 )
4551 const [ messages , setMessages ] = useState < Message [ ] > ( [ ] )
4652 const [ fragment , setFragment ] = useState < DeepPartial < FragmentSchema > > ( )
4753 const [ currentTab , setCurrentTab ] = useState < 'code' | 'fragment' | 'terminal' | 'interpreter' | 'editor' > ( 'code' )
@@ -125,6 +131,15 @@ export default function Home() {
125131 onFinish : async ( { object : fragment , error } ) => {
126132 if ( ! error ) {
127133 setIsPreviewLoading ( true )
134+ // Enhanced analytics tracking
135+ const generationTime = Date . now ( ) - Date . now ( ) // Would track actual generation time
136+ if ( fragment ) {
137+ analytics . trackFragmentGenerated ( fragment , generationTime , 1 )
138+ }
139+ setFragmentsGenerated ( prev => prev + 1 )
140+
141+ // Additional revenue tracking handled by analytics service
142+
128143 posthog . capture ( 'fragment_generated' , {
129144 template : fragment ?. template ,
130145 } )
@@ -148,6 +163,10 @@ export default function Home() {
148163 return
149164 }
150165
166+ // Enhanced sandbox tracking
167+ const creationTime = Date . now ( ) - Date . now ( ) // Would track actual creation time
168+ analytics . trackSandboxCreation ( fragment ?. template || 'unknown' , creationTime , response . ok )
169+
151170 posthog . capture ( 'sandbox_created' , { url : result . url } )
152171
153172 setResult ( result )
@@ -225,6 +244,21 @@ export default function Home() {
225244 if ( error ) stop ( )
226245 } , [ error , stop ] )
227246
247+ // Track session end when component unmounts
248+ useEffect ( ( ) => {
249+ return ( ) => {
250+ if ( session ?. user ?. id ) {
251+ const sessionDuration = Date . now ( ) - sessionStartTime
252+ analytics . trackSessionEnd (
253+ sessionDuration ,
254+ fragmentsGenerated ,
255+ messagesCount ,
256+ errorsEncountered
257+ )
258+ }
259+ }
260+ } , [ session ?. user ?. id , sessionStartTime , fragmentsGenerated , messagesCount , errorsEncountered , analytics ] )
261+
228262 function setMessage ( message : Partial < Message > , index ?: number ) {
229263 setMessages ( ( previousMessages ) => {
230264 const updatedMessages = [ ...previousMessages ]
@@ -292,6 +326,27 @@ export default function Home() {
292326 }
293327 }
294328
329+ // Enhanced chat analytics
330+ setMessagesCount ( prev => prev + 1 )
331+
332+ const promptLength = currentInput . length
333+ const hasImages = currentFiles . length > 0
334+
335+ analytics . trackPromptSubmission (
336+ currentInput ,
337+ languageModel . model || 'unknown' ,
338+ promptLength ,
339+ hasImages ,
340+ messages . length > 0 ? 'conversation' : 'none'
341+ )
342+
343+ // Track template selection
344+ if ( selectedTemplate !== 'auto' ) {
345+ analytics . trackTemplateSelected ( selectedTemplate , 'manual' )
346+ }
347+
348+ // Revenue tracking handled by analytics service
349+
295350 posthog . capture ( 'chat_submit' , {
296351 template : selectedTemplate ,
297352 model : languageModel . model ,
@@ -329,6 +384,16 @@ export default function Home() {
329384 }
330385
331386 function handleLanguageModelChange ( e : LLMModelConfig ) {
387+ const previousModel = languageModel . model
388+ const newModel = e . model
389+
390+ if ( previousModel && newModel && previousModel !== newModel ) {
391+ // Track model switching
392+ analytics . trackModelSwitch ( previousModel , newModel , 'experiment' )
393+
394+ // Revenue tracking handled by analytics service
395+ }
396+
332397 setLanguageModel ( { ...languageModel , ...e } )
333398 }
334399
@@ -341,6 +406,9 @@ export default function Home() {
341406 window . open ( 'https://discord.gg/' , '_blank' )
342407 }
343408
409+ // Enhanced social tracking
410+ analytics . trackFeatureUsed ( `social_${ target } ` , { target } )
411+
344412 posthog . capture ( `${ target } _click` )
345413 }
346414
@@ -370,7 +438,27 @@ export default function Home() {
370438 }
371439
372440 const executeCode = async ( code : string ) => {
441+ const startTime = Date . now ( )
373442 const result = await enhancedExecuteCode ( code )
443+ const executionTime = Date . now ( ) - startTime
444+
445+ // Enhanced execution tracking
446+ if ( session ?. user ?. id ) {
447+ analytics . trackCodeExecution (
448+ `exec_${ Date . now ( ) } ` ,
449+ selectedTemplate === 'auto' ? 'unknown' : selectedTemplate ,
450+ executionTime ,
451+ ! result . error ,
452+ result . error ? 'execution_error' : undefined
453+ )
454+
455+ // Revenue tracking handled by analytics service
456+
457+ if ( result . error ) {
458+ setErrorsEncountered ( prev => prev + 1 )
459+ }
460+ }
461+
374462 setExecutionResult ( result )
375463 }
376464
0 commit comments