Bluesky app fork with some witchin' additions 馃挮
at main 935 lines 23 kB view raw
1/* 2 * Do not import runtime code into this file 3 */ 4 5import {type Platform} from 'react-native' 6 7import {type NotificationReason} from '#/lib/hooks/useNotificationHandler' 8import {type FeedDescriptor} from '#/state/queries/post-feed' 9import {type LiveEventFeedMetricContext} from '#/features/liveEvents/types' 10 11export type Events = { 12 // App events 13 init: { 14 initMs: number 15 } 16 'experiment:viewed': { 17 experimentId: string 18 variationId: string 19 } 20 'feature:viewed': { 21 featureId: string 22 featureResultValue: unknown 23 /** Only available if feature has experiment rules applied */ 24 experimentId?: string 25 /** Only available if feature has experiment rules applied */ 26 variationId?: string 27 } 28 29 'account:loggedIn': { 30 logContext: 31 | 'LoginForm' 32 | 'SwitchAccount' 33 | 'ChooseAccountForm' 34 | 'Settings' 35 | 'Notification' 36 withPassword: boolean 37 } 38 'account:loggedOut': { 39 logContext: 40 | 'SwitchAccount' 41 | 'Settings' 42 | 'SignupQueued' 43 | 'Deactivated' 44 | 'Takendown' 45 | 'AgeAssuranceNoAccessScreen' 46 scope: 'current' | 'every' 47 } 48 'notifications:openApp': { 49 reason: NotificationReason 50 causedBoot: boolean 51 } 52 'notifications:request': { 53 context: 'StartOnboarding' | 'AfterOnboarding' | 'Login' | 'Home' 54 status: 'granted' | 'denied' | 'undetermined' 55 } 56 'state:background': { 57 secondsActive: number 58 } 59 'state:foreground': {} 60 'router:navigate': { 61 from?: string 62 } 63 'deepLink:referrerReceived': { 64 to: string 65 referrer: string 66 hostname: string 67 } 68 69 // Screen events 70 'splash:signInPressed': {} 71 'splash:createAccountPressed': {} 72 'welcomeModal:signupClicked': {} 73 'welcomeModal:exploreClicked': {} 74 'welcomeModal:signinClicked': {} 75 'welcomeModal:dismissed': {} 76 'welcomeModal:presented': {} 77 'signup:nextPressed': { 78 activeStep: number 79 phoneVerificationRequired?: boolean 80 } 81 'signup:backPressed': { 82 activeStep: number 83 } 84 'signup:captchaSuccess': {} 85 'signup:captchaFailure': {} 86 'signup:fieldError': { 87 field: string 88 errorCount: number 89 errorMessage: string 90 activeStep: number 91 } 92 'signup:backgrounded': { 93 activeStep: number 94 backgroundCount: number 95 } 96 'signup:handleTaken': {typeahead?: boolean} 97 'signup:handleAvailable': {typeahead?: boolean} 98 'signup:handleSuggestionSelected': {method: string} 99 'signin:hostingProviderPressed': { 100 hostingProviderDidChange: boolean 101 } 102 'signin:hostingProviderFailedResolution': {} 103 'signin:success': { 104 failedAttemptsCount: number 105 isUsingCustomProvider: boolean 106 timeTakenSeconds: number 107 } 108 'signin:backPressed': { 109 failedAttemptsCount: number 110 } 111 'signin:forgotPasswordPressed': {} 112 'signin:passwordReset': {} 113 'signin:passwordResetSuccess': {} 114 'signin:passwordResetFailure': {} 115 'onboarding:interests:nextPressed': { 116 selectedInterests: string[] 117 selectedInterestsLength: number 118 } 119 'onboarding:suggestedAccounts:tabPressed': { 120 tab: string 121 } 122 'onboarding:suggestedAccounts:followAllPressed': { 123 tab: string 124 numAccounts: number 125 } 126 'onboarding:suggestedAccounts:nextPressed': { 127 selectedAccountsLength: number 128 skipped: boolean 129 } 130 'onboarding:followingFeed:nextPressed': {} 131 'onboarding:algoFeeds:nextPressed': { 132 selectedPrimaryFeeds: string[] 133 selectedPrimaryFeedsLength: number 134 selectedSecondaryFeeds: string[] 135 selectedSecondaryFeedsLength: number 136 } 137 'onboarding:topicalFeeds:nextPressed': { 138 selectedFeeds: string[] 139 selectedFeedsLength: number 140 } 141 'onboarding:moderation:nextPressed': {} 142 'onboarding:profile:nextPressed': {} 143 'onboarding:finished:nextPressed': { 144 usedStarterPack: boolean 145 starterPackName?: string 146 starterPackCreator?: string 147 starterPackUri?: string 148 profilesFollowed: number 149 feedsPinned: number 150 } 151 'onboarding:finished:avatarResult': { 152 avatarResult: 'default' | 'created' | 'uploaded' 153 } 154 'onboarding:valueProp:stepOne:nextPressed': {} 155 'onboarding:valueProp:stepTwo:nextPressed': {} 156 'onboarding:valueProp:skipPressed': {} 157 'home:feedDisplayed': { 158 feedUrl: string 159 feedType: string 160 index: number 161 reason?: string 162 } 163 'feed:endReached': { 164 feedUrl: string 165 feedType: string 166 itemCount: number 167 } 168 'feed:refresh': { 169 feedUrl: string 170 feedType: string 171 reason: 'pull-to-refresh' | 'soft-reset' | 'load-latest' 172 } 173 'feed:save': { 174 feedUrl: string 175 } 176 'feed:unsave': { 177 feedUrl: string 178 } 179 'feed:pin': { 180 feedUrl: string 181 } 182 'feed:unpin': { 183 feedUrl: string 184 } 185 'feed:like': { 186 feedUrl: string 187 } 188 'feed:unlike': { 189 feedUrl: string 190 } 191 'feed:share': { 192 feedUrl: string 193 } 194 'feed:suggestion:seen': { 195 feedUrl: string 196 } 197 'feed:suggestion:press': { 198 feedUrl: string 199 } 200 'post:showMore': { 201 uri: string 202 authorDid: string 203 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 204 feedDescriptor?: string 205 position?: number 206 } 207 'post:showLess': { 208 uri: string 209 authorDid: string 210 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 211 feedDescriptor?: string 212 position?: number 213 } 214 'feed:clickthrough': { 215 feed: string 216 count: number 217 } 218 'feed:engaged': { 219 feed: string 220 count: number 221 } 222 'feed:seen': { 223 feed: string 224 count: number 225 } 226 227 'feed:discover:emptyError': { 228 userDid: string 229 } 230 231 'composer:gif:open': {} 232 'composer:gif:select': {} 233 'composerPrompt:press': {} 234 'composerPrompt:camera:press': {} 235 'composerPrompt:gallery:press': {} 236 237 'composer:threadgate:open': { 238 nudged: boolean 239 } 240 'composer:threadgate:save': { 241 replyOptions: string 242 quotesEnabled: boolean 243 persist: boolean 244 hasChanged: boolean 245 } 246 'composer:open': { 247 logContext: 248 | 'Fab' 249 | 'PostReply' 250 | 'QuotePost' 251 | 'ProfileFeed' 252 | 'Deeplink' 253 | 'Other' 254 isReply: boolean 255 hasQuote: boolean 256 hasDraft: boolean 257 } 258 'draft:save': { 259 isNewDraft: boolean 260 hasText: boolean 261 hasImages: boolean 262 hasVideo: boolean 263 hasGif: boolean 264 hasQuote: boolean 265 hasLink: boolean 266 postCount: number 267 textLength: number 268 } 269 'draft:load': { 270 draftAgeMs: number 271 hasText: boolean 272 hasImages: boolean 273 hasVideo: boolean 274 hasGif: boolean 275 postCount: number 276 } 277 'draft:delete': { 278 logContext: 'DraftsList' 279 draftAgeMs: number 280 } 281 'draft:listOpen': { 282 draftCount: number 283 } 284 'draft:post': { 285 draftAgeMs: number 286 wasEdited: boolean 287 } 288 'draft:discard': { 289 logContext: 'ComposerClose' | 'BeforeDraftsList' 290 hadContent: boolean 291 textLength: number 292 } 293 294 // Data events 295 'account:create:begin': {} 296 'account:create:success': { 297 signupDuration: number 298 fieldErrorsTotal: number 299 backgroundCount: number 300 } 301 'post:create': { 302 imageCount: number 303 isReply: boolean 304 isPartOfThread: boolean 305 hasLink: boolean 306 hasQuote: boolean 307 langs: string 308 logContext: 'Composer' 309 } 310 'thread:create': { 311 postCount: number 312 isReply: boolean 313 } 314 'post:like': { 315 uri: string 316 authorDid: string 317 doesLikerFollowPoster: boolean | undefined 318 doesPosterFollowLiker: boolean | undefined 319 likerClout: number | undefined 320 postClout: number | undefined 321 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 322 feedDescriptor?: string 323 } 324 'post:repost': { 325 uri: string 326 authorDid: string 327 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 328 feedDescriptor?: string 329 } 330 'post:unlike': { 331 uri: string 332 authorDid: string 333 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 334 feedDescriptor?: string 335 } 336 'post:unrepost': { 337 uri: string 338 authorDid: string 339 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 340 feedDescriptor?: string 341 } 342 'post:mute': { 343 uri: string 344 authorDid: string 345 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 346 feedDescriptor?: string 347 position?: number 348 } 349 'post:unmute': { 350 uri: string 351 authorDid: string 352 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 353 feedDescriptor?: string 354 position?: number 355 } 356 'post:pin': {} 357 'post:unpin': {} 358 'post:bookmark': { 359 uri: string 360 authorDid: string 361 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 362 feedDescriptor?: string 363 position?: number 364 } 365 'post:unbookmark': { 366 uri: string 367 authorDid: string 368 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 369 feedDescriptor?: string 370 position?: number 371 } 372 'post:clickReply': { 373 uri: string 374 authorDid: string 375 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 376 feedDescriptor?: string 377 position?: number 378 } 379 'post:clickQuotePost': { 380 uri: string 381 authorDid: string 382 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 383 feedDescriptor?: string 384 position?: number 385 } 386 'post:clickthroughAuthor': { 387 uri: string 388 authorDid: string 389 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 390 feedDescriptor?: string 391 position?: number 392 } 393 'post:clickthroughItem': { 394 uri: string 395 authorDid: string 396 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 397 feedDescriptor?: string 398 position?: number 399 } 400 'post:clickthroughEmbed': { 401 uri: string 402 authorDid: string 403 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 404 feedDescriptor?: string 405 position?: number 406 } 407 'post:view': { 408 uri: string 409 authorDid: string 410 logContext: 411 | 'FeedItem' 412 | 'PostThreadItem' 413 | 'Post' 414 | 'ImmersiveVideo' 415 | 'SearchResults' 416 | 'Bookmarks' 417 | 'Notifications' 418 | 'Hashtag' 419 | 'Topic' 420 | 'PostQuotes' 421 feedDescriptor?: string 422 position?: number 423 } 424 'bookmarks:view': {} 425 'bookmarks:post-clicked': {} 426 'profile:follow': { 427 contextProfileDid?: string 428 didBecomeMutual: boolean | undefined 429 followeeClout: number | undefined 430 followeeDid: string 431 followerClout: number | undefined 432 position?: number 433 logContext: 434 | 'RecommendedFollowsItem' 435 | 'PostThreadItem' 436 | 'ProfileCard' 437 | 'ProfileHeader' 438 | 'ProfileHeaderSuggestedFollows' 439 | 'ProfileMenu' 440 | 'ProfileHoverCard' 441 | 'AvatarButton' 442 | 'StarterPackProfilesList' 443 | 'FeedInterstitial' 444 | 'PostOnboardingFindFollows' 445 | 'ImmersiveVideo' 446 | 'ExploreSuggestedAccounts' 447 | 'OnboardingSuggestedAccounts' 448 | 'FindContacts' 449 } 450 'profile:followers:view': { 451 contextProfileDid: string 452 isOwnProfile: boolean 453 } 454 'profile:followers:paginate': { 455 contextProfileDid: string 456 itemCount: number 457 page: number 458 } 459 'profile:following:view': { 460 contextProfileDid: string 461 isOwnProfile: boolean 462 } 463 'profile:following:paginate': { 464 contextProfileDid: string 465 itemCount: number 466 page: number 467 } 468 'profileCard:seen': { 469 contextProfileDid?: string 470 profileDid: string 471 position?: number 472 } 473 'suggestedUser:follow': { 474 logContext: 475 | 'Explore' 476 | 'InterstitialDiscover' 477 | 'InterstitialProfile' 478 | 'Profile' 479 | 'Onboarding' 480 location: 'Card' | 'Profile' | 'FollowAll' 481 recId?: number | string 482 position: number 483 suggestedDid: string 484 category: string | null 485 } 486 'suggestedUser:press': { 487 logContext: 488 | 'Explore' 489 | 'InterstitialDiscover' 490 | 'InterstitialProfile' 491 | 'Onboarding' 492 recId?: number | string 493 position: number 494 suggestedDid: string 495 category: string | null 496 } 497 'suggestedUser:seen': { 498 logContext: 499 | 'Explore' 500 | 'InterstitialDiscover' 501 | 'InterstitialProfile' 502 | 'Profile' 503 | 'Onboarding' 504 | 'ProgressGuide' 505 recId?: number | string 506 position: number 507 suggestedDid: string 508 category: string | null 509 } 510 'suggestedUser:seeMore': { 511 logContext: 512 | 'Explore' 513 | 'InterstitialDiscover' 514 | 'InterstitialProfile' 515 | 'Profile' 516 | 'Onboarding' 517 } 518 'suggestedUser:dismiss': { 519 logContext: 'InterstitialDiscover' | 'InterstitialProfile' 520 recId?: number | string 521 position: number 522 suggestedDid: string 523 } 524 'profile:unfollow': { 525 logContext: 526 | 'RecommendedFollowsItem' 527 | 'PostThreadItem' 528 | 'ProfileCard' 529 | 'ProfileHeader' 530 | 'ProfileHeaderSuggestedFollows' 531 | 'ProfileMenu' 532 | 'ProfileHoverCard' 533 | 'Chat' 534 | 'AvatarButton' 535 | 'StarterPackProfilesList' 536 | 'FeedInterstitial' 537 | 'PostOnboardingFindFollows' 538 | 'ImmersiveVideo' 539 | 'ExploreSuggestedAccounts' 540 | 'OnboardingSuggestedAccounts' 541 | 'FindContacts' 542 } 543 'chat:create': { 544 logContext: 'ProfileHeader' | 'NewChatDialog' | 'SendViaChatDialog' 545 } 546 'chat:open': { 547 logContext: 548 | 'ProfileHeader' 549 | 'NewChatDialog' 550 | 'ChatsList' 551 | 'SendViaChatDialog' 552 } 553 'starterPack:addUser': { 554 starterPack?: string 555 } 556 'starterPack:removeUser': { 557 starterPack?: string 558 } 559 'starterPack:share': { 560 starterPack: string 561 shareType: 'link' | 'qrcode' 562 qrShareType?: 'save' | 'copy' | 'share' 563 } 564 'starterPack:followAll': { 565 logContext: 'StarterPackProfilesList' | 'Onboarding' 566 starterPack: string 567 count: number 568 } 569 'starterPack:delete': {} 570 'starterPack:create': { 571 setName: boolean 572 setDescription: boolean 573 profilesCount: number 574 feedsCount: number 575 } 576 'starterPack:convertToList': { 577 starterPack: string 578 memberCount: number 579 } 580 'starterPack:ctaPress': { 581 starterPack: string 582 } 583 'starterPack:opened': { 584 starterPack: string 585 } 586 'link:clicked': { 587 url: string 588 domain: string 589 } 590 591 'feed:interstitial:feedCard:press': {} 592 'desktopFeeds:feed:click': { 593 feedUri: string 594 feedDescriptor: string 595 } 596 597 'profile:header:suggestedFollowsCard:press': {} 598 'profile:addToStarterPack': {} 599 600 'test:all:always': {} 601 'test:all:sometimes': {} 602 'test:all:boosted_by_gate1': {reason: 'base' | 'gate1'} 603 'test:all:boosted_by_gate2': {reason: 'base' | 'gate2'} 604 'test:all:boosted_by_both': {reason: 'base' | 'gate1' | 'gate2'} 605 'test:gate1:always': {} 606 'test:gate1:sometimes': {} 607 'test:gate2:always': {} 608 'test:gate2:sometimes': {} 609 610 'tmd:share': {} 611 'tmd:download': {} 612 'tmd:post': {} 613 614 'trendingTopics:show': { 615 context: 'settings' 616 } 617 'trendingTopics:hide': { 618 context: 'settings' | 'sidebar' | 'interstitial' | 'explore:trending' 619 } 620 'trendingTopic:click': { 621 context: 'sidebar' | 'interstitial' | 'explore' 622 } 623 'recommendedTopic:click': { 624 context: 'explore' 625 } 626 'trendingVideos:show': { 627 context: 'settings' 628 } 629 'trendingVideos:hide': { 630 context: 'settings' | 'interstitial:discover' | 'interstitial:explore' 631 } 632 'videoCard:click': { 633 context: 'interstitial:discover' | 'interstitial:explore' | 'feed' 634 } 635 636 'explore:module:seen': { 637 module: 638 | 'trendingTopics' 639 | 'trendingVideos' 640 | 'suggestedAccounts' 641 | 'suggestedFeeds' 642 | 'suggestedStarterPacks' 643 | `feed:${FeedDescriptor}` 644 } 645 'explore:module:searchButtonPress': { 646 module: 'suggestedAccounts' | 'suggestedFeeds' 647 } 648 'explore:suggestedAccounts:tabPressed': { 649 tab: string 650 } 651 652 'search:query': { 653 source: 'typed' | 'history' | 'autocomplete' 654 } 655 656 'search:results:loaded': { 657 tab: 'top' | 'latest' | 'people' | 'feeds' 658 initialCount: number 659 } 660 661 'search:result:press': { 662 tab?: 'top' | 'latest' | 'people' | 'feeds' 663 resultType: 'post' | 'profile' | 'feed' 664 position: number 665 uri: string 666 } 667 668 'search:recent:press': { 669 profileDid: string 670 position: number 671 } 672 673 'search:autocomplete:press': { 674 profileDid: string 675 position: number 676 } 677 678 'progressGuide:hide': {} 679 'progressGuide:followDialog:open': {} 680 681 'moderation:subscribedToLabeler': {} 682 'moderation:unsubscribedFromLabeler': {} 683 'moderation:changeLabelPreference': { 684 preference: string 685 } 686 687 'moderation:subscribedToList': { 688 listType: 'mute' | 'block' 689 } 690 'moderation:unsubscribedFromList': { 691 listType: 'mute' | 'block' 692 } 693 694 'reportDialog:open': { 695 subjectType: string 696 } 697 'reportDialog:close': {} 698 'reportDialog:success': { 699 reason: string 700 labeler: string 701 details: boolean 702 } 703 'reportDialog:failure': {} 704 705 translate: { 706 sourceLanguages: string[] 707 targetLanguage: string 708 textLength: number 709 } 710 'translate:result': { 711 method: 'on-device' | 'google-translate' | 'fallback-alert' 712 os: Platform['OS'] 713 sourceLanguage: string | null 714 targetLanguage: string 715 } 716 'translate:override': { 717 os: Platform['OS'] 718 sourceLanguage: string 719 targetLanguage: string 720 } 721 722 'verification:create': {} 723 'verification:revoke': {} 724 'verification:badge:click': {} 725 'verification:learn-more': { 726 location: 727 | 'initialAnnouncementeNux' 728 | 'verificationsDialog' 729 | 'verifierDialog' 730 | 'verificationSettings' 731 } 732 'verification:settings:hideBadges': {} 733 'verification:settings:unHideBadges': {} 734 735 'live:create': {duration: number} 736 'live:edit': {} 737 'live:remove': {} 738 'live:card:open': {subject: string; from: 'post' | 'profile'} 739 'live:card:watch': {subject: string} 740 'live:card:openProfile': {subject: string} 741 'live:card:viewAvatar': {subject: string} 742 'live:view:profile': {subject: string} 743 'live:view:post': {subject: string; feed?: string} 744 745 'post:share': { 746 uri: string 747 authorDid: string 748 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 749 feedDescriptor?: string 750 postContext: 'feed' | 'thread' 751 position?: number 752 } 753 'share:press:copyLink': {} 754 'share:press:nativeShare': {} 755 'share:press:openDmSearch': {} 756 'share:press:dmSelected': {} 757 'share:press:recentDm': {} 758 'share:press:embed': {} 759 760 'thread:click:showOtherReplies': {} 761 'thread:click:hideReplyForMe': {} 762 'thread:click:hideReplyForEveryone': {} 763 'thread:preferences:load': { 764 [key: string]: any 765 } 766 'thread:preferences:update': { 767 [key: string]: any 768 } 769 'thread:click:headerMenuOpen': {} 770 'thread:click:editOwnThreadgate': {} 771 'thread:click:viewSomeoneElsesThreadgate': {} 772 'activitySubscription:enable': { 773 setting: 'posts' | 'posts_and_replies' 774 } 775 'activitySubscription:disable': {} 776 'activityPreference:changeChannels': { 777 name: string 778 push: boolean 779 list: boolean 780 } 781 'activityPreference:changeFilter': { 782 name: string 783 value: string 784 } 785 786 'ageAssurance:navigateToSettings': {} 787 'ageAssurance:dismissFeedBanner': {} 788 'ageAssurance:dismissSettingsNotice': {} 789 'ageAssurance:initDialogOpen': { 790 hasInitiatedPreviously: boolean 791 } 792 'ageAssurance:initDialogSubmit': {} 793 'ageAssurance:api:begin': { 794 platform: string 795 countryCode: string 796 regionCode?: string 797 } 798 'ageAssurance:initDialogError': { 799 code: string 800 } 801 'ageAssurance:redirectDialogOpen': {} 802 'ageAssurance:redirectDialogSuccess': {} 803 'ageAssurance:redirectDialogFail': {} 804 'ageAssurance:appealDialogOpen': {} 805 'ageAssurance:appealDialogSubmit': {} 806 'ageAssurance:noAccessScreen:shown': { 807 accountCreatedAt: string 808 isAARegion: boolean 809 hasDeclaredAge: boolean 810 canUpdateBirthday: boolean 811 } 812 'ageAssurance:noAccessScreen:openBirthdateDialog': {} 813 814 /* 815 * Specifically for the `BlockedGeoOverlay` 816 */ 817 'blockedGeoOverlay:shown': {} 818 819 'geo:debug': {} 820 821 /* 822 * Find Contacts stuff 823 */ 824 825 // user presses the button on the new feature NUX 826 'contacts:nux:ctaPressed': {} 827 // user presses the banner NUX 828 'contacts:nux:bannerPressed': {} 829 // user dismisses the banner 830 'contacts:nux:bannerDismissed': {} 831 832 // user lands on the contacts step 833 'onboarding:contacts:presented': {} 834 // user pressed "Import Contacts" button to begin flow 835 'onboarding:contacts:begin': {} 836 // skips the step entirely 837 'onboarding:contacts:skipPressed': {} 838 // user shared their contacts 839 'onboarding:contacts:contactsShared': {} 840 // user leaves the matches page 841 'onboarding:contacts:nextPressed': { 842 matchCount: number 843 followCount: number 844 dismissedMatchCount: number 845 } 846 847 // user entered a number 848 'contacts:phone:phoneEntered': { 849 entryPoint: 'Onboarding' | 'Standalone' 850 } 851 // user entered the correct one-time-code 852 'contacts:phone:phoneVerified': { 853 entryPoint: 'Onboarding' | 'Standalone' 854 } 855 // user responded to the contacts permission prompt 856 'contacts:permission:request': { 857 status: 'granted' | 'denied' 858 accessLevelIOS?: 'all' | 'limited' | 'none' 859 } 860 // contacts were successfully imported and matched 861 'contacts:import:success': { 862 contactCount: number 863 matchCount: number 864 entryPoint: 'Onboarding' | 'Standalone' 865 } 866 // contacts import failed 867 'contacts:import:failure': { 868 reason: 'noValidNumbers' | 'networkError' | 'unknown' 869 entryPoint: 'Onboarding' | 'Standalone' 870 } 871 // user followed a single match 872 'contacts:matches:follow': { 873 entryPoint: 'Onboarding' | 'Standalone' 874 } 875 // user pressed "Follow All" on matches 876 'contacts:matches:followAll': { 877 followCount: number 878 entryPoint: 'Onboarding' | 'Standalone' 879 } 880 // user dismissed a match 881 'contacts:matches:dismiss': { 882 entryPoint: 'Onboarding' | 'Standalone' 883 } 884 // user pressed invite to send an SMS to a non-match 885 'contacts:matches:invite': { 886 entryPoint: 'Onboarding' | 'Standalone' 887 } 888 // user opened the Find Contacts settings screen 889 'contacts:settings:presented': { 890 hasPreviouslySynced: boolean 891 matchCount?: number 892 } 893 // user followed a single match from settings 894 'contacts:settings:follow': {} 895 // user pressed "Follow All" from settings 896 'contacts:settings:followAll': { 897 followCount: number 898 } 899 // user dismissed a match from settings 900 'contacts:settings:dismiss': {} 901 // user re-entered the flow via the resync button 902 'contacts:settings:resync': { 903 daysSinceLastSync: number 904 } 905 // user pressed the remove all data button 906 'contacts:settings:removeData': {} 907 908 'liveEvents:feedBanner:seen': { 909 feed: string 910 context: LiveEventFeedMetricContext 911 } 912 'liveEvents:feedBanner:click': { 913 feed: string 914 context: LiveEventFeedMetricContext 915 } 916 'liveEvents:feedBanner:hide': { 917 feed: string 918 context: LiveEventFeedMetricContext 919 } 920 'liveEvents:feedBanner:unhide': { 921 feed: string 922 context: LiveEventFeedMetricContext 923 } 924 'liveEvents:hideAllFeedBanners': { 925 context: LiveEventFeedMetricContext 926 } 927 'liveEvents:unhideAllFeedBanners': { 928 context: LiveEventFeedMetricContext 929 } 930 931 'profile:associated:germ:click-to-chat': {} 932 'profile:associated:germ:click-self-info': {} 933 'profile:associated:germ:self-disconnect': {} 934 'profile:associated:germ:self-reconnect': {} 935}