onehook-api-client 1.0.18 → 1.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-cjs/telemetry/index.js +585 -0
- package/dist-es/telemetry/index.js +580 -0
- package/dist-types/telemetry/index.d.ts +413 -0
- package/package.json +11 -2
- package/telemetry/TelemetryCatalog.kt +457 -0
- package/telemetry/TelemetryCatalog.swift +621 -0
- package/telemetry/telemetry-catalog.json +4137 -0
|
@@ -0,0 +1,621 @@
|
|
|
1
|
+
// GENERATED FILE - DO NOT EDIT.
|
|
2
|
+
// telemetry-integrity: sha256 1282a87efde04e20ffb3445d70f03b20afda30c3167e2971ecbbf27eaf4128c6
|
|
3
|
+
// Source of truth: OneHookBackend/packages/telemetry/src/catalog.ts
|
|
4
|
+
// Regenerate: (OneHookBackend) npm run telemetry:generate && npm run telemetry:sync
|
|
5
|
+
// Catalog version 1.3.0, hash 25955dd2f9856888.
|
|
6
|
+
//
|
|
7
|
+
// HARD RULE: every user interaction MUST emit ui_interaction with an id from THIS file, and
|
|
8
|
+
// ids are controlled by the backend. Read TELEMETRY_CONTRACT.txt (printed by every build).
|
|
9
|
+
|
|
10
|
+
import Foundation
|
|
11
|
+
|
|
12
|
+
public enum TelemetryCatalog {
|
|
13
|
+
public static let version = "1.3.0"
|
|
14
|
+
public static let hash = "25955dd2f9856888"
|
|
15
|
+
/// The only allowed `telemetry-exempt: <category>: <reason>` categories (see the catalog).
|
|
16
|
+
public static let exemptCategories: [String] = ["duplicate", "backdrop", "gesture", "continuous", "disabled"]
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/// Every signal type the ingest accepts.
|
|
20
|
+
public enum TelemetrySignalType: String, CaseIterable, Codable, Sendable {
|
|
21
|
+
case screenView = "screen_view"
|
|
22
|
+
case uiInteraction = "ui_interaction"
|
|
23
|
+
case cardImpression = "card_impression"
|
|
24
|
+
case cardSwipeUi = "card_swipe_ui"
|
|
25
|
+
case promptView = "prompt_view"
|
|
26
|
+
case mediaView = "media_view"
|
|
27
|
+
case mediaFullscreenOpen = "media_fullscreen_open"
|
|
28
|
+
case sectionView = "section_view"
|
|
29
|
+
case notificationOpened = "notification_opened"
|
|
30
|
+
case sessionHeartbeat = "session_heartbeat"
|
|
31
|
+
case likeComposerOpen = "like_composer_open"
|
|
32
|
+
case likeCommentAbandoned = "like_comment_abandoned"
|
|
33
|
+
case conversationOpened = "conversation_opened"
|
|
34
|
+
case composeAbandoned = "compose_abandoned"
|
|
35
|
+
case profileRevisit = "profile_revisit"
|
|
36
|
+
case hookedStateView = "hooked_state_view"
|
|
37
|
+
case likesYouView = "likes_you_view"
|
|
38
|
+
case safetyUiOpen = "safety_ui_open"
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/// Client platform (from the X-OneHook-Platform header).
|
|
42
|
+
public enum TelemetryPlatform: String, CaseIterable, Codable, Sendable {
|
|
43
|
+
case web = "web"
|
|
44
|
+
case ios = "ios"
|
|
45
|
+
case android = "android"
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/// Any product surface (incl. non-viewable chrome).
|
|
49
|
+
public enum TelemetryScreen: String, CaseIterable, Codable, Sendable {
|
|
50
|
+
case nav = "NAV"
|
|
51
|
+
case landing = "LANDING"
|
|
52
|
+
case login = "LOGIN"
|
|
53
|
+
case redeemInvite = "REDEEM_INVITE"
|
|
54
|
+
case onboarding = "ONBOARDING"
|
|
55
|
+
case discover = "DISCOVER"
|
|
56
|
+
case likeComposer = "LIKE_COMPOSER"
|
|
57
|
+
case likesYou = "LIKES_YOU"
|
|
58
|
+
case chat = "CHAT"
|
|
59
|
+
case chatSettings = "CHAT_SETTINGS"
|
|
60
|
+
case notifications = "NOTIFICATIONS"
|
|
61
|
+
case profile = "PROFILE"
|
|
62
|
+
case profileEdit = "PROFILE_EDIT"
|
|
63
|
+
case profilePreview = "PROFILE_PREVIEW"
|
|
64
|
+
case preferences = "PREFERENCES"
|
|
65
|
+
case settings = "SETTINGS"
|
|
66
|
+
case paywall = "PAYWALL"
|
|
67
|
+
case liveness = "LIVENESS"
|
|
68
|
+
case photoViewer = "PHOTO_VIEWER"
|
|
69
|
+
case search = "SEARCH"
|
|
70
|
+
case create = "CREATE"
|
|
71
|
+
case shared = "SHARED"
|
|
72
|
+
|
|
73
|
+
/// Whether this surface can be the subject of a screen_view.
|
|
74
|
+
public var isViewable: Bool {
|
|
75
|
+
switch self { case .nav, .shared: return false; default: return true }
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/// Main-shell tabs, in order.
|
|
79
|
+
public static let tabs: [TelemetryScreen] = [.discover, .likesYou, .chat, .profile]
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/// The standard verbs for a UI interaction. Every platform uses these and only these.
|
|
83
|
+
public enum UiAction: String, CaseIterable, Codable, Sendable {
|
|
84
|
+
case tap = "tap"
|
|
85
|
+
case longPress = "long_press"
|
|
86
|
+
case submit = "submit"
|
|
87
|
+
case toggle = "toggle"
|
|
88
|
+
case select = "select"
|
|
89
|
+
case dismiss = "dismiss"
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/// Kind of control (informational; drives the default action).
|
|
93
|
+
public enum UiElementKind: String, CaseIterable, Codable, Sendable {
|
|
94
|
+
case button = "button"
|
|
95
|
+
case tab = "tab"
|
|
96
|
+
case toggle = "toggle"
|
|
97
|
+
case link = "link"
|
|
98
|
+
case listItem = "list_item"
|
|
99
|
+
case menuItem = "menu_item"
|
|
100
|
+
case dialogButton = "dialog_button"
|
|
101
|
+
case gesture = "gesture"
|
|
102
|
+
case segmented = "segmented"
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/// Discovery decision direction: left = pass, right = like, up = rose/super.
|
|
106
|
+
public enum TelemetrySwipeDirection: String, CaseIterable, Codable, Sendable {
|
|
107
|
+
case left = "left"
|
|
108
|
+
case right = "right"
|
|
109
|
+
case up = "up"
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/// Media element type.
|
|
113
|
+
public enum TelemetryMediaType: String, CaseIterable, Codable, Sendable {
|
|
114
|
+
case image = "image"
|
|
115
|
+
case video = "video"
|
|
116
|
+
case voice = "voice"
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/// Profile sections a viewer can dwell on.
|
|
120
|
+
public enum TelemetryProfileSection: String, CaseIterable, Codable, Sendable {
|
|
121
|
+
case photos = "PHOTOS"
|
|
122
|
+
case bio = "BIO"
|
|
123
|
+
case interests = "INTERESTS"
|
|
124
|
+
case prompts = "PROMPTS"
|
|
125
|
+
case voice = "VOICE"
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/// Profile element a comment-to-like targets.
|
|
129
|
+
public enum TelemetryLikeTargetType: String, CaseIterable, Codable, Sendable {
|
|
130
|
+
case photo = "PHOTO"
|
|
131
|
+
case video = "VIDEO"
|
|
132
|
+
case voice = "VOICE"
|
|
133
|
+
case prompt = "PROMPT"
|
|
134
|
+
case interest = "INTEREST"
|
|
135
|
+
case bio = "BIO"
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/// Safety UI intents (the action itself is server-authoritative).
|
|
139
|
+
public enum TelemetrySafetyAction: String, CaseIterable, Codable, Sendable {
|
|
140
|
+
case unmatch = "unmatch"
|
|
141
|
+
case block = "block"
|
|
142
|
+
case report = "report"
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/// Which discovery card design produced the signal (segment metrics by design).
|
|
146
|
+
public enum TelemetryCardVariant: String, CaseIterable, Codable, Sendable {
|
|
147
|
+
case interleaved = "interleaved"
|
|
148
|
+
case swipe = "swipe"
|
|
149
|
+
case feed = "feed"
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/// Kind of notification that was opened.
|
|
153
|
+
public enum TelemetryNotificationType: String, CaseIterable, Codable, Sendable {
|
|
154
|
+
case newMatch = "new_match"
|
|
155
|
+
case newLike = "new_like"
|
|
156
|
+
case newMessage = "new_message"
|
|
157
|
+
case reengagement = "reengagement"
|
|
158
|
+
case other = "other"
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/// Delivery channel of an opened notification.
|
|
162
|
+
public enum TelemetryNotificationChannel: String, CaseIterable, Codable, Sendable {
|
|
163
|
+
case push = "push"
|
|
164
|
+
case inApp = "in_app"
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/// Reaction to the "one connection at a time" (hooked) overlay.
|
|
168
|
+
public enum TelemetryHookedStateAction: String, CaseIterable, Codable, Sendable {
|
|
169
|
+
case shown = "shown"
|
|
170
|
+
case goToChat = "go_to_chat"
|
|
171
|
+
case dismiss = "dismiss"
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/// Static metadata of a registered UI element.
|
|
175
|
+
public struct UiElementSpec: Sendable, Equatable {
|
|
176
|
+
public let screen: TelemetryScreen
|
|
177
|
+
public let kind: UiElementKind
|
|
178
|
+
/// Allowed actions; the first is the default.
|
|
179
|
+
public let actions: [UiAction]
|
|
180
|
+
/// When non-nil, `value` is required and must be one of these.
|
|
181
|
+
public let allowedValues: [String]?
|
|
182
|
+
/// Platforms this element is in scope for (parity contract; see PLATFORM_GAPS in the catalog).
|
|
183
|
+
public let platforms: [TelemetryPlatform]
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/// Registered UI element ids (`<screen>.<subject>`). Track with `OneHookAnalytics.shared.trackUi(_:)`.
|
|
187
|
+
public enum UiElement: String, CaseIterable, Codable, Sendable {
|
|
188
|
+
case navTabSelect = "nav.tab_select"
|
|
189
|
+
case navSearchOpen = "nav.search_open"
|
|
190
|
+
case navMenuOpen = "nav.menu_open"
|
|
191
|
+
case navBack = "nav.back"
|
|
192
|
+
case navHomeLogo = "nav.home_logo"
|
|
193
|
+
case navHookedGoToChat = "nav.hooked_go_to_chat"
|
|
194
|
+
case navHookedDismiss = "nav.hooked_dismiss"
|
|
195
|
+
case landingGetStarted = "landing.get_started"
|
|
196
|
+
case landingLogin = "landing.login"
|
|
197
|
+
case landingPolicyLink = "landing.policy_link"
|
|
198
|
+
case landingHomeLink = "landing.home_link"
|
|
199
|
+
case landingOpenInApp = "landing.open_in_app"
|
|
200
|
+
case landingNavLink = "landing.nav_link"
|
|
201
|
+
case landingSocialLink = "landing.social_link"
|
|
202
|
+
case landingMobileMenuToggle = "landing.mobile_menu_toggle"
|
|
203
|
+
case landingSectionNav = "landing.section_nav"
|
|
204
|
+
case landingEmailLink = "landing.email_link"
|
|
205
|
+
case landingPricingPeriodSelect = "landing.pricing_period_select"
|
|
206
|
+
case landingCareersApply = "landing.careers_apply"
|
|
207
|
+
case landingDemoInteract = "landing.demo_interact"
|
|
208
|
+
case landingChatbotWidget = "landing.chatbot_widget"
|
|
209
|
+
case landingNoticeRetry = "landing.notice_retry"
|
|
210
|
+
case loginSubmit = "login.submit"
|
|
211
|
+
case loginGoogle = "login.google"
|
|
212
|
+
case loginApple = "login.apple"
|
|
213
|
+
case loginPasskey = "login.passkey"
|
|
214
|
+
case loginIdentifierMode = "login.identifier_mode"
|
|
215
|
+
case loginPasswordMode = "login.password_mode"
|
|
216
|
+
case loginForgotPassword = "login.forgot_password"
|
|
217
|
+
case loginResendCode = "login.resend_code"
|
|
218
|
+
case loginRedeemInvite = "login.redeem_invite"
|
|
219
|
+
case loginClose = "login.close"
|
|
220
|
+
case loginPasskeySetup = "login.passkey_setup"
|
|
221
|
+
case redeemInviteSubmit = "redeem_invite.submit"
|
|
222
|
+
case redeemInviteBack = "redeem_invite.back"
|
|
223
|
+
case redeemInviteLogin = "redeem_invite.login"
|
|
224
|
+
case redeemInviteClose = "redeem_invite.close"
|
|
225
|
+
case redeemInviteResendCode = "redeem_invite.resend_code"
|
|
226
|
+
case onboardingNext = "onboarding.next"
|
|
227
|
+
case onboardingBack = "onboarding.back"
|
|
228
|
+
case onboardingFinish = "onboarding.finish"
|
|
229
|
+
case onboardingSkipSignOut = "onboarding.skip_sign_out"
|
|
230
|
+
case onboardingSkipSignOutConfirm = "onboarding.skip_sign_out_confirm"
|
|
231
|
+
case onboardingPhotoAdd = "onboarding.photo_add"
|
|
232
|
+
case onboardingPhotoRemove = "onboarding.photo_remove"
|
|
233
|
+
case onboardingPhotoRemoveConfirm = "onboarding.photo_remove_confirm"
|
|
234
|
+
case onboardingPromptAdd = "onboarding.prompt_add"
|
|
235
|
+
case onboardingPromptRemove = "onboarding.prompt_remove"
|
|
236
|
+
case onboardingVoiceAdd = "onboarding.voice_add"
|
|
237
|
+
case onboardingVoiceRemove = "onboarding.voice_remove"
|
|
238
|
+
case onboardingChoiceSelect = "onboarding.choice_select"
|
|
239
|
+
case discoverPassButton = "discover.pass_button"
|
|
240
|
+
case discoverLikeButton = "discover.like_button"
|
|
241
|
+
case discoverRoseButton = "discover.rose_button"
|
|
242
|
+
case discoverUndoButton = "discover.undo_button"
|
|
243
|
+
case discoverElementLike = "discover.element_like"
|
|
244
|
+
case discoverPhotoOpen = "discover.photo_open"
|
|
245
|
+
case discoverVoicePlay = "discover.voice_play"
|
|
246
|
+
case discoverPreferencesOpen = "discover.preferences_open"
|
|
247
|
+
case discoverLikesYouOpen = "discover.likes_you_open"
|
|
248
|
+
case discoverAddHookOpen = "discover.add_hook_open"
|
|
249
|
+
case discoverRetry = "discover.retry"
|
|
250
|
+
case discoverAddHookSubmit = "discover.add_hook_submit"
|
|
251
|
+
case discoverUpgradeOpen = "discover.upgrade_open"
|
|
252
|
+
case likeComposerSend = "like_composer.send"
|
|
253
|
+
case likeComposerSendWithoutComment = "like_composer.send_without_comment"
|
|
254
|
+
case likeComposerCancel = "like_composer.cancel"
|
|
255
|
+
case likeComposerUpgrade = "like_composer.upgrade"
|
|
256
|
+
case likesYouProfileOpen = "likes_you.profile_open"
|
|
257
|
+
case likesYouLikedItemOpen = "likes_you.liked_item_open"
|
|
258
|
+
case likesYouRefresh = "likes_you.refresh"
|
|
259
|
+
case likesYouRetry = "likes_you.retry"
|
|
260
|
+
case likesYouClose = "likes_you.close"
|
|
261
|
+
case chatSendButton = "chat.send_button"
|
|
262
|
+
case chatAttachButton = "chat.attach_button"
|
|
263
|
+
case chatAttachOption = "chat.attach_option"
|
|
264
|
+
case chatCaptureOption = "chat.capture_option"
|
|
265
|
+
case chatVoiceRecordStart = "chat.voice_record_start"
|
|
266
|
+
case chatVoiceRecordStop = "chat.voice_record_stop"
|
|
267
|
+
case chatVoiceRecordCancel = "chat.voice_record_cancel"
|
|
268
|
+
case chatVoiceSend = "chat.voice_send"
|
|
269
|
+
case chatConversationSwitch = "chat.conversation_switch"
|
|
270
|
+
case chatConversationSort = "chat.conversation_sort"
|
|
271
|
+
case chatConversationSortOpen = "chat.conversation_sort_open"
|
|
272
|
+
case chatConversationSwitcherOpen = "chat.conversation_switcher_open"
|
|
273
|
+
case chatProfileOpen = "chat.profile_open"
|
|
274
|
+
case chatSafetyMenuOpen = "chat.safety_menu_open"
|
|
275
|
+
case chatUnmatch = "chat.unmatch"
|
|
276
|
+
case chatReportSpam = "chat.report_spam"
|
|
277
|
+
case chatReportBlock = "chat.report_block"
|
|
278
|
+
case chatBlockConfirm = "chat.block_confirm"
|
|
279
|
+
case chatSettingsOpen = "chat.settings_open"
|
|
280
|
+
case chatWallpaperOpen = "chat.wallpaper_open"
|
|
281
|
+
case chatAddHookOpen = "chat.add_hook_open"
|
|
282
|
+
case chatPrivacyToggle = "chat.privacy_toggle"
|
|
283
|
+
case chatCall = "chat.call"
|
|
284
|
+
case chatVideoCall = "chat.video_call"
|
|
285
|
+
case chatMediaOpen = "chat.media_open"
|
|
286
|
+
case chatAudioPlay = "chat.audio_play"
|
|
287
|
+
case chatFileOpen = "chat.file_open"
|
|
288
|
+
case chatMessageDelete = "chat.message_delete"
|
|
289
|
+
case chatMessageMenuOpen = "chat.message_menu_open"
|
|
290
|
+
case chatReportReasonSelect = "chat.report_reason_select"
|
|
291
|
+
case chatSensitiveRevealConfirm = "chat.sensitive_reveal_confirm"
|
|
292
|
+
case chatAttachmentRetry = "chat.attachment_retry"
|
|
293
|
+
case chatHistoryRecover = "chat.history_recover"
|
|
294
|
+
case chatMrOnehookOpen = "chat.mr_onehook_open"
|
|
295
|
+
case chatMrOnehookClose = "chat.mr_onehook_close"
|
|
296
|
+
case chatRetry = "chat.retry"
|
|
297
|
+
case chatUnmatchConfirm = "chat.unmatch_confirm"
|
|
298
|
+
case chatProfileClose = "chat.profile_close"
|
|
299
|
+
case chatMrOnehookContextShare = "chat.mr_onehook_context_share"
|
|
300
|
+
case chatMrOnehookScopeOpen = "chat.mr_onehook_scope_open"
|
|
301
|
+
case chatMrOnehookScopeSelect = "chat.mr_onehook_scope_select"
|
|
302
|
+
case chatIntroTourOpen = "chat.intro_tour_open"
|
|
303
|
+
case chatIntroDismiss = "chat.intro_dismiss"
|
|
304
|
+
case chatIntroGetStarted = "chat.intro_get_started"
|
|
305
|
+
case chatHistoryRecoverMethod = "chat.history_recover_method"
|
|
306
|
+
case chatHistoryRecoverStep = "chat.history_recover_step"
|
|
307
|
+
case chatHistoryResetConfirm = "chat.history_reset_confirm"
|
|
308
|
+
case chatSettingsLastSeenSelect = "chat_settings.last_seen_select"
|
|
309
|
+
case chatSettingsDisappearingSelect = "chat_settings.disappearing_select"
|
|
310
|
+
case chatSettingsNotificationToggle = "chat_settings.notification_toggle"
|
|
311
|
+
case chatSettingsPrivacyToggle = "chat_settings.privacy_toggle"
|
|
312
|
+
case chatSettingsFontSizeSelect = "chat_settings.font_size_select"
|
|
313
|
+
case chatSettingsWallpaperSelect = "chat_settings.wallpaper_select"
|
|
314
|
+
case chatSettingsExportChat = "chat_settings.export_chat"
|
|
315
|
+
case chatSettingsClearCache = "chat_settings.clear_cache"
|
|
316
|
+
case notificationsItemOpen = "notifications.item_open"
|
|
317
|
+
case notificationsItemDismiss = "notifications.item_dismiss"
|
|
318
|
+
case profileEditOpen = "profile.edit_open"
|
|
319
|
+
case profilePreviewOpen = "profile.preview_open"
|
|
320
|
+
case profilePreferencesOpen = "profile.preferences_open"
|
|
321
|
+
case profileSettingsOpen = "profile.settings_open"
|
|
322
|
+
case profileChatSettingsOpen = "profile.chat_settings_open"
|
|
323
|
+
case profileChatTourOpen = "profile.chat_tour_open"
|
|
324
|
+
case profilePhotoOpen = "profile.photo_open"
|
|
325
|
+
case profileVerifyIdentity = "profile.verify_identity"
|
|
326
|
+
case profileShareInvite = "profile.share_invite"
|
|
327
|
+
case profileInviteCodeCopy = "profile.invite_code_copy"
|
|
328
|
+
case profileInviteCodeShare = "profile.invite_code_share"
|
|
329
|
+
case profileUpgradeOpen = "profile.upgrade_open"
|
|
330
|
+
case profileUnhook = "profile.unhook"
|
|
331
|
+
case profileUnhookConfirm = "profile.unhook_confirm"
|
|
332
|
+
case profileTabSelect = "profile.tab_select"
|
|
333
|
+
case profileRetry = "profile.retry"
|
|
334
|
+
case profileVoicePlay = "profile.voice_play"
|
|
335
|
+
case profileEditSave = "profile_edit.save"
|
|
336
|
+
case profileEditPreview = "profile_edit.preview"
|
|
337
|
+
case profileEditPhotoAdd = "profile_edit.photo_add"
|
|
338
|
+
case profileEditPhotoRemove = "profile_edit.photo_remove"
|
|
339
|
+
case profileEditPhotoRemoveConfirm = "profile_edit.photo_remove_confirm"
|
|
340
|
+
case profileEditPhotoSetPrimary = "profile_edit.photo_set_primary"
|
|
341
|
+
case profileEditPhotoAdjust = "profile_edit.photo_adjust"
|
|
342
|
+
case profileEditPhotoReorder = "profile_edit.photo_reorder"
|
|
343
|
+
case profileEditPromptAdd = "profile_edit.prompt_add"
|
|
344
|
+
case profileEditPromptRemove = "profile_edit.prompt_remove"
|
|
345
|
+
case profileEditVoiceAdd = "profile_edit.voice_add"
|
|
346
|
+
case profileEditVoiceRemove = "profile_edit.voice_remove"
|
|
347
|
+
case profileEditChoiceSelect = "profile_edit.choice_select"
|
|
348
|
+
case preferencesSave = "preferences.save"
|
|
349
|
+
case preferencesUpgradeOpen = "preferences.upgrade_open"
|
|
350
|
+
case preferencesLockedFilterTap = "preferences.locked_filter_tap"
|
|
351
|
+
case settingsEmailManage = "settings.email_manage"
|
|
352
|
+
case settingsPhoneUpdate = "settings.phone_update"
|
|
353
|
+
case settingsGoogleLink = "settings.google_link"
|
|
354
|
+
case settingsAppleLink = "settings.apple_link"
|
|
355
|
+
case settingsPasskeyAdd = "settings.passkey_add"
|
|
356
|
+
case settingsPasswordSet = "settings.password_set"
|
|
357
|
+
case settingsRecoverySetup = "settings.recovery_setup"
|
|
358
|
+
case settingsDeviceRevoke = "settings.device_revoke"
|
|
359
|
+
case settingsDeviceRevokeConfirm = "settings.device_revoke_confirm"
|
|
360
|
+
case settingsSafetyOpen = "settings.safety_open"
|
|
361
|
+
case settingsThemeSelect = "settings.theme_select"
|
|
362
|
+
case settingsThemeOpen = "settings.theme_open"
|
|
363
|
+
case settingsSignOut = "settings.sign_out"
|
|
364
|
+
case settingsSignOutConfirm = "settings.sign_out_confirm"
|
|
365
|
+
case settingsDeleteAccountOpen = "settings.delete_account_open"
|
|
366
|
+
case settingsDeleteAccountConfirm = "settings.delete_account_confirm"
|
|
367
|
+
case settingsUnblockUser = "settings.unblock_user"
|
|
368
|
+
case settingsUnblockConfirm = "settings.unblock_confirm"
|
|
369
|
+
case settingsVerifyCodeSubmit = "settings.verify_code_submit"
|
|
370
|
+
case settingsPasswordSetConfirm = "settings.password_set_confirm"
|
|
371
|
+
case settingsHelpLink = "settings.help_link"
|
|
372
|
+
case settingsRecoveryApprove = "settings.recovery_approve"
|
|
373
|
+
case settingsRecoveryQrSave = "settings.recovery_qr_save"
|
|
374
|
+
case settingsRecoveryQrShare = "settings.recovery_qr_share"
|
|
375
|
+
case paywallPurchase = "paywall.purchase"
|
|
376
|
+
case paywallRestore = "paywall.restore"
|
|
377
|
+
case paywallFeaturesExpand = "paywall.features_expand"
|
|
378
|
+
case photoViewerClose = "photo_viewer.close"
|
|
379
|
+
case photoViewerPrevious = "photo_viewer.previous"
|
|
380
|
+
case photoViewerNext = "photo_viewer.next"
|
|
381
|
+
case searchClose = "search.close"
|
|
382
|
+
case searchQueryClear = "search.query_clear"
|
|
383
|
+
case searchFilterSelect = "search.filter_select"
|
|
384
|
+
case searchResultOpen = "search.result_open"
|
|
385
|
+
case createClose = "create.close"
|
|
386
|
+
case createOptionSelect = "create.option_select"
|
|
387
|
+
case sharedAlertDismiss = "shared.alert_dismiss"
|
|
388
|
+
case sharedErrorRecover = "shared.error_recover"
|
|
389
|
+
case sharedCountryCodeOpen = "shared.country_code_open"
|
|
390
|
+
case sharedCountryCodeSelect = "shared.country_code_select"
|
|
391
|
+
case sharedVoiceRecorder = "shared.voice_recorder"
|
|
392
|
+
case sharedPromptPresetSelect = "shared.prompt_preset_select"
|
|
393
|
+
case livenessBegin = "liveness.begin"
|
|
394
|
+
case livenessDismiss = "liveness.dismiss"
|
|
395
|
+
case livenessRetry = "liveness.retry"
|
|
396
|
+
case livenessOpenSettings = "liveness.open_settings"
|
|
397
|
+
case livenessClose = "liveness.close"
|
|
398
|
+
|
|
399
|
+
public var spec: UiElementSpec {
|
|
400
|
+
switch self {
|
|
401
|
+
case .navTabSelect: return UiElementSpec(screen: .nav, kind: .tab, actions: [.select], allowedValues: ["DISCOVER", "LIKES_YOU", "CHAT", "PROFILE"], platforms: [.web, .ios, .android])
|
|
402
|
+
case .navSearchOpen: return UiElementSpec(screen: .nav, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web])
|
|
403
|
+
case .navMenuOpen: return UiElementSpec(screen: .nav, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web])
|
|
404
|
+
case .navBack: return UiElementSpec(screen: .nav, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web])
|
|
405
|
+
case .navHomeLogo: return UiElementSpec(screen: .nav, kind: .link, actions: [.tap], allowedValues: nil, platforms: [.web])
|
|
406
|
+
case .navHookedGoToChat: return UiElementSpec(screen: .nav, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
407
|
+
case .navHookedDismiss: return UiElementSpec(screen: .nav, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.ios])
|
|
408
|
+
case .landingGetStarted: return UiElementSpec(screen: .landing, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
409
|
+
case .landingLogin: return UiElementSpec(screen: .landing, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
410
|
+
case .landingPolicyLink: return UiElementSpec(screen: .landing, kind: .link, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
411
|
+
case .landingHomeLink: return UiElementSpec(screen: .landing, kind: .link, actions: [.tap], allowedValues: nil, platforms: [.web])
|
|
412
|
+
case .landingOpenInApp: return UiElementSpec(screen: .landing, kind: .link, actions: [.tap], allowedValues: nil, platforms: [.web])
|
|
413
|
+
case .landingNavLink: return UiElementSpec(screen: .landing, kind: .link, actions: [.tap], allowedValues: ["philosophy", "how_it_works", "pricing", "contact", "careers", "science"], platforms: [.web])
|
|
414
|
+
case .landingSocialLink: return UiElementSpec(screen: .landing, kind: .link, actions: [.tap], allowedValues: ["instagram", "facebook", "x", "youtube", "linkedin", "tiktok", "threads", "other"], platforms: [.web, .ios])
|
|
415
|
+
case .landingMobileMenuToggle: return UiElementSpec(screen: .landing, kind: .toggle, actions: [.toggle], allowedValues: ["open", "closed"], platforms: [.web])
|
|
416
|
+
case .landingSectionNav: return UiElementSpec(screen: .landing, kind: .link, actions: [.tap], allowedValues: ["philosophy", "features", "under_the_hood", "get_app"], platforms: [.web])
|
|
417
|
+
case .landingEmailLink: return UiElementSpec(screen: .landing, kind: .link, actions: [.tap], allowedValues: ["privacy", "security", "support", "legal", "careers", "other"], platforms: [.web])
|
|
418
|
+
case .landingPricingPeriodSelect: return UiElementSpec(screen: .landing, kind: .segmented, actions: [.select, .tap], allowedValues: nil, platforms: [.web])
|
|
419
|
+
case .landingCareersApply: return UiElementSpec(screen: .landing, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web])
|
|
420
|
+
case .landingDemoInteract: return UiElementSpec(screen: .landing, kind: .button, actions: [.tap], allowedValues: ["opener_shuffle", "relationship_mode", "how_it_works_prev", "how_it_works_next", "how_it_works_step", "mascot_video", "mascot", "science_chapter", "science_signal_kind", "science_signal_send", "science_tab", "science_swipe", "science_erasure"], platforms: [.web])
|
|
421
|
+
case .landingChatbotWidget: return UiElementSpec(screen: .landing, kind: .button, actions: [.tap], allowedValues: ["open", "close", "fullscreen", "start", "send"], platforms: [.web])
|
|
422
|
+
case .landingNoticeRetry: return UiElementSpec(screen: .landing, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web])
|
|
423
|
+
case .loginSubmit: return UiElementSpec(screen: .login, kind: .button, actions: [.submit], allowedValues: ["request_otp", "verify_otp", "password", "reset_password"], platforms: [.web, .ios, .android])
|
|
424
|
+
case .loginGoogle: return UiElementSpec(screen: .login, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
425
|
+
case .loginApple: return UiElementSpec(screen: .login, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
426
|
+
case .loginPasskey: return UiElementSpec(screen: .login, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios])
|
|
427
|
+
case .loginIdentifierMode: return UiElementSpec(screen: .login, kind: .toggle, actions: [.toggle], allowedValues: ["phone", "email"], platforms: [.web, .ios, .android])
|
|
428
|
+
case .loginPasswordMode: return UiElementSpec(screen: .login, kind: .toggle, actions: [.toggle], allowedValues: ["password", "otp"], platforms: [.web, .ios, .android])
|
|
429
|
+
case .loginForgotPassword: return UiElementSpec(screen: .login, kind: .link, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
430
|
+
case .loginResendCode: return UiElementSpec(screen: .login, kind: .link, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
431
|
+
case .loginRedeemInvite: return UiElementSpec(screen: .login, kind: .link, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
432
|
+
case .loginClose: return UiElementSpec(screen: .login, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
433
|
+
case .loginPasskeySetup: return UiElementSpec(screen: .login, kind: .button, actions: [.tap], allowedValues: ["email_submit", "code_submit", "change_email", "skip_to_passkey", "passkey_create", "skip_to_app"], platforms: [.web])
|
|
434
|
+
case .redeemInviteSubmit: return UiElementSpec(screen: .redeemInvite, kind: .button, actions: [.submit], allowedValues: ["validate_invite", "send_otp", "create_account", "verify_sign_in_otp"], platforms: [.web, .ios, .android])
|
|
435
|
+
case .redeemInviteBack: return UiElementSpec(screen: .redeemInvite, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .android])
|
|
436
|
+
case .redeemInviteLogin: return UiElementSpec(screen: .redeemInvite, kind: .link, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
437
|
+
case .redeemInviteClose: return UiElementSpec(screen: .redeemInvite, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios, .android])
|
|
438
|
+
case .redeemInviteResendCode: return UiElementSpec(screen: .redeemInvite, kind: .link, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
439
|
+
case .onboardingNext: return UiElementSpec(screen: .onboarding, kind: .button, actions: [.submit], allowedValues: ["basics", "photos", "media", "prompts", "details"], platforms: [.web, .ios])
|
|
440
|
+
case .onboardingBack: return UiElementSpec(screen: .onboarding, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
441
|
+
case .onboardingFinish: return UiElementSpec(screen: .onboarding, kind: .button, actions: [.submit], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
442
|
+
case .onboardingSkipSignOut: return UiElementSpec(screen: .onboarding, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
443
|
+
case .onboardingSkipSignOutConfirm: return UiElementSpec(screen: .onboarding, kind: .dialogButton, actions: [.submit, .dismiss], allowedValues: nil, platforms: [.ios, .android])
|
|
444
|
+
case .onboardingPhotoAdd: return UiElementSpec(screen: .onboarding, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
445
|
+
case .onboardingPhotoRemove: return UiElementSpec(screen: .onboarding, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
446
|
+
case .onboardingPhotoRemoveConfirm: return UiElementSpec(screen: .onboarding, kind: .dialogButton, actions: [.submit, .dismiss], allowedValues: nil, platforms: [.web])
|
|
447
|
+
case .onboardingPromptAdd: return UiElementSpec(screen: .onboarding, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
448
|
+
case .onboardingPromptRemove: return UiElementSpec(screen: .onboarding, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
449
|
+
case .onboardingVoiceAdd: return UiElementSpec(screen: .onboarding, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
450
|
+
case .onboardingVoiceRemove: return UiElementSpec(screen: .onboarding, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
451
|
+
case .onboardingChoiceSelect: return UiElementSpec(screen: .onboarding, kind: .segmented, actions: [.select, .tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
452
|
+
case .discoverPassButton: return UiElementSpec(screen: .discover, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
453
|
+
case .discoverLikeButton: return UiElementSpec(screen: .discover, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.android])
|
|
454
|
+
case .discoverRoseButton: return UiElementSpec(screen: .discover, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
455
|
+
case .discoverUndoButton: return UiElementSpec(screen: .discover, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios])
|
|
456
|
+
case .discoverElementLike: return UiElementSpec(screen: .discover, kind: .button, actions: [.tap], allowedValues: ["PHOTO", "VIDEO", "VOICE", "PROMPT", "INTEREST", "BIO"], platforms: [.web, .ios])
|
|
457
|
+
case .discoverPhotoOpen: return UiElementSpec(screen: .discover, kind: .gesture, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
458
|
+
case .discoverVoicePlay: return UiElementSpec(screen: .discover, kind: .toggle, actions: [.toggle], allowedValues: ["play", "pause"], platforms: [.web, .ios])
|
|
459
|
+
case .discoverPreferencesOpen: return UiElementSpec(screen: .discover, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.ios])
|
|
460
|
+
case .discoverLikesYouOpen: return UiElementSpec(screen: .discover, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.ios, .android])
|
|
461
|
+
case .discoverAddHookOpen: return UiElementSpec(screen: .discover, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.ios])
|
|
462
|
+
case .discoverRetry: return UiElementSpec(screen: .discover, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
463
|
+
case .discoverAddHookSubmit: return UiElementSpec(screen: .discover, kind: .button, actions: [.submit], allowedValues: nil, platforms: [.web, .ios])
|
|
464
|
+
case .discoverUpgradeOpen: return UiElementSpec(screen: .discover, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.ios])
|
|
465
|
+
case .likeComposerSend: return UiElementSpec(screen: .likeComposer, kind: .button, actions: [.submit], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
466
|
+
case .likeComposerSendWithoutComment: return UiElementSpec(screen: .likeComposer, kind: .button, actions: [.submit], allowedValues: nil, platforms: [.ios])
|
|
467
|
+
case .likeComposerCancel: return UiElementSpec(screen: .likeComposer, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
468
|
+
case .likeComposerUpgrade: return UiElementSpec(screen: .likeComposer, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.ios])
|
|
469
|
+
case .likesYouProfileOpen: return UiElementSpec(screen: .likesYou, kind: .listItem, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
470
|
+
case .likesYouLikedItemOpen: return UiElementSpec(screen: .likesYou, kind: .gesture, actions: [.tap], allowedValues: nil, platforms: [.web])
|
|
471
|
+
case .likesYouRefresh: return UiElementSpec(screen: .likesYou, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .android])
|
|
472
|
+
case .likesYouRetry: return UiElementSpec(screen: .likesYou, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
473
|
+
case .likesYouClose: return UiElementSpec(screen: .likesYou, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.ios, .android])
|
|
474
|
+
case .chatSendButton: return UiElementSpec(screen: .chat, kind: .button, actions: [.submit], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
475
|
+
case .chatAttachButton: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
476
|
+
case .chatAttachOption: return UiElementSpec(screen: .chat, kind: .menuItem, actions: [.tap], allowedValues: ["photo_video", "camera", "file", "voice"], platforms: [.web, .ios, .android])
|
|
477
|
+
case .chatCaptureOption: return UiElementSpec(screen: .chat, kind: .menuItem, actions: [.tap], allowedValues: ["photo", "video"], platforms: [.android])
|
|
478
|
+
case .chatVoiceRecordStart: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap, .longPress], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
479
|
+
case .chatVoiceRecordStop: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios, .android])
|
|
480
|
+
case .chatVoiceRecordCancel: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
481
|
+
case .chatVoiceSend: return UiElementSpec(screen: .chat, kind: .button, actions: [.submit], allowedValues: nil, platforms: [.web, .ios])
|
|
482
|
+
case .chatConversationSwitch: return UiElementSpec(screen: .chat, kind: .listItem, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
483
|
+
case .chatConversationSort: return UiElementSpec(screen: .chat, kind: .menuItem, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
484
|
+
case .chatConversationSortOpen: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios])
|
|
485
|
+
case .chatConversationSwitcherOpen: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios])
|
|
486
|
+
case .chatProfileOpen: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
487
|
+
case .chatSafetyMenuOpen: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
488
|
+
case .chatUnmatch: return UiElementSpec(screen: .chat, kind: .menuItem, actions: [.tap], allowedValues: nil, platforms: [.ios, .android])
|
|
489
|
+
case .chatReportSpam: return UiElementSpec(screen: .chat, kind: .menuItem, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
490
|
+
case .chatReportBlock: return UiElementSpec(screen: .chat, kind: .menuItem, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
491
|
+
case .chatBlockConfirm: return UiElementSpec(screen: .chat, kind: .dialogButton, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
492
|
+
case .chatSettingsOpen: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios])
|
|
493
|
+
case .chatWallpaperOpen: return UiElementSpec(screen: .chat, kind: .menuItem, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web])
|
|
494
|
+
case .chatAddHookOpen: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios])
|
|
495
|
+
case .chatPrivacyToggle: return UiElementSpec(screen: .chat, kind: .toggle, actions: [.toggle], allowedValues: ["hidden", "visible"], platforms: [])
|
|
496
|
+
case .chatCall: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios])
|
|
497
|
+
case .chatVideoCall: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios])
|
|
498
|
+
case .chatMediaOpen: return UiElementSpec(screen: .chat, kind: .gesture, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
499
|
+
case .chatAudioPlay: return UiElementSpec(screen: .chat, kind: .toggle, actions: [.toggle], allowedValues: ["play", "pause"], platforms: [.web, .ios, .android])
|
|
500
|
+
case .chatFileOpen: return UiElementSpec(screen: .chat, kind: .listItem, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
501
|
+
case .chatMessageDelete: return UiElementSpec(screen: .chat, kind: .dialogButton, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.ios, .android])
|
|
502
|
+
case .chatMessageMenuOpen: return UiElementSpec(screen: .chat, kind: .gesture, actions: [.longPress, .dismiss], allowedValues: nil, platforms: [.ios, .android])
|
|
503
|
+
case .chatReportReasonSelect: return UiElementSpec(screen: .chat, kind: .menuItem, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
504
|
+
case .chatSensitiveRevealConfirm: return UiElementSpec(screen: .chat, kind: .dialogButton, actions: [.submit, .dismiss], allowedValues: nil, platforms: [.web, .ios])
|
|
505
|
+
case .chatAttachmentRetry: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap], allowedValues: ["upload", "download"], platforms: [.web, .ios, .android])
|
|
506
|
+
case .chatHistoryRecover: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
507
|
+
case .chatMrOnehookOpen: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .android])
|
|
508
|
+
case .chatMrOnehookClose: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.android])
|
|
509
|
+
case .chatRetry: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .android])
|
|
510
|
+
case .chatUnmatchConfirm: return UiElementSpec(screen: .chat, kind: .dialogButton, actions: [.submit, .dismiss], allowedValues: nil, platforms: [.ios, .android])
|
|
511
|
+
case .chatProfileClose: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.ios, .android])
|
|
512
|
+
case .chatMrOnehookContextShare: return UiElementSpec(screen: .chat, kind: .dialogButton, actions: [.submit, .dismiss], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
513
|
+
case .chatMrOnehookScopeOpen: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web])
|
|
514
|
+
case .chatMrOnehookScopeSelect: return UiElementSpec(screen: .chat, kind: .menuItem, actions: [.tap], allowedValues: nil, platforms: [.web])
|
|
515
|
+
case .chatIntroTourOpen: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios])
|
|
516
|
+
case .chatIntroDismiss: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.ios])
|
|
517
|
+
case .chatIntroGetStarted: return UiElementSpec(screen: .chat, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios])
|
|
518
|
+
case .chatHistoryRecoverMethod: return UiElementSpec(screen: .chat, kind: .menuItem, actions: [.tap, .dismiss], allowedValues: ["device", "qr_scan", "qr_import", "passkey"], platforms: [.web, .ios, .android])
|
|
519
|
+
case .chatHistoryRecoverStep: return UiElementSpec(screen: .chat, kind: .menuItem, actions: [.tap], allowedValues: ["retry", "qr_retry", "done", "reset_open", "cancel"], platforms: [.web, .ios, .android])
|
|
520
|
+
case .chatHistoryResetConfirm: return UiElementSpec(screen: .chat, kind: .dialogButton, actions: [.submit, .dismiss], allowedValues: nil, platforms: [.web])
|
|
521
|
+
case .chatSettingsLastSeenSelect: return UiElementSpec(screen: .chatSettings, kind: .segmented, actions: [.select, .tap], allowedValues: nil, platforms: [.web, .ios])
|
|
522
|
+
case .chatSettingsDisappearingSelect: return UiElementSpec(screen: .chatSettings, kind: .segmented, actions: [.select, .tap], allowedValues: nil, platforms: [.web, .ios])
|
|
523
|
+
case .chatSettingsNotificationToggle: return UiElementSpec(screen: .chatSettings, kind: .toggle, actions: [.toggle], allowedValues: ["on", "off"], platforms: [.web, .ios])
|
|
524
|
+
case .chatSettingsPrivacyToggle: return UiElementSpec(screen: .chatSettings, kind: .toggle, actions: [.toggle], allowedValues: ["on", "off"], platforms: [.web, .ios])
|
|
525
|
+
case .chatSettingsFontSizeSelect: return UiElementSpec(screen: .chatSettings, kind: .segmented, actions: [.select, .tap], allowedValues: nil, platforms: [.ios])
|
|
526
|
+
case .chatSettingsWallpaperSelect: return UiElementSpec(screen: .chatSettings, kind: .segmented, actions: [.select, .tap], allowedValues: nil, platforms: [.web, .ios])
|
|
527
|
+
case .chatSettingsExportChat: return UiElementSpec(screen: .chatSettings, kind: .button, actions: [.tap, .select, .dismiss], allowedValues: nil, platforms: [.ios])
|
|
528
|
+
case .chatSettingsClearCache: return UiElementSpec(screen: .chatSettings, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios])
|
|
529
|
+
case .notificationsItemOpen: return UiElementSpec(screen: .notifications, kind: .listItem, actions: [.tap], allowedValues: nil, platforms: [.ios])
|
|
530
|
+
case .notificationsItemDismiss: return UiElementSpec(screen: .notifications, kind: .gesture, actions: [.dismiss], allowedValues: nil, platforms: [.ios])
|
|
531
|
+
case .profileEditOpen: return UiElementSpec(screen: .profile, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.ios, .android])
|
|
532
|
+
case .profilePreviewOpen: return UiElementSpec(screen: .profile, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios])
|
|
533
|
+
case .profilePreferencesOpen: return UiElementSpec(screen: .profile, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios, .android])
|
|
534
|
+
case .profileSettingsOpen: return UiElementSpec(screen: .profile, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web])
|
|
535
|
+
case .profileChatSettingsOpen: return UiElementSpec(screen: .profile, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.ios])
|
|
536
|
+
case .profileChatTourOpen: return UiElementSpec(screen: .profile, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios])
|
|
537
|
+
case .profilePhotoOpen: return UiElementSpec(screen: .profile, kind: .gesture, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
538
|
+
case .profileVerifyIdentity: return UiElementSpec(screen: .profile, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios, .android])
|
|
539
|
+
case .profileShareInvite: return UiElementSpec(screen: .profile, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.ios, .android])
|
|
540
|
+
case .profileInviteCodeCopy: return UiElementSpec(screen: .profile, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios])
|
|
541
|
+
case .profileInviteCodeShare: return UiElementSpec(screen: .profile, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios])
|
|
542
|
+
case .profileUpgradeOpen: return UiElementSpec(screen: .profile, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
543
|
+
case .profileUnhook: return UiElementSpec(screen: .profile, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.android])
|
|
544
|
+
case .profileUnhookConfirm: return UiElementSpec(screen: .profile, kind: .dialogButton, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.android])
|
|
545
|
+
case .profileTabSelect: return UiElementSpec(screen: .profile, kind: .segmented, actions: [.select, .tap], allowedValues: nil, platforms: [.ios])
|
|
546
|
+
case .profileRetry: return UiElementSpec(screen: .profile, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
547
|
+
case .profileVoicePlay: return UiElementSpec(screen: .profile, kind: .toggle, actions: [.toggle], allowedValues: ["play", "pause"], platforms: [.web])
|
|
548
|
+
case .profileEditSave: return UiElementSpec(screen: .profileEdit, kind: .button, actions: [.submit], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
549
|
+
case .profileEditPreview: return UiElementSpec(screen: .profileEdit, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios])
|
|
550
|
+
case .profileEditPhotoAdd: return UiElementSpec(screen: .profileEdit, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
551
|
+
case .profileEditPhotoRemove: return UiElementSpec(screen: .profileEdit, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
552
|
+
case .profileEditPhotoRemoveConfirm: return UiElementSpec(screen: .profileEdit, kind: .dialogButton, actions: [.submit, .dismiss], allowedValues: nil, platforms: [.ios])
|
|
553
|
+
case .profileEditPhotoSetPrimary: return UiElementSpec(screen: .profileEdit, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
554
|
+
case .profileEditPhotoAdjust: return UiElementSpec(screen: .profileEdit, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios])
|
|
555
|
+
case .profileEditPhotoReorder: return UiElementSpec(screen: .profileEdit, kind: .gesture, actions: [.longPress], allowedValues: nil, platforms: [.ios])
|
|
556
|
+
case .profileEditPromptAdd: return UiElementSpec(screen: .profileEdit, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
557
|
+
case .profileEditPromptRemove: return UiElementSpec(screen: .profileEdit, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
558
|
+
case .profileEditVoiceAdd: return UiElementSpec(screen: .profileEdit, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
559
|
+
case .profileEditVoiceRemove: return UiElementSpec(screen: .profileEdit, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios])
|
|
560
|
+
case .profileEditChoiceSelect: return UiElementSpec(screen: .profileEdit, kind: .segmented, actions: [.select, .tap], allowedValues: nil, platforms: [.web, .ios])
|
|
561
|
+
case .preferencesSave: return UiElementSpec(screen: .preferences, kind: .button, actions: [.submit], allowedValues: nil, platforms: [.ios, .android])
|
|
562
|
+
case .preferencesUpgradeOpen: return UiElementSpec(screen: .preferences, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.ios])
|
|
563
|
+
case .preferencesLockedFilterTap: return UiElementSpec(screen: .preferences, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios])
|
|
564
|
+
case .settingsEmailManage: return UiElementSpec(screen: .settings, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
565
|
+
case .settingsPhoneUpdate: return UiElementSpec(screen: .settings, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.ios, .android])
|
|
566
|
+
case .settingsGoogleLink: return UiElementSpec(screen: .settings, kind: .toggle, actions: [.toggle], allowedValues: ["link", "unlink"], platforms: [.web, .ios, .android])
|
|
567
|
+
case .settingsAppleLink: return UiElementSpec(screen: .settings, kind: .toggle, actions: [.toggle], allowedValues: ["link", "unlink"], platforms: [.web, .ios])
|
|
568
|
+
case .settingsPasskeyAdd: return UiElementSpec(screen: .settings, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios])
|
|
569
|
+
case .settingsPasswordSet: return UiElementSpec(screen: .settings, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios])
|
|
570
|
+
case .settingsRecoverySetup: return UiElementSpec(screen: .settings, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
571
|
+
case .settingsDeviceRevoke: return UiElementSpec(screen: .settings, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
572
|
+
case .settingsDeviceRevokeConfirm: return UiElementSpec(screen: .settings, kind: .dialogButton, actions: [.submit, .dismiss], allowedValues: nil, platforms: [.ios, .android])
|
|
573
|
+
case .settingsSafetyOpen: return UiElementSpec(screen: .settings, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.ios])
|
|
574
|
+
case .settingsThemeSelect: return UiElementSpec(screen: .settings, kind: .segmented, actions: [.select, .tap], allowedValues: ["light", "dark", "system"], platforms: [.web, .ios, .android])
|
|
575
|
+
case .settingsThemeOpen: return UiElementSpec(screen: .settings, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
576
|
+
case .settingsSignOut: return UiElementSpec(screen: .settings, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
577
|
+
case .settingsSignOutConfirm: return UiElementSpec(screen: .settings, kind: .dialogButton, actions: [.submit, .dismiss], allowedValues: nil, platforms: [.ios])
|
|
578
|
+
case .settingsDeleteAccountOpen: return UiElementSpec(screen: .settings, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
579
|
+
case .settingsDeleteAccountConfirm: return UiElementSpec(screen: .settings, kind: .dialogButton, actions: [.submit, .dismiss], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
580
|
+
case .settingsUnblockUser: return UiElementSpec(screen: .settings, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios])
|
|
581
|
+
case .settingsUnblockConfirm: return UiElementSpec(screen: .settings, kind: .dialogButton, actions: [.submit, .dismiss], allowedValues: nil, platforms: [.ios])
|
|
582
|
+
case .settingsVerifyCodeSubmit: return UiElementSpec(screen: .settings, kind: .button, actions: [.submit, .dismiss], allowedValues: ["email", "phone"], platforms: [.ios, .android])
|
|
583
|
+
case .settingsPasswordSetConfirm: return UiElementSpec(screen: .settings, kind: .dialogButton, actions: [.submit, .dismiss], allowedValues: nil, platforms: [.ios])
|
|
584
|
+
case .settingsHelpLink: return UiElementSpec(screen: .settings, kind: .link, actions: [.tap], allowedValues: ["help_center", "faq", "contact", "safety", "privacy", "terms", "other"], platforms: [.ios])
|
|
585
|
+
case .settingsRecoveryApprove: return UiElementSpec(screen: .settings, kind: .dialogButton, actions: [.submit, .dismiss], allowedValues: nil, platforms: [.web, .ios])
|
|
586
|
+
case .settingsRecoveryQrSave: return UiElementSpec(screen: .settings, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
587
|
+
case .settingsRecoveryQrShare: return UiElementSpec(screen: .settings, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios, .android])
|
|
588
|
+
case .paywallPurchase: return UiElementSpec(screen: .paywall, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios])
|
|
589
|
+
case .paywallRestore: return UiElementSpec(screen: .paywall, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios, .android])
|
|
590
|
+
case .paywallFeaturesExpand: return UiElementSpec(screen: .paywall, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios])
|
|
591
|
+
case .photoViewerClose: return UiElementSpec(screen: .photoViewer, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
592
|
+
case .photoViewerPrevious: return UiElementSpec(screen: .photoViewer, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web])
|
|
593
|
+
case .photoViewerNext: return UiElementSpec(screen: .photoViewer, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web])
|
|
594
|
+
case .searchClose: return UiElementSpec(screen: .search, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web])
|
|
595
|
+
case .searchQueryClear: return UiElementSpec(screen: .search, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web])
|
|
596
|
+
case .searchFilterSelect: return UiElementSpec(screen: .search, kind: .segmented, actions: [.select, .tap], allowedValues: nil, platforms: [.web])
|
|
597
|
+
case .searchResultOpen: return UiElementSpec(screen: .search, kind: .listItem, actions: [.tap], allowedValues: nil, platforms: [.web])
|
|
598
|
+
case .createClose: return UiElementSpec(screen: .create, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web])
|
|
599
|
+
case .createOptionSelect: return UiElementSpec(screen: .create, kind: .menuItem, actions: [.tap], allowedValues: ["photo", "prompt", "voice"], platforms: [.web])
|
|
600
|
+
case .sharedAlertDismiss: return UiElementSpec(screen: .shared, kind: .dialogButton, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
601
|
+
case .sharedErrorRecover: return UiElementSpec(screen: .shared, kind: .button, actions: [.tap], allowedValues: ["retry", "home"], platforms: [.web])
|
|
602
|
+
case .sharedCountryCodeOpen: return UiElementSpec(screen: .shared, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
603
|
+
case .sharedCountryCodeSelect: return UiElementSpec(screen: .shared, kind: .segmented, actions: [.select, .tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
604
|
+
case .sharedVoiceRecorder: return UiElementSpec(screen: .shared, kind: .button, actions: [.tap], allowedValues: ["record", "stop", "play", "pause", "save", "discard", "cancel", "open_settings"], platforms: [.web, .ios])
|
|
605
|
+
case .sharedPromptPresetSelect: return UiElementSpec(screen: .shared, kind: .segmented, actions: [.select, .tap], allowedValues: nil, platforms: [.web, .ios])
|
|
606
|
+
case .livenessBegin: return UiElementSpec(screen: .liveness, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
607
|
+
case .livenessDismiss: return UiElementSpec(screen: .liveness, kind: .button, actions: [.tap, .dismiss], allowedValues: nil, platforms: [.ios, .android])
|
|
608
|
+
case .livenessRetry: return UiElementSpec(screen: .liveness, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.web, .ios, .android])
|
|
609
|
+
case .livenessOpenSettings: return UiElementSpec(screen: .liveness, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.ios, .android])
|
|
610
|
+
case .livenessClose: return UiElementSpec(screen: .liveness, kind: .button, actions: [.tap], allowedValues: nil, platforms: [.android])
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
public var screen: TelemetryScreen { spec.screen }
|
|
615
|
+
public var defaultAction: UiAction { spec.actions[0] }
|
|
616
|
+
|
|
617
|
+
/// Elements in scope for `platform` (what its coverage test must find instrumented).
|
|
618
|
+
public static func inScope(for platform: TelemetryPlatform) -> [UiElement] {
|
|
619
|
+
allCases.filter { $0.spec.platforms.contains(platform) }
|
|
620
|
+
}
|
|
621
|
+
}
|