git.iko.soy/dashared/hookah-tau
on develop help sign in
(#21): добавила отмену бронирований по свайпу на админке
commit4a7b7606c4bbf4bf41e484d1a589ed7e25a766aa authorDarya Rednikina <rednikina.com@yandex.ru> dateTue 7 Jan 2020, 12:29 (7 years ago) parentfb6f9c4
8 files changed+185−13
Hookah Tau.xcodeproj/project.pbxproj+8 Hookah Tau/API/Reservations api/ReservationsService.swift+8−2 Hookah Tau/API/Reservations api/Resolvers/Admin/ADeleteReservationResolver.swift+34 Hookah Tau/Controllers/Admin/Clients/Profile/ProfileTableViewController.swift+55−9 Hookah Tau/Controllers/Admin/Reservations/List of reservations/AdminReservationsController.swift+50 Hookah Tau/Controllers/BaseTableViewController.swift+28 Hookah Tau/Controllers/Client/Reservations/Active Reservations/ReservationsViewController.swift+1−1 Hookah Tau/Controllers/Client/Reservations/Steps/3/ThirdStepReservationViewController.swift+1−1
Hookah Tau.xcodeproj/project.pbxproj+8
@@ -95,6 +95,8 @@
9595 12D8FA2D237F003800305F57 /* DateView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 12D8FA2C237F003800305F57 /* DateView.xib */; };
9696 12D8FA2F237F00E200305F57 /* DateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12D8FA2E237F00E200305F57 /* DateView.swift */; };
9797 12D8FA31237F08C700305F57 /* AllReservations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12D8FA30237F08C700305F57 /* AllReservations.swift */; };
98+ 12D928AF23C47DCF0051724D /* ADeleteReservationResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12D928AE23C47DCF0051724D /* ADeleteReservationResolver.swift */; };
99+ 12D928B123C486380051724D /* BaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12D928B023C486380051724D /* BaseTableViewController.swift */; };
98100 12DBEEB223539F2100AF1BB6 /* Client.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 12DBEEB123539F2100AF1BB6 /* Client.storyboard */; };
99101 12E35071239FA8CA004BB188 /* Extensions+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12E35070239FA8CA004BB188 /* Extensions+String.swift */; };
100102 12E35074239FAF52004BB188 /* ClientsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12E35073239FAF52004BB188 /* ClientsService.swift */; };
@@ -249,6 +251,8 @@
249251 12D8FA2C237F003800305F57 /* DateView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DateView.xib; sourceTree = "<group>"; };
250252 12D8FA2E237F00E200305F57 /* DateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateView.swift; sourceTree = "<group>"; };
251253 12D8FA30237F08C700305F57 /* AllReservations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllReservations.swift; sourceTree = "<group>"; };
254+ 12D928AE23C47DCF0051724D /* ADeleteReservationResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ADeleteReservationResolver.swift; sourceTree = "<group>"; };
255+ 12D928B023C486380051724D /* BaseTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseTableViewController.swift; sourceTree = "<group>"; };
252256 12DBEEB123539F2100AF1BB6 /* Client.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Client.storyboard; sourceTree = "<group>"; };
253257 12E35070239FA8CA004BB188 /* Extensions+String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Extensions+String.swift"; sourceTree = "<group>"; };
254258 12E35073239FAF52004BB188 /* ClientsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClientsService.swift; sourceTree = "<group>"; };
@@ -590,6 +594,7 @@
590594 children = (
591595 12B3A7AC23ABEABF009E2FA6 /* AReservationsResolver.swift */,
592596 12B3A7C323AD2FCD009E2FA6 /* AChangeReservationResolver.swift */,
597+ 12D928AE23C47DCF0051724D /* ADeleteReservationResolver.swift */,
593598 );
594599 path = Admin;
595600 sourceTree = "<group>";
@@ -792,6 +797,7 @@
792797 F3FC7DFC2315C4710080D851 /* BaseCoordinator.swift */,
793798 F3FC7DFA2315C25D0080D851 /* ApplicationCoordinator.swift */,
794799 12B6A612235B9B4300898B31 /* BaseViewController.swift */,
800+ 12D928B023C486380051724D /* BaseTableViewController.swift */,
795801 12B3A79D23ABB8F4009E2FA6 /* Picker view */,
796802 F30369BB2336845F00A8EA84 /* Admin */,
797803 F30369BA2336845400A8EA84 /* Client */,
@@ -1171,6 +1177,7 @@
11711177 12B3A7BE23AD0049009E2FA6 /* AdminReservationEditingViewController.swift in Sources */,
11721178 12BE4B352399A60A00FC974B /* AdminTabbarController.swift in Sources */,
11731179 12FC403A2382CB6F00AB593B /* TableButton.swift in Sources */,
1180+ 12D928AF23C47DCF0051724D /* ADeleteReservationResolver.swift in Sources */,
11741181 12EB698123661CB300E4D1CE /* AddressCell.swift in Sources */,
11751182 F3895F48233D2EEA00FA6A37 /* CodeSmsViewController.swift in Sources */,
11761183 12219CEF2353A63F0057DDEE /* ReservationsCoordinator.swift in Sources */,
@@ -1236,6 +1243,7 @@
12361243 1212048E23915A0A00CAF162 /* ChangeReservationResolver.swift in Sources */,
12371244 12230AFC239034D3004A01E5 /* SecondStepReservationViewController.swift in Sources */,
12381245 F3851B2923409F8A009EE0B6 /* PhoneView.swift in Sources */,
1246+ 12D928B123C486380051724D /* BaseTableViewController.swift in Sources */,
12391247 12C72EE3235380EB00AD7004 /* ReservationsViewController.swift in Sources */,
12401248 12B6A611235B8EC500898B31 /* User.swift in Sources */,
12411249 12B3A7AD23ABEABF009E2FA6 /* AReservationsResolver.swift in Sources */,
Hookah Tau/API/Reservations api/ReservationsService.swift+8−2
@@ -40,8 +40,14 @@ class ReservationsService {
4040 }
4141 }
4242
43− func deleteReservation(uuid: String, completion: @escaping ((Bool) -> Void)) {
44− let resolver = DeleteReservationResolver(uuid: uuid)
43+ func deleteReservation(isAdmin: Bool, uuid: String, completion: @escaping ((Bool) -> Void)) {
44+ var resolver: ApiResolver!
45+ if isAdmin {
46+ resolver = ADeleteReservationResolver(uuid: uuid)
47+ } else {
48+ resolver = DeleteReservationResolver(uuid: uuid)
49+ }
50+
4551 let request = ApiRequest(resolver: resolver, httpMethod: .delete)
4652
4753 apiClient.load(request: request.request) { result in
Hookah Tau/API/Reservations api/Resolvers/Admin/ADeleteReservationResolver.swiftnew file+34
@@ -0,0 +1,34 @@
1+//
2+// ADeleteReservationResolver.swift
3+// Hookah Tau
4+//
5+// Created by cstore on 07/01/2020.
6+// Copyright © 2020 Daria Rednikina. All rights reserved.
7+//
8+
9+import Foundation
10+
11+class ADeleteReservationResolver: ApiResolver {
12+
13+ struct Request: MyCodable {
14+ var reservation: String
15+ }
16+
17+ var name: String {
18+ return "/reservations"
19+ }
20+
21+ var groupName: String? {
22+ return "/admin"
23+ }
24+
25+ var uuid: String
26+
27+ init(uuid: String) {
28+ self.uuid = uuid
29+ }
30+
31+ func parameters() -> MyCodable? {
32+ return Request(reservation: uuid)
33+ }
34+}
Hookah Tau/Controllers/Admin/Clients/Profile/ProfileTableViewController.swift+55−9
@@ -8,7 +8,7 @@
88
99import UIKit
1010
11−class ProfileTableViewController: UITableViewController {
11+class ProfileTableViewController: BaseTableViewController {
1212
1313 // MARK: - IBAOutlets
1414
@@ -33,6 +33,8 @@ class ProfileTableViewController: UITableViewController {
3333
3434 var clientsService: ClientsService?
3535
36+ var reservationsService: ReservationsService?
37+
3638 var user: FullUser? {
3739 didSet {
3840 guard let u = user else { return }
@@ -56,6 +58,7 @@ class ProfileTableViewController: UITableViewController {
5658 tableView?.register(ReservationCell.self, forCellReuseIdentifier: reservationCell)
5759
5860 clientsService = ClientsService(apiClient: APIClient.shared)
61+ reservationsService = ReservationsService(apiClient: APIClient.shared)
5962 loadReservations()
6063 }
6164
@@ -71,8 +74,33 @@ class ProfileTableViewController: UITableViewController {
7174 }
7275 })
7376 }
77+
78+ @objc func callUser() {
79+ guard
80+ let u = user,
81+ let urlPhone = URL(string: "tel://79\(u.phoneNumber)")
82+ else { return }
83+
84+ UIApplication.shared.open(urlPhone)
85+ }
86+
87+ func deleteReservation(uuid: String, completion: @escaping (([Reservation]?) -> Void)) {
88+ reservationsService?.deleteReservation(isAdmin: true, uuid: uuid) { result in
89+ if result {
90+ let newReservations = self.dataSource.filter { $0.uuid != uuid }
91+ completion(newReservations)
92+ return
93+ }
94+
95+ completion(nil)
96+ }
97+ }
98+
99+}
74100
75− // MARK: - Table view data source
101+// MARK: - Table view data source
102+
103+extension ProfileTableViewController {
76104
77105 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
78106 return dataSource.count
@@ -86,13 +114,31 @@ class ProfileTableViewController: UITableViewController {
86114 return cell
87115 }
88116
89− @objc func callUser() {
90− guard
91− let u = user,
92− let urlPhone = URL(string: "tel://79\(u.phoneNumber)")
93− else { return }
117+ // Update
118+
119+ override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
120+ return true
121+ }
122+
123+ override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
94124
95− UIApplication.shared.open(urlPhone)
125+ let uuid = dataSource[indexPath.row].uuid
126+ let cancelButton = UITableViewRowAction(style: .normal, title: "❌") { _,_ in
127+
128+ self.deleteReservation(uuid: uuid) { optionalNewVal in
129+ if let newval = optionalNewVal {
130+ self.tableView?.beginUpdates()
131+ self.tableView?.deleteRows(at: [indexPath], with: .automatic)
132+ self.dataSource = newval
133+ self.tableView?.endUpdates()
134+ } else {
135+ self.displayAlert(with: "Не удалось удалить вашу бронь! Попробуйте еще раз!")
136+ }
137+ }
138+ }
139+
140+ cancelButton.backgroundColor = .black
141+
142+ return [cancelButton]
96143 }
97−
98144}
Hookah Tau/Controllers/Admin/Reservations/List of reservations/AdminReservationsController.swift+50
@@ -114,6 +114,18 @@ class AdminReservationsController: BaseViewController {
114114 @objc func book() {
115115
116116 }
117+
118+ func deleteReservation(uuid: String, completion: @escaping (([ReservationWithUser]?) -> Void)) {
119+ reservationsService?.deleteReservation(isAdmin: true, uuid: uuid) { result in
120+ if result {
121+ let newReservations = self.activeReservations.filter { $0.uuid != uuid }
122+ completion(newReservations)
123+ return
124+ }
125+
126+ completion(nil)
127+ }
128+ }
117129
118130}
119131
@@ -141,5 +153,43 @@ extension AdminReservationsController: UITableViewDelegate, UITableViewDataSourc
141153 let reservation = activeReservations[indexPath.row]
142154 coordinator?.seeExistingReservation(data: reservation)
143155 }
156+
157+ // Dimesions
158+
159+ func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
160+ return UITableView.automaticDimension
161+ }
162+
163+ func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
164+ return 180.0
165+ }
166+
167+ // Update
168+
169+ func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
170+ return true
171+ }
172+
173+ func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
174+
175+ let uuid = activeReservations[indexPath.row].uuid
176+ let cancelButton = UITableViewRowAction(style: .normal, title: "❌") { _,_ in
177+
178+ self.deleteReservation(uuid: uuid) { optionalNewVal in
179+ if let newval = optionalNewVal {
180+ self.tableView?.beginUpdates()
181+ self.tableView?.deleteRows(at: [indexPath], with: .automatic)
182+ self.activeReservations = newval
183+ self.tableView?.endUpdates()
184+ } else {
185+ self.displayAlert(with: "Не удалось удалить вашу бронь! Попробуйте еще раз!")
186+ }
187+ }
188+ }
189+
190+ cancelButton.backgroundColor = .black
191+
192+ return [cancelButton]
193+ }
144194
145195}
Hookah Tau/Controllers/BaseTableViewController.swiftnew file+28
@@ -0,0 +1,28 @@
1+//
2+// BaseTableViewController.swift
3+// Hookah Tau
4+//
5+// Created by cstore on 07/01/2020.
6+// Copyright © 2020 Daria Rednikina. All rights reserved.
7+//
8+
9+import UIKit
10+
11+class BaseTableViewController: UITableViewController {
12+
13+ // MARK: - Alert
14+
15+ func displayAlert(forError error: GeneralError = GeneralError.noData, with message: String? = nil) {
16+ var title: String? = message == nil ? error.localizedDescription : message
17+ switch error {
18+ case .serverError(let se):
19+ title = se.error
20+ fallthrough // да тоже произведение искусства
21+ default:
22+ let alert = UIAlertController(title: title, message: nil, preferredStyle: .alert)
23+ alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
24+ self.present(alert, animated: true, completion: nil)
25+ }
26+ }
27+
28+}
Hookah Tau/Controllers/Client/Reservations/Active Reservations/ReservationsViewController.swift+1−1
@@ -124,7 +124,7 @@ class ReservationsViewController: BaseViewController {
124124 }
125125
126126 func deleteReservation(uuid: String, completion: @escaping (([Reservation]?) -> Void)) {
127− reservationsService?.deleteReservation(uuid: uuid) { result in
127+ reservationsService?.deleteReservation(isAdmin: false, uuid: uuid) { result in
128128 if result {
129129 let newReservations = self.activeReservations.filter { $0.uuid != uuid }
130130 completion(newReservations)
Hookah Tau/Controllers/Client/Reservations/Steps/3/ThirdStepReservationViewController.swift+1−1
@@ -139,7 +139,7 @@ class ThirdStepReservationViewController: BaseViewController {
139139 guard let res = reservation else { return }
140140
141141 cancelButton.loading = true
142− reservationService?.deleteReservation(uuid: res.uuid, completion: { [weak self] (result) in
142+ reservationService?.deleteReservation(isAdmin: false, uuid: res.uuid, completion: { [weak self] (result) in
143143 self?.cancelButton.loading = false
144144
145145 if result {