Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions NativeAppTemplate/Sessions/SessionController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,7 @@ import Observation
func updateConfirmedPrivacyVersion() async throws {
do {
try await meService.updateConfirmedPrivacyVersion()
shouldUpdatePrivacy = false
} catch {
Failure
.update(from: Self.self, reason: error.codedDescription)
Expand All @@ -210,6 +211,7 @@ import Observation
func updateConfirmedTermsVersion() async throws {
do {
try await meService.updateConfirmedTermsVersion()
shouldUpdateTerms = false
} catch {
Failure
.update(from: Self.self, reason: error.codedDescription)
Expand Down
76 changes: 34 additions & 42 deletions NativeAppTemplate/UI/App Root/MainView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,6 @@ struct MainView: View {
viewModel.handleBackgroundTagReading(userActivity)
}
})
.onChange(of: sessionController.shouldUpdatePrivacy) { _, _ in
viewModel?.handlePrivacyUpdate()
}
.onChange(of: sessionController.shouldUpdateTerms) { _, _ in
viewModel?.handleTermsUpdate()
}
.alert(
String.itemTagAlreadyCompleted,
isPresented: Binding(
Expand Down Expand Up @@ -66,6 +60,10 @@ private extension MainView {
@ViewBuilder var contentView: some View {
if !sessionController.isLoggedIn {
OnboardingView(onboardingRepository: dataManager.onboardingRepository)
} else if sessionController.shouldUpdatePrivacy {
acceptPrivacySheet
} else if sessionController.shouldUpdateTerms {
acceptTermsSheet
} else {
switch sessionController.permissionState {
case .loaded:
Expand All @@ -81,6 +79,36 @@ private extension MainView {
}
}

var acceptPrivacySheet: some View {
NavigationStack {
AcceptPrivacyView(
arePrivacyAccepted: Binding(
get: { viewModel?.arePrivacyAccepted ?? false },
set: { viewModel?.arePrivacyAccepted = $0 }
),
viewModel: AcceptPrivacyViewModel(
sessionController: sessionController,
messageBus: messageBus
)
)
}
}

var acceptTermsSheet: some View {
NavigationStack {
AcceptTermsView(
areTermsAccepted: Binding(
get: { viewModel?.areTermsAccepted ?? false },
set: { viewModel?.areTermsAccepted = $0 }
),
viewModel: AcceptTermsViewModel(
sessionController: sessionController,
messageBus: messageBus
)
)
}
}

@ViewBuilder var tabBarView: some View {
switch sessionController.sessionState {
case .online:
Expand All @@ -106,42 +134,6 @@ private extension MainView {
settingsView: settingsView
)
.environment(tabViewModel)
.sheet(isPresented: Binding(
get: { viewModel?.isShowingAcceptPrivacySheet ?? false },
set: { viewModel?.isShowingAcceptPrivacySheet = $0 }
)) {
NavigationStack {
AcceptPrivacyView(
arePrivacyAccepted: Binding(
get: { viewModel?.arePrivacyAccepted ?? false },
set: { viewModel?.arePrivacyAccepted = $0 }
),
viewModel: AcceptPrivacyViewModel(
sessionController: sessionController,
messageBus: messageBus
)
)
.interactiveDismissDisabled(!(viewModel?.arePrivacyAccepted ?? false))
}
}
.sheet(isPresented: Binding(
get: { viewModel?.isShowingAcceptTermsSheet ?? false },
set: { viewModel?.isShowingAcceptTermsSheet = $0 }
)) {
NavigationStack {
AcceptTermsView(
areTermsAccepted: Binding(
get: { viewModel?.areTermsAccepted ?? false },
set: { viewModel?.areTermsAccepted = $0 }
),
viewModel: AcceptTermsViewModel(
sessionController: sessionController,
messageBus: messageBus
)
)
.interactiveDismissDisabled(!(viewModel?.areTermsAccepted ?? false))
}
}
}
}
case .offline:
Expand Down
14 changes: 0 additions & 14 deletions NativeAppTemplate/UI/App Root/MainViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@ final class MainViewModel {
var itemTagId: String?
var isResetting = false
var isShowingResetConfirmationDialog = false
var isShowingAcceptPrivacySheet = false
var arePrivacyAccepted = false
var isShowingAcceptTermsSheet = false
var areTermsAccepted = false

private let sessionController: SessionControllerProtocol
Expand All @@ -36,18 +34,6 @@ final class MainViewModel {
self.tabViewModel = tabViewModel
}

func handlePrivacyUpdate() {
if sessionController.shouldUpdatePrivacy {
isShowingAcceptPrivacySheet = true
}
}

func handleTermsUpdate() {
if sessionController.shouldUpdateTerms {
isShowingAcceptTermsSheet = true
}
}

func resetTag() {
guard let itemTagId else { return }
resetTag(itemTagId: itemTagId)
Expand Down
70 changes: 0 additions & 70 deletions NativeAppTemplateTests/UI/App Root/MainViewModelTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -38,74 +38,10 @@ struct MainViewModelTest {
#expect(viewModel.itemTagId == nil)
#expect(viewModel.isResetting == false)
#expect(viewModel.isShowingResetConfirmationDialog == false)
#expect(viewModel.isShowingAcceptPrivacySheet == false)
#expect(viewModel.arePrivacyAccepted == false)
#expect(viewModel.isShowingAcceptTermsSheet == false)
#expect(viewModel.areTermsAccepted == false)
}

@Test
func handlePrivacyUpdate() {
let dataManager = createTestDataManager()
let tabViewModel = createTestTabViewModel()

let viewModel = MainViewModel(
sessionController: sessionController,
dataManager: dataManager,
messageBus: messageBus,
tabViewModel: tabViewModel
)

// Initially should not show privacy sheet
#expect(viewModel.isShowingAcceptPrivacySheet == false)

// Set shouldUpdatePrivacy to true
sessionController.shouldUpdatePrivacy = true

viewModel.handlePrivacyUpdate()

#expect(viewModel.isShowingAcceptPrivacySheet == true)

// Set shouldUpdatePrivacy to false
sessionController.shouldUpdatePrivacy = false

viewModel.handlePrivacyUpdate()

// Should not change the sheet state when false
#expect(viewModel.isShowingAcceptPrivacySheet == true)
}

@Test
func handleTermsUpdate() {
let dataManager = createTestDataManager()
let tabViewModel = createTestTabViewModel()

let viewModel = MainViewModel(
sessionController: sessionController,
dataManager: dataManager,
messageBus: messageBus,
tabViewModel: tabViewModel
)

// Initially should not show terms sheet
#expect(viewModel.isShowingAcceptTermsSheet == false)

// Set shouldUpdateTerms to true
sessionController.shouldUpdateTerms = true

viewModel.handleTermsUpdate()

#expect(viewModel.isShowingAcceptTermsSheet == true)

// Set shouldUpdateTerms to false
sessionController.shouldUpdateTerms = false

viewModel.handleTermsUpdate()

// Should not change the sheet state when false
#expect(viewModel.isShowingAcceptTermsSheet == true)
}

@Test
func logout() async {
let dataManager = createTestDataManager()
Expand Down Expand Up @@ -212,15 +148,9 @@ struct MainViewModelTest {
viewModel.isShowingResetConfirmationDialog = true
#expect(viewModel.isShowingResetConfirmationDialog == true)

viewModel.isShowingAcceptPrivacySheet = true
#expect(viewModel.isShowingAcceptPrivacySheet == true)

viewModel.arePrivacyAccepted = true
#expect(viewModel.arePrivacyAccepted == true)

viewModel.isShowingAcceptTermsSheet = true
#expect(viewModel.isShowingAcceptTermsSheet == true)

viewModel.areTermsAccepted = true
#expect(viewModel.areTermsAccepted == true)

Expand Down
Loading