You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
4.9 KiB

2 years ago
//
// SportDetailViewModels.swift
2 years ago
// Lookfit
//
// Created by lemo. on 2020/4/13.
// Copyright © 2020 Sheldon. All rights reserved.
//
import UIKit
import RxSwift
import CoreLocation
class SportDetailViewModels: ViewModel, ViewModelType {
2 years ago
struct Input {
}
struct Output {
let items: BehaviorRelay<[SectionModel<String, SportDetailCellViewModels>]>
2 years ago
let sportName: Driver<String>
let time: Driver<String>
let distance: Driver<String>
let distanceUnit: Driver<String>
let trajectory: Driver<(Bool, [CLLocationCoordinate2D])>
}
func transform(input: SportDetailViewModels.Input) -> SportDetailViewModels.Output {
let items = BehaviorRelay<[SectionModel<String, SportDetailCellViewModels>]>(value: [])
var dataSource: [SportDetailCellViewModels] = []
let cellViewModel1 = SportDetailCellViewModels(title: MultiLanguageKey.sportDuration.localized, img: R.image.icon_sporttime(), value: sportModel.durationStr, unit: nil)
let cellViewModel2 = SportDetailCellViewModels(title: MultiLanguageKey.consume.localized, img: R.image.icon_calories(), value: String(sportModel.calorie), unit: "kCal", rightLineHidden: true)
let cellViewModel3 = SportDetailCellViewModels(title: MultiLanguageKey.paceAvg.localized, img: R.image.icon_pace(), value: sportModel.avgPaceStr, unit: nil)
let cellViewModel4 = SportDetailCellViewModels(title: MultiLanguageKey.speedAvg.localized, img: R.image.icon_speed(), value: sportModel.avgSpeedStr, unit: "km/h", rightLineHidden: true)
let cellViewModel5 = SportDetailCellViewModels(title: MultiLanguageKey.strideAvg.localized, img: R.image.icon_stride(), value: String(sportModel.stepFrequency), unit: MultiLanguageKey.strideTip.localized)
let cellViewModel6 = SportDetailCellViewModels(title: MultiLanguageKey.cadenceAvg.localized, img: R.image.icon_cadence(), value: String(sportModel.stride), unit: MultiLanguageKey.cm.localized, rightLineHidden: true)
let cellViewModel7 = SportDetailCellViewModels(title: MultiLanguageKey.stepNumber.localized, img: R.image.icon_stepNumber(), value: String(sportModel.stepNumber), unit: MultiLanguageKey.stepTip.localized)
let cellViewModel8 = SportDetailCellViewModels(title: MultiLanguageKey.avgHr.localized, img: R.image.icon_heartRate(), value: String(sportModel.heartAvg), unit: "bpm", rightLineHidden: true)
2 years ago
dataSource.append(cellViewModel1)
dataSource.append(cellViewModel2)
dataSource.append(cellViewModel3)
dataSource.append(cellViewModel4)
dataSource.append(cellViewModel5)
dataSource.append(cellViewModel6)
dataSource.append(cellViewModel7)
dataSource.append(cellViewModel8)
items.accept([SectionModel(model: "", items: dataSource)])
let sportName = Driver.just(sportModel.getSportType.sportTypeName)
let time = Driver.just(sportModel.dataDate)
let distance = Driver.just(String(format: "%.2lf", Float(sportModel.distance) / 1000.0))
let metric = UserDefaultsManager.getUserInfo()?.metricUnit ?? 0
let distanceUnit = Driver.just(metric == 0 ? "km" : "miles")
let coordinates = sportModel.coordinates
let trajectory = Driver.just((coordinates.count == 0, coordinates))
return Output(items: items,
sportName: sportName,
time: time,
distance: distance,
distanceUnit: distanceUnit,
trajectory: trajectory)
}
private var sportModel: SportModel
init(sportModel: SportModel) {
self.sportModel = sportModel
super.init()
}
}
extension SportModel {
///
var coordinates: [CLLocationCoordinate2D] {
// let bool = arc4random() % 2 + 1
// if bool == 1 {
// gpsDeatail = "5|22.536874|113.961758|1281, 5|22.556874|113.961758|1281, 5|22.576874|113.961758|1281"
// }else {
// gpsDeatail = ""
// }
let tempCoordinateArr = gpsDeatail.components(separatedBy: ",")
if tempCoordinateArr.count < 2 {
return []
}
var coordinateArr: [CLLocationCoordinate2D] = []
tempCoordinateArr.forEach { (coordinateStr) in
let coords = coordinateStr.components(separatedBy: "|")
let formatter = NumberFormatter()
formatter.locale = .current
formatter.allowsFloats = true
if coords.count >= 4, let latitude = formatter.number(from: coords[1])?.doubleValue, let longitude = formatter.number(from: coords[2])?.doubleValue {
// GCJ-02()
let coordinate = TQLocationConverter.transformFromWGS(toGCJ: CLLocationCoordinate2DMake(latitude, longitude))
coordinateArr.append(coordinate)
}
}
return coordinateArr
}
}