git.iko.soy/dashared/hookah-tau
on develop help sign in
Подсоединила первый и второй экран к процессу сохдания брони с админки

+ PhoneTextField

commite15738da5b63c7850d0bca76dee28bf79258f386 authorDarya Rednikina <rednikina.com@yandex.ru> dateMon 13 Jan 2020, 17:09 (7 years ago) parent7f3d912
12 files changed+388−9
AdminSecondStepReservationViewController.swift+97 Hookah Tau.xcodeproj/project.pbxproj+32 Hookah Tau/Components/PhoneTextField.swift+63 Hookah Tau/Controllers/Admin/Reservations/AdminReservations.storyboard+64 Hookah Tau/Controllers/Admin/Reservations/List of reservations/AdminReservationsController.swift+2−1 Hookah Tau/Controllers/Admin/Reservations/List of reservations/AdminReservationsCoordinator.swift+13 Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/AdminFirstStepReservationViewCoordinator.swift+61 Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/AdminSecondStepReservationViewCoordinator.swift+27 Hookah Tau/Controllers/BaseViewController.swift+1−1 Hookah Tau/Controllers/Client/Reservations/Steps/1/FirstStepReservationCoordinator.swift+8−1 Hookah Tau/Controllers/Client/Reservations/Steps/1/FirstStepReservationViewController.swift+15−6 Hookah Tau/Models/Reservation.swift+5
AdminSecondStepReservationViewController.swiftnew file+97
@@ -0,0 +1,97 @@
1+//
2+// AdminSecondStepReservationViewController.swift
3+// Hookah Tau
4+//
5+// Created by cstore on 13/01/2020.
6+// Copyright © 2020 Daria Rednikina. All rights reserved.
7+//
8+
9+import UIKit
10+
11+class AdminSecondStepReservationViewController: BaseViewController {
12+
13+ // MARK: - IBAOutlets
14+
15+ @IBOutlet weak var mapContainerView: UIView!
16+
17+ @IBOutlet weak var heightConstraint: NSLayoutConstraint!
18+
19+ @IBOutlet weak var phoneTextField: PhoneTextField!
20+
21+ @IBOutlet weak var phoneContentView: UIView!
22+
23+ // MARK: - Properties
24+
25+ var mapScrollView: MapImageScroll?
26+
27+ weak var coordinator: AdminSecondStepReservationViewCoordinator?
28+
29+ let continueButton: Button = {
30+ let button = Button()
31+ let style = BlackButtonStyle()
32+ style.apply(to: button, withTitle: "ДАЛЕЕ")
33+ return button
34+ }()
35+
36+ let cancelButton: Button = {
37+ let button = Button()
38+ let style = BlackButtonStyle()
39+ style.apply(to: button, withTitle: "ОТМЕНИТЬ")
40+ return button
41+ }()
42+
43+ // MARK: - Lifecycle
44+
45+ override func viewDidLoad() {
46+ super.viewDidLoad()
47+
48+ setupMap()
49+ setupButtons()
50+ setUpKeyboard()
51+
52+ phoneTextField.becomeFirstResponder()
53+ }
54+
55+ // MARK: - Set up
56+
57+ func setupMap() {
58+ mapScrollView?.scrollToTable(table: 8)
59+ mapContainerView.addSubviewThatFills(mapScrollView)
60+ }
61+
62+ func setupButtons() {
63+ addStackViewWithButtons(leftBtn: cancelButton,
64+ rightBtn: continueButton,
65+ constant: -phoneContentView.frame.height - 20)
66+
67+ cancelButton.addTarget(self, action: #selector(cancel), for: .touchUpInside)
68+ continueButton.addTarget(self, action: #selector(continueBooking), for: .touchUpInside)
69+ }
70+
71+ // MARK: - Keyboad
72+
73+ @objc
74+ override func handleKeyboardNotifications(notification: NSNotification) {
75+ if let userInfo = notification.userInfo {
76+ let keyBoardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
77+ heightConstraint?.constant = notification.name == UIResponder.keyboardWillShowNotification ? keyBoardFrame.height + view.safeAreaInsets.bottom + 120.5 : 120.5
78+ bottomConstraint?.constant = notification.name == UIResponder.keyboardWillShowNotification ? -keyBoardFrame.height + view.safeAreaInsets.bottom - 140.5 : -140.5
79+
80+ UIView.animate(withDuration: 0, delay: 0, options: .curveEaseOut, animations: {
81+ self.view.layoutIfNeeded()
82+ })
83+ }
84+ }
85+
86+ // MARK: - Button handlers
87+
88+ @objc func cancel() {
89+ coordinator?.didEndFlow?()
90+ }
91+
92+ @objc func continueBooking() {
93+
94+ }
95+
96+
97+}
Hookah Tau.xcodeproj/project.pbxproj+32
@@ -51,6 +51,10 @@
5151 12838EB4236779C700CEF108 /* ApiResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12838EB3236779C700CEF108 /* ApiResolver.swift */; };
5252 12838EB623677FB900CEF108 /* ApiRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12838EB523677FB900CEF108 /* ApiRequest.swift */; };
5353 12838EB82367834900CEF108 /* MyCodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12838EB72367834900CEF108 /* MyCodable.swift */; };
54+ 129F162723CC838200EE13FC /* AdminFirstStepReservationViewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 129F162623CC838200EE13FC /* AdminFirstStepReservationViewCoordinator.swift */; };
55+ 129F162C23CC8D2E00EE13FC /* AdminSecondStepReservationViewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 129F162B23CC8D2E00EE13FC /* AdminSecondStepReservationViewCoordinator.swift */; };
56+ 129F162E23CC8DB900EE13FC /* AdminSecondStepReservationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 129F162D23CC8DB900EE13FC /* AdminSecondStepReservationViewController.swift */; };
57+ 129F163023CC8EF600EE13FC /* PhoneTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 129F162F23CC8EF600EE13FC /* PhoneTextField.swift */; };
5458 12A075F72373535C00D749BB /* FirstStepReservationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12A075F62373535C00D749BB /* FirstStepReservationViewController.swift */; };
5559 12A075F9237353F500D749BB /* MapView1.xib in Resources */ = {isa = PBXBuildFile; fileRef = 12A075F8237353F500D749BB /* MapView1.xib */; };
5660 12A075FB2373561A00D749BB /* Reservation.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 12A075FA2373561A00D749BB /* Reservation.storyboard */; };
@@ -208,6 +212,10 @@
208212 12838EB3236779C700CEF108 /* ApiResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApiResolver.swift; sourceTree = "<group>"; };
209213 12838EB523677FB900CEF108 /* ApiRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApiRequest.swift; sourceTree = "<group>"; };
210214 12838EB72367834900CEF108 /* MyCodable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyCodable.swift; sourceTree = "<group>"; };
215+ 129F162623CC838200EE13FC /* AdminFirstStepReservationViewCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdminFirstStepReservationViewCoordinator.swift; sourceTree = "<group>"; };
216+ 129F162B23CC8D2E00EE13FC /* AdminSecondStepReservationViewCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdminSecondStepReservationViewCoordinator.swift; sourceTree = "<group>"; };
217+ 129F162D23CC8DB900EE13FC /* AdminSecondStepReservationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdminSecondStepReservationViewController.swift; sourceTree = SOURCE_ROOT; };
218+ 129F162F23CC8EF600EE13FC /* PhoneTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneTextField.swift; sourceTree = "<group>"; };
211219 12A075F62373535C00D749BB /* FirstStepReservationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstStepReservationViewController.swift; sourceTree = "<group>"; };
212220 12A075F8237353F500D749BB /* MapView1.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MapView1.xib; sourceTree = "<group>"; };
213221 12A075FA2373561A00D749BB /* Reservation.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Reservation.storyboard; sourceTree = "<group>"; };
@@ -468,6 +476,7 @@
468476 123D25ED239E3D50002FA32B /* Reservations */ = {
469477 isa = PBXGroup;
470478 children = (
479+ 129F162523CC836600EE13FC /* Making a reeservation */,
471480 12B3A79623ABAD9A009E2FA6 /* Views */,
472481 12B3A7C123AD0751009E2FA6 /* Editing */,
473482 12B3A7C223AD0762009E2FA6 /* List of reservations */,
@@ -562,9 +571,27 @@
562571 path = API;
563572 sourceTree = "<group>";
564573 };
574+ 129F162523CC836600EE13FC /* Making a reeservation */ = {
575+ isa = PBXGroup;
576+ children = (
577+ 129F162D23CC8DB900EE13FC /* AdminSecondStepReservationViewController.swift */,
578+ 129F162623CC838200EE13FC /* AdminFirstStepReservationViewCoordinator.swift */,
579+ 129F162B23CC8D2E00EE13FC /* AdminSecondStepReservationViewCoordinator.swift */,
580+ );
581+ path = "Making a reeservation";
582+ sourceTree = "<group>";
583+ };
584+ 129F162823CC89EA00EE13FC /* Phone number */ = {
585+ isa = PBXGroup;
586+ children = (
587+ );
588+ path = "Phone number";
589+ sourceTree = "<group>";
590+ };
565591 12B3A79623ABAD9A009E2FA6 /* Views */ = {
566592 isa = PBXGroup;
567593 children = (
594+ 129F162823CC89EA00EE13FC /* Phone number */,
568595 12B3A7B223AC1A1F009E2FA6 /* No reserv */,
569596 12B3A79723ABADB9009E2FA6 /* AdminReservationView.xib */,
570597 12B3A79E23ABCA21009E2FA6 /* AdminReservationView.swift */,
@@ -812,6 +839,7 @@
812839 F3DC5A04233E89D500B5E751 /* Button.swift */,
813840 12FC40372382C93C00AB593B /* TableButtonStyle.swift */,
814841 12FC40392382CB6F00AB593B /* TableButton.swift */,
842+ 129F162F23CC8EF600EE13FC /* PhoneTextField.swift */,
815843 );
816844 path = Components;
817845 sourceTree = "<group>";
@@ -1136,6 +1164,8 @@
11361164 files = (
11371165 12EA99482362B684005D9FE9 /* AddresViewController.swift in Sources */,
11381166 124D007F237222B200AE76B9 /* ReservationsResolver.swift in Sources */,
1167+ 129F163023CC8EF600EE13FC /* PhoneTextField.swift in Sources */,
1168+ 129F162C23CC8D2E00EE13FC /* AdminSecondStepReservationViewCoordinator.swift in Sources */,
11391169 12230AF723900D44004A01E5 /* EstablishmentResolver.swift in Sources */,
11401170 1246B719235CD3AD004CBFA1 /* NoReservationsView.swift in Sources */,
11411171 F3895F4A233D323700FA6A37 /* CodeCoordinator.swift in Sources */,
@@ -1166,10 +1196,12 @@
11661196 12BE4B352399A60A00FC974B /* AdminTabbarController.swift in Sources */,
11671197 12FC403A2382CB6F00AB593B /* TableButton.swift in Sources */,
11681198 12D928AF23C47DCF0051724D /* ADeleteReservationResolver.swift in Sources */,
1199+ 129F162E23CC8DB900EE13FC /* AdminSecondStepReservationViewController.swift in Sources */,
11691200 12EB698123661CB300E4D1CE /* AddressCell.swift in Sources */,
11701201 F3895F48233D2EEA00FA6A37 /* CodeSmsViewController.swift in Sources */,
11711202 12219CEF2353A63F0057DDEE /* ReservationsCoordinator.swift in Sources */,
11721203 12230AF423900BCB004A01E5 /* EstablishmentService.swift in Sources */,
1204+ 129F162723CC838200EE13FC /* AdminFirstStepReservationViewCoordinator.swift in Sources */,
11731205 12A07601237359BB00D749BB /* MapView1.swift in Sources */,
11741206 125AE5212395753400F847BD /* HFunc.swift in Sources */,
11751207 12BD95B8237EDB01009614D8 /* TimePointView.swift in Sources */,
Hookah Tau/Components/PhoneTextField.swiftnew file+63
@@ -0,0 +1,63 @@
1+//
2+// PhoneTextField.swift
3+// Hookah Tau
4+//
5+// Created by cstore on 13/01/2020.
6+// Copyright © 2020 Daria Rednikina. All rights reserved.
7+//
8+
9+import UIKit
10+
11+class PhoneTextField: UITextField, UITextFieldDelegate {
12+
13+ override func awakeFromNib() {
14+ super.awakeFromNib()
15+
16+ self.delegate = self
17+ self.keyboardType = .numberPad
18+ }
19+
20+ func bind(withModel model: String) {
21+ self.text = model.formattedNumber()
22+ }
23+
24+ func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
25+ let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
26+ textField.text = formattedNumber(newString)
27+ return false
28+ }
29+
30+ private func formattedNumber(_ number: String) -> String {
31+ let cleanPhoneNumber = number.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()
32+
33+ var result = ""
34+ let phoneMask = "+X (XXX) XXX XX XX"
35+ var index = cleanPhoneNumber.startIndex
36+ for ch in phoneMask where index < cleanPhoneNumber.endIndex {
37+ if ch == "X" {
38+ result.append(cleanPhoneNumber[index])
39+ index = cleanPhoneNumber.index(after: index)
40+ } else {
41+ result.append(ch)
42+ }
43+ }
44+ return result
45+ }
46+
47+ /// +o (oxx) xxx xx xx
48+ ///
49+ /// need tor return only `x`, length is 9. And it has to have prefix +7 (9...) or +8 (9..)
50+ func getFormattedNumber() -> String? {
51+ guard let number = self.text else { return nil }
52+
53+ let cleanPhoneNumber = String(number.components(separatedBy: CharacterSet.decimalDigits.inverted).joined())
54+ let hasPrefix = cleanPhoneNumber.hasPrefix("79") || cleanPhoneNumber.hasPrefix("89")
55+
56+ let result = String(cleanPhoneNumber.dropFirst(2))
57+ if result.count == 9 && hasPrefix {
58+ return result
59+ }
60+
61+ return nil
62+ }
63+}
Hookah Tau/Controllers/Admin/Reservations/AdminReservations.storyboard+64
@@ -64,5 +64,69 @@
6464 </objects>
6565 <point key="canvasLocation" x="959.20000000000005" y="158.77061469265368"/>
6666 </scene>
67+ <!--Admin Second Step Reservation View Controller-->
68+ <scene sceneID="VhI-Z9-iqB">
69+ <objects>
70+ <viewController storyboardIdentifier="AdminSecondStepReservationViewController" id="eNJ-Ja-201" customClass="AdminSecondStepReservationViewController" customModule="Hookah_Tau" customModuleProvider="target" sceneMemberID="viewController">
71+ <view key="view" contentMode="scaleToFill" id="7mk-5I-JJs">
72+ <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
73+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
74+ <subviews>
75+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="oAV-GW-iea">
76+ <rect key="frame" x="0.0" y="0.0" width="375" height="293"/>
77+ <color key="backgroundColor" systemColor="systemIndigoColor" red="0.34509803919999998" green="0.33725490200000002" blue="0.83921568629999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
78+ </view>
79+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="a4v-ng-lm7">
80+ <rect key="frame" x="0.0" y="293" width="375" height="374"/>
81+ <subviews>
82+ <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" spacing="13" translatesAutoresizingMaskIntoConstraints="NO" id="1Bb-cO-4qW">
83+ <rect key="frame" x="20" y="22" width="335" height="88.5"/>
84+ <subviews>
85+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Номер клиента" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bME-Wr-gh7">
86+ <rect key="frame" x="62.5" y="0.0" width="210.5" height="33.5"/>
87+ <fontDescription key="fontDescription" type="boldSystem" pointSize="28"/>
88+ <nil key="textColor"/>
89+ <nil key="highlightedColor"/>
90+ </label>
91+ <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="+7 (988) 888-88-88" textAlignment="natural" minimumFontSize="28" translatesAutoresizingMaskIntoConstraints="NO" id="wBC-oa-ekQ" customClass="PhoneTextField" customModule="Hookah_Tau" customModuleProvider="target">
92+ <rect key="frame" x="13.5" y="46.5" width="308.5" height="42"/>
93+ <fontDescription key="fontDescription" type="boldSystem" pointSize="28"/>
94+ <textInputTraits key="textInputTraits"/>
95+ </textField>
96+ </subviews>
97+ </stackView>
98+ </subviews>
99+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
100+ <constraints>
101+ <constraint firstItem="1Bb-cO-4qW" firstAttribute="top" secondItem="a4v-ng-lm7" secondAttribute="top" constant="22" id="7fb-Up-Wmb"/>
102+ <constraint firstAttribute="trailing" secondItem="1Bb-cO-4qW" secondAttribute="trailing" constant="20" id="934-Ef-0xf"/>
103+ <constraint firstItem="1Bb-cO-4qW" firstAttribute="leading" secondItem="a4v-ng-lm7" secondAttribute="leading" constant="20" id="sr5-aO-q1p"/>
104+ <constraint firstAttribute="height" constant="374" id="uRW-2Q-OyM"/>
105+ </constraints>
106+ </view>
107+ </subviews>
108+ <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
109+ <constraints>
110+ <constraint firstItem="a4v-ng-lm7" firstAttribute="leading" secondItem="8aV-w1-NXE" secondAttribute="leading" id="OjU-Pl-gu1"/>
111+ <constraint firstItem="oAV-GW-iea" firstAttribute="trailing" secondItem="8aV-w1-NXE" secondAttribute="trailing" id="bPj-q1-pY6"/>
112+ <constraint firstItem="oAV-GW-iea" firstAttribute="top" secondItem="8aV-w1-NXE" secondAttribute="top" id="gUc-es-YHL"/>
113+ <constraint firstItem="a4v-ng-lm7" firstAttribute="bottom" secondItem="8aV-w1-NXE" secondAttribute="bottom" id="hZH-fU-zM5"/>
114+ <constraint firstItem="oAV-GW-iea" firstAttribute="leading" secondItem="8aV-w1-NXE" secondAttribute="leading" id="mos-8B-wjS"/>
115+ <constraint firstItem="a4v-ng-lm7" firstAttribute="trailing" secondItem="8aV-w1-NXE" secondAttribute="trailing" id="ntK-1r-AUW"/>
116+ <constraint firstItem="a4v-ng-lm7" firstAttribute="top" secondItem="oAV-GW-iea" secondAttribute="bottom" id="siv-Xa-Nl5"/>
117+ </constraints>
118+ <viewLayoutGuide key="safeArea" id="8aV-w1-NXE"/>
119+ </view>
120+ <connections>
121+ <outlet property="heightConstraint" destination="uRW-2Q-OyM" id="fmn-uI-ooi"/>
122+ <outlet property="mapContainerView" destination="oAV-GW-iea" id="jmP-q0-WbS"/>
123+ <outlet property="phoneContentView" destination="a4v-ng-lm7" id="W1O-A7-6EP"/>
124+ <outlet property="phoneTextField" destination="wBC-oa-ekQ" id="Btg-A3-tpm"/>
125+ </connections>
126+ </viewController>
127+ <placeholder placeholderIdentifier="IBFirstResponder" id="hNg-aQ-v7C" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
128+ </objects>
129+ <point key="canvasLocation" x="1664.8" y="158.77061469265368"/>
130+ </scene>
67131 </scenes>
68132</document>
Hookah Tau/Controllers/Admin/Reservations/List of reservations/AdminReservationsController.swift+2−1
@@ -123,7 +123,8 @@ class AdminReservationsController: BaseViewController {
123123 // MARK:- Button handler
124124
125125 @objc func book() {
126−
126+ guard let establishmentId = id else { return }
127+ coordinator?.book(inEstablishment: establishmentId)
127128 }
128129
129130 func deleteReservation(uuid: String, completion: @escaping (([ReservationWithUser]?) -> Void)) {
Hookah Tau/Controllers/Admin/Reservations/List of reservations/AdminReservationsCoordinator.swift+13
@@ -35,4 +35,17 @@ class AdminReservationsCoordinator: BaseCoordinator {
3535 }
3636 reservationCoordinator.start()
3737 }
38+
39+ /// Сюда мы идем после нажатия кнопочки "Забронировать" или плюсика справа сверху
40+ func book(inEstablishment establishmentId: Int) {
41+ let reservationCoordinator = AdminFirstStepReservationViewCoordinator(navigationController: navigationController)
42+ reservationCoordinator.establishment = establishmentId
43+ addDependency(reservationCoordinator)
44+ reservationCoordinator.didFinish = { [weak self] in
45+ self?.removeDependency(reservationCoordinator)
46+ self?.navigationController?.popViewController(animated: true)
47+ }
48+
49+ reservationCoordinator.start()
50+ }
3851}
Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/AdminFirstStepReservationViewCoordinator.swiftnew file+61
@@ -0,0 +1,61 @@
1+//
2+// AdminFirstStepReservationViewCoordinator.swift
3+// Hookah Tau
4+//
5+// Created by cstore on 13/01/2020.
6+// Copyright © 2020 Daria Rednikina. All rights reserved.
7+//
8+
9+import UIKit
10+
11+enum UserType {
12+ case admin
13+ case client
14+}
15+
16+protocol FirstStepReservationProtocol: BaseCoordinator {
17+
18+ var user: UserType { get }
19+
20+ func makeReservation(model: SecondStepModel, mapView: MapImageScroll?)
21+}
22+
23+class AdminFirstStepReservationViewCoordinator: BaseCoordinator{
24+
25+ // MARK: - Properties
26+
27+ var didFinish: (() -> Void)?
28+
29+ var establishment: Int = 1
30+
31+ // MARK: - Lifecycle
32+
33+ override func start() {
34+ let storyboard = UIStoryboard(name: "Reservation", bundle: nil)
35+ let reservationVC = storyboard.instantiateViewController(withIdentifier: "ReservationViewController") as! FirstStepReservationViewController
36+
37+ reservationVC.coordinator = self
38+ reservationVC.establishmentId = establishment
39+
40+ navigationController?.pushViewController(reservationVC, animated: true)
41+ }
42+
43+
44+}
45+
46+extension AdminFirstStepReservationViewCoordinator: FirstStepReservationProtocol {
47+
48+ var user: UserType {
49+ get {
50+ return .admin
51+ }
52+ }
53+
54+ func makeReservation(model: SecondStepModel, mapView: MapImageScroll?) {
55+ let reservationCoordinaotor = AdminSecondStepReservationViewCoordinator(navigationController: navigationController)
56+ reservationCoordinaotor.map = mapView
57+ addDependency(reservationCoordinaotor)
58+ reservationCoordinaotor.start()
59+ }
60+}
61+
Hookah Tau/Controllers/Admin/Reservations/Making a reeservation/AdminSecondStepReservationViewCoordinator.swiftnew file+27
@@ -0,0 +1,27 @@
1+//
2+// AdminSecondStepReservationViewCoordinator.swift
3+// Hookah Tau
4+//
5+// Created by cstore on 13/01/2020.
6+// Copyright © 2020 Daria Rednikina. All rights reserved.
7+//
8+
9+import UIKit
10+
11+class AdminSecondStepReservationViewCoordinator: BaseCoordinator {
12+
13+ var map: MapImageScroll?
14+
15+ override func start() {
16+ let storyboard = UIStoryboard(name: "AdminReservations", bundle: nil)
17+ let reservationVC = storyboard.instantiateViewController(withIdentifier: "AdminSecondStepReservationViewController") as! AdminSecondStepReservationViewController
18+ reservationVC.mapScrollView = map
19+ reservationVC.coordinator = self
20+ navigationController?.pushViewController(reservationVC, animated: true)
21+ }
22+
23+ func continueReservation() {
24+ let editingCoordinator = AdminReservationEditingCoordinator(navigationController: navigationController)
25+ editingCoordinator.start()
26+ }
27+}
Hookah Tau/Controllers/BaseViewController.swift+1−1
@@ -97,7 +97,7 @@ class BaseViewController: UIViewController {
9797 }
9898
9999 @objc
100− private func handleKeyboardNotifications(notification: NSNotification){
100+ func handleKeyboardNotifications(notification: NSNotification){
101101 if let userInfo = notification.userInfo {
102102 let keyBoardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
103103 bottomConstraint?.constant = notification.name == UIResponder.keyboardWillShowNotification ? -keyBoardFrame.height + view.safeAreaInsets.bottom - 20 : 0
Hookah Tau/Controllers/Client/Reservations/Steps/1/FirstStepReservationCoordinator.swift+8−1
@@ -8,7 +8,7 @@
88
99import UIKit
1010
11−class FirstStepReservationCoordinator: BaseCoordinator {
11+class FirstStepReservationCoordinator: BaseCoordinator, FirstStepReservationProtocol {
1212
1313 // MARK: - Properties
1414
@@ -28,6 +28,13 @@ class FirstStepReservationCoordinator: BaseCoordinator {
2828 navigationController?.pushViewController(reservationVC, animated: true)
2929 }
3030
31+ var user: UserType {
32+ get {
33+ return .client
34+ }
35+ }
36+
37+
3138 func makeReservation(model: SecondStepModel,
3239 mapView: MapImageScroll?) {
3340
Hookah Tau/Controllers/Client/Reservations/Steps/1/FirstStepReservationViewController.swift+15−6
@@ -13,7 +13,7 @@ class FirstStepReservationViewController: BaseViewController {
1313
1414 // MARK: - Properties
1515
16− weak var coordinator: FirstStepReservationCoordinator?
16+ weak var coordinator: FirstStepReservationProtocol?
1717
1818 @IBOutlet weak var childContentView: UIView!
1919
@@ -82,12 +82,21 @@ class FirstStepReservationViewController: BaseViewController {
8282 }
8383
8484 func setupButtons() {
85− addStackViewWithButtons(leftBtn: callButton,
86− rightBtn: continueButton,
87− constant: -childContentView.frame.height - 20)
85+
86+ guard let coord = coordinator else { return }
87+
88+ if coord.user == .admin {
89+ addStackViewWithButtons(rightBtn: continueButton,
90+ constant: -childContentView.frame.height - 20)
91+ } else {
92+ addStackViewWithButtons(leftBtn: callButton,
93+ rightBtn: continueButton,
94+ constant: -childContentView.frame.height - 20)
95+
96+ callButton.addTarget(self, action: #selector(call), for: .touchUpInside)
97+ }
8898
8999 continueButton.addTarget(self, action: #selector(continueBooking), for: .touchUpInside)
90− callButton.addTarget(self, action: #selector(call), for: .touchUpInside)
91100 }
92101
93102 func performUpdate() {
@@ -178,7 +187,7 @@ extension FirstStepReservationViewController: MapUpdater {
178187 let areBooked = allReservations?.intervals[date] ?? []
179188
180189 let isAdmin = DataStorage.standard.getUserModel()?.isAdmin ?? false
181− let closed = isAdmin || date.isInClosingHours()
190+ let closed = !isAdmin && date.isInClosingHours()
182191
183192 if Set(areBooked).contains(tableId) || closed {
184193 continueButton.availiable = false
Hookah Tau/Models/Reservation.swift+5
@@ -70,4 +70,9 @@ struct ReservationWithUser: MyCodable {
7070 }
7171}
7272
73+struct AdminCreateReservation: MyCodable {
74+ var reservation: ReservationData
75+ var user: String
76+}
77+
7378