diff --git a/AutoCat.xcodeproj/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist b/AutoCat.xcodeproj/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist index cc65585..825a033 100644 --- a/AutoCat.xcodeproj/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/AutoCat.xcodeproj/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,28 +7,28 @@ AutoCat.xcscheme_^#shared#^_ orderHint - 0 + 1 Eureka (Playground) 1.xcscheme isShown orderHint - 9 + 5 Eureka (Playground) 2.xcscheme isShown orderHint - 10 + 6 Eureka (Playground).xcscheme isShown orderHint - 3 + 4 GettingStarted (Playground) 1.xcscheme @@ -70,7 +70,7 @@ isShown orderHint - 5 + 10 Rx (Playground) 1.xcscheme @@ -84,28 +84,28 @@ isShown orderHint - 4 + 3 Rx (Playground).xcscheme isShown orderHint - 1 + 0 SwiftDate (Playground) 1.xcscheme isShown orderHint - 7 + 8 SwiftDate (Playground) 2.xcscheme isShown orderHint - 8 + 9 SwiftDate (Playground) 3.xcscheme @@ -133,7 +133,7 @@ isShown orderHint - 6 + 7 diff --git a/AutoCat/Cells/AudioRecordCell.swift b/AutoCat/Cells/AudioRecordCell.swift index cb61062..8c233ee 100644 --- a/AutoCat/Cells/AudioRecordCell.swift +++ b/AutoCat/Cells/AudioRecordCell.swift @@ -39,7 +39,7 @@ class AudioRecordCell: UITableViewCell { func configure(with record: AudioRecord) { self.record = record - self.date.text = self.dateFormatter.string(from: Date(timeIntervalSince1970: record.addedDate)) + self.date.text = self.dateFormatter.string(from: Date(timeIntervalSince1970: record.getAddedDate())) self.number.text = record.number ?? "Unrecognized" self.duration.text = self.componentsFormatter.string(from: record.duration) diff --git a/AutoCat/Cells/VehicleCell.swift b/AutoCat/Cells/VehicleCell.swift index 974e40c..eef8b5d 100644 --- a/AutoCat/Cells/VehicleCell.swift +++ b/AutoCat/Cells/VehicleCell.swift @@ -17,7 +17,7 @@ class VehicleCell: UITableViewCell { func configure(with vehicle: Vehicle) { self.name.text = vehicle.brand?.name?.original ?? "" - self.plate.number = PlateNumber(vehicle.number) + self.plate.number = PlateNumber(vehicle.getNumber()) if vehicle.unrecognized { self.plate.foreground = .systemRed } else if vehicle.outdated { diff --git a/AutoCat/Controllers/CheckController.swift b/AutoCat/Controllers/CheckController.swift index 0cfb280..6cb6188 100644 --- a/AutoCat/Controllers/CheckController.swift +++ b/AutoCat/Controllers/CheckController.swift @@ -185,7 +185,7 @@ class CheckController: UIViewController, UITableViewDelegate, UITextFieldDelegat eventSingle .flatMap { event in event.findAddress().map{ event }.catchErrorJustReturn(event) } .flatMap { - Api.add(event: $0, to: vehicle.number) + Api.add(event: $0, to: vehicle.getNumber()) } .subscribe(onSuccess: self.save(vehicle:), onError: { print("Error adding event: \($0)") }) .disposed(by: self.bag) @@ -209,7 +209,7 @@ class CheckController: UIViewController, UITableViewDelegate, UITextFieldDelegat if let detail = detail { detail.popToRootViewController(animated: true) let report = detail.viewControllers.first as? ReportController - report?.number = vehicle.number + report?.number = vehicle.getNumber() splitViewController.showDetailViewController(detail, sender: self) //self.performSegue(withIdentifier: "OpenDetailSegue", sender: self) } @@ -252,7 +252,7 @@ class CheckController: UIViewController, UITableViewDelegate, UITextFieldDelegat eventAction = .sendSpecific(savedEvent.freeze()) } - Api.checkVehicle(by: vehicle.number, force: true) + Api.checkVehicle(by: vehicle.getNumber(), force: true) .observeOn(MainScheduler.instance) .subscribe(onSuccess: { vehicle in self.onReceivedVehicle(vehicle, action: eventAction) @@ -264,7 +264,21 @@ class CheckController: UIViewController, UITableViewDelegate, UITextFieldDelegat } updateAction.image = UIImage(systemName: "arrow.2.circlepath") updateAction.backgroundColor = .systemBlue - let configuration = UISwipeActionsConfiguration(actions: [updateAction]) + + let removeAction = UIContextualAction(style: .destructive, title: "Remove") { action, view, completion in + if let realm = vehicle.realm { + do { + try realm.write { + realm.delete(vehicle) + } + } catch { + print(error) + } + } + } + removeAction.image = UIImage(systemName: "trash") + + let configuration = UISwipeActionsConfiguration(actions: [updateAction, removeAction]) configuration.performsFirstActionWithFullSwipe = false return configuration } diff --git a/AutoCat/Controllers/Location/EventsController.swift b/AutoCat/Controllers/Location/EventsController.swift index fe293e6..b44f414 100644 --- a/AutoCat/Controllers/Location/EventsController.swift +++ b/AutoCat/Controllers/Location/EventsController.swift @@ -60,7 +60,7 @@ class EventsController: UIViewController, UITableViewDataSource, UITableViewDele override func viewDidLoad() { super.viewDidLoad() - self.title = self.vehicle?.number ?? "Events" + self.title = self.vehicle?.getNumber() ?? "Events" #if targetEnvironment(macCatalyst) self.map.showsZoomControls = true @@ -207,7 +207,7 @@ class EventsController: UIViewController, UITableViewDataSource, UITableViewDele controller.onDone = { newEvent in self.navigationController?.popViewController(animated: true, completion: { IHProgressHUD.show() - Api.add(event: newEvent, to: vehicle.number) + Api.add(event: newEvent, to: vehicle.getNumber()) .observeOn(MainScheduler.instance) .subscribe(onSuccess: { self.update(vehicle: $0) }, onError: { error in diff --git a/AutoCat/Controllers/ReportController.swift b/AutoCat/Controllers/ReportController.swift index fa02288..e5a1465 100644 --- a/AutoCat/Controllers/ReportController.swift +++ b/AutoCat/Controllers/ReportController.swift @@ -204,9 +204,9 @@ class ReportController: UIViewController, UICollectionViewDataSource, UICollecti if let idSection = ReportIdSection(rawValue: indexPath.item) { switch idSection { case .number: - var num = vehicle.number + var num = vehicle.getNumber() if vehicle.outdated, let current = vehicle.currentNumber { - num = "\(vehicle.number) (\(current))" + num = "\(vehicle.getNumber()) (\(current))" } cell?.configure(param: idSection.description, value: num) break @@ -423,7 +423,7 @@ class ReportController: UIViewController, UICollectionViewDataSource, UICollecti let shareLink = UIAlertAction(title: "As link", style: .default) { _ in guard let vehicle = self.vehicle else { return } - if let jwt = try? JWT.generate(for: vehicle.number), let url = URL(string: Constants.reportLinkBaseURL + "?token=" + jwt) { + if let jwt = try? JWT.generate(for: vehicle.getNumber()), let url = URL(string: Constants.reportLinkBaseURL + "?token=" + jwt) { let controller = UIActivityViewController(activityItems: [url], applicationActivities: nil) controller.popoverPresentationController?.barButtonItem = sender self.present(controller, animated: true) @@ -449,7 +449,7 @@ class ReportController: UIViewController, UICollectionViewDataSource, UICollecti guard let url = self.reportImageUrl else { return nil } let metadata = LPLinkMetadata() - metadata.title = self.vehicle?.number + metadata.title = self.vehicle?.getNumber() metadata.originalURL = url metadata.url = url metadata.imageProvider = NSItemProvider.init(contentsOf: url) @@ -463,7 +463,7 @@ class ReportController: UIViewController, UICollectionViewDataSource, UICollecti let sheet = UIAlertController(title: "Copy to pasteboard", message: nil, preferredStyle: .actionSheet) sheet.popoverPresentationController?.barButtonItem = self.copyBarItem let cancel = UIAlertAction(title: "Cancel", style: .cancel) { _ in sheet.dismiss(animated: true, completion: nil) } - let copyPlateNumber = UIAlertAction(title: "Plate number", style: .default) { _ in UIPasteboard.general.string = self.vehicle?.number } + let copyPlateNumber = UIAlertAction(title: "Plate number", style: .default) { _ in UIPasteboard.general.string = self.vehicle?.getNumber() } let copyVin = UIAlertAction(title: "VIN", style: .default) { _ in UIPasteboard.general.string = self.vehicle?.vin1 } sheet.addAction(copyPlateNumber) sheet.addAction(copyVin) diff --git a/AutoCat/Extensions/Dated.swift b/AutoCat/Extensions/Dated.swift index 9d552cc..42472b6 100644 --- a/AutoCat/Extensions/Dated.swift +++ b/AutoCat/Extensions/Dated.swift @@ -19,7 +19,7 @@ extension Vehicle: Dated { extension AudioRecord: Dated { var date: Date { - Date(timeIntervalSince1970: self.addedDate) + Date(timeIntervalSince1970: self.getAddedDate()) } } diff --git a/AutoCat/Extensions/VehicleReportImage.swift b/AutoCat/Extensions/VehicleReportImage.swift index 8f85918..7174e6d 100644 --- a/AutoCat/Extensions/VehicleReportImage.swift +++ b/AutoCat/Extensions/VehicleReportImage.swift @@ -68,7 +68,7 @@ extension Vehicle { UIRectFill(rect) y += 12 - "\(self.brand?.name?.original ?? "Unknown model") (\(self.number))".draw(with: CGRect(x: 0, y: y, width: w, height: 30), options: .usesLineFragmentOrigin, attributes: titleAttributes, context: nil) + "\(self.brand?.name?.original ?? "Unknown model") (\(self.getNumber()))".draw(with: CGRect(x: 0, y: y, width: w, height: 30), options: .usesLineFragmentOrigin, attributes: titleAttributes, context: nil) y += 50 "GENERAL".draw(with: CGRect(x: 15, y: y, width: w - 15, height: 24), options: .usesLineFragmentOrigin, attributes: headerAttributes, context: nil) y += 24 @@ -93,7 +93,7 @@ extension Vehicle { y += 24 self.drawLine(y: y, width: w, margin: 0, context: ctx) y += 1/UIScreen.main.scale - self.drawCell(y: y, width: w, height: cellHeight, title: "Plate number", value: self.number, context: ctx) + self.drawCell(y: y, width: w, height: cellHeight, title: "Plate number", value: self.getNumber(), context: ctx) y += cellHeight self.drawCell(y: y, width: w, height: cellHeight, title: "VIN", value: self.vin1 ?? "", context: ctx) y += cellHeight @@ -216,7 +216,7 @@ extension Vehicle { } text += "Steering wheel position: \(position)\n" text += "Japanese: \(self.isJapanese ? "yes" : "no")\n" - text += "Plate number: \(self.number)\n" + text += "Plate number: \(self.getNumber())\n" if let vin = self.vin1 { text += "VIN: \(vin)\n" } if let sts = self.sts { text += "STS: \(sts)\n" } if let pts = self.pts { text += "PTS: \(pts)\n" } diff --git a/AutoCat/Models/AudioRecord.swift b/AutoCat/Models/AudioRecord.swift index 48546f1..a6c828e 100644 --- a/AutoCat/Models/AudioRecord.swift +++ b/AutoCat/Models/AudioRecord.swift @@ -7,7 +7,7 @@ class AudioRecord: Object, IdentifiableType { @objc dynamic var path: String = "" @objc dynamic var number: String? @objc dynamic var rawText: String = "" - @objc dynamic var addedDate: TimeInterval = Date().timeIntervalSince1970 + @objc private dynamic var addedDate: TimeInterval = Date().timeIntervalSince1970 @objc dynamic var duration: TimeInterval = 0 @objc dynamic var event: VehicleEvent? @@ -35,4 +35,12 @@ class AudioRecord: Object, IdentifiableType { override class func ignoredProperties() -> [String] { return ["identity", "identifier"] } + + func getAddedDate() -> TimeInterval { + if self.identifier == 0 { + self.identifier = self.addedDate + } + + return self.addedDate + } } diff --git a/AutoCat/Models/Vehicle.swift b/AutoCat/Models/Vehicle.swift index acffe89..c7c1d64 100644 --- a/AutoCat/Models/Vehicle.swift +++ b/AutoCat/Models/Vehicle.swift @@ -73,7 +73,7 @@ class Vehicle: Object, Decodable, IdentifiableType { @objc dynamic var year: Int = 0 @objc dynamic var category: String? @objc dynamic var engine: VehicleEngine? - @objc dynamic var number: String = "" + @objc private dynamic var number: String = "" @objc dynamic var currentNumber: String? @objc dynamic var vin1: String? @objc dynamic var vin2: String? @@ -87,7 +87,15 @@ class Vehicle: Object, Decodable, IdentifiableType { let ownershipPeriods = List() let events = List() - var identity: String { number } + //var identity: String { number } + + var identifier: String = "" + var identity: String { + if self.identifier.isEmpty { + self.identifier = self.number + } + return self.identifier + } enum CodingKeys: String, CodingKey { case brand @@ -141,21 +149,40 @@ class Vehicle: Object, Decodable, IdentifiableType { if let eventsArray = try container.decodeIfPresent([VehicleEvent].self, forKey: .events) { self.events.append(objectsIn: eventsArray) } + + print("Init from decoder - \(self.number)") + self.identifier = self.number } required init() { - + super.init() + print("Init - \(self.number)") + self.identifier = self.number } init(_ number: String) { + print("Init with number - \(number)") + self.identifier = number self.number = number self.addedDate = Date().timeIntervalSince1970*1000 } + func getNumber() -> String { + if self.identifier.isEmpty { + self.identifier = self.number + } + + return self.number + } + override static func primaryKey() -> String? { return "number" } + override class func ignoredProperties() -> [String] { + return ["identity", "identifier"] + } + var unrecognized: Bool { return self.brand == nil } diff --git a/AutoCat/Utils/Constants.swift b/AutoCat/Utils/Constants.swift index fd8bd02..34e7169 100644 --- a/AutoCat/Utils/Constants.swift +++ b/AutoCat/Utils/Constants.swift @@ -3,9 +3,9 @@ import Foundation enum Constants { static var baseUrl: String { #if DEBUG - //return "http://127.0.0.1:3000/" + return "http://127.0.0.1:3000/" //return "http://192.168.1.67:3000/" - return "https://vps.aliencat.pro:8443/" + //return "https://vps.aliencat.pro:8443/" #else return "https://vps.aliencat.pro:8443/" #endif