forked from
jollywhoppers.com/witchsky.app
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:
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}