@@ -50,6 +50,8 @@ interface UseApplicationBuilderOptions {
5050 suggestionContext ?: ApplicationStarterContext
5151}
5252
53+ type CopyTrigger = 'automatic' | 'user'
54+
5355const 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