Replace EventLogger with typed AnalyticsManager using PostHog

Complete analytics overhaul: delete EventLogger.swift, create Analytics.swift
with typed event enum (~45 events), screen tracking, super properties
(theme, icon pack, voting layout, etc.), session replay with kill switch,
autocapture, and network telemetry. Replace all 99 call sites across 38 files
with compiler-enforced typed events in object_action naming convention.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-02-10 15:12:33 -06:00
parent a08d0d33c0
commit e0330dbc8d
38 changed files with 1048 additions and 202 deletions

View File

@@ -46,8 +46,7 @@ struct CreateWidgetView: View {
}
func update(eye: CustomWidgetEyes, eyeOption: CustomWidgeImageOptions) {
EventLogger.log(event: "create_widget_view_update_eye",
withData: ["eye_value": eye.rawValue, "eye_option_value": eyeOption.rawValue])
AnalyticsManager.shared.track(.widgetEyeUpdated(style: eyeOption.rawValue))
switch eye {
case .left:
customWidget.leftEye = eyeOption
@@ -57,7 +56,7 @@ struct CreateWidgetView: View {
}
func createRandom() {
EventLogger.log(event: "create_widget_view_create_random")
AnalyticsManager.shared.track(.widgetRandomized)
customWidget.bgColor = Color.random()
customWidget.innerColor = Color.random()
customWidget.bgOverlayColor = Color.random()
@@ -74,14 +73,12 @@ struct CreateWidgetView: View {
}
func update(mouthOption: CustomWidgeImageOptions) {
EventLogger.log(event: "create_widget_view_update_mouth",
withData: ["mouthOption": mouthOption.rawValue])
AnalyticsManager.shared.track(.widgetMouthUpdated(style: mouthOption.rawValue))
customWidget.mouth = mouthOption
}
func update(background: CustomWidgetBackGroundOptions) {
EventLogger.log(event: "create_widget_view_update_background",
withData: ["background": background.rawValue])
AnalyticsManager.shared.track(.widgetBackgroundUpdated(style: background.rawValue))
customWidget.background = background
}
@@ -101,7 +98,7 @@ struct CreateWidgetView: View {
var bottomBarButtons: some View {
HStack(alignment: .center, spacing: 0) {
Button(action: {
EventLogger.log(event: "create_widget_view_shuffle")
AnalyticsManager.shared.track(.widgetShuffled)
createRandom()
}, label: {
Image(systemName: "shuffle")
@@ -114,7 +111,7 @@ struct CreateWidgetView: View {
.background(.blue)
Button(action: {
EventLogger.log(event: "create_widget_view_save_widget")
AnalyticsManager.shared.track(.widgetCreated)
UserDefaultsStore.saveCustomWidget(widgetModel: customWidget, inUse: false)
let impactMed = UIImpactFeedbackGenerator(style: .heavy)
impactMed.impactOccurred()
@@ -132,7 +129,7 @@ struct CreateWidgetView: View {
.background(.green)
Button(action: {
EventLogger.log(event: "customize_view_use_widget")
AnalyticsManager.shared.track(.widgetUsed)
UserDefaultsStore.saveCustomWidget(widgetModel: customWidget, inUse: true)
let impactMed = UIImpactFeedbackGenerator(style: .heavy)
impactMed.impactOccurred()
@@ -151,7 +148,7 @@ struct CreateWidgetView: View {
if customWidget.isSaved {
Button(action: {
EventLogger.log(event: "customize_view_delete_widget")
AnalyticsManager.shared.track(.widgetDeleted)
UserDefaultsStore.deleteCustomWidget(withUUID: customWidget.uuid)
let impactMed = UIImpactFeedbackGenerator(style: .heavy)
impactMed.impactOccurred()
@@ -178,7 +175,7 @@ struct CreateWidgetView: View {
Text(String(localized: "create_widget_background_color"))
ColorPicker("", selection: $customWidget.bgColor)
.onChange(of: customWidget.bgColor) {
EventLogger.log(event: "create_widget_view_update_background_color")
AnalyticsManager.shared.track(.widgetColorUpdated(part: "background"))
}
.labelsHidden()
}
@@ -188,7 +185,7 @@ struct CreateWidgetView: View {
Text(String(localized: "create_widget_inner_color"))
ColorPicker("", selection: $customWidget.innerColor)
.onChange(of: customWidget.innerColor) {
EventLogger.log(event: "create_widget_view_update_inner_color")
AnalyticsManager.shared.track(.widgetColorUpdated(part: "inner"))
}
.labelsHidden()
}
@@ -198,7 +195,7 @@ struct CreateWidgetView: View {
Text(String(localized: "create_widget_face_outline_color"))
ColorPicker("", selection: $customWidget.circleStrokeColor)
.onChange(of: customWidget.circleStrokeColor) {
EventLogger.log(event: "create_widget_view_update_outline_color")
AnalyticsManager.shared.track(.widgetColorUpdated(part: "outline"))
}
.labelsHidden()
}
@@ -210,7 +207,7 @@ struct CreateWidgetView: View {
Text(String(localized: "create_widget_view_left_eye_color"))
ColorPicker("", selection: $customWidget.leftEyeColor)
.onChange(of: customWidget.leftEyeColor) {
EventLogger.log(event: "create_widget_view_update_left_eye_color")
AnalyticsManager.shared.track(.widgetColorUpdated(part: "left_eye"))
}
.labelsHidden()
}
@@ -220,7 +217,7 @@ struct CreateWidgetView: View {
Text(String(localized: "create_widget_view_right_eye_color"))
ColorPicker("", selection: $customWidget.rightEyeColor)
.onChange(of: customWidget.rightEyeColor) {
EventLogger.log(event: "create_widget_view_update_right_eye_color")
AnalyticsManager.shared.track(.widgetColorUpdated(part: "right_eye"))
}
.labelsHidden()
}
@@ -230,7 +227,7 @@ struct CreateWidgetView: View {
Text(String(localized: "create_widget_view_mouth_color"))
ColorPicker("", selection: $customWidget.mouthColor)
.onChange(of: customWidget.mouthColor) {
EventLogger.log(event: "create_widget_view_update_mouth_color")
AnalyticsManager.shared.track(.widgetColorUpdated(part: "mouth"))
}
.labelsHidden()
}