Skip to content

Commit 846fca5

Browse files
authored
Oob section (#12421)
1 parent a6d6884 commit 846fca5

File tree

5 files changed

+491
-70
lines changed

5 files changed

+491
-70
lines changed

FirebaseAuth/Tests/SampleSwift/AuthenticationExample/Models/AuthMenu.swift

Lines changed: 107 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@ enum AuthMenu: String {
4040
case removeLastIdTokenChangeListener
4141
case verifyClient
4242
case deleteApp
43+
case actionType
44+
case continueURL
45+
case requestVerifyEmail
46+
case requestPasswordReset
47+
case resetPassword
48+
case checkActionCode
49+
case applyActionCode
50+
case verifyPasswordResetCode
4351

4452
// More intuitively named getter for `rawValue`.
4553
var id: String { rawValue }
@@ -95,6 +103,23 @@ enum AuthMenu: String {
95103
return "Verify Client"
96104
case .deleteApp:
97105
return "Delete App"
106+
// OOB
107+
case .actionType:
108+
return "Action Type"
109+
case .continueURL:
110+
return "Continue URL"
111+
case .requestVerifyEmail:
112+
return "Request Verify Email"
113+
case .requestPasswordReset:
114+
return "Request Password Reset"
115+
case .resetPassword:
116+
return "Reset Password"
117+
case .checkActionCode:
118+
return "Check Action Code"
119+
case .applyActionCode:
120+
return "Apply Action Code"
121+
case .verifyPasswordResetCode:
122+
return "Verify Password Reset Code"
98123
}
99124
}
100125

@@ -150,6 +175,52 @@ enum AuthMenu: String {
150175
self = .verifyClient
151176
case "Delete App":
152177
self = .deleteApp
178+
case "Action Type":
179+
self = .actionType
180+
case "Continue URL":
181+
self = .continueURL
182+
case "Request Verify Email":
183+
self = .requestVerifyEmail
184+
case "Request Password Reset":
185+
self = .requestPasswordReset
186+
case "Reset Password":
187+
self = .resetPassword
188+
case "Check Action Code":
189+
self = .checkActionCode
190+
case "Apply Action Code":
191+
self = .applyActionCode
192+
case "Verify Password Reset Code":
193+
self = .verifyPasswordResetCode
194+
default:
195+
return nil
196+
}
197+
}
198+
}
199+
200+
enum ActionCodeRequestType: String {
201+
case email
202+
case `continue`
203+
case inApp
204+
205+
var name: String {
206+
switch self {
207+
case .email:
208+
return "Email Only"
209+
case .inApp:
210+
return "In-App + Continue URL"
211+
case .continue:
212+
return "Continue URL"
213+
}
214+
}
215+
216+
init?(rawValue: String) {
217+
switch rawValue {
218+
case "Email Only":
219+
self = .email
220+
case "In-App + Continue URL":
221+
self = .inApp
222+
case "Continue URL":
223+
self = .continue
153224
default:
154225
return nil
155226
}
@@ -158,14 +229,14 @@ enum AuthMenu: String {
158229

159230
// MARK: DataSourceProvidable
160231

161-
extension AuthMenu: DataSourceProvidable {
232+
class AuthMenuData: DataSourceProvidable {
162233
private static var providers: [AuthMenu] {
163234
[.google, .apple, .twitter, .microsoft, .gitHub, .yahoo, .facebook, .gameCenter]
164235
}
165236

166237
static var settingsSection: Section {
167238
let header = "Auth Settings"
168-
let item = Item(title: settings.name, hasNestedContent: true)
239+
let item = Item(title: AuthMenu.settings.name, hasNestedContent: true)
169240
return Section(headerDescription: header, items: [item])
170241
}
171242

@@ -179,7 +250,7 @@ extension AuthMenu: DataSourceProvidable {
179250
static var emailPasswordSection: Section {
180251
let image = UIImage(named: "firebaseIcon")
181252
let header = "Email and Password Login"
182-
let item = Item(title: emailPassword.name, hasNestedContent: true, image: image)
253+
let item = Item(title: AuthMenu.emailPassword.name, hasNestedContent: true, image: image)
183254
return Section(headerDescription: header, items: [item])
184255
}
185256

@@ -190,10 +261,10 @@ extension AuthMenu: DataSourceProvidable {
190261
let shieldSymbol = UIImage.systemImage("lock.shield.fill", tintColor: .systemOrange)
191262

192263
let otherOptions = [
193-
Item(title: passwordless.name, image: lockSymbol),
194-
Item(title: phoneNumber.name, image: phoneSymbol),
195-
Item(title: anonymous.name, image: anonSymbol),
196-
Item(title: custom.name, image: shieldSymbol),
264+
Item(title: AuthMenu.passwordless.name, image: lockSymbol),
265+
Item(title: AuthMenu.phoneNumber.name, image: phoneSymbol),
266+
Item(title: AuthMenu.anonymous.name, image: anonSymbol),
267+
Item(title: AuthMenu.custom.name, image: shieldSymbol),
197268
]
198269
let header = "Other Authentication Methods"
199270
return Section(headerDescription: header, items: otherOptions)
@@ -202,44 +273,58 @@ extension AuthMenu: DataSourceProvidable {
202273
static var recaptchaSection: Section {
203274
let image = UIImage(named: "firebaseIcon")
204275
let header = "Initialize reCAPTCHA Enterprise"
205-
let item = Item(title: initRecaptcha.name, hasNestedContent: false, image: image)
276+
let item = Item(title: AuthMenu.initRecaptcha.name, hasNestedContent: false, image: image)
206277
return Section(headerDescription: header, items: [item])
207278
}
208279

209280
static var customAuthDomainSection: Section {
210281
let image = UIImage(named: "firebaseIcon")
211282
let header = "Custom Auth Domain"
212-
let item = Item(title: customAuthDomain.name, hasNestedContent: false, image: image)
283+
let item = Item(title: AuthMenu.customAuthDomain.name, hasNestedContent: false, image: image)
213284
return Section(headerDescription: header, items: [item])
214285
}
215286

216287
static var appSection: Section {
217288
let header = "APP"
218289
let items: [Item] = [
219-
Item(title: getToken.name),
220-
Item(title: getTokenForceRefresh.name),
221-
Item(title: addAuthStateChangeListener.name),
222-
Item(title: removeLastAuthStateChangeListener.name),
223-
Item(title: addIdTokenChangeListener.name),
224-
Item(title: removeLastIdTokenChangeListener.name),
225-
Item(title: verifyClient.name),
226-
Item(title: deleteApp.name),
290+
Item(title: AuthMenu.getToken.name),
291+
Item(title: AuthMenu.getTokenForceRefresh.name),
292+
Item(title: AuthMenu.addAuthStateChangeListener.name),
293+
Item(title: AuthMenu.removeLastAuthStateChangeListener.name),
294+
Item(title: AuthMenu.addIdTokenChangeListener.name),
295+
Item(title: AuthMenu.removeLastIdTokenChangeListener.name),
296+
Item(title: AuthMenu.verifyClient.name),
297+
Item(title: AuthMenu.deleteApp.name),
227298
]
228299
return Section(headerDescription: header, items: items)
229300
}
230301

231-
static var sections: [Section] {
232-
[settingsSection, providerSection, emailPasswordSection, otherSection, recaptchaSection,
233-
customAuthDomainSection, appSection]
302+
static var oobSection: Section {
303+
let header = "OOB"
304+
let items: [Item] = [
305+
Item(title: AuthMenu.actionType.name, detailTitle: ActionCodeRequestType.inApp.name),
306+
Item(title: AuthMenu.continueURL.name, detailTitle: "--", isEditable: true),
307+
Item(title: AuthMenu.requestVerifyEmail.name),
308+
Item(title: AuthMenu.requestPasswordReset.name),
309+
Item(title: AuthMenu.resetPassword.name),
310+
Item(title: AuthMenu.checkActionCode.name),
311+
Item(title: AuthMenu.applyActionCode.name),
312+
Item(title: AuthMenu.verifyPasswordResetCode.name),
313+
]
314+
return Section(headerDescription: header, items: items)
234315
}
235316

317+
static var sections: [Section] =
318+
[settingsSection, providerSection, emailPasswordSection, otherSection, recaptchaSection,
319+
customAuthDomainSection, appSection, oobSection]
320+
236321
static var authLinkSections: [Section] {
237-
let allItems = AuthMenu.sections.flatMap { $0.items }
322+
let allItems = AuthMenuData.sections.flatMap { $0.items }
238323
let header = "Manage linking between providers"
239324
let footer =
240325
"Select an unchecked row to link the currently signed in user to that auth provider. To unlink the user from a linked provider, select its corresponding row marked with a checkmark."
241326
return [Section(headerDescription: header, footerDescription: footer, items: allItems)]
242327
}
243328

244-
var sections: [Section] { AuthMenu.sections }
329+
var sections: [Section] = AuthMenuData.sections
245330
}

FirebaseAuth/Tests/SampleSwift/AuthenticationExample/Utility/DataSourceProvider/DataSourceProvider.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ class DataSourceProvider<DataSource: DataSourceProvidable>: NSObject, UITableVie
4343
return sectionItem(at: indexPath)
4444
}
4545

46+
public func updateItem(at indexPath: IndexPath, item: Item) -> DataSource.Section.Item {
47+
return editSectionItem(at: indexPath, item: item)
48+
}
49+
4650
// MARK: - UITableViewDataSource
4751

4852
func numberOfSections(in tableView: UITableView) -> Int {
@@ -101,6 +105,11 @@ class DataSourceProvider<DataSource: DataSourceProvidable>: NSObject, UITableVie
101105
return sections[indexPath.section].items[indexPath.row]
102106
}
103107

108+
private func editSectionItem(at indexPath: IndexPath, item: Item) -> DataSource.Section.Item {
109+
sections[indexPath.section].items[indexPath.row] = item as! DataSource.Section.Item
110+
return sectionItem(at: indexPath)
111+
}
112+
104113
private func config(_ label: inout UILabel, for section: DataSource.Section) {
105114
label.text = section.headerDescription
106115
label.textColor = .label

FirebaseAuth/Tests/SampleSwift/AuthenticationExample/ViewControllers/AccountLinkingViewController.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import AuthenticationServices
2828
import CryptoKit
2929

3030
class AccountLinkingViewController: UIViewController, DataSourceProviderDelegate {
31-
var dataSourceProvider: DataSourceProvider<AuthMenu>!
31+
var dataSourceProvider: DataSourceProvider<AuthMenuData>!
3232

3333
var tableView: UITableView { view as! UITableView }
3434

@@ -466,7 +466,7 @@ extension AccountLinkingViewController: DataSourceProvidable {
466466
var sections: [Section] { buildSections() }
467467

468468
private func buildSections() -> [Section] {
469-
var section = AuthMenu.authLinkSections.first!
469+
var section = AuthMenuData.authLinkSections.first!
470470
section.items = section.items.compactMap { item -> Item? in
471471
var item = item
472472
item.hasNestedContent = false

0 commit comments

Comments
 (0)