Skip to content

Commit af7412d

Browse files
dadachiclaude
andauthored
Fix accept privacy/terms views not displaying (#35)
Replace sheet-based presentation with inline content views. Privacy and terms views now render as the main content when shouldUpdatePrivacy or shouldUpdateTerms is true. Set shouldUpdatePrivacy and shouldUpdateTerms to false after successful server update. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent f2d0368 commit af7412d

4 files changed

Lines changed: 36 additions & 126 deletions

File tree

NativeAppTemplate/Sessions/SessionController.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ import Observation
199199
func updateConfirmedPrivacyVersion() async throws {
200200
do {
201201
try await meService.updateConfirmedPrivacyVersion()
202+
shouldUpdatePrivacy = false
202203
} catch {
203204
Failure
204205
.update(from: Self.self, reason: error.codedDescription)
@@ -210,6 +211,7 @@ import Observation
210211
func updateConfirmedTermsVersion() async throws {
211212
do {
212213
try await meService.updateConfirmedTermsVersion()
214+
shouldUpdateTerms = false
213215
} catch {
214216
Failure
215217
.update(from: Self.self, reason: error.codedDescription)

NativeAppTemplate/UI/App Root/MainView.swift

Lines changed: 34 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,6 @@ struct MainView: View {
2424
viewModel.handleBackgroundTagReading(userActivity)
2525
}
2626
})
27-
.onChange(of: sessionController.shouldUpdatePrivacy) { _, _ in
28-
viewModel?.handlePrivacyUpdate()
29-
}
30-
.onChange(of: sessionController.shouldUpdateTerms) { _, _ in
31-
viewModel?.handleTermsUpdate()
32-
}
3327
.alert(
3428
String.itemTagAlreadyCompleted,
3529
isPresented: Binding(
@@ -66,6 +60,10 @@ private extension MainView {
6660
@ViewBuilder var contentView: some View {
6761
if !sessionController.isLoggedIn {
6862
OnboardingView(onboardingRepository: dataManager.onboardingRepository)
63+
} else if sessionController.shouldUpdatePrivacy {
64+
acceptPrivacySheet
65+
} else if sessionController.shouldUpdateTerms {
66+
acceptTermsSheet
6967
} else {
7068
switch sessionController.permissionState {
7169
case .loaded:
@@ -81,6 +79,36 @@ private extension MainView {
8179
}
8280
}
8381

82+
var acceptPrivacySheet: some View {
83+
NavigationStack {
84+
AcceptPrivacyView(
85+
arePrivacyAccepted: Binding(
86+
get: { viewModel?.arePrivacyAccepted ?? false },
87+
set: { viewModel?.arePrivacyAccepted = $0 }
88+
),
89+
viewModel: AcceptPrivacyViewModel(
90+
sessionController: sessionController,
91+
messageBus: messageBus
92+
)
93+
)
94+
}
95+
}
96+
97+
var acceptTermsSheet: some View {
98+
NavigationStack {
99+
AcceptTermsView(
100+
areTermsAccepted: Binding(
101+
get: { viewModel?.areTermsAccepted ?? false },
102+
set: { viewModel?.areTermsAccepted = $0 }
103+
),
104+
viewModel: AcceptTermsViewModel(
105+
sessionController: sessionController,
106+
messageBus: messageBus
107+
)
108+
)
109+
}
110+
}
111+
84112
@ViewBuilder var tabBarView: some View {
85113
switch sessionController.sessionState {
86114
case .online:
@@ -106,42 +134,6 @@ private extension MainView {
106134
settingsView: settingsView
107135
)
108136
.environment(tabViewModel)
109-
.sheet(isPresented: Binding(
110-
get: { viewModel?.isShowingAcceptPrivacySheet ?? false },
111-
set: { viewModel?.isShowingAcceptPrivacySheet = $0 }
112-
)) {
113-
NavigationStack {
114-
AcceptPrivacyView(
115-
arePrivacyAccepted: Binding(
116-
get: { viewModel?.arePrivacyAccepted ?? false },
117-
set: { viewModel?.arePrivacyAccepted = $0 }
118-
),
119-
viewModel: AcceptPrivacyViewModel(
120-
sessionController: sessionController,
121-
messageBus: messageBus
122-
)
123-
)
124-
.interactiveDismissDisabled(!(viewModel?.arePrivacyAccepted ?? false))
125-
}
126-
}
127-
.sheet(isPresented: Binding(
128-
get: { viewModel?.isShowingAcceptTermsSheet ?? false },
129-
set: { viewModel?.isShowingAcceptTermsSheet = $0 }
130-
)) {
131-
NavigationStack {
132-
AcceptTermsView(
133-
areTermsAccepted: Binding(
134-
get: { viewModel?.areTermsAccepted ?? false },
135-
set: { viewModel?.areTermsAccepted = $0 }
136-
),
137-
viewModel: AcceptTermsViewModel(
138-
sessionController: sessionController,
139-
messageBus: messageBus
140-
)
141-
)
142-
.interactiveDismissDisabled(!(viewModel?.areTermsAccepted ?? false))
143-
}
144-
}
145137
}
146138
}
147139
case .offline:

NativeAppTemplate/UI/App Root/MainViewModel.swift

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ final class MainViewModel {
1414
var itemTagId: String?
1515
var isResetting = false
1616
var isShowingResetConfirmationDialog = false
17-
var isShowingAcceptPrivacySheet = false
1817
var arePrivacyAccepted = false
19-
var isShowingAcceptTermsSheet = false
2018
var areTermsAccepted = false
2119

2220
private let sessionController: SessionControllerProtocol
@@ -36,18 +34,6 @@ final class MainViewModel {
3634
self.tabViewModel = tabViewModel
3735
}
3836

39-
func handlePrivacyUpdate() {
40-
if sessionController.shouldUpdatePrivacy {
41-
isShowingAcceptPrivacySheet = true
42-
}
43-
}
44-
45-
func handleTermsUpdate() {
46-
if sessionController.shouldUpdateTerms {
47-
isShowingAcceptTermsSheet = true
48-
}
49-
}
50-
5137
func resetTag() {
5238
guard let itemTagId else { return }
5339
resetTag(itemTagId: itemTagId)

NativeAppTemplateTests/UI/App Root/MainViewModelTest.swift

Lines changed: 0 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -38,74 +38,10 @@ struct MainViewModelTest {
3838
#expect(viewModel.itemTagId == nil)
3939
#expect(viewModel.isResetting == false)
4040
#expect(viewModel.isShowingResetConfirmationDialog == false)
41-
#expect(viewModel.isShowingAcceptPrivacySheet == false)
4241
#expect(viewModel.arePrivacyAccepted == false)
43-
#expect(viewModel.isShowingAcceptTermsSheet == false)
4442
#expect(viewModel.areTermsAccepted == false)
4543
}
4644

47-
@Test
48-
func handlePrivacyUpdate() {
49-
let dataManager = createTestDataManager()
50-
let tabViewModel = createTestTabViewModel()
51-
52-
let viewModel = MainViewModel(
53-
sessionController: sessionController,
54-
dataManager: dataManager,
55-
messageBus: messageBus,
56-
tabViewModel: tabViewModel
57-
)
58-
59-
// Initially should not show privacy sheet
60-
#expect(viewModel.isShowingAcceptPrivacySheet == false)
61-
62-
// Set shouldUpdatePrivacy to true
63-
sessionController.shouldUpdatePrivacy = true
64-
65-
viewModel.handlePrivacyUpdate()
66-
67-
#expect(viewModel.isShowingAcceptPrivacySheet == true)
68-
69-
// Set shouldUpdatePrivacy to false
70-
sessionController.shouldUpdatePrivacy = false
71-
72-
viewModel.handlePrivacyUpdate()
73-
74-
// Should not change the sheet state when false
75-
#expect(viewModel.isShowingAcceptPrivacySheet == true)
76-
}
77-
78-
@Test
79-
func handleTermsUpdate() {
80-
let dataManager = createTestDataManager()
81-
let tabViewModel = createTestTabViewModel()
82-
83-
let viewModel = MainViewModel(
84-
sessionController: sessionController,
85-
dataManager: dataManager,
86-
messageBus: messageBus,
87-
tabViewModel: tabViewModel
88-
)
89-
90-
// Initially should not show terms sheet
91-
#expect(viewModel.isShowingAcceptTermsSheet == false)
92-
93-
// Set shouldUpdateTerms to true
94-
sessionController.shouldUpdateTerms = true
95-
96-
viewModel.handleTermsUpdate()
97-
98-
#expect(viewModel.isShowingAcceptTermsSheet == true)
99-
100-
// Set shouldUpdateTerms to false
101-
sessionController.shouldUpdateTerms = false
102-
103-
viewModel.handleTermsUpdate()
104-
105-
// Should not change the sheet state when false
106-
#expect(viewModel.isShowingAcceptTermsSheet == true)
107-
}
108-
10945
@Test
11046
func logout() async {
11147
let dataManager = createTestDataManager()
@@ -212,15 +148,9 @@ struct MainViewModelTest {
212148
viewModel.isShowingResetConfirmationDialog = true
213149
#expect(viewModel.isShowingResetConfirmationDialog == true)
214150

215-
viewModel.isShowingAcceptPrivacySheet = true
216-
#expect(viewModel.isShowingAcceptPrivacySheet == true)
217-
218151
viewModel.arePrivacyAccepted = true
219152
#expect(viewModel.arePrivacyAccepted == true)
220153

221-
viewModel.isShowingAcceptTermsSheet = true
222-
#expect(viewModel.isShowingAcceptTermsSheet == true)
223-
224154
viewModel.areTermsAccepted = true
225155
#expect(viewModel.areTermsAccepted == true)
226156

0 commit comments

Comments
 (0)