Bluesky app fork with some witchin' additions 💫
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 1163 lines 30 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 'composer:image:edit': { 234 platform: Platform['OS'] 235 } 236 'composerPrompt:press': {} 237 'composerPrompt:camera:press': {} 238 'composerPrompt:gallery:press': {} 239 240 'composer:threadgate:open': { 241 nudged: boolean 242 } 243 'composer:threadgate:save': { 244 replyOptions: string 245 quotesEnabled: boolean 246 persist: boolean 247 hasChanged: boolean 248 } 249 'composer:open': { 250 logContext: 251 | 'Fab' 252 | 'PostReply' 253 | 'QuotePost' 254 | 'ProfileFeed' 255 | 'Deeplink' 256 | 'Other' 257 isReply: boolean 258 hasQuote: boolean 259 hasDraft: boolean 260 } 261 'draft:save': { 262 isNewDraft: boolean 263 hasText: boolean 264 hasImages: boolean 265 hasVideo: boolean 266 hasGif: boolean 267 hasQuote: boolean 268 hasLink: boolean 269 postCount: number 270 textLength: number 271 } 272 'draft:load': { 273 draftAgeMs: number 274 hasText: boolean 275 hasImages: boolean 276 hasVideo: boolean 277 hasGif: boolean 278 postCount: number 279 } 280 'draft:delete': { 281 logContext: 'DraftsList' 282 draftAgeMs: number 283 } 284 'draft:listOpen': { 285 draftCount: number 286 } 287 'draft:post': { 288 draftAgeMs: number 289 wasEdited: boolean 290 } 291 'draft:discard': { 292 logContext: 'ComposerClose' | 'BeforeDraftsList' 293 hadContent: boolean 294 textLength: number 295 } 296 297 // Data events 298 'account:create:begin': {} 299 'account:create:success': { 300 signupDuration: number 301 fieldErrorsTotal: number 302 backgroundCount: number 303 } 304 'post:create': { 305 imageCount: number 306 isReply: boolean 307 isPartOfThread: boolean 308 hasLink: boolean 309 hasQuote: boolean 310 langs: string 311 logContext: 'Composer' 312 } 313 'thread:create': { 314 postCount: number 315 isReply: boolean 316 } 317 'post:like': { 318 uri: string 319 authorDid: string 320 doesLikerFollowPoster: boolean | undefined 321 doesPosterFollowLiker: boolean | undefined 322 likerClout: number | undefined 323 postClout: number | undefined 324 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 325 feedDescriptor?: string 326 } 327 'post:repost': { 328 uri: string 329 authorDid: string 330 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 331 feedDescriptor?: string 332 } 333 'post:unlike': { 334 uri: string 335 authorDid: string 336 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 337 feedDescriptor?: string 338 } 339 'post:unrepost': { 340 uri: string 341 authorDid: string 342 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 343 feedDescriptor?: string 344 } 345 'post:mute': { 346 uri: string 347 authorDid: string 348 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 349 feedDescriptor?: string 350 position?: number 351 } 352 'post:unmute': { 353 uri: string 354 authorDid: string 355 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 356 feedDescriptor?: string 357 position?: number 358 } 359 'post:pin': {} 360 'post:unpin': {} 361 'post:bookmark': { 362 uri: string 363 authorDid: string 364 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 365 feedDescriptor?: string 366 position?: number 367 } 368 'post:unbookmark': { 369 uri: string 370 authorDid: string 371 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 372 feedDescriptor?: string 373 position?: number 374 } 375 'post:clickReply': { 376 uri: string 377 authorDid: string 378 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 379 feedDescriptor?: string 380 position?: number 381 } 382 'post:clickQuotePost': { 383 uri: string 384 authorDid: string 385 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 386 feedDescriptor?: string 387 position?: number 388 } 389 'post:clickthroughAuthor': { 390 uri: string 391 authorDid: string 392 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 393 feedDescriptor?: string 394 position?: number 395 } 396 'post:clickthroughItem': { 397 uri: string 398 authorDid: string 399 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 400 feedDescriptor?: string 401 position?: number 402 } 403 'post:clickthroughEmbed': { 404 uri: string 405 authorDid: string 406 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 407 feedDescriptor?: string 408 position?: number 409 } 410 'post:view': { 411 uri: string 412 authorDid: string 413 logContext: 414 | 'FeedItem' 415 | 'PostThreadItem' 416 | 'Post' 417 | 'ImmersiveVideo' 418 | 'SearchResults' 419 | 'Bookmarks' 420 | 'Notifications' 421 | 'Hashtag' 422 | 'Topic' 423 | 'PostQuotes' 424 feedDescriptor?: string 425 position?: number 426 } 427 'bookmarks:view': {} 428 'bookmarks:post-clicked': {} 429 'profile:follow': { 430 contextProfileDid?: string 431 didBecomeMutual: boolean | undefined 432 followeeClout: number | undefined 433 followeeDid: string 434 followerClout: number | undefined 435 position?: number 436 logContext: 437 | 'RecommendedFollowsItem' 438 | 'PostThreadItem' 439 | 'ProfileCard' 440 | 'ProfileHeader' 441 | 'ProfileHeaderSuggestedFollows' 442 | 'ProfileMenu' 443 | 'ProfileHoverCard' 444 | 'AvatarButton' 445 | 'StarterPackProfilesList' 446 | 'FeedInterstitial' 447 | 'PostOnboardingFindFollows' 448 | 'ImmersiveVideo' 449 | 'ExploreSuggestedAccounts' 450 | 'OnboardingSuggestedAccounts' 451 | 'FindContacts' 452 } 453 'profile:followers:view': { 454 contextProfileDid: string 455 isOwnProfile: boolean 456 } 457 'profile:followers:paginate': { 458 contextProfileDid: string 459 itemCount: number 460 page: number 461 } 462 'profile:following:view': { 463 contextProfileDid: string 464 isOwnProfile: boolean 465 } 466 'profile:following:paginate': { 467 contextProfileDid: string 468 itemCount: number 469 page: number 470 } 471 'profileCard:seen': { 472 contextProfileDid?: string 473 profileDid: string 474 position?: number 475 } 476 'profile:mute': {} 477 'profile:unmute': {} 478 'profile:block': {} 479 'profile:unblock': {} 480 'suggestedUser:follow': { 481 logContext: 482 | 'Explore' 483 | 'DiscoverInterstitial' 484 | 'ProfileInterstitial' 485 | 'ProfileHeader' 486 | 'Onboarding' 487 | 'SeeMoreSuggestedUsers' 488 | 'ProgressGuide' 489 location: 'Card' | 'Profile' | 'FollowAll' 490 recSource?: 'Search' 491 recId?: number | string 492 position: number 493 suggestedDid: string 494 category: string | null 495 } 496 'suggestedUser:press': { 497 logContext: 498 | 'Explore' 499 | 'DiscoverInterstitial' 500 | 'ProfileInterstitial' 501 | 'ProfileHeader' 502 | 'Onboarding' 503 | 'SeeMoreSuggestedUsers' 504 recId?: number | string 505 position: number 506 suggestedDid: string 507 category: string | null 508 } 509 'suggestedUser:seen': { 510 logContext: 511 | 'Explore' 512 | 'DiscoverInterstitial' 513 | 'ProfileInterstitial' 514 | 'ProfileHeader' 515 | 'Onboarding' 516 | 'SeeMoreSuggestedUsers' 517 | 'ProgressGuide' 518 recSource?: 'Search' 519 recId?: number | string 520 position: number 521 suggestedDid: string 522 category: string | null 523 } 524 'suggestedUser:seeMore': { 525 logContext: 526 | 'Explore' 527 | 'DiscoverInterstitial' 528 | 'ProfileInterstitial' 529 | 'ProfileHeader' 530 | 'Onboarding' 531 recId?: number | string 532 } 533 'suggestedUser:dismiss': { 534 logContext: 'DiscoverInterstitial' | 'ProfileInterstitial' | 'ProfileHeader' 535 recId?: number | string 536 position: number 537 suggestedDid: string 538 } 539 'profile:unfollow': { 540 logContext: 541 | 'RecommendedFollowsItem' 542 | 'PostThreadItem' 543 | 'ProfileCard' 544 | 'ProfileHeader' 545 | 'ProfileHeaderSuggestedFollows' 546 | 'ProfileMenu' 547 | 'ProfileHoverCard' 548 | 'Chat' 549 | 'AvatarButton' 550 | 'StarterPackProfilesList' 551 | 'FeedInterstitial' 552 | 'PostOnboardingFindFollows' 553 | 'ImmersiveVideo' 554 | 'ExploreSuggestedAccounts' 555 | 'OnboardingSuggestedAccounts' 556 | 'FindContacts' 557 } 558 'chat:create': { 559 logContext: 'ProfileHeader' | 'NewChatDialog' | 'SendViaChatDialog' 560 } 561 'chat:open': { 562 logContext: 563 | 'ProfileHeader' 564 | 'NewChatDialog' 565 | 'ChatsList' 566 | 'SendViaChatDialog' 567 } 568 'groupchat:create': { 569 logContext: 'NewChatDialog' 570 } 571 'starterPack:addUser': { 572 starterPack?: string 573 } 574 'starterPack:removeUser': { 575 starterPack?: string 576 } 577 'starterPack:share': { 578 starterPack: string 579 shareType: 'link' | 'qrcode' 580 qrShareType?: 'save' | 'copy' | 'share' 581 } 582 'starterPack:followAll': { 583 logContext: 'StarterPackProfilesList' | 'Onboarding' 584 starterPack: string 585 count: number 586 } 587 'starterPack:delete': {} 588 'starterPack:create': { 589 setName: boolean 590 setDescription: boolean 591 profilesCount: number 592 feedsCount: number 593 } 594 'starterPack:convertToList': { 595 starterPack: string 596 memberCount: number 597 } 598 'starterPack:ctaPress': { 599 starterPack: string 600 } 601 'starterPack:opened': { 602 starterPack: string 603 } 604 'link:clicked': { 605 url: string 606 domain: string 607 } 608 609 'feed:interstitial:feedCard:press': {} 610 'desktopFeeds:feed:click': { 611 feedUri: string 612 feedDescriptor: string 613 } 614 615 'profile:header:suggestedFollowsCard:press': {} 616 'profile:addToStarterPack': {} 617 618 'test:all:always': {} 619 'test:all:sometimes': {} 620 'test:all:boosted_by_gate1': {reason: 'base' | 'gate1'} 621 'test:all:boosted_by_gate2': {reason: 'base' | 'gate2'} 622 'test:all:boosted_by_both': {reason: 'base' | 'gate1' | 'gate2'} 623 'test:gate1:always': {} 624 'test:gate1:sometimes': {} 625 'test:gate2:always': {} 626 'test:gate2:sometimes': {} 627 628 'tmd:share': {} 629 'tmd:download': {} 630 'tmd:post': {} 631 632 'trendingTopics:show': { 633 context: 'settings' 634 } 635 'trendingTopics:hide': { 636 context: 'settings' | 'sidebar' | 'interstitial' | 'explore:trending' 637 } 638 'trendingTopic:click': { 639 context: 'sidebar' | 'interstitial' | 'explore' 640 } 641 'recommendedTopic:click': { 642 context: 'explore' 643 } 644 'trendingVideos:show': { 645 context: 'settings' 646 } 647 'trendingVideos:hide': { 648 context: 'settings' | 'interstitial:discover' | 'interstitial:explore' 649 } 650 'videoCard:click': { 651 context: 'interstitial:discover' | 'interstitial:explore' | 'feed' 652 } 653 654 'explore:module:seen': { 655 module: 656 | 'trendingTopics' 657 | 'trendingVideos' 658 | 'suggestedAccounts' 659 | 'suggestedFeeds' 660 | 'suggestedStarterPacks' 661 | `feed:${FeedDescriptor}` 662 } 663 'explore:module:searchButtonPress': { 664 module: 'suggestedAccounts' | 'suggestedFeeds' 665 } 666 'explore:suggestedAccounts:tabPressed': { 667 tab: string 668 } 669 670 'search:query': { 671 source: 'typed' | 'history' | 'autocomplete' 672 } 673 674 'search:results:loaded': { 675 tab: 'top' | 'latest' | 'people' | 'feeds' 676 initialCount: number 677 } 678 679 'search:result:press': { 680 tab?: 'top' | 'latest' | 'people' | 'feeds' 681 resultType: 'post' | 'profile' | 'feed' 682 position: number 683 uri: string 684 } 685 686 'search:recent:press': { 687 profileDid: string 688 position: number 689 } 690 691 'search:autocomplete:press': { 692 profileDid: string 693 position: number 694 } 695 696 'progressGuide:hide': {} 697 'progressGuide:followDialog:open': {} 698 699 'moderation:subscribedToLabeler': {} 700 'moderation:unsubscribedFromLabeler': {} 701 'moderation:changeLabelPreference': { 702 preference: string 703 } 704 705 'moderation:subscribedToList': { 706 listType: 'mute' | 'block' 707 } 708 'moderation:unsubscribedFromList': { 709 listType: 'mute' | 'block' 710 } 711 712 'reportDialog:open': { 713 subjectType: string 714 } 715 'reportDialog:close': {} 716 'reportDialog:success': { 717 reason: string 718 labeler: string 719 details: boolean 720 } 721 'reportDialog:failure': {} 722 723 translate: { 724 os: Platform['OS'] 725 /** 726 * The languages the content might be in, such as the user-supplied 727 * language codes on posts. Currently only available on posts. 728 */ 729 possibleSourceLanguages: string[] | undefined 730 /** 731 * This is the user's configured primary language, which is always defined. 732 */ 733 expectedTargetLanguage: string 734 /** 735 * The length of the text being translated. We assume shorter texts are 736 * more likely to have inaccurate translations. 737 */ 738 textLength: number 739 googleTranslate: boolean 740 } 741 'translate:result': { 742 success: boolean 743 os: Platform['OS'] 744 /** 745 * The languages the content might be in, such as the user-supplied 746 * language codes on posts. Currently only available on posts. 747 */ 748 possibleSourceLanguages: string[] | undefined 749 /** 750 * The language we expected the content to be in. This could be based on 751 * user selection or on our confidence in the detected language. This is 752 * nullable because we may not always have an expected source language. 753 */ 754 expectedSourceLanguage: string | null 755 /** 756 * This is the user's configured primary language, which is always defined. 757 */ 758 expectedTargetLanguage: string 759 /** 760 * The language the translation result was actually in. This is nullable 761 * because the translation could have failed, in which case we won't have a 762 * result source language. 763 */ 764 resultSourceLanguage: string | null 765 /** 766 * The language the translation result was translated into. This should be 767 * the same as `expectedTargetLanguage`, but we include it for completeness 768 * and in case there are any edge cases where they differ. This is nullable 769 * because if the translation failed, we won't have a result target 770 * language. 771 */ 772 resultTargetLanguage: string | null 773 /** 774 * The length of the text being translated. We assume shorter texts are 775 * more likely to have inaccurate translations. 776 */ 777 textLength: number 778 } 779 'translate:override': { 780 os: Platform['OS'] 781 /** 782 * The languages the content might be in, such as the user-supplied 783 * language codes on posts. Currently only available on posts. 784 */ 785 possibleSourceLanguages: string[] | undefined 786 /** 787 * The language the user has indicated the content is actually in, which 788 * may be different from the expected source language if the user is 789 * overriding the auto-detected language. This is the language the user 790 * wants to translate from after overriding. 791 */ 792 expectedSourceLanguage: string 793 /** 794 * This is the user's configured primary language, which is always defined. 795 */ 796 expectedTargetLanguage: string 797 /** 798 * The language the translation result was actually in, which the user now 799 * wishes to override. 800 */ 801 resultSourceLanguage: string 802 } 803 'composer:language:suggestLanguage': { 804 os: Platform['OS'] 805 /** 806 * The language we detected and suggested to the user as an override for the 807 * expected target language. 808 */ 809 suggestedLanguage: string | undefined 810 /** 811 * This is the user's current composer languages, which are always defined. 812 */ 813 currentTargetLanguages: string[] 814 /** 815 * The length of the text being translated. We assume shorter texts are 816 * more likely to have inaccurate translations. 817 */ 818 textLength: number 819 } 820 'composer:language:acceptSuggestion': { 821 os: Platform['OS'] 822 /** 823 * The language we detected and suggested to the user as an override for the 824 * expected target language. 825 */ 826 suggestedLanguage: string | undefined 827 /** 828 * This is the user's current composer languages, which are always defined. 829 */ 830 currentTargetLanguages: string[] 831 /** 832 * The length of the text being translated. We assume shorter texts are 833 * more likely to have inaccurate translations. 834 */ 835 textLength: number 836 } 837 'composer:language:declineSuggestion': { 838 os: Platform['OS'] 839 /** 840 * The language we detected and suggested to the user as an override for the 841 * expected target language. 842 */ 843 suggestedLanguage: string | undefined 844 /** 845 * This is the user's current composer languages, which are always defined. 846 */ 847 currentTargetLanguages: string[] 848 /** 849 * The length of the text being translated. We assume shorter texts are 850 * more likely to have inaccurate translations. 851 */ 852 textLength: number 853 } 854 'composer:language:replyNudgeAccept': { 855 /** 856 * The language of the post the user is replying to. 857 */ 858 replyToLanguage: string 859 /** 860 * This is the user's current composer languages, which are always defined. 861 */ 862 currentTargetLanguages: string[] 863 } 864 'composer:language:replyNudgeDecline': { 865 /** 866 * The language of the post the user is replying to. 867 */ 868 replyToLanguage: string 869 /** 870 * This is the user's current composer languages, which are always defined. 871 */ 872 currentTargetLanguages: string[] 873 } 874 'composer:language:nudgeUser': { 875 os: Platform['OS'] 876 /** 877 * The language we detected and suggested to the user as an override for the 878 * expected target language. 879 */ 880 suggestedLanguage: string | undefined 881 /** 882 * This is the user's current composer languages, which are always defined. 883 */ 884 currentTargetLanguages: string[] 885 /** 886 * The length of the text being translated. We assume shorter texts are 887 * more likely to have inaccurate translations. 888 */ 889 textLength: number 890 } 891 'composer:language:langSelectorPressed': { 892 /** 893 * If the user was nudged by our language detection to update their language 894 */ 895 wasNudged: boolean 896 } 897 898 'postMenu:openMuteWordsDialog': { 899 uri: string 900 authorDid: string 901 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 902 feedDescriptor?: string 903 } 904 'postMenu:muteAccount': { 905 uri: string 906 authorDid: string 907 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 908 feedDescriptor?: string 909 } 910 'postMenu:unmuteAccount': { 911 uri: string 912 authorDid: string 913 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 914 feedDescriptor?: string 915 } 916 'postMenu:blockAccount': { 917 uri: string 918 authorDid: string 919 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 920 feedDescriptor?: string 921 } 922 'postMenu:reportPost': { 923 uri: string 924 authorDid: string 925 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 926 feedDescriptor?: string 927 } 928 929 'verification:create': {} 930 'verification:revoke': {} 931 'verification:badge:click': {} 932 'verification:learn-more': { 933 location: 934 | 'initialAnnouncementeNux' 935 | 'verificationsDialog' 936 | 'verifierDialog' 937 | 'verificationSettings' 938 } 939 'verification:settings:hideBadges': {} 940 'verification:settings:unHideBadges': {} 941 942 'bot:label:toggle': {state: 'add' | 'remove'} 943 'bot:badge:click': {} 944 'pet:label:toggle': {state: 'add' | 'remove'} 945 'pet:badge:click': {} 946 947 'live:create': {duration: number} 948 'live:edit': {} 949 'live:remove': {} 950 'live:card:open': {subject: string; from: 'post' | 'profile'} 951 'live:card:watch': {subject: string} 952 'live:card:openProfile': {subject: string} 953 'live:card:viewAvatar': {subject: string} 954 'live:view:profile': {subject: string} 955 'live:view:post': {subject: string; feed?: string} 956 957 'post:share': { 958 uri: string 959 authorDid: string 960 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 961 feedDescriptor?: string 962 postContext: 'feed' | 'thread' 963 position?: number 964 } 965 'share:press:copyLink': {} 966 'share:press:nativeShare': {} 967 'share:press:openDmSearch': {} 968 'share:press:dmSelected': {} 969 'share:press:recentDm': {} 970 'share:press:embed': {} 971 972 'thread:click:showOtherReplies': {} 973 'thread:click:hideReplyForMe': {} 974 'thread:click:hideReplyForEveryone': {} 975 'thread:preferences:load': { 976 [key: string]: any 977 } 978 'thread:preferences:update': { 979 [key: string]: any 980 } 981 'thread:click:headerMenuOpen': {} 982 'thread:click:editOwnThreadgate': {} 983 'thread:click:viewSomeoneElsesThreadgate': {} 984 'activitySubscription:enable': { 985 setting: 'posts' | 'posts_and_replies' 986 } 987 'activitySubscription:disable': {} 988 'activityPreference:changeChannels': { 989 name: string 990 push: boolean 991 list: boolean 992 } 993 'activityPreference:changeFilter': { 994 name: string 995 value: string 996 } 997 998 'ageAssurance:navigateToSettings': {} 999 'ageAssurance:dismissFeedBanner': {} 1000 'ageAssurance:dismissSettingsNotice': {} 1001 'ageAssurance:initDialogOpen': { 1002 hasInitiatedPreviously: boolean 1003 } 1004 'ageAssurance:initDialogSubmit': {} 1005 'ageAssurance:api:begin': { 1006 platform: string 1007 countryCode: string 1008 regionCode?: string 1009 } 1010 'ageAssurance:initDialogError': { 1011 code: string 1012 } 1013 'ageAssurance:redirectDialogOpen': {} 1014 'ageAssurance:redirectDialogSuccess': {} 1015 'ageAssurance:redirectDialogFail': {} 1016 'ageAssurance:appealDialogOpen': {} 1017 'ageAssurance:appealDialogSubmit': {} 1018 'ageAssurance:noAccessScreen:shown': { 1019 accountCreatedAt: string 1020 isAARegion: boolean 1021 hasDeclaredAge: boolean 1022 canUpdateBirthday: boolean 1023 } 1024 'ageAssurance:noAccessScreen:openBirthdateDialog': {} 1025 'ageAssurance:noAccessScreen:openDeleteAccountDialog': {} 1026 1027 /* 1028 * Specifically for the `BlockedGeoOverlay` 1029 */ 1030 'blockedGeoOverlay:shown': {} 1031 1032 'geo:debug': {} 1033 1034 /* 1035 * Find Contacts stuff 1036 */ 1037 1038 // user presses the button on the new feature NUX 1039 'contacts:nux:ctaPressed': {} 1040 // user presses the banner NUX 1041 'contacts:nux:bannerPressed': {} 1042 // user dismisses the banner 1043 'contacts:nux:bannerDismissed': {} 1044 1045 // user lands on the contacts step 1046 'onboarding:contacts:presented': {} 1047 // user pressed "Import Contacts" button to begin flow 1048 'onboarding:contacts:begin': {} 1049 // skips the step entirely 1050 'onboarding:contacts:skipPressed': {} 1051 // user shared their contacts 1052 'onboarding:contacts:contactsShared': {} 1053 // user leaves the matches page 1054 'onboarding:contacts:nextPressed': { 1055 matchCount: number 1056 followCount: number 1057 dismissedMatchCount: number 1058 } 1059 1060 // user entered a number 1061 'contacts:phone:phoneEntered': { 1062 entryPoint: 'Onboarding' | 'Standalone' 1063 } 1064 // user entered the correct one-time-code 1065 'contacts:phone:phoneVerified': { 1066 entryPoint: 'Onboarding' | 'Standalone' 1067 } 1068 // user responded to the contacts permission prompt 1069 'contacts:permission:request': { 1070 status: 'granted' | 'denied' 1071 accessLevelIOS?: 'all' | 'limited' | 'none' 1072 } 1073 // contacts were successfully imported and matched 1074 'contacts:import:success': { 1075 contactCount: number 1076 matchCount: number 1077 entryPoint: 'Onboarding' | 'Standalone' 1078 } 1079 // contacts import failed 1080 'contacts:import:failure': { 1081 reason: 'noValidNumbers' | 'networkError' | 'unknown' 1082 entryPoint: 'Onboarding' | 'Standalone' 1083 } 1084 // user followed a single match 1085 'contacts:matches:follow': { 1086 entryPoint: 'Onboarding' | 'Standalone' 1087 } 1088 // user pressed "Follow All" on matches 1089 'contacts:matches:followAll': { 1090 followCount: number 1091 entryPoint: 'Onboarding' | 'Standalone' 1092 } 1093 // user dismissed a match 1094 'contacts:matches:dismiss': { 1095 entryPoint: 'Onboarding' | 'Standalone' 1096 } 1097 // user pressed invite to send an SMS to a non-match 1098 'contacts:matches:invite': { 1099 entryPoint: 'Onboarding' | 'Standalone' 1100 } 1101 // user opened the Find Contacts settings screen 1102 'contacts:settings:presented': { 1103 hasPreviouslySynced: boolean 1104 matchCount?: number 1105 } 1106 // user followed a single match from settings 1107 'contacts:settings:follow': {} 1108 // user pressed "Follow All" from settings 1109 'contacts:settings:followAll': { 1110 followCount: number 1111 } 1112 // user dismissed a match from settings 1113 'contacts:settings:dismiss': {} 1114 // user re-entered the flow via the resync button 1115 'contacts:settings:resync': { 1116 daysSinceLastSync: number 1117 } 1118 // user pressed the remove all data button 1119 'contacts:settings:removeData': {} 1120 1121 'liveEvents:feedBanner:seen': { 1122 feed: string 1123 context: LiveEventFeedMetricContext 1124 } 1125 'liveEvents:feedBanner:click': { 1126 feed: string 1127 context: LiveEventFeedMetricContext 1128 } 1129 'liveEvents:feedBanner:hide': { 1130 feed: string 1131 context: LiveEventFeedMetricContext 1132 } 1133 'liveEvents:feedBanner:unhide': { 1134 feed: string 1135 context: LiveEventFeedMetricContext 1136 } 1137 'liveEvents:hideAllFeedBanners': { 1138 context: LiveEventFeedMetricContext 1139 } 1140 'liveEvents:unhideAllFeedBanners': { 1141 context: LiveEventFeedMetricContext 1142 } 1143 1144 'profile:associated:germ:click-to-chat': {} 1145 'profile:associated:germ:click-self-info': {} 1146 'profile:associated:germ:self-disconnect': {} 1147 'profile:associated:germ:self-reconnect': {} 1148 1149 // Gallery carousel events 1150 'post:gallery:swipe': { 1151 fromImage: number 1152 toImage: number 1153 totalImages: number 1154 } 1155 'post:gallery:openLightbox': { 1156 fromImage: number 1157 totalImages: number 1158 } 1159 'post:gallery:impression': { 1160 totalImages: number 1161 postUri: string 1162 } 1163}