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
41 changes: 19 additions & 22 deletions WordPress/Classes/Utility/ImmuTableViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import WordPressShared
typealias ImmuTableRowControllerGenerator = ImmuTableRow -> UIViewController

protocol ImmuTablePresenter: class {
var visible: Observable<Bool> { get }
func push(controllerGenerator: ImmuTableRowControllerGenerator) -> ImmuTableAction

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your previous version of this PR added a present method here, too. Should it be in this version?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not being used yet, so I think I'll add it on the plans list changes, which need to present the details modally

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

}

Expand All @@ -20,11 +19,10 @@ extension ImmuTablePresenter where Self: UIViewController {
}

protocol ImmuTableController {
var presenter: ImmuTablePresenter? { get set }
var title: String { get }
var immuTableRows: [ImmuTableRow.Type] { get }
var immuTable: Observable<ImmuTable> { get }
var errorMessage: Observable<String?> { get }
func tableViewModelWithPresenter(presenter: ImmuTablePresenter) -> Observable<ImmuTable>
}

/// Generic view controller to present ImmuTable-based tables
Expand All @@ -41,32 +39,31 @@ final class ImmuTableViewController: UITableViewController, ImmuTablePresenter {

private var errorAnimator: ErrorAnimator!

let controller: ImmuTableController?
let controller: ImmuTableController

private let bag = DisposeBag()

// MARK: - Table View Controller

init(controller: ImmuTableController? = nil) {
init(controller: ImmuTableController) {
self.controller = controller
super.init(style: .Grouped)
self.controller?.presenter = self
if let controller = self.controller {
title = controller.title
registerRows(controller.immuTableRows)
controller.immuTable
.observeOn(MainScheduler.instance)
.subscribeNext({ [weak self] in
self?.handler.viewModel = $0
})
.addDisposableTo(bag)
controller.errorMessage
.observeOn(MainScheduler.instance)
.subscribeNext({ [weak self] in
self?.errorMessage = $0
})
.addDisposableTo(bag)
}
title = controller.title
registerRows(controller.immuTableRows)
controller.tableViewModelWithPresenter(self)
.pausable(visible)
.observeOn(MainScheduler.instance)
.subscribeNext({ [weak self] in
self?.handler.viewModel = $0
})
.addDisposableTo(bag)
controller.errorMessage
.pausable(visible)
.observeOn(MainScheduler.instance)
.subscribeNext({ [weak self] in
self?.errorMessage = $0
})
.addDisposableTo(bag)
}

required init?(coder aDecoder: NSCoder) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,10 @@ func AccountSettingsViewController(account account: WPAccount) -> ImmuTableViewC
func AccountSettingsViewController(service service: AccountSettingsService) -> ImmuTableViewController {
let controller = AccountSettingsController(service: service)
let viewController = ImmuTableViewController(controller: controller)
assert(viewController.controller?.presenter != nil, "ImmuTableViewController should have set the presenter for AccountSettingsController")
return viewController
}

private struct AccountSettingsController: SettingsController {
weak var presenter: ImmuTablePresenter? = nil

let title = NSLocalizedString("Account Settings", comment: "Account Settings Title");

var immuTableRows: [ImmuTableRow.Type] {
Expand All @@ -38,13 +35,7 @@ private struct AccountSettingsController: SettingsController {

// MARK: - Model mapping

func mapViewModel(settings: AccountSettings?) -> ImmuTable {
precondition(presenter != nil, "presenter must be set before using")
guard let presenter = presenter else {
// This shouldn't happen. If there's no presenter we can't push the
// editText controllers.
return ImmuTable.Empty
}
func mapViewModel(settings: AccountSettings?, presenter: ImmuTablePresenter) -> ImmuTable {
let username = TextRow(
title: NSLocalizedString("Username", comment: "Account Settings Username label"),
value: settings?.username ?? "")
Expand Down
11 changes: 1 addition & 10 deletions WordPress/Classes/ViewRelated/Me/MyProfileViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ func MyProfileViewController(account account: WPAccount) -> ImmuTableViewControl
func MyProfileViewController(service service: AccountSettingsService) -> ImmuTableViewController {
let controller = MyProfileController(service: service)
let viewController = ImmuTableViewController(controller: controller)
assert(viewController.controller?.presenter != nil, "ImmuTableViewController should have set the presenter for MyProfileController")
return viewController
}

Expand All @@ -20,8 +19,6 @@ func MyProfileViewController(service service: AccountSettingsService) -> ImmuTab
private struct MyProfileController: SettingsController {
// MARK: - ImmuTableController

weak var presenter: ImmuTablePresenter? = nil

let title = NSLocalizedString("My Profile", comment: "My Profile view title")

var immuTableRows: [ImmuTableRow.Type] {
Expand All @@ -38,13 +35,7 @@ private struct MyProfileController: SettingsController {

// MARK: - Model mapping

func mapViewModel(settings: AccountSettings?) -> ImmuTable {
precondition(presenter != nil, "presenter must be set before using")
guard let presenter = presenter else {
// This shouldn't happen. If there's no presenter we can't push the
// editText controllers.
return ImmuTable.Empty
}
func mapViewModel(settings: AccountSettings?, presenter: ImmuTablePresenter) -> ImmuTable {
let firstNameRow = EditableTextRow(
title: NSLocalizedString("First Name", comment: "My Profile first name label"),
value: settings?.firstName ?? "",
Expand Down
17 changes: 5 additions & 12 deletions WordPress/Classes/ViewRelated/SettingsCommon.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ import RxSwift

protocol SettingsController: ImmuTableController {
var service: AccountSettingsService { get }
var presenter: ImmuTablePresenter? { get }
func mapViewModel(settings: AccountSettings?) -> ImmuTable
func mapViewModel(settings: AccountSettings?, presenter: ImmuTablePresenter) -> ImmuTable
}

// MARK: - Shared implementation
Expand All @@ -16,20 +15,14 @@ extension SettingsController {
SwitchRow.self]
}

var immuTable: Observable<ImmuTable> {
precondition(presenter != nil, "presenter must be set before using")
return service.settings.map(mapViewModel)
func tableViewModelWithPresenter(presenter: ImmuTablePresenter) -> Observable<ImmuTable> {
return service.settings.map({ settings in
self.mapViewModel(settings, presenter: presenter)
})
}

var errorMessage: Observable<String?> {
precondition(presenter != nil, "presenter must be set before using")
guard let presenter = presenter else {
// This shouldn't happen, but if it does, disabling the error feels
// safer than having it running when the VC is not visible.
return Observable.just(nil)
}
return service.refresh
.pausable(presenter.visible)
// replace errors with .Failed status
.catchErrorJustReturn(.Failed)
// convert status to string
Expand Down