Skip to content

Commit 3292378

Browse files
author
Gerome El-assaad
committed
updated analytics components
1 parent 1d2bf28 commit 3292378

11 files changed

Lines changed: 5487 additions & 135 deletions

File tree

app/api/analytics/business/route.ts

Lines changed: 482 additions & 0 deletions
Large diffs are not rendered by default.

app/api/analytics/export/route.ts

Lines changed: 627 additions & 0 deletions
Large diffs are not rendered by default.

app/layout.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { GeistMono } from 'geist/font/mono'
77
import { Analytics } from "@vercel/analytics/next"
88
import { SpeedInsights } from "@vercel/speed-insights/next"
99
import Script from 'next/script'
10+
import r from 'react-syntax-highlighter/dist/esm/languages/hljs/r'
1011

1112
export const metadata: Metadata = {
1213
metadataBase: new URL('https://codingit.vercel.app'),
@@ -62,6 +63,16 @@ export default function RootLayout({
6263
gtag('config', 'G-CV2G2EG0KJ');
6364
`}
6465
</Script>
66+
<Script id="posthog-init" strategy="afterInteractive">
67+
{`
68+
!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="init Re Ms Fs Pe Rs Cs capture Ve calculateEventProperties Ds register register_once register_for_session unregister unregister_for_session zs getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSurveysLoaded onSessionId getSurveys getActiveMatchingSurveys renderSurvey canRenderSurvey canRenderSurveyAsync identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException loadToolbar get_property getSessionProperty Ls As createPersonProfile Ns Is Us opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing is_capturing clear_opt_in_out_capturing Os debug I js getPageViewId captureTraceFeedback captureTraceMetric".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
69+
posthog.init('phc_XiYZl1EamBghxnDqz8UQFv5AYMtVBX6XOZhSdMLIHMI', {
70+
api_host: 'https://us.i.posthog.com',
71+
defaults: '2025-05-24',
72+
person_profiles: 'identified_only',
73+
});
74+
`}
75+
</Script>
6576
</head>
6677
<body>
6778
<SpeedInsights />

app/page.tsx

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { SetStateAction, useCallback, useEffect, useState } from 'react'
2626
import { useLocalStorage } from 'usehooks-ts'
2727
import { useEnhancedChat } from '@/hooks/use-enhanced-chat'
2828
import { HeroPillSecond } from '@/components/announcement'
29+
import { useAnalytics } from '@/lib/analytics-service'
2930

3031
export 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

Comments
 (0)