Bluesky app fork with some witchin' additions 💫
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}