Skip to content

Commit fd7ff81

Browse files
committed
Move menu child effect handling from Root into Menu
1 parent 8ef22f8 commit fd7ff81

File tree

3 files changed

+86
-71
lines changed

3 files changed

+86
-71
lines changed

Authenticator/Source/Menu.swift

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
// SOFTWARE.
2424
//
2525

26+
import Foundation
27+
2628
struct Menu: Component {
2729
let infoList: InfoList
2830
private(set) var child: Child
@@ -74,9 +76,19 @@ struct Menu: Component {
7476
enum Action {
7577
case dismissInfo
7678
case dismissDisplayOptions
79+
80+
case infoListEffect(InfoList.Effect)
81+
case infoEffect(Info.Effect)
82+
case displayOptionsEffect(DisplayOptions.Effect)
7783
}
7884

79-
typealias Effect = Never
85+
enum Effect {
86+
case done
87+
case showErrorMessage(String)
88+
case showSuccessMessage(String)
89+
case openURL(URL)
90+
case setDigitGroupSize(Int)
91+
}
8092

8193
mutating func update(with action: Action) throws -> Effect? {
8294
switch action {
@@ -87,14 +99,74 @@ struct Menu: Component {
8799
case .dismissDisplayOptions:
88100
try dismissDisplayOptions()
89101
return nil
102+
103+
case .infoListEffect(let effect):
104+
return try handleInfoListEffect(effect)
105+
106+
case .infoEffect(let effect):
107+
return handleInfoEffect(effect)
108+
109+
case .displayOptionsEffect(let effect):
110+
return handleDisplayOptionsEffect(effect)
90111
}
91112
}
92113

114+
private mutating func handleInfoListEffect(_ effect: InfoList.Effect) throws -> Effect? {
115+
switch effect {
116+
case .showDisplayOptions:
117+
try showDisplayOptions()
118+
return nil
119+
120+
case .showBackupInfo:
121+
let backupInfo: Info
122+
do {
123+
backupInfo = try Info.backupInfo()
124+
} catch {
125+
return .showErrorMessage("Failed to load backup info.")
126+
}
127+
try showInfo(backupInfo)
128+
return nil
129+
130+
case .showLicenseInfo:
131+
let licenseInfo: Info
132+
do {
133+
licenseInfo = try Info.licenseInfo()
134+
} catch {
135+
return .showErrorMessage("Failed to load acknowledgements.")
136+
}
137+
try showInfo(licenseInfo)
138+
return nil
139+
140+
case .done:
141+
return .done
142+
}
143+
}
144+
145+
private mutating func handleInfoEffect(_ effect: Info.Effect) -> Effect? {
146+
switch effect {
147+
case .done:
148+
return .done
149+
case let .openURL(url):
150+
return .openURL(url)
151+
}
152+
}
153+
154+
private mutating func handleDisplayOptionsEffect(_ effect: DisplayOptions.Effect) -> Effect? {
155+
switch effect {
156+
case .done:
157+
return .done
158+
case let .setDigitGroupSize(digitGroupSize):
159+
return .setDigitGroupSize(digitGroupSize)
160+
}
161+
}
162+
163+
// MARK: -
164+
93165
enum Error: Swift.Error {
94166
case badChildState
95167
}
96168

97-
mutating func showInfo(_ info: Info) throws {
169+
private mutating func showInfo(_ info: Info) throws {
98170
guard case .none = child else {
99171
throw Error.badChildState
100172
}
@@ -108,7 +180,7 @@ struct Menu: Component {
108180
child = .none
109181
}
110182

111-
mutating func showDisplayOptions() throws {
183+
private mutating func showDisplayOptions() throws {
112184
guard case .none = child else {
113185
throw Error.badChildState
114186
}

Authenticator/Source/Root.swift

Lines changed: 6 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,6 @@ extension Root {
9090
case tokenScannerAction(TokenScanner.Action)
9191
case menuAction(Menu.Action)
9292

93-
case infoListEffect(InfoList.Effect)
94-
case infoEffect(Info.Effect)
95-
case displayOptionsEffect(DisplayOptions.Effect)
96-
9793
case addTokenFromURL(Token)
9894
}
9995

@@ -166,15 +162,6 @@ extension Root {
166162
handleMenuEffect(effect)
167163
}
168164

169-
case .infoListEffect(let effect):
170-
return try handleInfoListEffect(effect)
171-
172-
case .infoEffect(let effect):
173-
return handleInfoEffect(effect)
174-
175-
case .displayOptionsEffect(let effect):
176-
return handleDisplayOptionsEffect(effect)
177-
178165
case .addTokenFromURL(let token):
179166
return .addToken(token,
180167
success: Event.addTokenFromURLSucceeded,
@@ -316,69 +303,25 @@ extension Root {
316303
}
317304
}
318305

319-
private mutating func handleInfoListEffect(_ effect: InfoList.Effect) throws -> Effect? {
306+
private mutating func handleMenuEffect(_ effect: Menu.Effect) -> Effect? {
320307
switch effect {
321-
case .showDisplayOptions:
322-
try modal.withMenu { menu in
323-
try menu.showDisplayOptions()
324-
}
325-
return nil
326-
327-
case .showBackupInfo:
328-
let backupInfo: Info
329-
do {
330-
backupInfo = try Info.backupInfo()
331-
} catch {
332-
return .showErrorMessage("Failed to load backup info.")
333-
}
334-
try modal.withMenu { menu in
335-
try menu.showInfo(backupInfo)
336-
}
337-
return nil
338-
339-
case .showLicenseInfo:
340-
let licenseInfo: Info
341-
do {
342-
licenseInfo = try Info.licenseInfo()
343-
} catch {
344-
return .showErrorMessage("Failed to load acknowledgements.")
345-
}
346-
try modal.withMenu { menu in
347-
try menu.showInfo(licenseInfo)
348-
}
349-
return nil
350-
351308
case .done:
352309
modal = .none
353310
return nil
354311

355-
}
356-
}
312+
case let .showErrorMessage(message):
313+
return .showErrorMessage(message)
314+
315+
case let .showSuccessMessage(message):
316+
return .showSuccessMessage(message)
357317

358-
private mutating func handleInfoEffect(_ effect: Info.Effect) -> Effect? {
359-
switch effect {
360-
case .done:
361-
modal = .none
362-
return nil
363318
case let .openURL(url):
364319
return .openURL(url)
365-
}
366-
}
367320

368-
private mutating func handleDisplayOptionsEffect(_ effect: DisplayOptions.Effect) -> Effect? {
369-
switch effect {
370-
case .done:
371-
modal = .none
372-
return nil
373321
case let .setDigitGroupSize(digitGroupSize):
374322
return .setDigitGroupSize(digitGroupSize)
375323
}
376324
}
377-
378-
private mutating func handleMenuEffect(_ effect: Menu.Effect) -> Effect? {
379-
switch effect {
380-
}
381-
}
382325
}
383326

384327
private extension Root.Modal {

Authenticator/Source/RootViewController.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -155,23 +155,23 @@ extension RootViewController {
155155
case .info(let infoViewModel):
156156
presentViewModels(menuViewModel.infoList,
157157
using: InfoListViewController.self,
158-
actionTransform: Root.Action.infoListEffect,
158+
actionTransform: compose(Menu.Action.infoListEffect, Root.Action.menuAction),
159159
and: infoViewModel,
160160
using: InfoViewController.self,
161-
actionTransform: Root.Action.infoEffect)
161+
actionTransform: compose(Menu.Action.infoEffect, Root.Action.menuAction))
162162

163163
case .displayOptions(let displayOptionsViewModel):
164164
presentViewModels(menuViewModel.infoList,
165165
using: InfoListViewController.self,
166-
actionTransform: Root.Action.infoListEffect,
166+
actionTransform: compose(Menu.Action.infoListEffect, Root.Action.menuAction),
167167
and: displayOptionsViewModel,
168168
using: DisplayOptionsViewController.self,
169-
actionTransform: Root.Action.displayOptionsEffect)
169+
actionTransform: compose(Menu.Action.displayOptionsEffect, Root.Action.menuAction))
170170

171171
case .none:
172172
presentViewModel(menuViewModel.infoList,
173173
using: InfoListViewController.self,
174-
actionTransform: Root.Action.infoListEffect)
174+
actionTransform: compose(Menu.Action.infoListEffect, Root.Action.menuAction))
175175
}
176176
}
177177
currentViewModel = viewModel

0 commit comments

Comments
 (0)