Last active
July 18, 2021 09:28
-
-
Save ykpoh/2feb659d01b7b723a8d2a3437b71b837 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
import RxCocoa | |
protocol LaunchListTableViewCellViewModelType { // 1 | |
var launch: BehaviorRelay<Launch?> { get } | |
var launchNumber: BehaviorRelay<String?> { get } | |
var detail: BehaviorRelay<String?> { get } | |
var hideDetail: BehaviorRelay<Bool> { get } | |
var dateTime: BehaviorRelay<String?> { get } | |
var statusString: BehaviorRelay<String?> { get } | |
var statusTextColor: BehaviorRelay<UIColor> { get } | |
init(launch: Launch) | |
} | |
class LaunchListTableViewCellViewModel: LaunchListTableViewCellViewModelType { // 2 | |
enum Status: String { | |
case upcoming = "UPCOMING" | |
case success = "SUCCESS" | |
case fail = "FAIL" | |
} | |
var launch = BehaviorRelay<Launch?>(value: nil) | |
var launchNumber = BehaviorRelay<String?>(value: nil) | |
var detail = BehaviorRelay<String?>(value: nil) | |
var hideDetail = BehaviorRelay<Bool>(value: false) | |
var dateTime = BehaviorRelay<String?>(value: nil) | |
var statusString = BehaviorRelay<String?>(value: nil) | |
var statusTextColor = BehaviorRelay<UIColor>(value: .black) | |
var status: Status = .upcoming | |
init() {} | |
required convenience init(launch: Launch) { // 3 | |
self.init() | |
self.launch.accept(launch) | |
launchNumber.accept(launch.name) | |
detail.accept(launch.details) | |
hideDetail.accept(launch.details == nil) | |
if let date = launch.date_utc { | |
dateTime.accept("Launch time: \(DateFormatter.dateTimeSeconds.string(from: date)) (UTC)") | |
} else { | |
dateTime.accept("Launch time: TBD") | |
} | |
status = { () -> (Status) in | |
if launch.upcoming ?? false { | |
return .upcoming | |
} else if launch.success ?? false { | |
return .success | |
} else { | |
return .fail | |
} | |
}() | |
statusString.accept(status.rawValue) | |
statusTextColor.accept({ () -> UIColor in | |
switch status { | |
case .upcoming: | |
return .brown | |
case .success: | |
return .green | |
case .fail: | |
return .red | |
} | |
}()) | |
} | |
public func configure(_ cell: LaunchListTableViewCell) { // 4 | |
cell.viewModel = self | |
cell.setupListeners() | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment