From 6f608efa7fb2dbd5d7fbd1e64bb8b6389fcb8696 Mon Sep 17 00:00:00 2001 From: Thomas Ricouard Date: Tue, 13 Aug 2024 12:41:46 +0200 Subject: [PATCH 1/8] Switch to gpt4 o-mini --- Packages/Network/Sources/Network/OpenAIClient.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Packages/Network/Sources/Network/OpenAIClient.swift b/Packages/Network/Sources/Network/OpenAIClient.swift index f3ceca6f..574a007d 100644 --- a/Packages/Network/Sources/Network/OpenAIClient.swift +++ b/Packages/Network/Sources/Network/OpenAIClient.swift @@ -25,7 +25,7 @@ public struct OpenAIClient { public let content: String } - let model = "gpt-4o" + let model = "gpt-4o-mini" let messages: [Message] let temperature: CGFloat @@ -52,7 +52,7 @@ public struct OpenAIClient { public let content: [MessageContent] } - let model = "gpt-4o" + let model = "gpt-4o-mini" let messages: [Message] let maxTokens = 50 } From 77bec1fae347adef1f3fd643115b8a65cbb60dcd Mon Sep 17 00:00:00 2001 From: Ahnaf Mahmud <44692189+infinitepower18@users.noreply.github.com> Date: Wed, 14 Aug 2024 07:43:35 +0100 Subject: [PATCH 2/8] Remove space between Settings and ellipsis (#2125) --- .../Localization/Localizable.xcstrings | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/IceCubesApp/Resources/Localization/Localizable.xcstrings b/IceCubesApp/Resources/Localization/Localizable.xcstrings index 26520ef5..dd38fee4 100644 --- a/IceCubesApp/Resources/Localization/Localizable.xcstrings +++ b/IceCubesApp/Resources/Localization/Localizable.xcstrings @@ -35814,44 +35814,44 @@ "localizations" : { "be" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Налады ..." + "state" : "translated", + "value" : "Налады..." } }, "ca" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Configuració ..." + "state" : "translated", + "value" : "Configuració..." } }, "de" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Einstellungen ..." + "state" : "translated", + "value" : "Einstellungen..." } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "Settings ..." + "value" : "Settings..." } }, "en-GB" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Settings ..." + "state" : "translated", + "value" : "Settings..." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Ajustes ..." + "value" : "Ajustes..." } }, "eu" : { "stringUnit" : { "state" : "translated", - "value" : "Ezarpenak ..." + "value" : "Ezarpenak..." } }, "fr" : { @@ -35862,26 +35862,26 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Impostazioni ..." + "state" : "translated", + "value" : "Impostazioni..." } }, "ja" : { "stringUnit" : { - "state" : "needs_review", - "value" : "設定 ..." + "state" : "translated", + "value" : "設定..." } }, "ko" : { "stringUnit" : { - "state" : "needs_review", - "value" : "앱 설정 ..." + "state" : "translated", + "value" : "앱 설정..." } }, "nb" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Innstillinger ..." + "state" : "translated", + "value" : "Innstillinger..." } }, "nl" : { @@ -35892,38 +35892,38 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Ustawienia ..." + "state" : "translated", + "value" : "Ustawienia..." } }, "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Configurações ..." + "state" : "translated", + "value" : "Configurações..." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Ayarlar ..." + "value" : "Ayarlar..." } }, "uk" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Налаштування ..." + "state" : "translated", + "value" : "Налаштування..." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "设置 ..." + "value" : "设置..." } }, "zh-Hant" : { "stringUnit" : { - "state" : "needs_review", - "value" : "設定 ..." + "state" : "translated", + "value" : "設定..." } } } From 113c4f1c848edcf58a9884c69d979ccad46d6e44 Mon Sep 17 00:00:00 2001 From: Thomas Ricouard Date: Wed, 14 Aug 2024 08:45:20 +0200 Subject: [PATCH 3/8] Display push notification while in the app --- Packages/Env/Sources/Env/PushNotificationsService.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Packages/Env/Sources/Env/PushNotificationsService.swift b/Packages/Env/Sources/Env/PushNotificationsService.swift index 17bb27a9..f271a6dd 100644 --- a/Packages/Env/Sources/Env/PushNotificationsService.swift +++ b/Packages/Env/Sources/Env/PushNotificationsService.swift @@ -154,6 +154,11 @@ extension PushNotificationsService: UNUserNotificationCenterDelegate { handledNotification = .init(account: account.account, notification: notification) } catch {} } + + public func userNotificationCenter(_ center: UNUserNotificationCenter, + willPresent notification: UNNotification) async -> UNNotificationPresentationOptions { + return [.banner, .sound] + } } extension Data { From 4158f7c959ceddd1b3077db7490049724b7d8f70 Mon Sep 17 00:00:00 2001 From: Thomas Ricouard Date: Wed, 14 Aug 2024 08:47:57 +0200 Subject: [PATCH 4/8] Bump version to 1.10.48 --- IceCubesApp.xcodeproj/project.pbxproj | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/IceCubesApp.xcodeproj/project.pbxproj b/IceCubesApp.xcodeproj/project.pbxproj index 8c5647db..4e5924f6 100644 --- a/IceCubesApp.xcodeproj/project.pbxproj +++ b/IceCubesApp.xcodeproj/project.pbxproj @@ -1193,7 +1193,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.10.47; + MARKETING_VERSION = 1.10.48; PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_ID_PREFIX).IceCubesApp.IceCubesNotifications"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -1228,7 +1228,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.10.47; + MARKETING_VERSION = 1.10.48; PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_ID_PREFIX).IceCubesApp.IceCubesNotifications"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -1267,7 +1267,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.10.47; + MARKETING_VERSION = 1.10.48; PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_ID_PREFIX).IceCubesApp.IceCubesAppWidgetsExtension"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -1303,7 +1303,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.10.47; + MARKETING_VERSION = 1.10.48; PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_ID_PREFIX).IceCubesApp.IceCubesAppWidgetsExtension"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -1336,7 +1336,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.10.47; + MARKETING_VERSION = 1.10.48; PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_ID_PREFIX).IceCubesApp.IceCubesShareExtension"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -1370,7 +1370,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.10.47; + MARKETING_VERSION = 1.10.48; PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_ID_PREFIX).IceCubesApp.IceCubesShareExtension"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -1552,7 +1552,7 @@ LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 13.0; - MARKETING_VERSION = 1.10.47; + MARKETING_VERSION = 1.10.48; PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_ID_PREFIX).IceCubesApp"; PRODUCT_NAME = "Ice Cubes"; SDKROOT = auto; @@ -1608,7 +1608,7 @@ LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 13.0; - MARKETING_VERSION = 1.10.47; + MARKETING_VERSION = 1.10.48; PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_ID_PREFIX).IceCubesApp"; PRODUCT_NAME = "Ice Cubes"; SDKROOT = auto; @@ -1643,7 +1643,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.10.47; + MARKETING_VERSION = 1.10.48; PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_ID_PREFIX).IceCubesApp.IceCubesActionExtension"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -1678,7 +1678,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.10.47; + MARKETING_VERSION = 1.10.48; PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_ID_PREFIX).IceCubesApp.IceCubesActionExtension"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; From 456d85eda218acd0bcb5cb665d52f87704ff8ee8 Mon Sep 17 00:00:00 2001 From: Thomas Ricouard Date: Wed, 14 Aug 2024 17:22:27 +0200 Subject: [PATCH 5/8] New alternative icon settings --- IceCubesApp.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/IceCubesApp.xcodeproj/project.pbxproj b/IceCubesApp.xcodeproj/project.pbxproj index 4e5924f6..81604d1d 100644 --- a/IceCubesApp.xcodeproj/project.pbxproj +++ b/IceCubesApp.xcodeproj/project.pbxproj @@ -1514,10 +1514,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = "AppIconAlternate0 AppIconAlternate6 AppIconAlternate7 AppIconAlternate8 AppIconAlternate10 AppIconAlternate11 AppIconAlternate12 AppIconAlternate13 AppIconAlternate14 AppIconAlternate15 AppIconAlternate16 AppIconAlternate17 AppIconAlternate19 AppIconAlternate18 AppIconAlternate20 AppIconAlternate21 AppIconAlternate22 AppIconAlternate23 AppIconAlternate24 AppIconAlternate25 AppIconAlternate26 AppIconAlternate27 AppIconAlternate28 AppIconAlternate29 AppIconAlternate30 AppIconAlternate31 AppIconAlternate32 AppIconAlternate33 AppIconAlternate34 AppIconAlternate35 AppIconAlternate36 AppIconAlternate37 AppIconAlternate38 AppIconAlternate39 AppIconAlternate40 AppIconAlternate42 AppIconAlternate2 AppIconAlternate41 AppIconAlternate45 AppIconAlternate44 AppIconAlternate1 AppIconAlternate4 AppIconAlternate3 AppIconAlternate5 AppIconAlternate46 AppIconAlternate9 AppIconAlternate49 AppIconAlternate48 AppIconAlternate47 AppIconAlternate43"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; + ASSETCATALOG_COMPILER_STANDALONE_ICON_BEHAVIOR = all; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = NO; CODE_SIGN_ENTITLEMENTS = IceCubesApp/App/IceCubesApp.entitlements; CODE_SIGN_IDENTITY = "-"; @@ -1570,10 +1570,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = "AppIconAlternate0 AppIconAlternate6 AppIconAlternate7 AppIconAlternate8 AppIconAlternate10 AppIconAlternate11 AppIconAlternate12 AppIconAlternate13 AppIconAlternate14 AppIconAlternate15 AppIconAlternate16 AppIconAlternate17 AppIconAlternate19 AppIconAlternate18 AppIconAlternate20 AppIconAlternate21 AppIconAlternate22 AppIconAlternate23 AppIconAlternate24 AppIconAlternate25 AppIconAlternate26 AppIconAlternate27 AppIconAlternate28 AppIconAlternate29 AppIconAlternate30 AppIconAlternate31 AppIconAlternate32 AppIconAlternate33 AppIconAlternate34 AppIconAlternate35 AppIconAlternate36 AppIconAlternate37 AppIconAlternate38 AppIconAlternate39 AppIconAlternate40 AppIconAlternate42 AppIconAlternate2 AppIconAlternate41 AppIconAlternate45 AppIconAlternate44 AppIconAlternate1 AppIconAlternate4 AppIconAlternate3 AppIconAlternate5 AppIconAlternate46 AppIconAlternate9 AppIconAlternate49 AppIconAlternate48 AppIconAlternate47 AppIconAlternate43"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; + ASSETCATALOG_COMPILER_STANDALONE_ICON_BEHAVIOR = all; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = NO; CODE_SIGN_ENTITLEMENTS = "IceCubesApp/App/IceCubesApp-release.entitlements"; CODE_SIGN_IDENTITY = "-"; From a737ac19e51e32d49224967d7cfef2d903f746b0 Mon Sep 17 00:00:00 2001 From: Thomas Ricouard Date: Wed, 14 Aug 2024 17:22:44 +0200 Subject: [PATCH 6/8] Add Labels in settings --- IceCubesApp/App/Tabs/Settings/SettingsTab.swift | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/IceCubesApp/App/Tabs/Settings/SettingsTab.swift b/IceCubesApp/App/Tabs/Settings/SettingsTab.swift index 9b8410db..d166eef2 100644 --- a/IceCubesApp/App/Tabs/Settings/SettingsTab.swift +++ b/IceCubesApp/App/Tabs/Settings/SettingsTab.swift @@ -136,10 +136,10 @@ struct SettingsTabs: View { } } } + addAccountButton if !appAccountsManager.availableAccounts.isEmpty { editAccountButton } - addAccountButton } #if !os(visionOS) .listRowBackground(theme.primaryBackgroundColor) @@ -154,6 +154,7 @@ struct SettingsTabs: View { await timelineCache.clearCache(for: client.id) await sub.deleteSubscription() appAccountsManager.delete(account: account) + Telemetry.signal("account.removed") } } @@ -314,7 +315,7 @@ struct SettingsTabs: View { Button { addAccountSheetPresented.toggle() } label: { - Text("settings.account.add") + Label("settings.account.add", systemImage: "person.badge.plus") } .sheet(isPresented: $addAccountSheetPresented) { AddAccountView() @@ -322,15 +323,17 @@ struct SettingsTabs: View { } private var editAccountButton: some View { - Button(role: isEditingAccount ? .none : .destructive) { + Button(role: .destructive) { withAnimation { isEditingAccount.toggle() } } label: { if isEditingAccount { - Text("action.done") + Label("action.done", systemImage: "person.badge.minus") + .foregroundStyle(.red) } else { - Text("account.action.logout") + Label("account.action.logout", systemImage: "person.badge.minus") + .foregroundStyle(.red) } } } From 56869e3a2f24b662e142defc8ff324d0d85e3523 Mon Sep 17 00:00:00 2001 From: Thomas Ricouard Date: Wed, 14 Aug 2024 17:23:00 +0200 Subject: [PATCH 7/8] Allow cancel add account sheet even when no account --- IceCubesApp/App/Tabs/Settings/AddAccountsView.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/IceCubesApp/App/Tabs/Settings/AddAccountsView.swift b/IceCubesApp/App/Tabs/Settings/AddAccountsView.swift index 325dca87..741be139 100644 --- a/IceCubesApp/App/Tabs/Settings/AddAccountsView.swift +++ b/IceCubesApp/App/Tabs/Settings/AddAccountsView.swift @@ -88,9 +88,7 @@ struct AddAccountView: View { .scrollDismissesKeyboard(.immediately) #endif .toolbar { - if !appAccountsManager.availableAccounts.isEmpty { - CancelToolbarItem() - } + CancelToolbarItem() } .onAppear { isInstanceURLFieldFocused = true @@ -290,6 +288,7 @@ struct AddAccountView: View { let oauthToken = try await client.continueOauthFlow(url: url) let client = Client(server: client.server, oauthToken: oauthToken) let account: Account = try await client.get(endpoint: Accounts.verifyCredentials) + Telemetry.signal("account.added") appAccountsManager.add(account: AppAccount(server: client.server, accountName: "\(account.acct)@\(client.server)", oauthToken: oauthToken)) From 9d11814e4904373a07ed78591de120c514d7656b Mon Sep 17 00:00:00 2001 From: Thomas Ricouard Date: Wed, 14 Aug 2024 17:23:10 +0200 Subject: [PATCH 8/8] Add TelemetryDeck --- .../xcshareddata/swiftpm/Package.resolved | 9 +++++++++ IceCubesApp/App/Main/IceCubesApp.swift | 2 ++ .../Tabs/Settings/AccountSettingView.swift | 3 ++- .../App/Tabs/Timeline/TimelineTab.swift | 4 +++- PRIVACY.MD | 2 ++ Packages/Env/Package.swift | 2 ++ Packages/Env/Sources/Env/Telemetry.swift | 19 +++++++++++++++++++ .../Timeline/View/TimelineViewModel.swift | 5 ++++- 8 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 Packages/Env/Sources/Env/Telemetry.swift diff --git a/IceCubesApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/IceCubesApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 4a1d13bf..e42e2b04 100644 --- a/IceCubesApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/IceCubesApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -117,6 +117,15 @@ "version" : "0.3.0" } }, + { + "identity" : "swiftsdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/TelemetryDeck/SwiftSDK", + "state" : { + "revision" : "13a26cf125b70d695913eb9bea9f9b9c29da5790", + "version" : "2.3.0" + } + }, { "identity" : "swiftsoup", "kind" : "remoteSourceControl", diff --git a/IceCubesApp/App/Main/IceCubesApp.swift b/IceCubesApp/App/Main/IceCubesApp.swift index cc64b64d..83cbef7e 100644 --- a/IceCubesApp/App/Main/IceCubesApp.swift +++ b/IceCubesApp/App/Main/IceCubesApp.swift @@ -87,6 +87,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { try? AVAudioSession.sharedInstance().setCategory(.ambient, options: .mixWithOthers) try? AVAudioSession.sharedInstance().setActive(true) PushNotificationsService.shared.setAccounts(accounts: AppAccountsManager.shared.pushAccounts) + Telemetry.setup() + Telemetry.signal("app.launched") return true } diff --git a/IceCubesApp/App/Tabs/Settings/AccountSettingView.swift b/IceCubesApp/App/Tabs/Settings/AccountSettingView.swift index ecf3d0fc..d93631a5 100644 --- a/IceCubesApp/App/Tabs/Settings/AccountSettingView.swift +++ b/IceCubesApp/App/Tabs/Settings/AccountSettingView.swift @@ -85,11 +85,12 @@ struct AccountSettingsView: View { await sub.deleteSubscription() } appAccountsManager.delete(account: appAccount) + Telemetry.signal("account.removed") dismiss() } } } label: { - Text("account.action.logout") + Label("account.action.logout", systemImage: "trash") .frame(maxWidth: .infinity) } } diff --git a/IceCubesApp/App/Tabs/Timeline/TimelineTab.swift b/IceCubesApp/App/Tabs/Timeline/TimelineTab.swift index f4b9852b..b6989128 100644 --- a/IceCubesApp/App/Tabs/Timeline/TimelineTab.swift +++ b/IceCubesApp/App/Tabs/Timeline/TimelineTab.swift @@ -218,9 +218,11 @@ struct TimelineTab: View { Button { withAnimation { if let index { - pinnedFilters.remove(at: index) + let timeline = pinnedFilters.remove(at: index) + Telemetry.signal("timeline.pin.removed", parameters: ["timeline" : timeline.rawValue]) } else { pinnedFilters.append(timeline) + Telemetry.signal("timeline.pin.added", parameters: ["timeline" : timeline.rawValue]) } } } label: { diff --git a/PRIVACY.MD b/PRIVACY.MD index 6d2fae3d..93fa1da8 100644 --- a/PRIVACY.MD +++ b/PRIVACY.MD @@ -1,3 +1,5 @@ IceCubesApp does not collect or process any personal information from its users. The app is used to connect to third-party Mastodon servers that may or may not collect personal information and are not covered by this privacy policy. Each third-party Mastodon server comes equipped with its own privacy policy that can be viewed through the app or through that server's website. When you use the OpenAI feature in the composer, please be aware that your input will be sent to the OpenAI server in order to generate a response. Please refer to the [OpenAI Privacy Policy](https://openai.com/policies/privacy-policy) if you want to know more. Nothing is sent to OpenAI if you don't use this feature. You can also completely disable this button in the app settings. + +Ice Cubes use TelemetryDeck to collect anonymized usage data. This helps us understand how our users are using our app and how we can improve it. TelemetryDeck does not collect any personally identifiable information. You can read more about TelemetryDeck’s [privacy policy](https://telemetrydeck.com/privacy) diff --git a/Packages/Env/Package.swift b/Packages/Env/Package.swift index 8c7b09b4..0ffd5dd6 100644 --- a/Packages/Env/Package.swift +++ b/Packages/Env/Package.swift @@ -20,6 +20,7 @@ let package = Package( .package(name: "Models", path: "../Models"), .package(name: "Network", path: "../Network"), .package(url: "https://github.com/evgenyneu/keychain-swift", branch: "master"), + .package(url: "https://github.com/TelemetryDeck/SwiftSDK", from: "2.3.0") ], targets: [ .target( @@ -28,6 +29,7 @@ let package = Package( .product(name: "Models", package: "Models"), .product(name: "Network", package: "Network"), .product(name: "KeychainSwift", package: "keychain-swift"), + .product(name: "TelemetryDeck", package: "SwiftSDK") ], swiftSettings: [ .enableExperimentalFeature("StrictConcurrency"), diff --git a/Packages/Env/Sources/Env/Telemetry.swift b/Packages/Env/Sources/Env/Telemetry.swift new file mode 100644 index 00000000..f676d5a2 --- /dev/null +++ b/Packages/Env/Sources/Env/Telemetry.swift @@ -0,0 +1,19 @@ +import TelemetryDeck +import SwiftUI + +@MainActor +public class Telemetry { + static var userId: String? { + CurrentAccount.shared.account?.id + } + + public static func setup() { + let config = TelemetryDeck.Config(appID: "F04175D2-599A-4504-867E-CE870B991EB7") + TelemetryDeck.initialize(config: config) + } + + + public static func signal(_ event: String, parameters: [String: String] = [:]) { + TelemetryDeck.signal(event, parameters: parameters, customUserID: userId) + } +} diff --git a/Packages/Timeline/Sources/Timeline/View/TimelineViewModel.swift b/Packages/Timeline/Sources/Timeline/View/TimelineViewModel.swift index b2f94a11..019bac29 100644 --- a/Packages/Timeline/Sources/Timeline/View/TimelineViewModel.swift +++ b/Packages/Timeline/Sources/Timeline/View/TimelineViewModel.swift @@ -9,7 +9,7 @@ import SwiftUI @Observable class TimelineViewModel { var scrollToIndex: Int? var statusesState: StatusesState = .loading - var timeline: TimelineFilter = .federated { + var timeline: TimelineFilter = .home { willSet { if timeline == .home, newValue != .resume { saveMarker() @@ -21,6 +21,9 @@ import SwiftUI await handleLatestOrResume(oldValue) if oldValue != timeline { + Telemetry.signal("timeline.filter.updated", + parameters: ["timeline": timeline.rawValue]) + await reset() pendingStatusesObserver.pendingStatuses = [] tag = nil