202 lines
5.7 KiB
Swift
202 lines
5.7 KiB
Swift
import Foundation
|
|
import FirebaseAnalytics
|
|
import FirebaseCore
|
|
|
|
class FirebaseService {
|
|
static let shared = FirebaseService()
|
|
|
|
private var isConfigured: Bool {
|
|
FirebaseApp.app() != nil
|
|
}
|
|
|
|
private init() {}
|
|
|
|
// MARK: - User Properties
|
|
|
|
func setUserTier(_ tier: UserTier) {
|
|
guard isConfigured else { return }
|
|
Analytics.setUserProperty(tier.rawValue, forName: "user_tier")
|
|
}
|
|
|
|
enum UserTier: String {
|
|
case free = "free"
|
|
case premium = "premium"
|
|
}
|
|
|
|
// MARK: - Screen Tracking
|
|
|
|
func logScreenView(screenName: String, screenClass: String? = nil) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent(AnalyticsEventScreenView, parameters: [
|
|
AnalyticsParameterScreenName: screenName,
|
|
AnalyticsParameterScreenClass: screenClass ?? screenName
|
|
])
|
|
}
|
|
|
|
// MARK: - Investment Events
|
|
|
|
func logSourceAdded(categoryName: String, sourceCount: Int) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("source_added", parameters: [
|
|
"category_name": categoryName,
|
|
"total_sources": sourceCount
|
|
])
|
|
}
|
|
|
|
func logSourceDeleted(categoryName: String) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("source_deleted", parameters: [
|
|
"category_name": categoryName
|
|
])
|
|
}
|
|
|
|
func logSnapshotAdded(sourceName: String, value: Decimal) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("snapshot_added", parameters: [
|
|
"source_name": sourceName,
|
|
"value": NSDecimalNumber(decimal: value).doubleValue
|
|
])
|
|
}
|
|
|
|
func logCategoryCreated(name: String) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("category_created", parameters: [
|
|
"category_name": name
|
|
])
|
|
}
|
|
|
|
// MARK: - Purchase Events
|
|
|
|
func logPaywallShown(trigger: String) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("paywall_shown", parameters: [
|
|
"trigger": trigger
|
|
])
|
|
}
|
|
|
|
func logPurchaseAttempt(productId: String) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("purchase_attempt", parameters: [
|
|
"product_id": productId
|
|
])
|
|
}
|
|
|
|
func logPurchaseSuccess(productId: String, price: Decimal, isFamilyShared: Bool) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent(AnalyticsEventPurchase, parameters: [
|
|
AnalyticsParameterItemID: productId,
|
|
AnalyticsParameterPrice: NSDecimalNumber(decimal: price).doubleValue,
|
|
AnalyticsParameterCurrency: "EUR",
|
|
"is_family_shared": isFamilyShared
|
|
])
|
|
}
|
|
|
|
func logPurchaseFailure(productId: String, error: String) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("purchase_failed", parameters: [
|
|
"product_id": productId,
|
|
"error": error
|
|
])
|
|
}
|
|
|
|
func logRestorePurchases(success: Bool) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("restore_purchases", parameters: [
|
|
"success": success
|
|
])
|
|
}
|
|
|
|
// MARK: - Feature Usage Events
|
|
|
|
func logChartViewed(chartType: String, isPremium: Bool) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("chart_viewed", parameters: [
|
|
"chart_type": chartType,
|
|
"is_premium_chart": isPremium
|
|
])
|
|
}
|
|
|
|
func logPredictionViewed(algorithm: String) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("prediction_viewed", parameters: [
|
|
"algorithm": algorithm
|
|
])
|
|
}
|
|
|
|
func logExportAttempt(format: String, success: Bool) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("export_attempt", parameters: [
|
|
"format": format,
|
|
"success": success
|
|
])
|
|
}
|
|
|
|
func logNotificationScheduled(frequency: String) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("notification_scheduled", parameters: [
|
|
"frequency": frequency
|
|
])
|
|
}
|
|
|
|
// MARK: - Ad Events
|
|
|
|
func logAdImpression(adType: String) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("ad_impression", parameters: [
|
|
"ad_type": adType
|
|
])
|
|
}
|
|
|
|
func logAdClick(adType: String) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("ad_click", parameters: [
|
|
"ad_type": adType
|
|
])
|
|
}
|
|
|
|
// MARK: - Engagement Events
|
|
|
|
func logOnboardingCompleted(stepCount: Int) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("onboarding_completed", parameters: [
|
|
"steps_completed": stepCount
|
|
])
|
|
}
|
|
|
|
func logWidgetUsed(widgetType: String) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("widget_used", parameters: [
|
|
"widget_type": widgetType
|
|
])
|
|
}
|
|
|
|
func logAppOpened(fromWidget: Bool) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("app_opened", parameters: [
|
|
"from_widget": fromWidget
|
|
])
|
|
}
|
|
|
|
// MARK: - Portfolio Events
|
|
|
|
func logPortfolioMilestone(totalValue: Decimal, milestone: String) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("portfolio_milestone", parameters: [
|
|
"total_value": NSDecimalNumber(decimal: totalValue).doubleValue,
|
|
"milestone": milestone
|
|
])
|
|
}
|
|
|
|
// MARK: - Error Events
|
|
|
|
func logError(type: String, message: String, context: String? = nil) {
|
|
guard isConfigured else { return }
|
|
Analytics.logEvent("app_error", parameters: [
|
|
"error_type": type,
|
|
"error_message": message,
|
|
"context": context ?? ""
|
|
])
|
|
}
|
|
}
|
|
|