Skip to content

Commit 8bcbbc5

Browse files
committed
fix: close application builder tracking gaps
1 parent e0b525c commit 8bcbbc5

File tree

2 files changed

+100
-15
lines changed

2 files changed

+100
-15
lines changed

src/components/ApplicationStarter.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import {
3939
} from '~/components/application-builder/shared'
4040
import { useApplicationBuilder } from '~/components/application-builder/useApplicationBuilder'
4141
import { Button, GitHub } from '~/ui'
42+
import { trackPostHogEvent } from '~/utils/posthog'
4243

4344
interface ApplicationStarterProps {
4445
alwaysShowPostAnalysisSection?: boolean
@@ -98,6 +99,7 @@ export function ApplicationStarter({
9899
}: ApplicationStarterProps) {
99100
const {
100101
analysis,
102+
analyticsProperties,
101103
anonymousGenerationQuota,
102104
copiedKind,
103105
copyResultValue,
@@ -613,6 +615,14 @@ export function ApplicationStarter({
613615
size="sm"
614616
type="button"
615617
onClick={() => {
618+
trackPostHogEvent(
619+
'application_starter_action_clicked',
620+
{
621+
...analyticsProperties,
622+
action: 'lucky_mode',
623+
surface: 'application_starter',
624+
},
625+
)
616626
enableLuckyActions()
617627
}}
618628
disabled={!canUseLuckyAction}
@@ -627,6 +637,14 @@ export function ApplicationStarter({
627637
size="sm"
628638
type="button"
629639
onClick={() => {
640+
trackPostHogEvent(
641+
'application_starter_action_clicked',
642+
{
643+
...analyticsProperties,
644+
action: 'confident_mode',
645+
surface: 'application_starter',
646+
},
647+
)
630648
setShowConfidentOptions(true)
631649
}}
632650
>

src/components/application-builder/useApplicationBuilder.tsx

Lines changed: 82 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ interface UseApplicationBuilderOptions {
5050
suggestionContext?: ApplicationStarterContext
5151
}
5252

53+
type CopyTrigger = 'automatic' | 'user'
54+
5355
const starterFeatureLibraryMap: Record<string, LibraryId | undefined> = {
5456
ai: 'ai',
5557
form: 'form',
@@ -331,21 +333,40 @@ export function useApplicationBuilder({
331333
const togglePackageManager = React.useCallback(
332334
(packageManager: StarterPackageManager) => {
333335
invalidateResult()
334-
setSelectedPackageManager((current) =>
335-
current === packageManager ? undefined : packageManager,
336-
)
336+
337+
setSelectedPackageManager((current) => {
338+
const nextPackageManager =
339+
current === packageManager ? undefined : packageManager
340+
341+
trackPostHogEvent('application_starter_package_manager_toggled', {
342+
...analyticsProperties,
343+
package_manager: packageManager,
344+
selected: nextPackageManager === packageManager,
345+
})
346+
347+
return nextPackageManager
348+
})
337349
},
338-
[invalidateResult],
350+
[analyticsProperties, invalidateResult],
339351
)
340352

341353
const toggleToolchain = React.useCallback(
342354
(toolchain: StarterToolchain) => {
343355
invalidateResult()
344-
setSelectedToolchain((current) =>
345-
current === toolchain ? undefined : toolchain,
346-
)
356+
357+
setSelectedToolchain((current) => {
358+
const nextToolchain = current === toolchain ? undefined : toolchain
359+
360+
trackPostHogEvent('application_starter_toolchain_toggled', {
361+
...analyticsProperties,
362+
selected: nextToolchain === toolchain,
363+
toolchain,
364+
})
365+
366+
return nextToolchain
367+
})
347368
},
348-
[invalidateResult],
369+
[analyticsProperties, invalidateResult],
349370
)
350371

351372
React.useEffect(() => {
@@ -396,7 +417,10 @@ export function useApplicationBuilder({
396417
}, [])
397418

398419
const markCopied = React.useCallback(
399-
(kind: string, options?: { showPromptNotice?: boolean }) => {
420+
(
421+
kind: string,
422+
options?: { showPromptNotice?: boolean; trigger?: CopyTrigger },
423+
) => {
400424
setCopiedKind(kind)
401425
setTimeout(
402426
() => setCopiedKind((current) => (current === kind ? null : current)),
@@ -410,6 +434,7 @@ export function useApplicationBuilder({
410434
trackPostHogEvent('application_starter_value_copied', {
411435
...analyticsProperties,
412436
copied_kind: kind,
437+
copy_trigger: options?.trigger ?? 'user',
413438
})
414439
},
415440
[analyticsProperties, revealPromptCopyNotice],
@@ -419,10 +444,17 @@ export function useApplicationBuilder({
419444
async (
420445
value: string,
421446
kind: string,
422-
options?: { notify?: boolean; showPromptNotice?: boolean },
447+
options?: {
448+
notify?: boolean
449+
showPromptNotice?: boolean
450+
trigger?: CopyTrigger
451+
},
423452
) => {
424453
await navigator.clipboard.writeText(value)
425-
markCopied(kind, { showPromptNotice: options?.showPromptNotice })
454+
markCopied(kind, {
455+
showPromptNotice: options?.showPromptNotice,
456+
trigger: options?.trigger,
457+
})
426458

427459
if (options?.notify === false) {
428460
return
@@ -447,14 +479,25 @@ export function useApplicationBuilder({
447479
onResolvedResult?.(nextResult)
448480

449481
if (mode !== 'compact') {
450-
void handleCopy(nextResult.prompt, 'prompt', { notify: false })
482+
void handleCopy(nextResult.prompt, 'prompt', {
483+
notify: false,
484+
trigger: 'automatic',
485+
})
451486
}
452487

453488
if (!builderIntegration) {
454489
return
455490
}
456491

457492
const applied = await builderIntegration.applyResult(nextResult)
493+
494+
trackPostHogEvent('application_starter_builder_result_applied', {
495+
...analyticsProperties,
496+
applied,
497+
recipe_target: nextResult.recipe.target,
498+
result_type: nextResult.resultType,
499+
})
500+
458501
if (applied) {
459502
notify(
460503
<div>
@@ -466,7 +509,14 @@ export function useApplicationBuilder({
466509
)
467510
}
468511
},
469-
[builderIntegration, handleCopy, mode, notify, onResolvedResult],
512+
[
513+
analyticsProperties,
514+
builderIntegration,
515+
handleCopy,
516+
mode,
517+
notify,
518+
onResolvedResult,
519+
],
470520
)
471521

472522
const handleResolveMutate = React.useCallback(() => {
@@ -480,6 +530,11 @@ export function useApplicationBuilder({
480530
return
481531
}
482532

533+
trackPostHogEvent('application_starter_analysis_failed', {
534+
...analyticsProperties,
535+
error_message: error instanceof Error ? error.message : 'unknown_error',
536+
})
537+
483538
notify(
484539
<div>
485540
<div className="font-medium">Could not analyze the prompt</div>
@@ -489,7 +544,7 @@ export function useApplicationBuilder({
489544
</div>,
490545
)
491546
},
492-
[notify],
547+
[analyticsProperties, notify],
493548
)
494549

495550
const handleAnalysisSuccess = React.useCallback(
@@ -505,8 +560,20 @@ export function useApplicationBuilder({
505560
setIsAnalysisStale(false)
506561
setIsLocked(false)
507562
setLockMessage(null)
563+
564+
trackPostHogEvent('application_starter_analyzed', {
565+
...analyticsProperties,
566+
analysis_deployment: nextAnalysis.recipe.deployment,
567+
analysis_inferred_library_count: nextAnalysis.inferredLibraryIds.length,
568+
analysis_inferred_library_ids: nextAnalysis.inferredLibraryIds,
569+
analysis_inferred_partner_count: nextAnalysis.inferredPartnerIds.length,
570+
analysis_inferred_partner_ids: nextAnalysis.inferredPartnerIds,
571+
analysis_package_manager: nextAnalysis.recipe.packageManager,
572+
analysis_target: nextAnalysis.recipe.target,
573+
analysis_toolchain: nextAnalysis.recipe.toolchain,
574+
})
508575
},
509-
[],
576+
[analyticsProperties],
510577
)
511578

512579
const handleResolveError = React.useCallback(

0 commit comments

Comments
 (0)