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 1168 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: 560 | 'ProfileHeader' 561 | 'NewChatDialog' 562 | 'SendViaChatDialog' 563 | 'ConvoSettings' 564 } 565 'chat:open': { 566 logContext: 567 | 'ProfileHeader' 568 | 'NewChatDialog' 569 | 'ChatsList' 570 | 'SendViaChatDialog' 571 | 'ConvoSettings' 572 } 573 'groupchat:create': { 574 logContext: 'NewChatDialog' 575 } 576 'starterPack:addUser': { 577 starterPack?: string 578 } 579 'starterPack:removeUser': { 580 starterPack?: string 581 } 582 'starterPack:share': { 583 starterPack: string 584 shareType: 'link' | 'qrcode' 585 qrShareType?: 'save' | 'copy' | 'share' 586 } 587 'starterPack:followAll': { 588 logContext: 'StarterPackProfilesList' | 'Onboarding' 589 starterPack: string 590 count: number 591 } 592 'starterPack:delete': {} 593 'starterPack:create': { 594 setName: boolean 595 setDescription: boolean 596 profilesCount: number 597 feedsCount: number 598 } 599 'starterPack:convertToList': { 600 starterPack: string 601 memberCount: number 602 } 603 'starterPack:ctaPress': { 604 starterPack: string 605 } 606 'starterPack:opened': { 607 starterPack: string 608 } 609 'link:clicked': { 610 url: string 611 domain: string 612 } 613 614 'feed:interstitial:feedCard:press': {} 615 'desktopFeeds:feed:click': { 616 feedUri: string 617 feedDescriptor: string 618 } 619 620 'profile:header:suggestedFollowsCard:press': {} 621 'profile:addToStarterPack': {} 622 623 'test:all:always': {} 624 'test:all:sometimes': {} 625 'test:all:boosted_by_gate1': {reason: 'base' | 'gate1'} 626 'test:all:boosted_by_gate2': {reason: 'base' | 'gate2'} 627 'test:all:boosted_by_both': {reason: 'base' | 'gate1' | 'gate2'} 628 'test:gate1:always': {} 629 'test:gate1:sometimes': {} 630 'test:gate2:always': {} 631 'test:gate2:sometimes': {} 632 633 'tmd:share': {} 634 'tmd:download': {} 635 'tmd:post': {} 636 637 'trendingTopics:show': { 638 context: 'settings' 639 } 640 'trendingTopics:hide': { 641 context: 'settings' | 'sidebar' | 'interstitial' | 'explore:trending' 642 } 643 'trendingTopic:click': { 644 context: 'sidebar' | 'interstitial' | 'explore' 645 } 646 'recommendedTopic:click': { 647 context: 'explore' 648 } 649 'trendingVideos:show': { 650 context: 'settings' 651 } 652 'trendingVideos:hide': { 653 context: 'settings' | 'interstitial:discover' | 'interstitial:explore' 654 } 655 'videoCard:click': { 656 context: 'interstitial:discover' | 'interstitial:explore' | 'feed' 657 } 658 659 'explore:module:seen': { 660 module: 661 | 'trendingTopics' 662 | 'trendingVideos' 663 | 'suggestedAccounts' 664 | 'suggestedFeeds' 665 | 'suggestedStarterPacks' 666 | `feed:${FeedDescriptor}` 667 } 668 'explore:module:searchButtonPress': { 669 module: 'suggestedAccounts' | 'suggestedFeeds' 670 } 671 'explore:suggestedAccounts:tabPressed': { 672 tab: string 673 } 674 675 'search:query': { 676 source: 'typed' | 'history' | 'autocomplete' 677 } 678 679 'search:results:loaded': { 680 tab: 'top' | 'latest' | 'people' | 'feeds' 681 initialCount: number 682 } 683 684 'search:result:press': { 685 tab?: 'top' | 'latest' | 'people' | 'feeds' 686 resultType: 'post' | 'profile' | 'feed' 687 position: number 688 uri: string 689 } 690 691 'search:recent:press': { 692 profileDid: string 693 position: number 694 } 695 696 'search:autocomplete:press': { 697 profileDid: string 698 position: number 699 } 700 701 'progressGuide:hide': {} 702 'progressGuide:followDialog:open': {} 703 704 'moderation:subscribedToLabeler': {} 705 'moderation:unsubscribedFromLabeler': {} 706 'moderation:changeLabelPreference': { 707 preference: string 708 } 709 710 'moderation:subscribedToList': { 711 listType: 'mute' | 'block' 712 } 713 'moderation:unsubscribedFromList': { 714 listType: 'mute' | 'block' 715 } 716 717 'reportDialog:open': { 718 subjectType: string 719 } 720 'reportDialog:close': {} 721 'reportDialog:success': { 722 reason: string 723 labeler: string 724 details: boolean 725 } 726 'reportDialog:failure': {} 727 728 translate: { 729 os: Platform['OS'] 730 /** 731 * The languages the content might be in, such as the user-supplied 732 * language codes on posts. Currently only available on posts. 733 */ 734 possibleSourceLanguages: string[] | undefined 735 /** 736 * This is the user's configured primary language, which is always defined. 737 */ 738 expectedTargetLanguage: string 739 /** 740 * The length of the text being translated. We assume shorter texts are 741 * more likely to have inaccurate translations. 742 */ 743 textLength: number 744 googleTranslate: boolean 745 } 746 'translate:result': { 747 success: boolean 748 os: Platform['OS'] 749 /** 750 * The languages the content might be in, such as the user-supplied 751 * language codes on posts. Currently only available on posts. 752 */ 753 possibleSourceLanguages: string[] | undefined 754 /** 755 * The language we expected the content to be in. This could be based on 756 * user selection or on our confidence in the detected language. This is 757 * nullable because we may not always have an expected source language. 758 */ 759 expectedSourceLanguage: string | null 760 /** 761 * This is the user's configured primary language, which is always defined. 762 */ 763 expectedTargetLanguage: string 764 /** 765 * The language the translation result was actually in. This is nullable 766 * because the translation could have failed, in which case we won't have a 767 * result source language. 768 */ 769 resultSourceLanguage: string | null 770 /** 771 * The language the translation result was translated into. This should be 772 * the same as `expectedTargetLanguage`, but we include it for completeness 773 * and in case there are any edge cases where they differ. This is nullable 774 * because if the translation failed, we won't have a result target 775 * language. 776 */ 777 resultTargetLanguage: string | null 778 /** 779 * The length of the text being translated. We assume shorter texts are 780 * more likely to have inaccurate translations. 781 */ 782 textLength: number 783 } 784 'translate:override': { 785 os: Platform['OS'] 786 /** 787 * The languages the content might be in, such as the user-supplied 788 * language codes on posts. Currently only available on posts. 789 */ 790 possibleSourceLanguages: string[] | undefined 791 /** 792 * The language the user has indicated the content is actually in, which 793 * may be different from the expected source language if the user is 794 * overriding the auto-detected language. This is the language the user 795 * wants to translate from after overriding. 796 */ 797 expectedSourceLanguage: string 798 /** 799 * This is the user's configured primary language, which is always defined. 800 */ 801 expectedTargetLanguage: string 802 /** 803 * The language the translation result was actually in, which the user now 804 * wishes to override. 805 */ 806 resultSourceLanguage: string 807 } 808 'composer:language:suggestLanguage': { 809 os: Platform['OS'] 810 /** 811 * The language we detected and suggested to the user as an override for the 812 * expected target language. 813 */ 814 suggestedLanguage: string | undefined 815 /** 816 * This is the user's current composer languages, which are always defined. 817 */ 818 currentTargetLanguages: string[] 819 /** 820 * The length of the text being translated. We assume shorter texts are 821 * more likely to have inaccurate translations. 822 */ 823 textLength: number 824 } 825 'composer:language:acceptSuggestion': { 826 os: Platform['OS'] 827 /** 828 * The language we detected and suggested to the user as an override for the 829 * expected target language. 830 */ 831 suggestedLanguage: string | undefined 832 /** 833 * This is the user's current composer languages, which are always defined. 834 */ 835 currentTargetLanguages: string[] 836 /** 837 * The length of the text being translated. We assume shorter texts are 838 * more likely to have inaccurate translations. 839 */ 840 textLength: number 841 } 842 'composer:language:declineSuggestion': { 843 os: Platform['OS'] 844 /** 845 * The language we detected and suggested to the user as an override for the 846 * expected target language. 847 */ 848 suggestedLanguage: string | undefined 849 /** 850 * This is the user's current composer languages, which are always defined. 851 */ 852 currentTargetLanguages: string[] 853 /** 854 * The length of the text being translated. We assume shorter texts are 855 * more likely to have inaccurate translations. 856 */ 857 textLength: number 858 } 859 'composer:language:replyNudgeAccept': { 860 /** 861 * The language of the post the user is replying to. 862 */ 863 replyToLanguage: string 864 /** 865 * This is the user's current composer languages, which are always defined. 866 */ 867 currentTargetLanguages: string[] 868 } 869 'composer:language:replyNudgeDecline': { 870 /** 871 * The language of the post the user is replying to. 872 */ 873 replyToLanguage: string 874 /** 875 * This is the user's current composer languages, which are always defined. 876 */ 877 currentTargetLanguages: string[] 878 } 879 'composer:language:nudgeUser': { 880 os: Platform['OS'] 881 /** 882 * The language we detected and suggested to the user as an override for the 883 * expected target language. 884 */ 885 suggestedLanguage: string | undefined 886 /** 887 * This is the user's current composer languages, which are always defined. 888 */ 889 currentTargetLanguages: string[] 890 /** 891 * The length of the text being translated. We assume shorter texts are 892 * more likely to have inaccurate translations. 893 */ 894 textLength: number 895 } 896 'composer:language:langSelectorPressed': { 897 /** 898 * If the user was nudged by our language detection to update their language 899 */ 900 wasNudged: boolean 901 } 902 903 'postMenu:openMuteWordsDialog': { 904 uri: string 905 authorDid: string 906 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 907 feedDescriptor?: string 908 } 909 'postMenu:muteAccount': { 910 uri: string 911 authorDid: string 912 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 913 feedDescriptor?: string 914 } 915 'postMenu:unmuteAccount': { 916 uri: string 917 authorDid: string 918 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 919 feedDescriptor?: string 920 } 921 'postMenu:blockAccount': { 922 uri: string 923 authorDid: string 924 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 925 feedDescriptor?: string 926 } 927 'postMenu:reportPost': { 928 uri: string 929 authorDid: string 930 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 931 feedDescriptor?: string 932 } 933 934 'verification:create': {} 935 'verification:revoke': {} 936 'verification:badge:click': {} 937 'verification:learn-more': { 938 location: 939 | 'initialAnnouncementeNux' 940 | 'verificationsDialog' 941 | 'verifierDialog' 942 | 'verificationSettings' 943 } 944 'verification:settings:hideBadges': {} 945 'verification:settings:unHideBadges': {} 946 947 'bot:label:toggle': {state: 'add' | 'remove'} 948 'bot:badge:click': {} 949 'pet:label:toggle': {state: 'add' | 'remove'} 950 'pet:badge:click': {} 951 952 'live:create': {duration: number} 953 'live:edit': {} 954 'live:remove': {} 955 'live:card:open': {subject: string; from: 'post' | 'profile'} 956 'live:card:watch': {subject: string} 957 'live:card:openProfile': {subject: string} 958 'live:card:viewAvatar': {subject: string} 959 'live:view:profile': {subject: string} 960 'live:view:post': {subject: string; feed?: string} 961 962 'post:share': { 963 uri: string 964 authorDid: string 965 logContext: 'FeedItem' | 'PostThreadItem' | 'Post' | 'ImmersiveVideo' 966 feedDescriptor?: string 967 postContext: 'feed' | 'thread' 968 position?: number 969 } 970 'share:press:copyLink': {} 971 'share:press:nativeShare': {} 972 'share:press:openDmSearch': {} 973 'share:press:dmSelected': {} 974 'share:press:recentDm': {} 975 'share:press:embed': {} 976 977 'thread:click:showOtherReplies': {} 978 'thread:click:hideReplyForMe': {} 979 'thread:click:hideReplyForEveryone': {} 980 'thread:preferences:load': { 981 [key: string]: any 982 } 983 'thread:preferences:update': { 984 [key: string]: any 985 } 986 'thread:click:headerMenuOpen': {} 987 'thread:click:editOwnThreadgate': {} 988 'thread:click:viewSomeoneElsesThreadgate': {} 989 'activitySubscription:enable': { 990 setting: 'posts' | 'posts_and_replies' 991 } 992 'activitySubscription:disable': {} 993 'activityPreference:changeChannels': { 994 name: string 995 push: boolean 996 list: boolean 997 } 998 'activityPreference:changeFilter': { 999 name: string 1000 value: string 1001 } 1002 1003 'ageAssurance:navigateToSettings': {} 1004 'ageAssurance:dismissFeedBanner': {} 1005 'ageAssurance:dismissSettingsNotice': {} 1006 'ageAssurance:initDialogOpen': { 1007 hasInitiatedPreviously: boolean 1008 } 1009 'ageAssurance:initDialogSubmit': {} 1010 'ageAssurance:api:begin': { 1011 platform: string 1012 countryCode: string 1013 regionCode?: string 1014 } 1015 'ageAssurance:initDialogError': { 1016 code: string 1017 } 1018 'ageAssurance:redirectDialogOpen': {} 1019 'ageAssurance:redirectDialogSuccess': {} 1020 'ageAssurance:redirectDialogFail': {} 1021 'ageAssurance:appealDialogOpen': {} 1022 'ageAssurance:appealDialogSubmit': {} 1023 'ageAssurance:noAccessScreen:shown': { 1024 accountCreatedAt: string 1025 isAARegion: boolean 1026 hasDeclaredAge: boolean 1027 canUpdateBirthday: boolean 1028 } 1029 'ageAssurance:noAccessScreen:openBirthdateDialog': {} 1030 'ageAssurance:noAccessScreen:openDeleteAccountDialog': {} 1031 1032 /* 1033 * Specifically for the `BlockedGeoOverlay` 1034 */ 1035 'blockedGeoOverlay:shown': {} 1036 1037 'geo:debug': {} 1038 1039 /* 1040 * Find Contacts stuff 1041 */ 1042 1043 // user presses the button on the new feature NUX 1044 'contacts:nux:ctaPressed': {} 1045 // user presses the banner NUX 1046 'contacts:nux:bannerPressed': {} 1047 // user dismisses the banner 1048 'contacts:nux:bannerDismissed': {} 1049 1050 // user lands on the contacts step 1051 'onboarding:contacts:presented': {} 1052 // user pressed "Import Contacts" button to begin flow 1053 'onboarding:contacts:begin': {} 1054 // skips the step entirely 1055 'onboarding:contacts:skipPressed': {} 1056 // user shared their contacts 1057 'onboarding:contacts:contactsShared': {} 1058 // user leaves the matches page 1059 'onboarding:contacts:nextPressed': { 1060 matchCount: number 1061 followCount: number 1062 dismissedMatchCount: number 1063 } 1064 1065 // user entered a number 1066 'contacts:phone:phoneEntered': { 1067 entryPoint: 'Onboarding' | 'Standalone' 1068 } 1069 // user entered the correct one-time-code 1070 'contacts:phone:phoneVerified': { 1071 entryPoint: 'Onboarding' | 'Standalone' 1072 } 1073 // user responded to the contacts permission prompt 1074 'contacts:permission:request': { 1075 status: 'granted' | 'denied' 1076 accessLevelIOS?: 'all' | 'limited' | 'none' 1077 } 1078 // contacts were successfully imported and matched 1079 'contacts:import:success': { 1080 contactCount: number 1081 matchCount: number 1082 entryPoint: 'Onboarding' | 'Standalone' 1083 } 1084 // contacts import failed 1085 'contacts:import:failure': { 1086 reason: 'noValidNumbers' | 'networkError' | 'unknown' 1087 entryPoint: 'Onboarding' | 'Standalone' 1088 } 1089 // user followed a single match 1090 'contacts:matches:follow': { 1091 entryPoint: 'Onboarding' | 'Standalone' 1092 } 1093 // user pressed "Follow All" on matches 1094 'contacts:matches:followAll': { 1095 followCount: number 1096 entryPoint: 'Onboarding' | 'Standalone' 1097 } 1098 // user dismissed a match 1099 'contacts:matches:dismiss': { 1100 entryPoint: 'Onboarding' | 'Standalone' 1101 } 1102 // user pressed invite to send an SMS to a non-match 1103 'contacts:matches:invite': { 1104 entryPoint: 'Onboarding' | 'Standalone' 1105 } 1106 // user opened the Find Contacts settings screen 1107 'contacts:settings:presented': { 1108 hasPreviouslySynced: boolean 1109 matchCount?: number 1110 } 1111 // user followed a single match from settings 1112 'contacts:settings:follow': {} 1113 // user pressed "Follow All" from settings 1114 'contacts:settings:followAll': { 1115 followCount: number 1116 } 1117 // user dismissed a match from settings 1118 'contacts:settings:dismiss': {} 1119 // user re-entered the flow via the resync button 1120 'contacts:settings:resync': { 1121 daysSinceLastSync: number 1122 } 1123 // user pressed the remove all data button 1124 'contacts:settings:removeData': {} 1125 1126 'liveEvents:feedBanner:seen': { 1127 feed: string 1128 context: LiveEventFeedMetricContext 1129 } 1130 'liveEvents:feedBanner:click': { 1131 feed: string 1132 context: LiveEventFeedMetricContext 1133 } 1134 'liveEvents:feedBanner:hide': { 1135 feed: string 1136 context: LiveEventFeedMetricContext 1137 } 1138 'liveEvents:feedBanner:unhide': { 1139 feed: string 1140 context: LiveEventFeedMetricContext 1141 } 1142 'liveEvents:hideAllFeedBanners': { 1143 context: LiveEventFeedMetricContext 1144 } 1145 'liveEvents:unhideAllFeedBanners': { 1146 context: LiveEventFeedMetricContext 1147 } 1148 1149 'profile:associated:germ:click-to-chat': {} 1150 'profile:associated:germ:click-self-info': {} 1151 'profile:associated:germ:self-disconnect': {} 1152 'profile:associated:germ:self-reconnect': {} 1153 1154 // Gallery carousel events 1155 'post:gallery:swipe': { 1156 fromImage: number 1157 toImage: number 1158 totalImages: number 1159 } 1160 'post:gallery:openLightbox': { 1161 fromImage: number 1162 totalImages: number 1163 } 1164 'post:gallery:impression': { 1165 totalImages: number 1166 postUri: string 1167 } 1168}