85 lines
3.2 KiB
Swift
85 lines
3.2 KiB
Swift
import SwiftUI
|
|
|
|
struct RootView: View {
|
|
@StateObject private var localization = LocalizationStore()
|
|
@EnvironmentObject private var analytics: HermesAnalyticsClient
|
|
@EnvironmentObject private var repository: HermesRepository
|
|
|
|
let onStartSession: (String) -> Void
|
|
|
|
var body: some View {
|
|
NavigationStack {
|
|
ScrollView {
|
|
VStack(alignment: .leading, spacing: 24) {
|
|
header
|
|
OnboardingView(onStartSession: { onStartSession(localization.localeCode) })
|
|
FeedView(onRetry: { onStartSession(localization.localeCode) })
|
|
RoundView(onRetry: { onStartSession(localization.localeCode) })
|
|
SessionView(onRetry: { onStartSession(localization.localeCode) })
|
|
SettingsView()
|
|
}
|
|
.padding(.horizontal, HermesTheme.screenPadding)
|
|
.padding(.vertical, 24)
|
|
}
|
|
.background(HermesTheme.background.ignoresSafeArea())
|
|
.navigationTitle(localization.string(for: "app.name"))
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
}
|
|
.environmentObject(localization)
|
|
.onAppear {
|
|
analytics.track("app_opened", attributes: ["screen_name": "home"])
|
|
analytics.track("screen_viewed", attributes: ["screen_name": "home"])
|
|
}
|
|
.task(id: localization.localeCode) {
|
|
onStartSession(localization.localeCode)
|
|
}
|
|
.task {
|
|
while !Task.isCancelled {
|
|
try? await Task.sleep(nanoseconds: 5_000_000_000)
|
|
await analytics.flush(using: repository)
|
|
}
|
|
}
|
|
}
|
|
|
|
private var header: some View {
|
|
HStack(alignment: .top) {
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
Text(localization.string(for: "app.name"))
|
|
.font(.largeTitle.bold())
|
|
.foregroundStyle(HermesTheme.textPrimary)
|
|
Text(localization.string(for: "app.subtitle"))
|
|
.font(.callout)
|
|
.foregroundStyle(HermesTheme.textSecondary)
|
|
}
|
|
|
|
Spacer(minLength: 12)
|
|
|
|
localeToggle
|
|
}
|
|
}
|
|
|
|
private var localeToggle: some View {
|
|
HStack(spacing: 8) {
|
|
localeButton(title: localization.localeName(for: "en"), localeCode: "en")
|
|
localeButton(title: localization.localeName(for: "sv"), localeCode: "sv")
|
|
}
|
|
}
|
|
|
|
private func localeButton(title: String, localeCode: String) -> some View {
|
|
let isSelected = localization.localeCode == localeCode
|
|
|
|
return Button {
|
|
localization.setLocale(localeCode)
|
|
analytics.track("locale_changed", attributes: ["locale_code": localeCode])
|
|
} label: {
|
|
Text(title)
|
|
.font(.caption.weight(.bold))
|
|
.padding(.horizontal, 12)
|
|
.padding(.vertical, 8)
|
|
.foregroundStyle(isSelected ? HermesTheme.background : HermesTheme.textPrimary)
|
|
.background(isSelected ? HermesTheme.accent : HermesTheme.surfaceElevated)
|
|
.clipShape(Capsule())
|
|
}
|
|
}
|
|
}
|