Showing
40 changed files
with
1048 additions
and
577 deletions
@@ -20,6 +20,8 @@ | @@ -20,6 +20,8 @@ | ||
20 | 00A48B7B285F8F6600EF0A08 /* ProtocolDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00A48B79285F8F6600EF0A08 /* ProtocolDelegate.swift */; }; | 20 | 00A48B7B285F8F6600EF0A08 /* ProtocolDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00A48B79285F8F6600EF0A08 /* ProtocolDelegate.swift */; }; |
21 | 00A48B7F285F8F9200EF0A08 /* ContactPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00A48B7E285F8F9200EF0A08 /* ContactPickerViewController.swift */; }; | 21 | 00A48B7F285F8F9200EF0A08 /* ContactPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00A48B7E285F8F9200EF0A08 /* ContactPickerViewController.swift */; }; |
22 | 00E581BB284F71CD00E779FB /* Checkbox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00E581BA284F71CD00E779FB /* Checkbox.swift */; }; | 22 | 00E581BB284F71CD00E779FB /* Checkbox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00E581BA284F71CD00E779FB /* Checkbox.swift */; }; |
23 | + 1721AEF028704E3100EC4FDB /* Strings + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1721AEEF28704E3100EC4FDB /* Strings + Extension.swift */; }; | ||
24 | + 1721AEF228705FD600EC4FDB /* OTPView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1721AEF128705FD600EC4FDB /* OTPView.swift */; }; | ||
23 | 17287C602848AD8D00AA7113 /* Fonts + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17287C5F2848AD8D00AA7113 /* Fonts + Extension.swift */; }; | 25 | 17287C602848AD8D00AA7113 /* Fonts + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17287C5F2848AD8D00AA7113 /* Fonts + Extension.swift */; }; |
24 | 17287C692848C69600AA7113 /* Sk-Modernist-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 17287C642848C69600AA7113 /* Sk-Modernist-Bold.otf */; }; | 26 | 17287C692848C69600AA7113 /* Sk-Modernist-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 17287C642848C69600AA7113 /* Sk-Modernist-Bold.otf */; }; |
25 | 17287C6A2848C69600AA7113 /* Sk-Modernist-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 17287C652848C69600AA7113 /* Sk-Modernist-Regular.otf */; }; | 27 | 17287C6A2848C69600AA7113 /* Sk-Modernist-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 17287C652848C69600AA7113 /* Sk-Modernist-Regular.otf */; }; |
@@ -32,8 +34,8 @@ | @@ -32,8 +34,8 @@ | ||
32 | 1738F7DA2850F5F1003F1806 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1738F7D92850F5F1003F1806 /* SettingsView.swift */; }; | 34 | 1738F7DA2850F5F1003F1806 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1738F7D92850F5F1003F1806 /* SettingsView.swift */; }; |
33 | 175DA474285241C90075F0A9 /* SettingsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 175DA473285241C90075F0A9 /* SettingsModel.swift */; }; | 35 | 175DA474285241C90075F0A9 /* SettingsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 175DA473285241C90075F0A9 /* SettingsModel.swift */; }; |
34 | 1763F7FC2861FFFD005D988C /* ResidentTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1763F7FB2861FFFD005D988C /* ResidentTableViewCell.swift */; }; | 36 | 1763F7FC2861FFFD005D988C /* ResidentTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1763F7FB2861FFFD005D988C /* ResidentTableViewCell.swift */; }; |
35 | - 1764A05C28670B9F00847A30 /* NetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1764A05B28670B9F00847A30 /* NetworkManager.swift */; }; | ||
36 | - 1764A05E28673C7F00847A30 /* Constant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1764A05D28673C7F00847A30 /* Constant.swift */; }; | 37 | + 1764A05C28670B9F00847A30 /* AuthNetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1764A05B28670B9F00847A30 /* AuthNetworkManager.swift */; }; |
38 | + 1764A05E28673C7F00847A30 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1764A05D28673C7F00847A30 /* Constants.swift */; }; | ||
37 | 1774213D2866EE13002730EE /* AuthModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1774213C2866EE13002730EE /* AuthModel.swift */; }; | 39 | 1774213D2866EE13002730EE /* AuthModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1774213C2866EE13002730EE /* AuthModel.swift */; }; |
38 | 17ABE070285B80DC0006E7EC /* DisplayNameCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17ABE06F285B80DC0006E7EC /* DisplayNameCell.swift */; }; | 40 | 17ABE070285B80DC0006E7EC /* DisplayNameCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17ABE06F285B80DC0006E7EC /* DisplayNameCell.swift */; }; |
39 | 17ABE072285B810F0006E7EC /* SettingsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17ABE071285B810F0006E7EC /* SettingsTableViewCell.swift */; }; | 41 | 17ABE072285B810F0006E7EC /* SettingsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17ABE071285B810F0006E7EC /* SettingsTableViewCell.swift */; }; |
@@ -68,6 +70,8 @@ | @@ -68,6 +70,8 @@ | ||
68 | 00A48B79285F8F6600EF0A08 /* ProtocolDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProtocolDelegate.swift; sourceTree = "<group>"; }; | 70 | 00A48B79285F8F6600EF0A08 /* ProtocolDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProtocolDelegate.swift; sourceTree = "<group>"; }; |
69 | 00A48B7E285F8F9200EF0A08 /* ContactPickerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContactPickerViewController.swift; sourceTree = "<group>"; }; | 71 | 00A48B7E285F8F9200EF0A08 /* ContactPickerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContactPickerViewController.swift; sourceTree = "<group>"; }; |
70 | 00E581BA284F71CD00E779FB /* Checkbox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Checkbox.swift; sourceTree = "<group>"; }; | 72 | 00E581BA284F71CD00E779FB /* Checkbox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Checkbox.swift; sourceTree = "<group>"; }; |
73 | + 1721AEEF28704E3100EC4FDB /* Strings + Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Strings + Extension.swift"; sourceTree = "<group>"; }; | ||
74 | + 1721AEF128705FD600EC4FDB /* OTPView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OTPView.swift; sourceTree = "<group>"; }; | ||
71 | 17287C5F2848AD8D00AA7113 /* Fonts + Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Fonts + Extension.swift"; sourceTree = "<group>"; }; | 75 | 17287C5F2848AD8D00AA7113 /* Fonts + Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Fonts + Extension.swift"; sourceTree = "<group>"; }; |
72 | 17287C642848C69600AA7113 /* Sk-Modernist-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Sk-Modernist-Bold.otf"; sourceTree = "<group>"; }; | 76 | 17287C642848C69600AA7113 /* Sk-Modernist-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Sk-Modernist-Bold.otf"; sourceTree = "<group>"; }; |
73 | 17287C652848C69600AA7113 /* Sk-Modernist-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Sk-Modernist-Regular.otf"; sourceTree = "<group>"; }; | 77 | 17287C652848C69600AA7113 /* Sk-Modernist-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Sk-Modernist-Regular.otf"; sourceTree = "<group>"; }; |
@@ -80,8 +84,8 @@ | @@ -80,8 +84,8 @@ | ||
80 | 1738F7D92850F5F1003F1806 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; }; | 84 | 1738F7D92850F5F1003F1806 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; }; |
81 | 175DA473285241C90075F0A9 /* SettingsModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsModel.swift; sourceTree = "<group>"; }; | 85 | 175DA473285241C90075F0A9 /* SettingsModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsModel.swift; sourceTree = "<group>"; }; |
82 | 1763F7FB2861FFFD005D988C /* ResidentTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResidentTableViewCell.swift; sourceTree = "<group>"; }; | 86 | 1763F7FB2861FFFD005D988C /* ResidentTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResidentTableViewCell.swift; sourceTree = "<group>"; }; |
83 | - 1764A05B28670B9F00847A30 /* NetworkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkManager.swift; sourceTree = "<group>"; }; | ||
84 | - 1764A05D28673C7F00847A30 /* Constant.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constant.swift; sourceTree = "<group>"; }; | 87 | + 1764A05B28670B9F00847A30 /* AuthNetworkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthNetworkManager.swift; sourceTree = "<group>"; }; |
88 | + 1764A05D28673C7F00847A30 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; }; | ||
85 | 1774213C2866EE13002730EE /* AuthModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthModel.swift; sourceTree = "<group>"; }; | 89 | 1774213C2866EE13002730EE /* AuthModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthModel.swift; sourceTree = "<group>"; }; |
86 | 17ABE06F285B80DC0006E7EC /* DisplayNameCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayNameCell.swift; sourceTree = "<group>"; }; | 90 | 17ABE06F285B80DC0006E7EC /* DisplayNameCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayNameCell.swift; sourceTree = "<group>"; }; |
87 | 17ABE071285B810F0006E7EC /* SettingsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsTableViewCell.swift; sourceTree = "<group>"; }; | 91 | 17ABE071285B810F0006E7EC /* SettingsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsTableViewCell.swift; sourceTree = "<group>"; }; |
@@ -121,8 +125,8 @@ | @@ -121,8 +125,8 @@ | ||
121 | 00A48B5D285F8CDD00EF0A08 /* OneTimePasswordScreen */ = { | 125 | 00A48B5D285F8CDD00EF0A08 /* OneTimePasswordScreen */ = { |
122 | isa = PBXGroup; | 126 | isa = PBXGroup; |
123 | children = ( | 127 | children = ( |
124 | - 00A48B5E285F8CDD00EF0A08 /* View */, | ||
125 | 00A48B60285F8CDD00EF0A08 /* ViewController */, | 128 | 00A48B60285F8CDD00EF0A08 /* ViewController */, |
129 | + 00A48B5E285F8CDD00EF0A08 /* View */, | ||
126 | ); | 130 | ); |
127 | path = OneTimePasswordScreen; | 131 | path = OneTimePasswordScreen; |
128 | sourceTree = "<group>"; | 132 | sourceTree = "<group>"; |
@@ -130,6 +134,7 @@ | @@ -130,6 +134,7 @@ | ||
130 | 00A48B5E285F8CDD00EF0A08 /* View */ = { | 134 | 00A48B5E285F8CDD00EF0A08 /* View */ = { |
131 | isa = PBXGroup; | 135 | isa = PBXGroup; |
132 | children = ( | 136 | children = ( |
137 | + 1721AEF128705FD600EC4FDB /* OTPView.swift */, | ||
133 | 00A48B5F285F8CDD00EF0A08 /* CodeVerificationView.swift */, | 138 | 00A48B5F285F8CDD00EF0A08 /* CodeVerificationView.swift */, |
134 | ); | 139 | ); |
135 | path = View; | 140 | path = View; |
@@ -146,9 +151,9 @@ | @@ -146,9 +151,9 @@ | ||
146 | 00A48B64285F8CEA00EF0A08 /* AddResidentsScreen */ = { | 151 | 00A48B64285F8CEA00EF0A08 /* AddResidentsScreen */ = { |
147 | isa = PBXGroup; | 152 | isa = PBXGroup; |
148 | children = ( | 153 | children = ( |
154 | + 00A48B68285F8CEA00EF0A08 /* ViewController */, | ||
149 | 00A48B65285F8CEA00EF0A08 /* View */, | 155 | 00A48B65285F8CEA00EF0A08 /* View */, |
150 | 00A48B67285F8CEA00EF0A08 /* ResidentModel.swift */, | 156 | 00A48B67285F8CEA00EF0A08 /* ResidentModel.swift */, |
151 | - 00A48B68285F8CEA00EF0A08 /* ViewController */, | ||
152 | ); | 157 | ); |
153 | path = AddResidentsScreen; | 158 | path = AddResidentsScreen; |
154 | sourceTree = "<group>"; | 159 | sourceTree = "<group>"; |
@@ -182,7 +187,8 @@ | @@ -182,7 +187,8 @@ | ||
182 | children = ( | 187 | children = ( |
183 | 00A48B75285F8EE800EF0A08 /* Colors + Extension.swift */, | 188 | 00A48B75285F8EE800EF0A08 /* Colors + Extension.swift */, |
184 | ); | 189 | ); |
185 | - path = "Colors + Extension"; | 190 | + name = "Colors + Extension"; |
191 | + path = "InterQR-Internship/Extensions/Colors + Extension"; | ||
186 | sourceTree = SOURCE_ROOT; | 192 | sourceTree = SOURCE_ROOT; |
187 | }; | 193 | }; |
188 | 00A48B77285F8F6600EF0A08 /* Protocols */ = { | 194 | 00A48B77285F8F6600EF0A08 /* Protocols */ = { |
@@ -278,6 +284,31 @@ | @@ -278,6 +284,31 @@ | ||
278 | path = Checkbox; | 284 | path = Checkbox; |
279 | sourceTree = "<group>"; | 285 | sourceTree = "<group>"; |
280 | }; | 286 | }; |
287 | + 1721AEEB28704D6500EC4FDB /* PhonePickerModel */ = { | ||
288 | + isa = PBXGroup; | ||
289 | + children = ( | ||
290 | + 1729E22028465DA9006C7C29 /* PhonePickerModel.swift */, | ||
291 | + ); | ||
292 | + path = PhonePickerModel; | ||
293 | + sourceTree = "<group>"; | ||
294 | + }; | ||
295 | + 1721AEEC28704DBF00EC4FDB /* Extensions */ = { | ||
296 | + isa = PBXGroup; | ||
297 | + children = ( | ||
298 | + 1721AEED28704DCD00EC4FDB /* String + Extension */, | ||
299 | + 00A48B74285F8EE800EF0A08 /* Colors + Extension */, | ||
300 | + ); | ||
301 | + path = Extensions; | ||
302 | + sourceTree = "<group>"; | ||
303 | + }; | ||
304 | + 1721AEED28704DCD00EC4FDB /* String + Extension */ = { | ||
305 | + isa = PBXGroup; | ||
306 | + children = ( | ||
307 | + 1721AEEF28704E3100EC4FDB /* Strings + Extension.swift */, | ||
308 | + ); | ||
309 | + path = "String + Extension"; | ||
310 | + sourceTree = "<group>"; | ||
311 | + }; | ||
281 | 17287C5E2848AC8800AA7113 /* Fonts + Extension */ = { | 312 | 17287C5E2848AC8800AA7113 /* Fonts + Extension */ = { |
282 | isa = PBXGroup; | 313 | isa = PBXGroup; |
283 | children = ( | 314 | children = ( |
@@ -334,7 +365,7 @@ | @@ -334,7 +365,7 @@ | ||
334 | 1764A05A28670B7200847A30 /* NetworkManager */ = { | 365 | 1764A05A28670B7200847A30 /* NetworkManager */ = { |
335 | isa = PBXGroup; | 366 | isa = PBXGroup; |
336 | children = ( | 367 | children = ( |
337 | - 1764A05B28670B9F00847A30 /* NetworkManager.swift */, | 368 | + 1764A05B28670B9F00847A30 /* AuthNetworkManager.swift */, |
338 | ); | 369 | ); |
339 | path = NetworkManager; | 370 | path = NetworkManager; |
340 | sourceTree = "<group>"; | 371 | sourceTree = "<group>"; |
@@ -342,6 +373,7 @@ | @@ -342,6 +373,7 @@ | ||
342 | 1774213A2866EDF4002730EE /* Models */ = { | 373 | 1774213A2866EDF4002730EE /* Models */ = { |
343 | isa = PBXGroup; | 374 | isa = PBXGroup; |
344 | children = ( | 375 | children = ( |
376 | + 1721AEEB28704D6500EC4FDB /* PhonePickerModel */, | ||
345 | 1774213B2866EDFD002730EE /* Auth Model */, | 377 | 1774213B2866EDFD002730EE /* Auth Model */, |
346 | ); | 378 | ); |
347 | path = Models; | 379 | path = Models; |
@@ -464,10 +496,10 @@ | @@ -464,10 +496,10 @@ | ||
464 | 17CF9EDF2844ED8F000D8077 /* InterQR-Internship */ = { | 496 | 17CF9EDF2844ED8F000D8077 /* InterQR-Internship */ = { |
465 | isa = PBXGroup; | 497 | isa = PBXGroup; |
466 | children = ( | 498 | children = ( |
499 | + 1721AEEC28704DBF00EC4FDB /* Extensions */, | ||
467 | 1764A05A28670B7200847A30 /* NetworkManager */, | 500 | 1764A05A28670B7200847A30 /* NetworkManager */, |
468 | 1774213A2866EDF4002730EE /* Models */, | 501 | 1774213A2866EDF4002730EE /* Models */, |
469 | 00A48B77285F8F6600EF0A08 /* Protocols */, | 502 | 00A48B77285F8F6600EF0A08 /* Protocols */, |
470 | - 00A48B74285F8EE800EF0A08 /* Colors + Extension */, | ||
471 | 00E581B7284F71A700E779FB /* Common */, | 503 | 00E581B7284F71A700E779FB /* Common */, |
472 | 00E581B0284F666000E779FB /* Modules */, | 504 | 00E581B0284F666000E779FB /* Modules */, |
473 | 17CF9EE02844ED8F000D8077 /* AppDelegate.swift */, | 505 | 17CF9EE02844ED8F000D8077 /* AppDelegate.swift */, |
@@ -476,8 +508,7 @@ | @@ -476,8 +508,7 @@ | ||
476 | 17CF9EEB2844ED90000D8077 /* LaunchScreen.storyboard */, | 508 | 17CF9EEB2844ED90000D8077 /* LaunchScreen.storyboard */, |
477 | 17CF9EEE2844ED90000D8077 /* Info.plist */, | 509 | 17CF9EEE2844ED90000D8077 /* Info.plist */, |
478 | 1729E21C28465162006C7C29 /* PhoneService.swift */, | 510 | 1729E21C28465162006C7C29 /* PhoneService.swift */, |
479 | - 1729E22028465DA9006C7C29 /* PhonePickerModel.swift */, | ||
480 | - 1764A05D28673C7F00847A30 /* Constant.swift */, | 511 | + 1764A05D28673C7F00847A30 /* Constants.swift */, |
481 | ); | 512 | ); |
482 | path = "InterQR-Internship"; | 513 | path = "InterQR-Internship"; |
483 | sourceTree = "<group>"; | 514 | sourceTree = "<group>"; |
@@ -634,7 +665,7 @@ | @@ -634,7 +665,7 @@ | ||
634 | isa = PBXSourcesBuildPhase; | 665 | isa = PBXSourcesBuildPhase; |
635 | buildActionMask = 2147483647; | 666 | buildActionMask = 2147483647; |
636 | files = ( | 667 | files = ( |
637 | - 1764A05C28670B9F00847A30 /* NetworkManager.swift in Sources */, | 668 | + 1764A05C28670B9F00847A30 /* AuthNetworkManager.swift in Sources */, |
638 | 17ABE070285B80DC0006E7EC /* DisplayNameCell.swift in Sources */, | 669 | 17ABE070285B80DC0006E7EC /* DisplayNameCell.swift in Sources */, |
639 | 00A48B73285F8EB000EF0A08 /* SquereCheckBox.swift in Sources */, | 670 | 00A48B73285F8EB000EF0A08 /* SquereCheckBox.swift in Sources */, |
640 | 1729E22128465DA9006C7C29 /* PhonePickerModel.swift in Sources */, | 671 | 1729E22128465DA9006C7C29 /* PhonePickerModel.swift in Sources */, |
@@ -646,8 +677,10 @@ | @@ -646,8 +677,10 @@ | ||
646 | 17ABE072285B810F0006E7EC /* SettingsTableViewCell.swift in Sources */, | 677 | 17ABE072285B810F0006E7EC /* SettingsTableViewCell.swift in Sources */, |
647 | 17CD09AC2858F9B0008483E2 /* ResidentsView.swift in Sources */, | 678 | 17CD09AC2858F9B0008483E2 /* ResidentsView.swift in Sources */, |
648 | 00A48B7A285F8F6600EF0A08 /* Reusable + Cell.swift in Sources */, | 679 | 00A48B7A285F8F6600EF0A08 /* Reusable + Cell.swift in Sources */, |
680 | + 1721AEF228705FD600EC4FDB /* OTPView.swift in Sources */, | ||
649 | 00A48B71285F8E8200EF0A08 /* HomeTableViewCell.swift in Sources */, | 681 | 00A48B71285F8E8200EF0A08 /* HomeTableViewCell.swift in Sources */, |
650 | 00A48B6E285F8E5700EF0A08 /* TextFieldWithPadding.swift in Sources */, | 682 | 00A48B6E285F8E5700EF0A08 /* TextFieldWithPadding.swift in Sources */, |
683 | + 1721AEF028704E3100EC4FDB /* Strings + Extension.swift in Sources */, | ||
651 | 17B0254628587716004225AE /* ChooseApartmentsViewController.swift in Sources */, | 684 | 17B0254628587716004225AE /* ChooseApartmentsViewController.swift in Sources */, |
652 | 17ABFE58284FD20C003B6959 /* HomeViewController.swift in Sources */, | 685 | 17ABFE58284FD20C003B6959 /* HomeViewController.swift in Sources */, |
653 | 17CF9EE52844ED8F000D8077 /* VerificationViewController.swift in Sources */, | 686 | 17CF9EE52844ED8F000D8077 /* VerificationViewController.swift in Sources */, |
@@ -669,7 +702,7 @@ | @@ -669,7 +702,7 @@ | ||
669 | 17287C602848AD8D00AA7113 /* Fonts + Extension.swift in Sources */, | 702 | 17287C602848AD8D00AA7113 /* Fonts + Extension.swift in Sources */, |
670 | 00A48B6A285F8CEA00EF0A08 /* AddResidentsView.swift in Sources */, | 703 | 00A48B6A285F8CEA00EF0A08 /* AddResidentsView.swift in Sources */, |
671 | 00A48B63285F8CDD00EF0A08 /* CodeVerificationViewController.swift in Sources */, | 704 | 00A48B63285F8CDD00EF0A08 /* CodeVerificationViewController.swift in Sources */, |
672 | - 1764A05E28673C7F00847A30 /* Constant.swift in Sources */, | 705 | + 1764A05E28673C7F00847A30 /* Constants.swift in Sources */, |
673 | 17ABE074285B81390006E7EC /* SettingsSwitchCell.swift in Sources */, | 706 | 17ABE074285B81390006E7EC /* SettingsSwitchCell.swift in Sources */, |
674 | 17CF9EF72844EF8B000D8077 /* VerificationView.swift in Sources */, | 707 | 17CF9EF72844EF8B000D8077 /* VerificationView.swift in Sources */, |
675 | 17B0254828587726004225AE /* ChooseApartmentsView.swift in Sources */, | 708 | 17B0254828587726004225AE /* ChooseApartmentsView.swift in Sources */, |
@@ -20,5 +20,21 @@ | @@ -20,5 +20,21 @@ | ||
20 | landmarkType = "7"> | 20 | landmarkType = "7"> |
21 | </BreakpointContent> | 21 | </BreakpointContent> |
22 | </BreakpointProxy> | 22 | </BreakpointProxy> |
23 | + <BreakpointProxy | ||
24 | + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> | ||
25 | + <BreakpointContent | ||
26 | + uuid = "352946CD-61D5-4838-888E-86E2F3E773EF" | ||
27 | + shouldBeEnabled = "Yes" | ||
28 | + ignoreCount = "0" | ||
29 | + continueAfterRunningActions = "No" | ||
30 | + filePath = "InterQR-Internship/Common/CustomUI/OTPView.swift" | ||
31 | + startingColumnNumber = "9223372036854775807" | ||
32 | + endingColumnNumber = "9223372036854775807" | ||
33 | + startingLineNumber = "112" | ||
34 | + endingLineNumber = "112" | ||
35 | + landmarkName = "handleErrorUI(_:)" | ||
36 | + landmarkType = "7"> | ||
37 | + </BreakpointContent> | ||
38 | + </BreakpointProxy> | ||
23 | </Breakpoints> | 39 | </Breakpoints> |
24 | </Bucket> | 40 | </Bucket> |
InterQR-Internship/Assets.xcassets/UIColors/Background/LightRedBackgroud.colorset/Contents.json
0 → 100644
1 | +{ | ||
2 | + "colors" : [ | ||
3 | + { | ||
4 | + "color" : { | ||
5 | + "color-space" : "srgb", | ||
6 | + "components" : { | ||
7 | + "alpha" : "1.000", | ||
8 | + "blue" : "0.180", | ||
9 | + "green" : "0.000", | ||
10 | + "red" : "1.000" | ||
11 | + } | ||
12 | + }, | ||
13 | + "idiom" : "universal" | ||
14 | + }, | ||
15 | + { | ||
16 | + "appearances" : [ | ||
17 | + { | ||
18 | + "appearance" : "luminosity", | ||
19 | + "value" : "dark" | ||
20 | + } | ||
21 | + ], | ||
22 | + "color" : { | ||
23 | + "color-space" : "srgb", | ||
24 | + "components" : { | ||
25 | + "alpha" : "1.000", | ||
26 | + "blue" : "1.000", | ||
27 | + "green" : "1.000", | ||
28 | + "red" : "1.000" | ||
29 | + } | ||
30 | + }, | ||
31 | + "idiom" : "universal" | ||
32 | + } | ||
33 | + ], | ||
34 | + "info" : { | ||
35 | + "author" : "xcode", | ||
36 | + "version" : 1 | ||
37 | + } | ||
38 | +} |
@@ -7,8 +7,7 @@ | @@ -7,8 +7,7 @@ | ||
7 | 7 | ||
8 | import Foundation | 8 | import Foundation |
9 | import UIKit | 9 | import UIKit |
10 | -class Checkbox: UIButton { | ||
11 | - | 10 | +class Checkbox: UIButton { |
12 | private let checkboxImageView: UIImageView = { | 11 | private let checkboxImageView: UIImageView = { |
13 | let obj = UIImageView() | 12 | let obj = UIImageView() |
14 | return obj | 13 | return obj |
@@ -26,8 +25,8 @@ class Checkbox: UIButton { | @@ -26,8 +25,8 @@ class Checkbox: UIButton { | ||
26 | .TextColor.darkBlue : | 25 | .TextColor.darkBlue : |
27 | .TextColor.lightGrey | 26 | .TextColor.lightGrey |
28 | checkboxImageView.image = isSelected ? | 27 | checkboxImageView.image = isSelected ? |
29 | - UIImage(named: "OnIndicator") : | ||
30 | - UIImage(named: "OffIndicator") | 28 | + UIImage(named: .Image.onIndicator) : |
29 | + UIImage(named: .Image.offIndicator) | ||
31 | } | 30 | } |
32 | } | 31 | } |
33 | 32 |
@@ -24,8 +24,8 @@ class SquereCheckbox: UIButton { | @@ -24,8 +24,8 @@ class SquereCheckbox: UIButton { | ||
24 | .TextColor.darkBlue : | 24 | .TextColor.darkBlue : |
25 | .TextColor.lightGrey | 25 | .TextColor.lightGrey |
26 | checkboxImageView.image = isSelected ? | 26 | checkboxImageView.image = isSelected ? |
27 | - UIImage(named: "FullSquere") : | ||
28 | - UIImage(named: "EmptySquere") | 27 | + UIImage(named: .Image.fullSquere) : |
28 | + UIImage(named: .Image.emptySquere) | ||
29 | } | 29 | } |
30 | } | 30 | } |
31 | 31 |
@@ -18,7 +18,7 @@ class TextFieldWithPadding: UITextField { | @@ -18,7 +18,7 @@ class TextFieldWithPadding: UITextField { | ||
18 | let rect = super.textRect(forBounds: bounds) | 18 | let rect = super.textRect(forBounds: bounds) |
19 | return rect.inset(by: textPadding) | 19 | return rect.inset(by: textPadding) |
20 | } | 20 | } |
21 | - | 21 | + |
22 | override func editingRect(forBounds bounds: CGRect) -> CGRect { | 22 | override func editingRect(forBounds bounds: CGRect) -> CGRect { |
23 | let rect = super.editingRect(forBounds: bounds) | 23 | let rect = super.editingRect(forBounds: bounds) |
24 | return rect.inset(by: textPadding) | 24 | return rect.inset(by: textPadding) |
InterQR-Internship/Constant.swift
deleted
100644 → 0
InterQR-Internship/Constants.swift
0 → 100644
1 | +// | ||
2 | +// Constant.swift | ||
3 | +// InterQR-Internship | ||
4 | +// | ||
5 | +// Created by Дмитрий Тимофеев on 25.06.2022. | ||
6 | +// | ||
7 | + | ||
8 | +import Foundation | ||
9 | + | ||
10 | +struct Constants { | ||
11 | + enum APIRoutes { | ||
12 | + case initURL | ||
13 | + case startURL | ||
14 | + case verifyURL | ||
15 | + case loginURL | ||
16 | + case logoutURL | ||
17 | + | ||
18 | + var urlString: String { | ||
19 | + switch self { | ||
20 | + case .initURL: | ||
21 | + return "https://www.interqr.com/api/init" | ||
22 | + case .startURL: | ||
23 | + return "https://www.interqr.com/api/twofa/start" | ||
24 | + case .verifyURL: | ||
25 | + return "https://www.interqr.com/api/twofa/verify" | ||
26 | + case .loginURL: | ||
27 | + return "https://www.interqr.com/api/login" | ||
28 | + case .logoutURL: | ||
29 | + return "https://www.interqr.com/api/logout" | ||
30 | + } | ||
31 | + } | ||
32 | + } | ||
33 | +} | ||
34 | + |
@@ -22,6 +22,12 @@ extension UIColor { | @@ -22,6 +22,12 @@ extension UIColor { | ||
22 | 22 | ||
23 | enum Background { | 23 | enum Background { |
24 | static let lightGrey = UIColor(named: "LightGreyBackground") | 24 | static let lightGrey = UIColor(named: "LightGreyBackground") |
25 | + static let lightRed = UIColor(named: "LightRedBackgroud") | ||
26 | + } | ||
27 | + | ||
28 | + enum GradientBlue { | ||
29 | + static let left = UIColor(named: "Left")?.cgColor | ||
30 | + static let right = UIColor(named: "Right")?.cgColor | ||
25 | } | 31 | } |
26 | 32 | ||
27 | } | 33 | } |
@@ -36,3 +42,10 @@ extension CGColor { | @@ -36,3 +42,10 @@ extension CGColor { | ||
36 | static let right = UIColor(named: "Right")?.cgColor | 42 | static let right = UIColor(named: "Right")?.cgColor |
37 | } | 43 | } |
38 | } | 44 | } |
45 | + | ||
46 | +extension CAGradientLayer { | ||
47 | + enum GradientBlue { | ||
48 | + static let left = UIColor(named: "Left")?.cgColor | ||
49 | + static let right = UIColor(named: "Right")?.cgColor | ||
50 | + } | ||
51 | +} |
1 | +// | ||
2 | +// Strings + Extension.swift | ||
3 | +// InterQR-Internship | ||
4 | +// | ||
5 | +// Created by Дмитрий Тимофеев on 02.07.2022. | ||
6 | +// | ||
7 | + | ||
8 | +import Foundation | ||
9 | +import UIKit | ||
10 | + | ||
11 | +extension String { | ||
12 | + enum Text { | ||
13 | + static let addResident = "Add resident" | ||
14 | + static let residentName = "Resident name" | ||
15 | + static let enterResidentName = "Enter resident name" | ||
16 | + static let mobileNumber = "Mobile number" | ||
17 | + static let enterResidentNumber = "Enter resident number" | ||
18 | + static let manager = "Manager" | ||
19 | + static let hidden = "Hidden" | ||
20 | + static let enterYourVerificationCode = "Enter your\nverification code" | ||
21 | + static let pleaseEnterValidCode = "Please, enter valid verification code" | ||
22 | + static let verify = "Verify" | ||
23 | + static let myApartName = "My apart name" | ||
24 | + static let residents = "Residents" | ||
25 | + static let chooseApartment = "Choose\napartman" | ||
26 | + static let settings = "Settings" | ||
27 | + static let logout = "Logout" | ||
28 | + static let yourDisplayName = "Your display name" | ||
29 | + static let nameWillBeDisplay = "This name will be displayed everywhere" | ||
30 | + static let editResidents = "Edit residents" | ||
31 | + static let editResidentsAndInfo = "Edit the residents and their information" | ||
32 | + static let doNotDisturb = "Do not disturb" | ||
33 | + static let youWillNotBeNotified = "You will not be notified of any calls for one day. Auto reset at midnight" | ||
34 | + static let welcome = "Welcome" | ||
35 | + static let myDoors = "My doors" | ||
36 | + static let locked = "Locked" | ||
37 | + static let home = "Home" | ||
38 | + static let frontDoor = "Front Door" | ||
39 | + static let selectYourCountry = "Select your country" | ||
40 | + static let select = "Select" | ||
41 | + static let hello = "Hello" | ||
42 | + static let letsVerifyYourAccount = "Lets verify your \naccount" | ||
43 | + static let chooseWhatToStartWith = "Choose what to start with" | ||
44 | + static let email = "Email" | ||
45 | + static let phoneNumber = "Phone Number" | ||
46 | + static let enterYourEmailAddress = "Enter your email address" | ||
47 | + static let exampleEmail = "Example: john.doe@gmail.com" | ||
48 | + static let plusOne = "+1" | ||
49 | + static let verificationCodeWillBeSentToYourEmail = "Verification code will be sent to your e-mail" | ||
50 | + static let continueText = "Continue" | ||
51 | + static let johnDoe = "John Doe" | ||
52 | + static let userCode = "503331651" | ||
53 | + static let enterYourPhoneNumber = "Enter your phone number" | ||
54 | + static let verificationCodeWillBeSentToYourNumber = "Verification code will be sent to\nyour phone number" | ||
55 | + static let apple = "Apple" | ||
56 | + } | ||
57 | + | ||
58 | + enum Image { | ||
59 | + static let close = "Close" | ||
60 | + static let threeUsers = "3Users" | ||
61 | + static let heart = "Heart" | ||
62 | + static let heartRed = "HeartRed" | ||
63 | + static let backPointer = "BackPointer" | ||
64 | + static let interQR = "InterQR" | ||
65 | + static let lock = "Lock" | ||
66 | + static let RectangleWithShadow = "RectangleWithShadow" | ||
67 | + static let tick = "Tick" | ||
68 | + static let edit = "Edit" | ||
69 | + static let bin = "Bin" | ||
70 | + static let mask = "Mask" | ||
71 | + static let apartman = "Apartman" | ||
72 | + static let nextPointer = "NextPointer" | ||
73 | + static let gear = "Gear" | ||
74 | + static let profile = "Profile" | ||
75 | + static let notification = "Notification" | ||
76 | + static let setting = "Setting" | ||
77 | + static let home = "Home" | ||
78 | + static let gradient = "Gradient" | ||
79 | + static let password = "Password" | ||
80 | + static let rightStatus = "RightBlue" | ||
81 | + static let leftBlue = "LeftBlue" | ||
82 | + static let shield = "Shield" | ||
83 | + static let USA = "USA" | ||
84 | + static let flagPointer = "FlagPointer" | ||
85 | + static let fullSquere = "FullSquere" | ||
86 | + static let emptySquere = "EmptySquere" | ||
87 | + static let pointer = "Pointer" | ||
88 | + static let onIndicator = "OnIndicator" | ||
89 | + static let offIndicator = "OffIndicator" | ||
90 | + } | ||
91 | +} |
@@ -6,49 +6,23 @@ | @@ -6,49 +6,23 @@ | ||
6 | // | 6 | // |
7 | 7 | ||
8 | import Foundation | 8 | import Foundation |
9 | -struct InterQR: Decodable { | ||
10 | - var Auth: Auth | ||
11 | -} | ||
12 | - | ||
13 | -struct Auth: Decodable { | ||
14 | - var initialize: Init | ||
15 | - var start: Start | ||
16 | - var verify: Verify | ||
17 | - var login: Login | ||
18 | - | ||
19 | - enum CodingKeys: String, CodingKey { | ||
20 | - case initialize = "init" | ||
21 | - case start = "start 2fa" | ||
22 | - case verify = "verify 2fa" | ||
23 | - case login | ||
24 | - } | ||
25 | -} | ||
26 | - | ||
27 | -struct Initialize : Decodable { | ||
28 | - var message: Init | ||
29 | - | ||
30 | - enum CodingKeys: String, CodingKey { | ||
31 | - case message = "message" | ||
32 | - } | ||
33 | -} | ||
34 | 9 | ||
35 | -struct Init: Decodable { | ||
36 | - var deviceID: String | 10 | +//MARK: - Init collection |
11 | +struct InitRequestModel: Codable { | ||
12 | + var deviceUUID: String | ||
37 | var manufacturer: String | 13 | var manufacturer: String |
38 | var model: String | 14 | var model: String |
39 | var platform: String | 15 | var platform: String |
40 | var osVersion: String | 16 | var osVersion: String |
41 | var appVersion: String | 17 | var appVersion: String |
42 | - | ||
43 | - enum CodingKeys: String, CodingKey { | ||
44 | - case deviceID = "device_uuid" | ||
45 | - case manufacturer, model, platform | ||
46 | - case osVersion = "os_version" | ||
47 | - case appVersion = "app_version" | ||
48 | - } | ||
49 | } | 18 | } |
50 | 19 | ||
51 | -struct Start: Decodable { | 20 | +struct InitResponseModel: Decodable { |
21 | + var message: String | ||
22 | +} | ||
23 | + | ||
24 | +//MARK: - Start2fa collection | ||
25 | +struct StartRequestModel: Codable { | ||
52 | var emailOrNumber: String | 26 | var emailOrNumber: String |
53 | 27 | ||
54 | enum CodingKeys: String, CodingKey { | 28 | enum CodingKeys: String, CodingKey { |
@@ -56,7 +30,12 @@ struct Start: Decodable { | @@ -56,7 +30,12 @@ struct Start: Decodable { | ||
56 | } | 30 | } |
57 | } | 31 | } |
58 | 32 | ||
59 | -struct Verify: Decodable { | 33 | +struct StartResponseModel: Decodable { |
34 | + var message: String | ||
35 | +} | ||
36 | + | ||
37 | +//MARK: - Verify2fa collection | ||
38 | +struct VerifyRequestModel: Codable { | ||
60 | var emailOrNumber: String | 39 | var emailOrNumber: String |
61 | var code: String | 40 | var code: String |
62 | var secondAuthToken: String | 41 | var secondAuthToken: String |
@@ -68,10 +47,39 @@ struct Verify: Decodable { | @@ -68,10 +47,39 @@ struct Verify: Decodable { | ||
68 | } | 47 | } |
69 | } | 48 | } |
70 | 49 | ||
71 | -struct Login: Decodable { | ||
72 | - var deviceID: String | 50 | +struct VerifyResponseModel: Decodable { |
51 | + var data: VerifyData | ||
52 | + var message: String | ||
53 | +} | ||
54 | + | ||
55 | +struct VerifyData: Decodable { | ||
56 | + var token: String | ||
57 | + var uuid: String | ||
58 | +} | ||
59 | + | ||
60 | +//MARK: - Login collection | ||
61 | +struct LoginRequestModel: Codable { | ||
62 | + var deviceUUID: String | ||
63 | + | ||
64 | + enum CodingKeys: String, CodingKey { | ||
65 | + case deviceUUID = "device_uuid" | ||
66 | + } | ||
67 | +} | ||
68 | + | ||
69 | +struct LoginResponseModel: Decodable { | ||
70 | + var message: String? | ||
71 | +} | ||
72 | + | ||
73 | +//MARK: - Logout collection | ||
74 | + | ||
75 | +struct LogoutRequestModel: Codable { | ||
76 | + var deviceUUID: String | ||
73 | 77 | ||
74 | enum CodingKeys: String, CodingKey { | 78 | enum CodingKeys: String, CodingKey { |
75 | - case deviceID = "device_uuid" | 79 | + case deviceUUID = "device_uuid" |
76 | } | 80 | } |
77 | } | 81 | } |
82 | + | ||
83 | +struct LogoutResponseModel: Decodable { | ||
84 | + var message: String? | ||
85 | +} |
@@ -9,7 +9,6 @@ import Foundation | @@ -9,7 +9,6 @@ import Foundation | ||
9 | import UIKit | 9 | import UIKit |
10 | 10 | ||
11 | struct PhonePickerModel { | 11 | struct PhonePickerModel { |
12 | - | ||
13 | let code: String | 12 | let code: String |
14 | let countryCode: String | 13 | let countryCode: String |
15 | let title: String | 14 | let title: String |
@@ -37,7 +37,7 @@ class AddResidentsView: UIView { | @@ -37,7 +37,7 @@ class AddResidentsView: UIView { | ||
37 | 37 | ||
38 | var addResidentLabeL: UILabel = { | 38 | var addResidentLabeL: UILabel = { |
39 | var obj = UILabel() | 39 | var obj = UILabel() |
40 | - obj.text = "Add resident" | 40 | + obj.text = .Text.addResident |
41 | obj.textColor = .TextColor.darkBlue | 41 | obj.textColor = .TextColor.darkBlue |
42 | obj.font = .skModernist(type: .bold, ofSize: 24) | 42 | obj.font = .skModernist(type: .bold, ofSize: 24) |
43 | return obj | 43 | return obj |
@@ -48,7 +48,7 @@ class AddResidentsView: UIView { | @@ -48,7 +48,7 @@ class AddResidentsView: UIView { | ||
48 | obj.layer.cornerRadius = 13 | 48 | obj.layer.cornerRadius = 13 |
49 | obj.layer.borderWidth = 1 | 49 | obj.layer.borderWidth = 1 |
50 | obj.layer.borderColor = .BorderColor.lightGrey | 50 | obj.layer.borderColor = .BorderColor.lightGrey |
51 | - obj.setImage(UIImage(named: "Close"), for: .normal) | 51 | + obj.setImage(UIImage(named: .Image.close), for: .normal) |
52 | return obj | 52 | return obj |
53 | }() | 53 | }() |
54 | 54 | ||
@@ -60,7 +60,7 @@ class AddResidentsView: UIView { | @@ -60,7 +60,7 @@ class AddResidentsView: UIView { | ||
60 | 60 | ||
61 | var residentNameLabel: UILabel = { | 61 | var residentNameLabel: UILabel = { |
62 | var obj = UILabel() | 62 | var obj = UILabel() |
63 | - obj.text = "Resident name" | 63 | + obj.text = .Text.residentName |
64 | obj.font = .skModernist(type: .bold, ofSize: 14) | 64 | obj.font = .skModernist(type: .bold, ofSize: 14) |
65 | obj.textColor = .TextColor.darkBlue | 65 | obj.textColor = .TextColor.darkBlue |
66 | return obj | 66 | return obj |
@@ -71,7 +71,7 @@ class AddResidentsView: UIView { | @@ -71,7 +71,7 @@ class AddResidentsView: UIView { | ||
71 | obj.backgroundColor = .TextFieldColor.general | 71 | obj.backgroundColor = .TextFieldColor.general |
72 | obj.textAlignment = .left | 72 | obj.textAlignment = .left |
73 | obj.layer.cornerRadius = 15 | 73 | obj.layer.cornerRadius = 15 |
74 | - obj.placeholder = "Enter resident name" | 74 | + obj.placeholder = .Text.enterResidentName |
75 | obj.font = .skModernist(type: .regular, ofSize: 14) | 75 | obj.font = .skModernist(type: .regular, ofSize: 14) |
76 | obj.textPadding = UIEdgeInsets(top: 0, left: 22, bottom: 0, right: 22) | 76 | obj.textPadding = UIEdgeInsets(top: 0, left: 22, bottom: 0, right: 22) |
77 | return obj | 77 | return obj |
@@ -79,9 +79,9 @@ class AddResidentsView: UIView { | @@ -79,9 +79,9 @@ class AddResidentsView: UIView { | ||
79 | 79 | ||
80 | var mobileNumberLabel: UILabel = { | 80 | var mobileNumberLabel: UILabel = { |
81 | var obj = UILabel() | 81 | var obj = UILabel() |
82 | - obj.text = "Mobile number" | 82 | + obj.text = .Text.mobileNumber |
83 | obj.font = .skModernist(type: .bold, ofSize: 14) | 83 | obj.font = .skModernist(type: .bold, ofSize: 14) |
84 | - obj.textColor = .TextColor.lightGrey | 84 | + obj.textColor = .TextColor.darkBlue |
85 | return obj | 85 | return obj |
86 | }() | 86 | }() |
87 | 87 | ||
@@ -92,39 +92,38 @@ class AddResidentsView: UIView { | @@ -92,39 +92,38 @@ class AddResidentsView: UIView { | ||
92 | obj.layer.cornerRadius = 15 | 92 | obj.layer.cornerRadius = 15 |
93 | obj.font = .skModernist(type: .regular, ofSize: 14) | 93 | obj.font = .skModernist(type: .regular, ofSize: 14) |
94 | obj.textPadding = UIEdgeInsets(top: 0, left: 22, bottom: 0, right: 45) | 94 | obj.textPadding = UIEdgeInsets(top: 0, left: 22, bottom: 0, right: 45) |
95 | - obj.placeholder = "Enter resident number" | 95 | + obj.placeholder = .Text.enterResidentNumber |
96 | return obj | 96 | return obj |
97 | }() | 97 | }() |
98 | 98 | ||
99 | let contactListButton: UIButton = { | 99 | let contactListButton: UIButton = { |
100 | let obj = UIButton() | 100 | let obj = UIButton() |
101 | - obj.setImage(UIImage(named:"3Users"), for: .normal) | 101 | + obj.setImage(UIImage(named: .Image.threeUsers), for: .normal) |
102 | return obj | 102 | return obj |
103 | }() | 103 | }() |
104 | 104 | ||
105 | var managerButton: SquereCheckbox = { | 105 | var managerButton: SquereCheckbox = { |
106 | var obj = SquereCheckbox() | 106 | var obj = SquereCheckbox() |
107 | - obj.checkboxTitle = "Manager" | 107 | + obj.checkboxTitle = .Text.manager |
108 | return obj | 108 | return obj |
109 | }() | 109 | }() |
110 | 110 | ||
111 | var hiddenButton: SquereCheckbox = { | 111 | var hiddenButton: SquereCheckbox = { |
112 | var obj = SquereCheckbox() | 112 | var obj = SquereCheckbox() |
113 | - obj.checkboxTitle = "Hidden" | 113 | + obj.checkboxTitle = .Text.hidden |
114 | return obj | 114 | return obj |
115 | }() | 115 | }() |
116 | 116 | ||
117 | var heartButton: UIButton = { | 117 | var heartButton: UIButton = { |
118 | var obj = UIButton() | 118 | var obj = UIButton() |
119 | - obj.setImage(UIImage(named: "Heart"), for: .normal) | ||
120 | - obj.setImage(UIImage(named: "HeartRed"), for: .selected) | 119 | + obj.setImage(UIImage(named: .Image.heart), for: .normal) |
120 | + obj.setImage(UIImage(named: .Image.heartRed), for: .selected) | ||
121 | return obj | 121 | return obj |
122 | }() | 122 | }() |
123 | 123 | ||
124 | var gradientBG: CAGradientLayer = { | 124 | var gradientBG: CAGradientLayer = { |
125 | let obj = CAGradientLayer() | 125 | let obj = CAGradientLayer() |
126 | var leftColor = CGColor.GradientBlue.left | 126 | var leftColor = CGColor.GradientBlue.left |
127 | - | ||
128 | var rightColor = CGColor.GradientBlue.right | 127 | var rightColor = CGColor.GradientBlue.right |
129 | obj.colors = [leftColor, rightColor] | 128 | obj.colors = [leftColor, rightColor] |
130 | obj.startPoint = CGPoint(x: 0, y: 0.5) | 129 | obj.startPoint = CGPoint(x: 0, y: 0.5) |
@@ -134,7 +133,7 @@ class AddResidentsView: UIView { | @@ -134,7 +133,7 @@ class AddResidentsView: UIView { | ||
134 | 133 | ||
135 | var addResidentButton: UIButton = { | 134 | var addResidentButton: UIButton = { |
136 | var obj = UIButton() | 135 | var obj = UIButton() |
137 | - obj.setTitle("Add resident", for: .normal) | 136 | + obj.setTitle(.Text.addResident, for: .normal) |
138 | obj.setTitleColor(.white, for: .normal) | 137 | obj.setTitleColor(.white, for: .normal) |
139 | obj.titleLabel?.font = .skModernist(type: .bold, ofSize: 16) | 138 | obj.titleLabel?.font = .skModernist(type: .bold, ofSize: 16) |
140 | obj.clipsToBounds = true | 139 | obj.clipsToBounds = true |
@@ -9,14 +9,12 @@ import UIKit | @@ -9,14 +9,12 @@ import UIKit | ||
9 | import ContactsUI | 9 | import ContactsUI |
10 | 10 | ||
11 | class AddResidentsViewController: UIViewController { | 11 | class AddResidentsViewController: UIViewController { |
12 | - var savedResidents: [ResidentModel] = [] | 12 | + var isKeyboardAppear = false |
13 | 13 | ||
14 | + var savedResidents: [ResidentModel] = [] | ||
14 | weak var delegate: ResidentSavable? | 15 | weak var delegate: ResidentSavable? |
15 | 16 | ||
16 | var contact = ContactPickerViewController() | 17 | var contact = ContactPickerViewController() |
17 | - | ||
18 | - var isKeyboardAppear = false | ||
19 | - | ||
20 | var mainView = AddResidentsView() | 18 | var mainView = AddResidentsView() |
21 | 19 | ||
22 | var closeTap: UITapGestureRecognizer? | 20 | var closeTap: UITapGestureRecognizer? |
@@ -56,7 +54,6 @@ class AddResidentsViewController: UIViewController { | @@ -56,7 +54,6 @@ class AddResidentsViewController: UIViewController { | ||
56 | mainView.mobileNumberTextField.reloadInputViews() | 54 | mainView.mobileNumberTextField.reloadInputViews() |
57 | } | 55 | } |
58 | 56 | ||
59 | - | ||
60 | @objc private func didTapCloseButton() { | 57 | @objc private func didTapCloseButton() { |
61 | dismiss(animated: true, completion: nil) | 58 | dismiss(animated: true, completion: nil) |
62 | } | 59 | } |
@@ -80,13 +77,13 @@ class AddResidentsViewController: UIViewController { | @@ -80,13 +77,13 @@ class AddResidentsViewController: UIViewController { | ||
80 | heart: mainView.heartButton.isSelected)] | 77 | heart: mainView.heartButton.isSelected)] |
81 | savedResidents.append(contentsOf: model) | 78 | savedResidents.append(contentsOf: model) |
82 | delegate?.save(savedResidents) | 79 | delegate?.save(savedResidents) |
83 | -// ??????????????????????????????? | 80 | + // ??????????????????????????????? |
84 | mainView.nameTextField.text = "" //??? | 81 | mainView.nameTextField.text = "" //??? |
85 | mainView.mobileNumberTextField.text = "" //??? | 82 | mainView.mobileNumberTextField.text = "" //??? |
86 | mainView.managerButton.isSelected = false //??? | 83 | mainView.managerButton.isSelected = false //??? |
87 | mainView.hiddenButton.isSelected = false //??? | 84 | mainView.hiddenButton.isSelected = false //??? |
88 | mainView.heartButton.isSelected = false //??? | 85 | mainView.heartButton.isSelected = false //??? |
89 | -// ??????????????????????????????? | 86 | + // ??????????????????????????????? |
90 | } | 87 | } |
91 | 88 | ||
92 | @objc private func didTapOnChangeableButtons(_ sender: SquereCheckbox) { | 89 | @objc private func didTapOnChangeableButtons(_ sender: SquereCheckbox) { |
@@ -114,7 +111,7 @@ class AddResidentsViewController: UIViewController { | @@ -114,7 +111,7 @@ class AddResidentsViewController: UIViewController { | ||
114 | } | 111 | } |
115 | } | 112 | } |
116 | 113 | ||
117 | - @objc func didTapContactListButton() { | 114 | + @objc private func didTapContactListButton() { |
118 | presentContactPickerVC() | 115 | presentContactPickerVC() |
119 | } | 116 | } |
120 | 117 |
@@ -12,14 +12,14 @@ class ChooseApartmentsTableViewCell: UITableViewCell { | @@ -12,14 +12,14 @@ class ChooseApartmentsTableViewCell: UITableViewCell { | ||
12 | 12 | ||
13 | var apartmanImage: UIImageView = { | 13 | var apartmanImage: UIImageView = { |
14 | var obj = UIImageView() | 14 | var obj = UIImageView() |
15 | - obj.image = UIImage(named: "Apartman") | 15 | + obj.image = UIImage(named: .Image.apartman) |
16 | return obj | 16 | return obj |
17 | }() | 17 | }() |
18 | 18 | ||
19 | var clientNameLabel: UILabel = { | 19 | var clientNameLabel: UILabel = { |
20 | var obj = UILabel() | 20 | var obj = UILabel() |
21 | obj.text = "Bares Family" | 21 | obj.text = "Bares Family" |
22 | - obj.textColor = UIColor(red: 0.196, green: 0.216, blue: 0.333, alpha: 1) | 22 | + obj.textColor = .TextColor.darkBlue |
23 | obj.font = .skModernist(type: .bold, ofSize: 16) | 23 | obj.font = .skModernist(type: .bold, ofSize: 16) |
24 | return obj | 24 | return obj |
25 | }() | 25 | }() |
@@ -27,27 +27,27 @@ class ChooseApartmentsTableViewCell: UITableViewCell { | @@ -27,27 +27,27 @@ class ChooseApartmentsTableViewCell: UITableViewCell { | ||
27 | var adressLabel: UILabel = { | 27 | var adressLabel: UILabel = { |
28 | var obj = UILabel() | 28 | var obj = UILabel() |
29 | obj.text = "200 5th Ave" | 29 | obj.text = "200 5th Ave" |
30 | - obj.textColor = UIColor(red: 0.725, green: 0.725, blue: 0.725, alpha: 1) | 30 | + obj.textColor = .TextColor.lightGrey |
31 | obj.font = .skModernist(type: .regular, ofSize: 14) | 31 | obj.font = .skModernist(type: .regular, ofSize: 14) |
32 | return obj | 32 | return obj |
33 | }() | 33 | }() |
34 | 34 | ||
35 | var nextPointerImage: UIImageView = { | 35 | var nextPointerImage: UIImageView = { |
36 | var obj = UIImageView() | 36 | var obj = UIImageView() |
37 | - obj.image = UIImage(named: "NextPointer") | 37 | + obj.image = UIImage(named: .Image.nextPointer) |
38 | return obj | 38 | return obj |
39 | }() | 39 | }() |
40 | 40 | ||
41 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { | 41 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { |
42 | super.init(style: style, reuseIdentifier: reuseIdentifier) | 42 | super.init(style: style, reuseIdentifier: reuseIdentifier) |
43 | - layout() | 43 | + setup() |
44 | } | 44 | } |
45 | 45 | ||
46 | required init?(coder: NSCoder) { | 46 | required init?(coder: NSCoder) { |
47 | fatalError("init(coder:) has not been implemented") | 47 | fatalError("init(coder:) has not been implemented") |
48 | } | 48 | } |
49 | 49 | ||
50 | - func layout() { | 50 | + func setup() { |
51 | selectionStyle = .none | 51 | selectionStyle = .none |
52 | contentView.addSubview(apartmanImage) | 52 | contentView.addSubview(apartmanImage) |
53 | contentView.addSubview(clientNameLabel) | 53 | contentView.addSubview(clientNameLabel) |
@@ -11,9 +11,9 @@ class ChooseApartmentView: UIView { | @@ -11,9 +11,9 @@ class ChooseApartmentView: UIView { | ||
11 | 11 | ||
12 | var backButton: UIButton = { | 12 | var backButton: UIButton = { |
13 | var obj = UIButton() | 13 | var obj = UIButton() |
14 | - obj.setImage(UIImage(named: "BackPointer"), for: .normal) | 14 | + obj.setImage(UIImage(named: .Image.backPointer), for: .normal) |
15 | obj.backgroundColor = .white | 15 | obj.backgroundColor = .white |
16 | - obj.layer.borderColor = UIColor(red: 224/255, green: 231/255, blue: 232/255, alpha: 1).cgColor | 16 | + obj.layer.borderColor = .BorderColor.lightGrey |
17 | obj.layer.cornerRadius = 13 | 17 | obj.layer.cornerRadius = 13 |
18 | obj.layer.borderWidth = 1 | 18 | obj.layer.borderWidth = 1 |
19 | return obj | 19 | return obj |
@@ -21,20 +21,20 @@ class ChooseApartmentView: UIView { | @@ -21,20 +21,20 @@ class ChooseApartmentView: UIView { | ||
21 | 21 | ||
22 | var logoImage: UIImageView = { | 22 | var logoImage: UIImageView = { |
23 | var obj = UIImageView() | 23 | var obj = UIImageView() |
24 | - obj.image = UIImage(named: "InterQR") | 24 | + obj.image = UIImage(named: .Image.interQR) |
25 | return obj | 25 | return obj |
26 | }() | 26 | }() |
27 | 27 | ||
28 | var tickImage: UIImageView = { | 28 | var tickImage: UIImageView = { |
29 | var obj = UIImageView() | 29 | var obj = UIImageView() |
30 | - obj.image = UIImage(named: "Mask") | 30 | + obj.image = UIImage(named: .Image.mask) |
31 | return obj | 31 | return obj |
32 | }() | 32 | }() |
33 | 33 | ||
34 | let apartmentsLabel: UILabel = { | 34 | let apartmentsLabel: UILabel = { |
35 | var obj = UILabel() | 35 | var obj = UILabel() |
36 | obj.font = .skModernist(type: .bold, ofSize: 35) | 36 | obj.font = .skModernist(type: .bold, ofSize: 35) |
37 | - obj.text = "Choose\napartman" | 37 | + obj.text = .Text.chooseApartment |
38 | obj.numberOfLines = 0 | 38 | obj.numberOfLines = 0 |
39 | return obj | 39 | return obj |
40 | }() | 40 | }() |
@@ -21,9 +21,9 @@ class ChooseApartmentsViewController: UIViewController { | @@ -21,9 +21,9 @@ class ChooseApartmentsViewController: UIViewController { | ||
21 | } | 21 | } |
22 | 22 | ||
23 | func initViewController() { | 23 | func initViewController() { |
24 | - mainView.backButton.addTarget(self, action: #selector(backToSettingsVC), for: .touchUpInside) | ||
25 | mainView.tableView.delegate = self | 24 | mainView.tableView.delegate = self |
26 | mainView.tableView.dataSource = self | 25 | mainView.tableView.dataSource = self |
26 | + mainView.backButton.addTarget(self, action: #selector(backToSettingsVC), for: .touchUpInside) | ||
27 | mainView.tableView.register(ChooseApartmentsTableViewCell.self, forCellReuseIdentifier: ChooseApartmentsTableViewCell.id) | 27 | mainView.tableView.register(ChooseApartmentsTableViewCell.self, forCellReuseIdentifier: ChooseApartmentsTableViewCell.id) |
28 | } | 28 | } |
29 | 29 | ||
@@ -49,7 +49,5 @@ extension ChooseApartmentsViewController: UITableViewDelegate, UITableViewDataSo | @@ -49,7 +49,5 @@ extension ChooseApartmentsViewController: UITableViewDelegate, UITableViewDataSo | ||
49 | func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { | 49 | func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { |
50 | let vc = ResidentsViewController() | 50 | let vc = ResidentsViewController() |
51 | navigationController?.pushViewController(vc, animated: true) | 51 | navigationController?.pushViewController(vc, animated: true) |
52 | - print("❌") | ||
53 | - | ||
54 | } | 52 | } |
55 | } | 53 | } |
@@ -11,11 +11,8 @@ import ContactsUI | @@ -11,11 +11,8 @@ import ContactsUI | ||
11 | 11 | ||
12 | class ContactPickerViewController: CNContactPickerViewController { | 12 | class ContactPickerViewController: CNContactPickerViewController { |
13 | var phoneNumber = "" | 13 | var phoneNumber = "" |
14 | - | ||
15 | - override func viewDidLoad() { | ||
16 | -// delegate = self | ||
17 | - } | ||
18 | } | 14 | } |
15 | + | ||
19 | //MARK: - Contact picker delegate | 16 | //MARK: - Contact picker delegate |
20 | extension ContactPickerViewController: CNContactPickerDelegate { | 17 | extension ContactPickerViewController: CNContactPickerDelegate { |
21 | func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) { | 18 | func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) { |
@@ -20,7 +20,7 @@ class HomeTableViewCell: UITableViewCell { | @@ -20,7 +20,7 @@ class HomeTableViewCell: UITableViewCell { | ||
20 | 20 | ||
21 | var leftStatusImage: UIImageView = { | 21 | var leftStatusImage: UIImageView = { |
22 | var obj = UIImageView() | 22 | var obj = UIImageView() |
23 | - obj.image = UIImage(named: "LeftBlue") | 23 | + obj.image = UIImage(named: .Image.leftBlue) |
24 | obj.contentMode = .scaleAspectFill | 24 | obj.contentMode = .scaleAspectFill |
25 | return obj | 25 | return obj |
26 | }() | 26 | }() |
@@ -29,7 +29,7 @@ class HomeTableViewCell: UITableViewCell { | @@ -29,7 +29,7 @@ class HomeTableViewCell: UITableViewCell { | ||
29 | var obj = UILabel() | 29 | var obj = UILabel() |
30 | obj.font = .skModernist(type: .bold, ofSize: 16) | 30 | obj.font = .skModernist(type: .bold, ofSize: 16) |
31 | obj.textColor = .TextColor.darkBlue | 31 | obj.textColor = .TextColor.darkBlue |
32 | - obj.text = "Front Door" | 32 | + obj.text = .Text.frontDoor |
33 | return obj | 33 | return obj |
34 | }() | 34 | }() |
35 | 35 | ||
@@ -37,34 +37,34 @@ class HomeTableViewCell: UITableViewCell { | @@ -37,34 +37,34 @@ class HomeTableViewCell: UITableViewCell { | ||
37 | var obj = UILabel() | 37 | var obj = UILabel() |
38 | obj.textColor = .TextColor.lightGrey | 38 | obj.textColor = .TextColor.lightGrey |
39 | obj.font = .skModernist(type: .regular, ofSize: 14) | 39 | obj.font = .skModernist(type: .regular, ofSize: 14) |
40 | - obj.text = "Home" | 40 | + obj.text = .Text.home |
41 | return obj | 41 | return obj |
42 | }() | 42 | }() |
43 | 43 | ||
44 | var lockStatusLabel: UILabel = { | 44 | var lockStatusLabel: UILabel = { |
45 | var obj = UILabel() | 45 | var obj = UILabel() |
46 | - obj.textColor = UIColor(red: 0, green: 0.267, blue: 0.545, alpha: 1) | 46 | + obj.textColor = .TextColor.darkBlue |
47 | obj.font = .skModernist(type: .bold, ofSize: 15) | 47 | obj.font = .skModernist(type: .bold, ofSize: 15) |
48 | - obj.text = "Locked" | 48 | + obj.text = .Text.locked |
49 | return obj | 49 | return obj |
50 | }() | 50 | }() |
51 | 51 | ||
52 | var rightStatusImage: UIImageView = { | 52 | var rightStatusImage: UIImageView = { |
53 | var obj = UIImageView() | 53 | var obj = UIImageView() |
54 | - obj.image = UIImage(named: "RightBlue") | 54 | + obj.image = UIImage(named: .Image.rightStatus) |
55 | return obj | 55 | return obj |
56 | }() | 56 | }() |
57 | 57 | ||
58 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { | 58 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { |
59 | super.init(style: style, reuseIdentifier: reuseIdentifier) | 59 | super.init(style: style, reuseIdentifier: reuseIdentifier) |
60 | - layout() | 60 | + setup() |
61 | } | 61 | } |
62 | 62 | ||
63 | required init?(coder: NSCoder) { | 63 | required init?(coder: NSCoder) { |
64 | fatalError("init(coder:) has not been implemented") | 64 | fatalError("init(coder:) has not been implemented") |
65 | } | 65 | } |
66 | 66 | ||
67 | - func layout() { | 67 | + func setup() { |
68 | selectionStyle = .none | 68 | selectionStyle = .none |
69 | 69 | ||
70 | addSubview(containerView) | 70 | addSubview(containerView) |
@@ -106,12 +106,5 @@ class HomeTableViewCell: UITableViewCell { | @@ -106,12 +106,5 @@ class HomeTableViewCell: UITableViewCell { | ||
106 | $0.top.equalTo(snp.top).offset(19) | 106 | $0.top.equalTo(snp.top).offset(19) |
107 | } | 107 | } |
108 | } | 108 | } |
109 | - // func configureWithItem(_ item: DoorsModel) { | ||
110 | - | ||
111 | - // doorTypeLabel.text = item.purpose | ||
112 | - // doorLocationLabel.text = item.type | ||
113 | - // configureStatus(status: item.lockStatus) | ||
114 | - // rightStatusImageView.isHidden = false | ||
115 | - // } | ||
116 | } | 109 | } |
117 | 110 |
@@ -8,65 +8,71 @@ | @@ -8,65 +8,71 @@ | ||
8 | import UIKit | 8 | import UIKit |
9 | 9 | ||
10 | class HomeView: UIView { | 10 | class HomeView: UIView { |
11 | - | ||
12 | var logoView: UIImageView = { | 11 | var logoView: UIImageView = { |
13 | var obj = UIImageView() | 12 | var obj = UIImageView() |
14 | - obj.image = UIImage(named: "InterQR") | 13 | + obj.image = UIImage(named: .Image.interQR) |
15 | return obj | 14 | return obj |
16 | }() | 15 | }() |
16 | + | ||
17 | var settingsButton: UIButton = { | 17 | var settingsButton: UIButton = { |
18 | var obj = UIButton() | 18 | var obj = UIButton() |
19 | - obj.setImage(UIImage(named: "Setting"), for: .normal) | 19 | + obj.setImage(UIImage(named: .Image.setting), for: .normal) |
20 | obj.layer.borderWidth = 1 | 20 | obj.layer.borderWidth = 1 |
21 | - obj.layer.borderColor = UIColor(red: 0.882, green: 0.91, blue: 0.91, alpha: 1).cgColor | 21 | + obj.layer.borderColor = .BorderColor.lightGrey |
22 | obj.layer.cornerRadius = 13 | 22 | obj.layer.cornerRadius = 13 |
23 | return obj | 23 | return obj |
24 | }() | 24 | }() |
25 | + | ||
25 | var homeImage: UIImageView = { | 26 | var homeImage: UIImageView = { |
26 | var obj = UIImageView() | 27 | var obj = UIImageView() |
27 | - obj.image = UIImage(named: "Home") | 28 | + obj.image = UIImage(named: .Image.home) |
28 | return obj | 29 | return obj |
29 | }() | 30 | }() |
31 | + | ||
30 | var welcomeLabel: UILabel = { | 32 | var welcomeLabel: UILabel = { |
31 | var obj = UILabel() | 33 | var obj = UILabel() |
32 | obj.font = .skModernist(type: .bold, ofSize: 35) | 34 | obj.font = .skModernist(type: .bold, ofSize: 35) |
33 | - obj.text = "Welcome" | 35 | + obj.text = .Text.welcome |
34 | return obj | 36 | return obj |
35 | }() | 37 | }() |
38 | + | ||
36 | var doorsLabel: UILabel = { | 39 | var doorsLabel: UILabel = { |
37 | var obj = UILabel() | 40 | var obj = UILabel() |
38 | obj.font = .skModernist(type: .bold, ofSize: 20) | 41 | obj.font = .skModernist(type: .bold, ofSize: 20) |
39 | - obj.text = "My doors" | 42 | + obj.text = .Text.myDoors |
40 | return obj | 43 | return obj |
41 | }() | 44 | }() |
45 | + | ||
42 | var tableView: UITableView = { | 46 | var tableView: UITableView = { |
43 | var obj = UITableView() | 47 | var obj = UITableView() |
44 | obj.separatorStyle = .none | 48 | obj.separatorStyle = .none |
45 | obj.showsVerticalScrollIndicator = false | 49 | obj.showsVerticalScrollIndicator = false |
46 | return obj | 50 | return obj |
47 | }() | 51 | }() |
52 | + | ||
48 | var gradientView: UIImageView = { | 53 | var gradientView: UIImageView = { |
49 | var obj = UIImageView() | 54 | var obj = UIImageView() |
50 | - obj.image = UIImage(named: "Gradient") | 55 | + obj.image = UIImage(named: .Image.gradient) |
51 | return obj | 56 | return obj |
52 | }() | 57 | }() |
58 | + | ||
53 | var passwordButton: UIButton = { | 59 | var passwordButton: UIButton = { |
54 | var obj = UIButton() | 60 | var obj = UIButton() |
55 | - obj.setImage(UIImage(named: "Password"), for: .normal) | 61 | + obj.setImage(UIImage(named: .Image.password), for: .normal) |
56 | return obj | 62 | return obj |
57 | }() | 63 | }() |
58 | 64 | ||
59 | override init(frame: CGRect) { | 65 | override init(frame: CGRect) { |
60 | super.init(frame: frame) | 66 | super.init(frame: frame) |
61 | backgroundColor = .white | 67 | backgroundColor = .white |
62 | - layout() | 68 | + setup() |
63 | } | 69 | } |
64 | 70 | ||
65 | required init?(coder: NSCoder) { | 71 | required init?(coder: NSCoder) { |
66 | fatalError("init(coder:) has not been implemented") | 72 | fatalError("init(coder:) has not been implemented") |
67 | } | 73 | } |
68 | 74 | ||
69 | - func layout() { | 75 | + func setup() { |
70 | addSubview(logoView) | 76 | addSubview(logoView) |
71 | addSubview(settingsButton) | 77 | addSubview(settingsButton) |
72 | addSubview(welcomeLabel) | 78 | addSubview(welcomeLabel) |
@@ -80,33 +86,40 @@ class HomeView: UIView { | @@ -80,33 +86,40 @@ class HomeView: UIView { | ||
80 | $0.top.equalTo(77) | 86 | $0.top.equalTo(77) |
81 | $0.leading.equalTo(24) | 87 | $0.leading.equalTo(24) |
82 | } | 88 | } |
89 | + | ||
83 | settingsButton.snp.makeConstraints { | 90 | settingsButton.snp.makeConstraints { |
84 | $0.top.equalTo(snp.top).offset(63) | 91 | $0.top.equalTo(snp.top).offset(63) |
85 | $0.trailing.equalTo(snp.trailing).offset(-27) | 92 | $0.trailing.equalTo(snp.trailing).offset(-27) |
86 | $0.height.width.equalTo(45) | 93 | $0.height.width.equalTo(45) |
87 | } | 94 | } |
95 | + | ||
88 | welcomeLabel.snp.makeConstraints { | 96 | welcomeLabel.snp.makeConstraints { |
89 | $0.top.equalTo(logoView.snp.bottom).offset(63) | 97 | $0.top.equalTo(logoView.snp.bottom).offset(63) |
90 | $0.leading.equalTo(logoView.snp.leading) | 98 | $0.leading.equalTo(logoView.snp.leading) |
91 | } | 99 | } |
100 | + | ||
92 | homeImage.snp.makeConstraints { | 101 | homeImage.snp.makeConstraints { |
93 | $0.top.equalTo(settingsButton.snp.bottom) | 102 | $0.top.equalTo(settingsButton.snp.bottom) |
94 | $0.trailing.equalTo(snp.trailing).offset(5) | 103 | $0.trailing.equalTo(snp.trailing).offset(5) |
95 | } | 104 | } |
105 | + | ||
96 | doorsLabel.snp.makeConstraints { | 106 | doorsLabel.snp.makeConstraints { |
97 | $0.top.equalTo(homeImage.snp.bottom).offset(31) | 107 | $0.top.equalTo(homeImage.snp.bottom).offset(31) |
98 | $0.leading.equalTo(logoView.snp.leading) | 108 | $0.leading.equalTo(logoView.snp.leading) |
99 | } | 109 | } |
110 | + | ||
100 | tableView.snp.makeConstraints { | 111 | tableView.snp.makeConstraints { |
101 | $0.top.equalTo(doorsLabel.snp.bottom).offset(28) | 112 | $0.top.equalTo(doorsLabel.snp.bottom).offset(28) |
102 | $0.leading.equalTo(snp.leading).offset(20) | 113 | $0.leading.equalTo(snp.leading).offset(20) |
103 | $0.trailing.equalTo(snp.trailing).offset(-27) | 114 | $0.trailing.equalTo(snp.trailing).offset(-27) |
104 | $0.bottom.equalToSuperview() | 115 | $0.bottom.equalToSuperview() |
105 | } | 116 | } |
117 | + | ||
106 | gradientView.snp.makeConstraints { | 118 | gradientView.snp.makeConstraints { |
107 | $0.leading.trailing.bottom.equalToSuperview() | 119 | $0.leading.trailing.bottom.equalToSuperview() |
108 | $0.height.equalTo(75) | 120 | $0.height.equalTo(75) |
109 | } | 121 | } |
122 | + | ||
110 | passwordButton.snp.makeConstraints { | 123 | passwordButton.snp.makeConstraints { |
111 | $0.trailing.equalTo(gradientView.snp.trailing).offset(-48) | 124 | $0.trailing.equalTo(gradientView.snp.trailing).offset(-48) |
112 | $0.bottom.equalTo(gradientView.snp.bottom).offset(-18) | 125 | $0.bottom.equalTo(gradientView.snp.bottom).offset(-18) |
@@ -8,7 +8,6 @@ | @@ -8,7 +8,6 @@ | ||
8 | import UIKit | 8 | import UIKit |
9 | 9 | ||
10 | class HomeViewController: UIViewController { | 10 | class HomeViewController: UIViewController { |
11 | - | ||
12 | var mainView = HomeView() | 11 | var mainView = HomeView() |
13 | 12 | ||
14 | override func loadView() { | 13 | override func loadView() { |
@@ -28,8 +27,7 @@ class HomeViewController: UIViewController { | @@ -28,8 +27,7 @@ class HomeViewController: UIViewController { | ||
28 | } | 27 | } |
29 | 28 | ||
30 | extension HomeViewController { | 29 | extension HomeViewController { |
31 | - | ||
32 | - @objc func didShowSettingsVC() { | 30 | + @objc private func didShowSettingsVC() { |
33 | let vc = SettingsViewController() | 31 | let vc = SettingsViewController() |
34 | navigationController?.pushViewController(vc, animated: true) | 32 | navigationController?.pushViewController(vc, animated: true) |
35 | } | 33 | } |
@@ -15,9 +15,9 @@ class CodeVerificationView: UIView { | @@ -15,9 +15,9 @@ class CodeVerificationView: UIView { | ||
15 | 15 | ||
16 | var backButton: UIButton = { | 16 | var backButton: UIButton = { |
17 | var obj = UIButton() | 17 | var obj = UIButton() |
18 | - obj.setImage(UIImage(named: "BackPointer"), for: .normal) | 18 | + obj.setImage(UIImage(named: .Image.backPointer), for: .normal) |
19 | obj.backgroundColor = .white | 19 | obj.backgroundColor = .white |
20 | - obj.layer.borderColor = UIColor(red: 224/255, green: 231/255, blue: 232/255, alpha: 1).cgColor | 20 | + obj.layer.borderColor = .BorderColor.lightGrey |
21 | obj.layer.cornerRadius = 13 | 21 | obj.layer.cornerRadius = 13 |
22 | obj.layer.borderWidth = 1 | 22 | obj.layer.borderWidth = 1 |
23 | return obj | 23 | return obj |
@@ -25,81 +25,33 @@ class CodeVerificationView: UIView { | @@ -25,81 +25,33 @@ class CodeVerificationView: UIView { | ||
25 | 25 | ||
26 | var logoImage: UIImageView = { | 26 | var logoImage: UIImageView = { |
27 | var obj = UIImageView() | 27 | var obj = UIImageView() |
28 | - obj.image = UIImage(named: "InterQR") | 28 | + obj.image = UIImage(named: .Image.interQR) |
29 | return obj | 29 | return obj |
30 | }() | 30 | }() |
31 | 31 | ||
32 | var shieldImage: UIImageView = { | 32 | var shieldImage: UIImageView = { |
33 | var obj = UIImageView() | 33 | var obj = UIImageView() |
34 | - obj.image = UIImage(named: "Lock") | 34 | + obj.image = UIImage(named: .Image.lock) |
35 | return obj | 35 | return obj |
36 | }() | 36 | }() |
37 | 37 | ||
38 | var descriptionLabel: UILabel = { | 38 | var descriptionLabel: UILabel = { |
39 | var obj = UILabel() | 39 | var obj = UILabel() |
40 | - obj.font = UIFont(name: SkModernistFontType.bold.rawValue, size: 35) | ||
41 | - obj.text = "Enter your\nverification code" | 40 | + obj.font = .skModernist(type: .bold, ofSize: 35) |
41 | + obj.text = .Text.enterYourVerificationCode | ||
42 | obj.numberOfLines = 2 | 42 | obj.numberOfLines = 2 |
43 | return obj | 43 | return obj |
44 | }() | 44 | }() |
45 | 45 | ||
46 | - var textField: UITextField = { | ||
47 | - let obj = UITextField() | ||
48 | - obj.returnKeyType = .done | ||
49 | - obj.keyboardType = .numberPad | ||
50 | - obj.becomeFirstResponder() | ||
51 | - obj.isHidden = true | ||
52 | - return obj | ||
53 | - }() | ||
54 | - | ||
55 | - var firstDigitLabel: UILabel = { | ||
56 | - let obj = UILabel() | ||
57 | - obj.font = .skModernist(type: .bold, ofSize: 16) | ||
58 | - obj.textColor = .black | ||
59 | - obj.textAlignment = .center | ||
60 | - obj.backgroundColor = UIColor(red: 0.954, green: 0.954, blue: 0.954, alpha: 1) | ||
61 | - obj.layer.cornerRadius = 15 | ||
62 | - obj.clipsToBounds = true | ||
63 | - return obj | ||
64 | - }() | ||
65 | - | ||
66 | - var secondDigitLabel: UILabel = { | ||
67 | - let obj = UILabel() | ||
68 | - obj.font = .skModernist(type: .bold, ofSize: 16) | ||
69 | - obj.textColor = .black | ||
70 | - obj.textAlignment = .center | ||
71 | - obj.backgroundColor = UIColor(red: 0.954, green: 0.954, blue: 0.954, alpha: 1) | ||
72 | - obj.layer.cornerRadius = 15 | ||
73 | - obj.clipsToBounds = true | ||
74 | - return obj | ||
75 | - }() | ||
76 | - | ||
77 | - var thirdDigitLabel: UILabel = { | ||
78 | - let obj = UILabel() | ||
79 | - obj.font = .skModernist(type: .bold, ofSize: 16) | ||
80 | - obj.textColor = .black | ||
81 | - obj.textAlignment = .center | ||
82 | - obj.backgroundColor = UIColor(red: 0.954, green: 0.954, blue: 0.954, alpha: 1) | ||
83 | - obj.layer.cornerRadius = 15 | ||
84 | - obj.clipsToBounds = true | ||
85 | - return obj | ||
86 | - }() | ||
87 | - | ||
88 | - var fourthDigitLabel: UILabel = { | ||
89 | - let obj = UILabel() | ||
90 | - obj.font = .skModernist(type: .bold, ofSize: 16) | ||
91 | - obj.textColor = .black | ||
92 | - obj.textAlignment = .center | ||
93 | - obj.backgroundColor = UIColor(red: 0.954, green: 0.954, blue: 0.954, alpha: 1) | ||
94 | - obj.layer.cornerRadius = 15 | ||
95 | - obj.clipsToBounds = true | 46 | + let otpView: OTPView = { |
47 | + let obj = OTPView() | ||
96 | return obj | 48 | return obj |
97 | }() | 49 | }() |
98 | 50 | ||
99 | var errorAlertLabel: UILabel = { | 51 | var errorAlertLabel: UILabel = { |
100 | var obj = UILabel() | 52 | var obj = UILabel() |
101 | - obj.text = "Please, enter valid verification code" | ||
102 | - obj.font = UIFont(name: SkModernistFontType.regular.rawValue, size: 14) | 53 | + obj.text = .Text.pleaseEnterValidCode |
54 | + obj.font = .skModernist(type: .regular, ofSize: 14) | ||
103 | obj.textColor = UIColor(red: 255/255, green: 0/255, blue: 46/255, alpha: 1) | 55 | obj.textColor = UIColor(red: 255/255, green: 0/255, blue: 46/255, alpha: 1) |
104 | obj.isHidden = true | 56 | obj.isHidden = true |
105 | return obj | 57 | return obj |
@@ -107,7 +59,7 @@ class CodeVerificationView: UIView { | @@ -107,7 +59,7 @@ class CodeVerificationView: UIView { | ||
107 | 59 | ||
108 | var verifyButton: UIButton = { | 60 | var verifyButton: UIButton = { |
109 | var obj = UIButton() | 61 | var obj = UIButton() |
110 | - obj.setImage(UIImage(named: "RectangleWithShadow"), for: .normal) | 62 | + obj.setImage(UIImage(named: .Image.RectangleWithShadow), for: .normal) |
111 | return obj | 63 | return obj |
112 | }() | 64 | }() |
113 | 65 | ||
@@ -115,39 +67,53 @@ class CodeVerificationView: UIView { | @@ -115,39 +67,53 @@ class CodeVerificationView: UIView { | ||
115 | var obj = UILabel() | 67 | var obj = UILabel() |
116 | obj.font = UIFont(name: SkModernistFontType.bold.rawValue, size: 16) | 68 | obj.font = UIFont(name: SkModernistFontType.bold.rawValue, size: 16) |
117 | obj.textColor = .white | 69 | obj.textColor = .white |
118 | - obj.text = "Verify" | 70 | + obj.text = .Text.verify |
119 | return obj | 71 | return obj |
120 | }() | 72 | }() |
121 | 73 | ||
122 | var tickImage: UIImageView = { | 74 | var tickImage: UIImageView = { |
123 | var obj = UIImageView() | 75 | var obj = UIImageView() |
124 | - obj.image = UIImage(named: "Tick") | 76 | + obj.image = UIImage(named: .Image.tick) |
77 | + return obj | ||
78 | + }() | ||
79 | + | ||
80 | + let spinner: UIActivityIndicatorView = { | ||
81 | + var obj = UIActivityIndicatorView(style: .large) | ||
82 | + obj.hidesWhenStopped = true | ||
83 | + | ||
84 | + return obj | ||
85 | + }() | ||
86 | + | ||
87 | + let loadingView: UIView = { | ||
88 | + var obj = UIView() | ||
89 | + obj.alpha = 0.25 | ||
90 | + obj.backgroundColor = .black | ||
91 | + obj.clipsToBounds = true | ||
92 | + obj.layer.cornerRadius = 13 | ||
125 | return obj | 93 | return obj |
126 | }() | 94 | }() |
127 | 95 | ||
128 | override init(frame: CGRect) { | 96 | override init(frame: CGRect) { |
129 | super.init(frame: frame) | 97 | super.init(frame: frame) |
130 | - layout() | 98 | + setup() |
131 | } | 99 | } |
132 | 100 | ||
133 | required init?(coder: NSCoder) { | 101 | required init?(coder: NSCoder) { |
134 | fatalError("init(coder:) has not been implemented") | 102 | fatalError("init(coder:) has not been implemented") |
135 | } | 103 | } |
136 | 104 | ||
137 | - func layout() { | 105 | + func setup() { |
138 | backgroundColor = .white | 106 | backgroundColor = .white |
139 | 107 | ||
140 | - addSubview(textField) | ||
141 | addSubview(backButton) | 108 | addSubview(backButton) |
142 | addSubview(logoImage) | 109 | addSubview(logoImage) |
143 | addSubview(shieldImage) | 110 | addSubview(shieldImage) |
144 | - | ||
145 | addSubview(containerView) | 111 | addSubview(containerView) |
112 | + addSubview(spinner) | ||
113 | + spinner.addSubview(loadingView) | ||
114 | + | ||
146 | containerView.addSubview(descriptionLabel) | 115 | containerView.addSubview(descriptionLabel) |
147 | - containerView.addSubview(firstDigitLabel) | ||
148 | - containerView.addSubview(secondDigitLabel) | ||
149 | - containerView.addSubview(thirdDigitLabel) | ||
150 | - containerView.addSubview(fourthDigitLabel) | 116 | + containerView.addSubview(otpView) |
151 | containerView.addSubview(errorAlertLabel) | 117 | containerView.addSubview(errorAlertLabel) |
152 | 118 | ||
153 | containerView.addSubview(verifyButton) | 119 | containerView.addSubview(verifyButton) |
@@ -181,41 +147,19 @@ class CodeVerificationView: UIView { | @@ -181,41 +147,19 @@ class CodeVerificationView: UIView { | ||
181 | $0.top.equalTo(containerView.snp.top) | 147 | $0.top.equalTo(containerView.snp.top) |
182 | } | 148 | } |
183 | 149 | ||
184 | - firstDigitLabel.snp.makeConstraints { | ||
185 | - $0.leading.equalTo(containerView.snp.leading).offset(25) | ||
186 | - $0.top.equalTo(descriptionLabel.snp.bottom).offset(28) | ||
187 | - $0.height.equalTo(55) | ||
188 | - } | ||
189 | - | ||
190 | - secondDigitLabel.snp.makeConstraints { | ||
191 | - $0.leading.equalTo(firstDigitLabel.snp.trailing).offset(12) | ||
192 | - $0.centerY.equalTo(firstDigitLabel) | ||
193 | - $0.width.equalTo(firstDigitLabel.snp.width) | ||
194 | - $0.height.equalTo(55) | ||
195 | - } | ||
196 | - | ||
197 | - thirdDigitLabel.snp.makeConstraints { | ||
198 | - $0.leading.equalTo(secondDigitLabel.snp.trailing).offset(12) | ||
199 | - $0.centerY.equalTo(firstDigitLabel) | ||
200 | - $0.width.equalTo(firstDigitLabel.snp.width) | ||
201 | - $0.height.equalTo(55) | ||
202 | - } | ||
203 | - | ||
204 | - fourthDigitLabel.snp.makeConstraints { | ||
205 | - $0.leading.equalTo(thirdDigitLabel.snp.trailing).offset(12) | ||
206 | - $0.centerY.equalTo(firstDigitLabel) | ||
207 | - $0.trailing.equalTo(containerView.snp.trailing).offset(-25) | ||
208 | - $0.width.equalTo(firstDigitLabel.snp.width) | ||
209 | - $0.height.equalTo(55) | 150 | + otpView.snp.makeConstraints { make in |
151 | + make.leading.trailing.equalToSuperview().inset(25) | ||
152 | + make.top.equalTo(descriptionLabel.snp.bottom).offset(28) | ||
153 | + make.height.equalTo(55) | ||
210 | } | 154 | } |
211 | 155 | ||
212 | errorAlertLabel.snp.makeConstraints { | 156 | errorAlertLabel.snp.makeConstraints { |
213 | - $0.top.equalTo(firstDigitLabel.snp.bottom).offset(8) | ||
214 | - $0.leading.equalTo(firstDigitLabel.snp.leading) | 157 | + $0.top.equalTo(otpView.snp.bottom).offset(8) |
158 | + $0.leading.equalTo(otpView.snp.leading) | ||
215 | } | 159 | } |
216 | 160 | ||
217 | verifyButton.snp.makeConstraints { | 161 | verifyButton.snp.makeConstraints { |
218 | - $0.top.equalTo(firstDigitLabel.snp.bottom).offset(67) | 162 | + $0.top.equalTo(otpView.snp.bottom).offset(67) |
219 | $0.left.right.equalToSuperview() | 163 | $0.left.right.equalToSuperview() |
220 | } | 164 | } |
221 | 165 | ||
@@ -228,5 +172,12 @@ class CodeVerificationView: UIView { | @@ -228,5 +172,12 @@ class CodeVerificationView: UIView { | ||
228 | $0.right.equalToSuperview().offset(-47) | 172 | $0.right.equalToSuperview().offset(-47) |
229 | $0.centerY.equalTo(verifyLabel) | 173 | $0.centerY.equalTo(verifyLabel) |
230 | } | 174 | } |
175 | + spinner.snp.makeConstraints { make in | ||
176 | + make.centerX.centerY.equalToSuperview() | ||
177 | + } | ||
178 | + loadingView.snp.makeConstraints { make in | ||
179 | + make.edges.equalTo(snp.edges) | ||
180 | + } | ||
231 | } | 181 | } |
232 | } | 182 | } |
183 | + |
1 | +// | ||
2 | +// OTPView.swift | ||
3 | +// InterQR-Internship | ||
4 | +// | ||
5 | +// Created by Дмитрий Тимофеев on 02.07.2022. | ||
6 | +// | ||
7 | + | ||
8 | +import Foundation | ||
9 | +import UIKit | ||
10 | +protocol OTPViewDelegate: AnyObject { | ||
11 | + func didFullCodeCompletion(_ otpView: OTPView) | ||
12 | +} | ||
13 | + | ||
14 | +class OTPView: UIView { | ||
15 | + weak var delegate: OTPViewDelegate? | ||
16 | + | ||
17 | + var digitViews: [UILabel] = [] | ||
18 | + | ||
19 | + var code: String? { | ||
20 | + return textField.text | ||
21 | + } | ||
22 | + | ||
23 | + var isError: Bool = false { | ||
24 | + didSet { | ||
25 | + handleErrorUI(isError) | ||
26 | + } | ||
27 | + } | ||
28 | + | ||
29 | + let textField: UITextField = { | ||
30 | + let obj = UITextField() | ||
31 | + obj.isHidden = true | ||
32 | + obj.keyboardType = .numberPad | ||
33 | + return obj | ||
34 | + }() | ||
35 | + | ||
36 | + private lazy var stackView: UIStackView = { | ||
37 | + let obj = UIStackView(arrangedSubviews: digitViews) | ||
38 | + obj.axis = .horizontal | ||
39 | + obj.spacing = 11 | ||
40 | + obj.distribution = .fillEqually | ||
41 | + obj.semanticContentAttribute = .forceLeftToRight | ||
42 | + return obj | ||
43 | + }() | ||
44 | + | ||
45 | + override init(frame: CGRect) { | ||
46 | + super.init(frame: frame) | ||
47 | + initDigits() | ||
48 | + setup() | ||
49 | + } | ||
50 | + | ||
51 | + required init?(coder: NSCoder) { | ||
52 | + super.init(coder: coder) | ||
53 | + setup() | ||
54 | + } | ||
55 | + | ||
56 | + private func initDigits() { | ||
57 | + for i in 0...3 { | ||
58 | + digitViews.append(initLabel()) | ||
59 | + } | ||
60 | + } | ||
61 | + | ||
62 | + private func initLabel() -> UILabel { | ||
63 | + let obj = UILabel() | ||
64 | + obj.font = .skModernist(type: .bold, ofSize: 16) | ||
65 | + obj.textColor = .black | ||
66 | + obj.textAlignment = .center | ||
67 | + obj.backgroundColor = .TextFieldColor.general | ||
68 | + obj.layer.cornerRadius = 15 | ||
69 | + obj.clipsToBounds = true | ||
70 | + return obj | ||
71 | + } | ||
72 | + | ||
73 | + private func setup() { | ||
74 | + addSubview(textField) | ||
75 | + addSubview(stackView) | ||
76 | + | ||
77 | + stackView.snp.makeConstraints { make in | ||
78 | + make.edges.equalToSuperview() | ||
79 | + } | ||
80 | + | ||
81 | + textField.addTarget(self, action: #selector(didTextFieldChanged(_:)), for: .editingChanged) | ||
82 | + } | ||
83 | + | ||
84 | + override func addSubview(_ view: UIView) { | ||
85 | + super.addSubview(view) | ||
86 | + textField.becomeFirstResponder() | ||
87 | + } | ||
88 | + | ||
89 | + @objc func didTextFieldChanged(_ sender: UITextField) { | ||
90 | + guard var code = sender.text else { | ||
91 | + return | ||
92 | + } | ||
93 | + if code.count > 4 { | ||
94 | + code.removeLast() | ||
95 | + } else { | ||
96 | + if code.count == 4 { | ||
97 | + delegate?.didFullCodeCompletion(self) | ||
98 | + textField.resignFirstResponder() | ||
99 | + } | ||
100 | + } | ||
101 | + | ||
102 | + digitViews.enumerated().forEach { index, item in | ||
103 | + item.text = (code.count-1 >= index ? String(code[code.index(code.startIndex, offsetBy: index)]) : "") | ||
104 | + } | ||
105 | + } | ||
106 | + | ||
107 | + private func handleErrorUI(_ isError: Bool) { | ||
108 | + colorСhanger() | ||
109 | + } | ||
110 | + | ||
111 | + private func colorСhanger() { | ||
112 | + digitViews.self.forEach { label in | ||
113 | + label.backgroundColor = .TextFieldColor.error | ||
114 | + label.textColor = .TextColor.redError | ||
115 | + } | ||
116 | + } | ||
117 | +} |
InterQR-Internship/Modules/OneTimePasswordScreen/ViewController/CodeVerificationViewController.swift
@@ -8,12 +8,12 @@ | @@ -8,12 +8,12 @@ | ||
8 | import UIKit | 8 | import UIKit |
9 | 9 | ||
10 | class CodeVerificationViewController: UIViewController { | 10 | class CodeVerificationViewController: UIViewController { |
11 | - var otp: String = "" | 11 | +// var otp: String = "" |
12 | 12 | ||
13 | var isKeyboardAppear = false | 13 | var isKeyboardAppear = false |
14 | 14 | ||
15 | private let mainView = CodeVerificationView() | 15 | private let mainView = CodeVerificationView() |
16 | - | 16 | + private let networkManager = AuthNetworkManager() |
17 | override func loadView() { | 17 | override func loadView() { |
18 | view = mainView | 18 | view = mainView |
19 | } | 19 | } |
@@ -23,10 +23,9 @@ class CodeVerificationViewController: UIViewController { | @@ -23,10 +23,9 @@ class CodeVerificationViewController: UIViewController { | ||
23 | } | 23 | } |
24 | 24 | ||
25 | private func initViewController() { | 25 | private func initViewController() { |
26 | - mainView.textField.delegate = self | ||
27 | - | 26 | + mainView.otpView.delegate = self |
28 | mainView.backButton.addTarget(self, action: #selector(didDismissVC), for: .touchUpInside) | 27 | mainView.backButton.addTarget(self, action: #selector(didDismissVC), for: .touchUpInside) |
29 | - mainView.verifyButton.addTarget(self, action: #selector(didVerifyCode), for: .touchUpInside) | 28 | + mainView.verifyButton.addTarget(self, action: #selector(didTapVerifyButton), for: .touchUpInside) |
30 | 29 | ||
31 | NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil) | 30 | NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil) |
32 | NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil) | 31 | NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil) |
@@ -36,41 +35,81 @@ class CodeVerificationViewController: UIViewController { | @@ -36,41 +35,81 @@ class CodeVerificationViewController: UIViewController { | ||
36 | NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil) | 35 | NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil) |
37 | NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil) | 36 | NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil) |
38 | } | 37 | } |
38 | + | ||
39 | + func networkingVerify() { | ||
40 | + guard let verifyUrl = URL(string: Constants.APIRoutes.verifyURL.urlString) else { return } | ||
41 | + let verifyModel = verifyModelFilling() | ||
42 | + networkManager.verifyRequest(verifyUrl, model: verifyModel!) { response in | ||
43 | + print("3️⃣✅\(response.data)") | ||
44 | + print("\(response.message)✅") | ||
45 | + self.mainView.spinner.startAnimating() | ||
46 | + } fail: { error in | ||
47 | + print("3️⃣\(error)") | ||
48 | + } | ||
49 | + } | ||
50 | + | ||
51 | + func networkingLogin() { | ||
52 | + guard let loginUrl = URL(string: Constants.APIRoutes.loginURL.urlString) else { return } | ||
53 | + guard let loginModel = loginModelFilling() else { return } | ||
54 | + | ||
55 | + self.networkManager.loginRequest(loginUrl, model: loginModel) { response in | ||
56 | + guard let message = response.message else { return } | ||
57 | + print("4️⃣✅\(message)✅") | ||
58 | + } fail: { error in | ||
59 | + print("4️⃣⛔️\(error)⛔️") | ||
60 | + } | ||
61 | + } | ||
62 | + | ||
63 | + func verifyModelFilling() -> VerifyRequestModel? { | ||
64 | + let email = "test@interqr.com" | ||
65 | + guard let code = mainView.otpView.code else { return nil } | ||
66 | + return VerifyRequestModel(emailOrNumber: email, code: code, secondAuthToken: "asdas") | ||
67 | + } | ||
68 | + | ||
69 | + func loginModelFilling() -> LoginRequestModel? { | ||
70 | + guard let deviceUUID = UIDevice.current.identifierForVendor?.uuidString else { | ||
71 | + return nil | ||
72 | + } | ||
73 | + return LoginRequestModel(deviceUUID: deviceUUID) | ||
74 | + } | ||
39 | } | 75 | } |
40 | //MARK: - Targets | 76 | //MARK: - Targets |
41 | extension CodeVerificationViewController { | 77 | extension CodeVerificationViewController { |
78 | + @objc private func didTapVerifyButton() { | ||
79 | + errorProcessing() | ||
80 | + networkingVerify() | ||
81 | + } | ||
42 | 82 | ||
43 | - @objc private func didDismissVC() { | ||
44 | - navigationController?.popViewController(animated: true) | 83 | + private func showHomeVC() { |
84 | + let viewController = HomeViewController() | ||
85 | + navigationController?.pushViewController(viewController, animated: true) | ||
45 | } | 86 | } |
46 | 87 | ||
47 | - @objc private func didVerifyCode() { | ||
48 | - if mainView.fourthDigitLabel.text == nil { | ||
49 | - let alert = UIAlertController(title: "❌❌❌", message: "Some fields are empty, please fill in all", preferredStyle: .alert) | ||
50 | - let _: Void = alert.addAction(UIAlertAction(title: "Close", style: .cancel, handler: nil)) | 88 | + private func errorProcessing() { |
89 | + guard let code = mainView.otpView.code else { return } | ||
90 | + if code.count < 4 { | ||
91 | + let alert = UIAlertController(title: "❌", message: "Enter all fields", preferredStyle: .alert) | ||
92 | + alert.addAction(UIAlertAction(title: "Close", style: .cancel, handler: nil)) | ||
51 | present(alert, animated: true, completion: nil) | 93 | present(alert, animated: true, completion: nil) |
52 | - | ||
53 | } else { | 94 | } else { |
54 | - mainView.firstDigitLabel.backgroundColor = UIColor(red: 1, green: 0.929, blue: 0.941, alpha: 1) | ||
55 | - mainView.firstDigitLabel.textColor = UIColor(red: 1, green: 0, blue: 0.18, alpha: 1) | ||
56 | - | ||
57 | - mainView.secondDigitLabel.backgroundColor = UIColor(red: 1, green: 0.929, blue: 0.941, alpha: 1) | ||
58 | - mainView.secondDigitLabel.textColor = UIColor(red: 1, green: 0, blue: 0.18, alpha: 1) | ||
59 | - | ||
60 | - mainView.thirdDigitLabel.backgroundColor = UIColor(red: 1, green: 0.929, blue: 0.941, alpha: 1) | ||
61 | - mainView.thirdDigitLabel.textColor = UIColor(red: 1, green: 0, blue: 0.18, alpha: 1) | ||
62 | - | ||
63 | - mainView.fourthDigitLabel.backgroundColor = UIColor(red: 1, green: 0.929, blue: 0.941, alpha: 1) | ||
64 | - mainView.fourthDigitLabel.textColor = UIColor(red: 1, green: 0, blue: 0.18, alpha: 1) | ||
65 | - mainView.errorAlertLabel.isHidden = false | ||
66 | - | ||
67 | - DispatchQueue.main.asyncAfter(deadline: .now() + 3) { | ||
68 | - let vc = HomeViewController() | ||
69 | - vc.navigationItem.hidesBackButton = true | ||
70 | - self.navigationController?.pushViewController(vc, animated: true) | 95 | + if code != "8327" { |
96 | + mainView.otpView.isError.toggle() | ||
97 | + mainView.errorAlertLabel.isHidden = false | ||
98 | + mainView.otpView.textField.becomeFirstResponder() | ||
99 | + } else { | ||
100 | + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { | ||
101 | + self.networkingLogin() | ||
102 | + self.mainView.spinner.stopAnimating() | ||
103 | + self.showHomeVC() | ||
104 | + } | ||
105 | + | ||
71 | } | 106 | } |
72 | } | 107 | } |
73 | } | 108 | } |
109 | + | ||
110 | + @objc private func didDismissVC() { | ||
111 | + navigationController?.popViewController(animated: true) | ||
112 | + } | ||
74 | 113 | ||
75 | @objc private func keyboardWillShow(notification: NSNotification) { | 114 | @objc private func keyboardWillShow(notification: NSNotification) { |
76 | let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double | 115 | let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double |
@@ -107,27 +146,10 @@ extension CodeVerificationViewController { | @@ -107,27 +146,10 @@ extension CodeVerificationViewController { | ||
107 | } | 146 | } |
108 | } | 147 | } |
109 | 148 | ||
110 | -//MARK: - TextField delegate | ||
111 | -extension CodeVerificationViewController: UITextFieldDelegate { | 149 | +//MARK: - OTPView delegate |
150 | +extension CodeVerificationViewController: OTPViewDelegate { | ||
112 | 151 | ||
113 | - func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { | ||
114 | - otp += string | ||
115 | - | ||
116 | - otp.enumerated().forEach { index,item in | ||
117 | - switch index { | ||
118 | - case 0: | ||
119 | - mainView.firstDigitLabel.text = String(item) | ||
120 | - case 1: | ||
121 | - mainView.secondDigitLabel.text = String(item) | ||
122 | - case 2: | ||
123 | - mainView.thirdDigitLabel.text = String(item) | ||
124 | - case 3: | ||
125 | - mainView.fourthDigitLabel.text = String(item) | ||
126 | - mainView.textField.endEditing(true) | ||
127 | - default: | ||
128 | - mainView.textField.endEditing(true) | ||
129 | - } | ||
130 | - } | ||
131 | - return true | 152 | + func didFullCodeCompletion(_ otpView: OTPView) { |
153 | + print("code -> \(String(describing: otpView.code))") | ||
132 | } | 154 | } |
133 | } | 155 | } |
@@ -50,7 +50,7 @@ class ResidentTableViewCell: UITableViewCell { | @@ -50,7 +50,7 @@ class ResidentTableViewCell: UITableViewCell { | ||
50 | 50 | ||
51 | var managerButton: SquereCheckbox = { | 51 | var managerButton: SquereCheckbox = { |
52 | var obj = SquereCheckbox() | 52 | var obj = SquereCheckbox() |
53 | - obj.checkboxTitle = "Manager" | 53 | + obj.checkboxTitle = .Text.manager |
54 | obj.setTitleColor(.TextColor.lightGrey, for: .normal) | 54 | obj.setTitleColor(.TextColor.lightGrey, for: .normal) |
55 | obj.setTitleColor(.TextColor.darkBlue, for: .selected) | 55 | obj.setTitleColor(.TextColor.darkBlue, for: .selected) |
56 | obj.isSelected = false | 56 | obj.isSelected = false |
@@ -59,7 +59,7 @@ class ResidentTableViewCell: UITableViewCell { | @@ -59,7 +59,7 @@ class ResidentTableViewCell: UITableViewCell { | ||
59 | 59 | ||
60 | var hiddenButton: SquereCheckbox = { | 60 | var hiddenButton: SquereCheckbox = { |
61 | var obj = SquereCheckbox() | 61 | var obj = SquereCheckbox() |
62 | - obj.checkboxTitle = "Hidden" | 62 | + obj.checkboxTitle = .Text.hidden |
63 | obj.setTitleColor(.TextColor.lightGrey, for: .normal) | 63 | obj.setTitleColor(.TextColor.lightGrey, for: .normal) |
64 | obj.setTitleColor(.TextColor.darkBlue, for: .selected) | 64 | obj.setTitleColor(.TextColor.darkBlue, for: .selected) |
65 | obj.isSelected = false | 65 | obj.isSelected = false |
@@ -68,21 +68,21 @@ class ResidentTableViewCell: UITableViewCell { | @@ -68,21 +68,21 @@ class ResidentTableViewCell: UITableViewCell { | ||
68 | 68 | ||
69 | var heartButton: UIButton = { | 69 | var heartButton: UIButton = { |
70 | var obj = UIButton() | 70 | var obj = UIButton() |
71 | - obj.setImage(UIImage(named: "Heart"), for: .normal) | ||
72 | - obj.setImage(UIImage(named: "HeartRed"), for: .selected) | 71 | + obj.setImage(UIImage(named: .Image.heart), for: .normal) |
72 | + obj.setImage(UIImage(named: .Image.heartRed), for: .selected) | ||
73 | return obj | 73 | return obj |
74 | }() | 74 | }() |
75 | 75 | ||
76 | var removeCellButton: UIButton = { | 76 | var removeCellButton: UIButton = { |
77 | var obj = UIButton() | 77 | var obj = UIButton() |
78 | - obj.setImage(UIImage(named: "Bin"), for: .normal) | 78 | + obj.setImage(UIImage(named: .Image.bin), for: .normal) |
79 | return obj | 79 | return obj |
80 | }() | 80 | }() |
81 | 81 | ||
82 | var gradientBG: CAGradientLayer = { | 82 | var gradientBG: CAGradientLayer = { |
83 | let obj = CAGradientLayer() | 83 | let obj = CAGradientLayer() |
84 | - var leftColor = UIColor(red: 0/255, green: 68/255, blue: 139/255, alpha: 1).cgColor | ||
85 | - var rightColor = UIColor(red: 0/255, green: 122/255, blue: 191/255, alpha: 1).cgColor | 84 | + var leftColor = UIColor.GradientBlue.left |
85 | + var rightColor = UIColor.GradientBlue.right | ||
86 | obj.colors = [leftColor, rightColor] | 86 | obj.colors = [leftColor, rightColor] |
87 | obj.startPoint = CGPoint(x: 0, y: 0.5) | 87 | obj.startPoint = CGPoint(x: 0, y: 0.5) |
88 | obj.endPoint = CGPoint(x: 1, y: 0.5) | 88 | obj.endPoint = CGPoint(x: 1, y: 0.5) |
@@ -91,14 +91,14 @@ class ResidentTableViewCell: UITableViewCell { | @@ -91,14 +91,14 @@ class ResidentTableViewCell: UITableViewCell { | ||
91 | 91 | ||
92 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { | 92 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { |
93 | super.init(style: style, reuseIdentifier: reuseIdentifier) | 93 | super.init(style: style, reuseIdentifier: reuseIdentifier) |
94 | - layout() | 94 | + setup() |
95 | } | 95 | } |
96 | 96 | ||
97 | required init?(coder: NSCoder) { | 97 | required init?(coder: NSCoder) { |
98 | fatalError("init(coder:) has not been implemented") | 98 | fatalError("init(coder:) has not been implemented") |
99 | } | 99 | } |
100 | 100 | ||
101 | - func layout() { | 101 | + func setup() { |
102 | selectionStyle = .none | 102 | selectionStyle = .none |
103 | serialNumberView.layer.insertSublayer(gradientBG, at: 0) | 103 | serialNumberView.layer.insertSublayer(gradientBG, at: 0) |
104 | 104 | ||
@@ -112,12 +112,12 @@ class ResidentTableViewCell: UITableViewCell { | @@ -112,12 +112,12 @@ class ResidentTableViewCell: UITableViewCell { | ||
112 | containerView.addSubview(hiddenButton) | 112 | containerView.addSubview(hiddenButton) |
113 | containerView.addSubview(heartButton) | 113 | containerView.addSubview(heartButton) |
114 | containerView.addSubview(removeCellButton) | 114 | containerView.addSubview(removeCellButton) |
115 | - | 115 | + |
116 | containerView.snp.makeConstraints { | 116 | containerView.snp.makeConstraints { |
117 | $0.leading.trailing.equalToSuperview().inset(25) | 117 | $0.leading.trailing.equalToSuperview().inset(25) |
118 | $0.bottom.top.equalToSuperview().inset(8) | 118 | $0.bottom.top.equalToSuperview().inset(8) |
119 | } | 119 | } |
120 | - | 120 | + |
121 | serialNumberView.snp.makeConstraints { | 121 | serialNumberView.snp.makeConstraints { |
122 | $0.height.width.equalTo(41) | 122 | $0.height.width.equalTo(41) |
123 | $0.leading.equalToSuperview().offset(23) | 123 | $0.leading.equalToSuperview().offset(23) |
@@ -127,34 +127,34 @@ class ResidentTableViewCell: UITableViewCell { | @@ -127,34 +127,34 @@ class ResidentTableViewCell: UITableViewCell { | ||
127 | serialNumberLabel.snp.makeConstraints { | 127 | serialNumberLabel.snp.makeConstraints { |
128 | $0.centerX.centerY.equalToSuperview() | 128 | $0.centerX.centerY.equalToSuperview() |
129 | } | 129 | } |
130 | - | 130 | + |
131 | nameLabel.snp.makeConstraints { | 131 | nameLabel.snp.makeConstraints { |
132 | $0.leading.equalTo(serialNumberView.snp.trailing).offset(18) | 132 | $0.leading.equalTo(serialNumberView.snp.trailing).offset(18) |
133 | $0.top.equalToSuperview().offset(22) | 133 | $0.top.equalToSuperview().offset(22) |
134 | } | 134 | } |
135 | - | 135 | + |
136 | removeCellButton.snp.makeConstraints { | 136 | removeCellButton.snp.makeConstraints { |
137 | $0.centerY.equalTo(nameLabel.snp.centerY) | 137 | $0.centerY.equalTo(nameLabel.snp.centerY) |
138 | $0.trailing.equalToSuperview().offset(-22.5) | 138 | $0.trailing.equalToSuperview().offset(-22.5) |
139 | } | 139 | } |
140 | - | 140 | + |
141 | phoneNumberLabel.snp.makeConstraints { | 141 | phoneNumberLabel.snp.makeConstraints { |
142 | $0.leading.equalTo(nameLabel.snp.leading) | 142 | $0.leading.equalTo(nameLabel.snp.leading) |
143 | $0.top.equalTo(nameLabel.snp.bottom).offset(1) | 143 | $0.top.equalTo(nameLabel.snp.bottom).offset(1) |
144 | } | 144 | } |
145 | - | 145 | + |
146 | managerButton.snp.makeConstraints { | 146 | managerButton.snp.makeConstraints { |
147 | $0.top.equalTo(phoneNumberLabel.snp.bottom).offset(30) | 147 | $0.top.equalTo(phoneNumberLabel.snp.bottom).offset(30) |
148 | $0.leading.equalToSuperview().offset(24) | 148 | $0.leading.equalToSuperview().offset(24) |
149 | $0.height.equalTo(20) | 149 | $0.height.equalTo(20) |
150 | } | 150 | } |
151 | - | 151 | + |
152 | hiddenButton.snp.makeConstraints { | 152 | hiddenButton.snp.makeConstraints { |
153 | $0.leading.equalTo(managerButton.snp.trailing).offset(23) | 153 | $0.leading.equalTo(managerButton.snp.trailing).offset(23) |
154 | $0.centerY.equalTo(managerButton) | 154 | $0.centerY.equalTo(managerButton) |
155 | $0.height.equalTo(20) | 155 | $0.height.equalTo(20) |
156 | } | 156 | } |
157 | - | 157 | + |
158 | heartButton.snp.makeConstraints { | 158 | heartButton.snp.makeConstraints { |
159 | $0.centerY.equalTo(hiddenButton) | 159 | $0.centerY.equalTo(hiddenButton) |
160 | $0.bottom.equalToSuperview().offset(-18) | 160 | $0.bottom.equalToSuperview().offset(-18) |
@@ -166,4 +166,14 @@ class ResidentTableViewCell: UITableViewCell { | @@ -166,4 +166,14 @@ class ResidentTableViewCell: UITableViewCell { | ||
166 | super.layoutSubviews() | 166 | super.layoutSubviews() |
167 | gradientBG.frame = serialNumberView.bounds | 167 | gradientBG.frame = serialNumberView.bounds |
168 | } | 168 | } |
169 | + | ||
170 | + func model(_ item: ResidentModel) { | ||
171 | + nameLabel.text = item.name | ||
172 | + phoneNumberLabel.text = item.mobileNumber | ||
173 | + managerButton.isSelected = item.manager | ||
174 | + hiddenButton.isSelected = item.hidden | ||
175 | + heartButton.isSelected = item.heart | ||
176 | + } | ||
177 | + | ||
178 | + | ||
169 | } | 179 | } |
@@ -8,10 +8,9 @@ | @@ -8,10 +8,9 @@ | ||
8 | import UIKit | 8 | import UIKit |
9 | 9 | ||
10 | class ResidentsView: UIView { | 10 | class ResidentsView: UIView { |
11 | - | ||
12 | var backButton: UIButton = { | 11 | var backButton: UIButton = { |
13 | var obj = UIButton() | 12 | var obj = UIButton() |
14 | - obj.setImage(UIImage(named: "BackPointer"), for: .normal) | 13 | + obj.setImage(UIImage(named: .Image.backPointer), for: .normal) |
15 | obj.backgroundColor = .white | 14 | obj.backgroundColor = .white |
16 | obj.layer.borderColor = .BorderColor.lightGrey | 15 | obj.layer.borderColor = .BorderColor.lightGrey |
17 | obj.layer.cornerRadius = 13 | 16 | obj.layer.cornerRadius = 13 |
@@ -21,36 +20,36 @@ class ResidentsView: UIView { | @@ -21,36 +20,36 @@ class ResidentsView: UIView { | ||
21 | 20 | ||
22 | var logoImage: UIImageView = { | 21 | var logoImage: UIImageView = { |
23 | var obj = UIImageView() | 22 | var obj = UIImageView() |
24 | - obj.image = UIImage(named: "InterQR") | 23 | + obj.image = UIImage(named: .Image.interQR) |
25 | return obj | 24 | return obj |
26 | }() | 25 | }() |
27 | 26 | ||
28 | let apartNameLabel: UILabel = { | 27 | let apartNameLabel: UILabel = { |
29 | var obj = UILabel() | 28 | var obj = UILabel() |
30 | obj.font = .skModernist(type: .bold, ofSize: 35) | 29 | obj.font = .skModernist(type: .bold, ofSize: 35) |
31 | - obj.text = "My apart name" | 30 | + obj.text = .Text.myApartName |
32 | return obj | 31 | return obj |
33 | }() | 32 | }() |
34 | 33 | ||
35 | var dividingLineView: UIView = { | 34 | var dividingLineView: UIView = { |
36 | var view = UIView() | 35 | var view = UIView() |
37 | - view.backgroundColor = UIColor(red: 246/255, green: 246/255, blue: 246/255, alpha: 1) | 36 | + view.backgroundColor = .Background.lightGrey |
38 | return view | 37 | return view |
39 | }() | 38 | }() |
40 | 39 | ||
41 | var residentsLabel: UILabel = { | 40 | var residentsLabel: UILabel = { |
42 | var obj = UILabel() | 41 | var obj = UILabel() |
43 | obj.font = .skModernist(type: .bold, ofSize: 20) | 42 | obj.font = .skModernist(type: .bold, ofSize: 20) |
44 | - obj.text = "Residents" | 43 | + obj.text = .Text.residents |
45 | return obj | 44 | return obj |
46 | }() | 45 | }() |
47 | 46 | ||
48 | var addResidentsButton: UIButton = { | 47 | var addResidentsButton: UIButton = { |
49 | var obj = UIButton() | 48 | var obj = UIButton() |
50 | obj.layer.borderWidth = 1 | 49 | obj.layer.borderWidth = 1 |
51 | - obj.layer.borderColor = UIColor(red: 0.882, green: 0.91, blue: 0.91, alpha: 1).cgColor | 50 | + obj.layer.borderColor = .BorderColor.lightGrey |
52 | obj.layer.cornerRadius = 13 | 51 | obj.layer.cornerRadius = 13 |
53 | - obj.setImage(UIImage(named: "Edit"), for: .normal) | 52 | + obj.setImage(UIImage(named: .Image.edit), for: .normal) |
54 | return obj | 53 | return obj |
55 | }() | 54 | }() |
56 | 55 | ||
@@ -71,14 +70,14 @@ class ResidentsView: UIView { | @@ -71,14 +70,14 @@ class ResidentsView: UIView { | ||
71 | override init(frame: CGRect) { | 70 | override init(frame: CGRect) { |
72 | super.init(frame: frame) | 71 | super.init(frame: frame) |
73 | backgroundColor = .white | 72 | backgroundColor = .white |
74 | - layout() | 73 | + setup() |
75 | } | 74 | } |
76 | 75 | ||
77 | required init?(coder: NSCoder) { | 76 | required init?(coder: NSCoder) { |
78 | fatalError("init(coder:) has not been implemented") | 77 | fatalError("init(coder:) has not been implemented") |
79 | } | 78 | } |
80 | 79 | ||
81 | - func layout() { | 80 | + func setup() { |
82 | 81 | ||
83 | addSubview(backButton) | 82 | addSubview(backButton) |
84 | addSubview(logoImage) | 83 | addSubview(logoImage) |
@@ -94,33 +93,40 @@ class ResidentsView: UIView { | @@ -94,33 +93,40 @@ class ResidentsView: UIView { | ||
94 | $0.leading.equalTo(snp.leading).offset(25) | 93 | $0.leading.equalTo(snp.leading).offset(25) |
95 | $0.height.width.equalTo(45) | 94 | $0.height.width.equalTo(45) |
96 | } | 95 | } |
96 | + | ||
97 | logoImage.snp.makeConstraints { | 97 | logoImage.snp.makeConstraints { |
98 | $0.leading.equalTo(backButton.snp.trailing).offset(20) | 98 | $0.leading.equalTo(backButton.snp.trailing).offset(20) |
99 | $0.top.equalTo(snp.top).offset(79) | 99 | $0.top.equalTo(snp.top).offset(79) |
100 | } | 100 | } |
101 | + | ||
101 | apartNameLabel.snp.makeConstraints { | 102 | apartNameLabel.snp.makeConstraints { |
102 | $0.leading.equalTo(backButton.snp.leading) | 103 | $0.leading.equalTo(backButton.snp.leading) |
103 | $0.top.equalTo(backButton.snp.bottom).offset(46) | 104 | $0.top.equalTo(backButton.snp.bottom).offset(46) |
104 | } | 105 | } |
106 | + | ||
105 | dividingLineView.snp.makeConstraints { | 107 | dividingLineView.snp.makeConstraints { |
106 | $0.leading.trailing.equalToSuperview() | 108 | $0.leading.trailing.equalToSuperview() |
107 | $0.height.equalTo(1) | 109 | $0.height.equalTo(1) |
108 | $0.top.equalTo(apartNameLabel.snp.bottom).offset(42) | 110 | $0.top.equalTo(apartNameLabel.snp.bottom).offset(42) |
109 | } | 111 | } |
112 | + | ||
110 | residentsLabel.snp.makeConstraints { | 113 | residentsLabel.snp.makeConstraints { |
111 | $0.leading.equalToSuperview().offset(24) | 114 | $0.leading.equalToSuperview().offset(24) |
112 | $0.top.equalTo(dividingLineView.snp.bottom).offset(43) | 115 | $0.top.equalTo(dividingLineView.snp.bottom).offset(43) |
113 | } | 116 | } |
117 | + | ||
114 | addResidentsButton.snp.makeConstraints { | 118 | addResidentsButton.snp.makeConstraints { |
115 | $0.height.width.equalTo(45) | 119 | $0.height.width.equalTo(45) |
116 | $0.top.equalTo(dividingLineView.snp.bottom).offset(32) | 120 | $0.top.equalTo(dividingLineView.snp.bottom).offset(32) |
117 | $0.trailing.equalToSuperview().offset(-29) | 121 | $0.trailing.equalToSuperview().offset(-29) |
118 | } | 122 | } |
123 | + | ||
119 | tableView.snp.makeConstraints { | 124 | tableView.snp.makeConstraints { |
120 | $0.top.equalTo(residentsLabel.snp.bottom).offset(30) | 125 | $0.top.equalTo(residentsLabel.snp.bottom).offset(30) |
121 | $0.leading.trailing.equalToSuperview() | 126 | $0.leading.trailing.equalToSuperview() |
122 | $0.bottom.equalToSuperview() | 127 | $0.bottom.equalToSuperview() |
123 | } | 128 | } |
129 | + | ||
124 | addResidentView.snp.makeConstraints { | 130 | addResidentView.snp.makeConstraints { |
125 | $0.top.trailing.leading.bottom.equalToSuperview() | 131 | $0.top.trailing.leading.bottom.equalToSuperview() |
126 | } | 132 | } |
@@ -12,7 +12,7 @@ class ResidentsViewController: UIViewController { | @@ -12,7 +12,7 @@ class ResidentsViewController: UIViewController { | ||
12 | var myData: [ResidentModel] = [] | 12 | var myData: [ResidentModel] = [] |
13 | 13 | ||
14 | let addResidentsVC = AddResidentsViewController() | 14 | let addResidentsVC = AddResidentsViewController() |
15 | - let networkManager = NetworkManager() | 15 | + let networkManager = AuthNetworkManager() |
16 | 16 | ||
17 | override func loadView() { | 17 | override func loadView() { |
18 | view = mainView | 18 | view = mainView |
@@ -22,49 +22,46 @@ class ResidentsViewController: UIViewController { | @@ -22,49 +22,46 @@ class ResidentsViewController: UIViewController { | ||
22 | initViewController() | 22 | initViewController() |
23 | networking() | 23 | networking() |
24 | } | 24 | } |
25 | - func modelFilling() -> RequestModel? { | 25 | + |
26 | + func initViewController() { | ||
27 | + mainView.tableView.delegate = self | ||
28 | + mainView.tableView.dataSource = self | ||
29 | + mainView.tableView.register(ResidentTableViewCell.self, forCellReuseIdentifier: ResidentTableViewCell.id) | ||
30 | + | ||
31 | + mainView.backButton.addTarget(self, action: #selector(didShowChooseApartVC), for: .touchUpInside) | ||
32 | + mainView.addResidentsButton.addTarget(self, action: #selector(willShowAddResidentVC), for: .touchUpInside) | ||
33 | + } | ||
34 | + | ||
35 | + func modelFilling() -> InitRequestModel? { | ||
26 | guard let deviceUUID = UIDevice.current.identifierForVendor?.uuidString else { | 36 | guard let deviceUUID = UIDevice.current.identifierForVendor?.uuidString else { |
27 | return nil | 37 | return nil |
28 | } | 38 | } |
29 | guard let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else { | 39 | guard let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else { |
30 | return nil | 40 | return nil |
31 | } | 41 | } |
32 | - return RequestModel(deviceUUID: deviceUUID, | ||
33 | - manufacturer: "Apple", | ||
34 | - model: UIDevice.current.model, | ||
35 | - platform: UIDevice.current.systemName, | ||
36 | - osVersion: UIDevice.current.systemVersion, | ||
37 | - appVersion: appVersion) | ||
38 | - | ||
39 | - | 42 | + return InitRequestModel(deviceUUID: deviceUUID, |
43 | + manufacturer: .Text.apple, | ||
44 | + model: UIDevice.current.model, | ||
45 | + platform: UIDevice.current.systemName, | ||
46 | + osVersion: UIDevice.current.systemVersion, | ||
47 | + appVersion: appVersion) | ||
40 | } | 48 | } |
49 | + | ||
41 | func networking() { | 50 | func networking() { |
42 | - guard let url = URL(string: Constant.URL.rawValue) else { return } | 51 | + guard let initUrl = URL(string: Constants.APIRoutes.initURL.urlString) else { return } |
43 | guard let model = modelFilling() else { return } | 52 | guard let model = modelFilling() else { return } |
44 | - networkManager.authorizationRequest(url, model: model) { responseModel in | ||
45 | - <#code#> | ||
46 | - } fail: { <#Error#> in | ||
47 | - <#code#> | 53 | + networkManager.initRequest(initUrl, model: model) { responseModel in |
54 | + print("1️⃣✅\(responseModel.message)✅") | ||
55 | + } fail: { error in | ||
56 | + print("1️⃣\(error)") | ||
48 | } | 57 | } |
49 | - | ||
50 | - | ||
51 | - print("") | ||
52 | - | ||
53 | - } | ||
54 | - func initViewController() { | ||
55 | - mainView.tableView.delegate = self | ||
56 | - mainView.tableView.dataSource = self | ||
57 | - mainView.tableView.register(ResidentTableViewCell.self, forCellReuseIdentifier: ResidentTableViewCell.id) | ||
58 | - | ||
59 | - mainView.backButton.addTarget(self, action: #selector(didShowChooseApartVC), for: .touchUpInside) | ||
60 | - mainView.addResidentsButton.addTarget(self, action: #selector(willShowAddResidentVC), for: .touchUpInside) | ||
61 | } | 58 | } |
62 | 59 | ||
63 | - @objc func didShowChooseApartVC() { | 60 | + @objc private func didShowChooseApartVC() { |
64 | navigationController?.popViewController(animated: true) | 61 | navigationController?.popViewController(animated: true) |
65 | } | 62 | } |
66 | 63 | ||
67 | - @objc func willShowAddResidentVC() { | 64 | + @objc private func willShowAddResidentVC() { |
68 | addResidentsVC.modalPresentationStyle = .overCurrentContext | 65 | addResidentsVC.modalPresentationStyle = .overCurrentContext |
69 | addResidentsVC.modalTransitionStyle = .crossDissolve | 66 | addResidentsVC.modalTransitionStyle = .crossDissolve |
70 | addResidentsVC.delegate = self | 67 | addResidentsVC.delegate = self |
@@ -75,22 +72,37 @@ class ResidentsViewController: UIViewController { | @@ -75,22 +72,37 @@ class ResidentsViewController: UIViewController { | ||
75 | //MARK: - TableView delegate & data source | 72 | //MARK: - TableView delegate & data source |
76 | extension ResidentsViewController: UITableViewDelegate, UITableViewDataSource { | 73 | extension ResidentsViewController: UITableViewDelegate, UITableViewDataSource { |
77 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { | 74 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { |
78 | - addResidentsVC.savedResidents.count | 75 | + myData.count |
79 | } | 76 | } |
80 | 77 | ||
81 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { | 78 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { |
82 | guard let cell = tableView.dequeueReusableCell(withIdentifier: ResidentTableViewCell.id, for: indexPath) as? ResidentTableViewCell else { return UITableViewCell() } | 79 | guard let cell = tableView.dequeueReusableCell(withIdentifier: ResidentTableViewCell.id, for: indexPath) as? ResidentTableViewCell else { return UITableViewCell() } |
83 | - // cell.configureWithItem(doors[indexPath.row]) | ||
84 | cell.serialNumberLabel.text = "\(indexPath.row + 1)" | 80 | cell.serialNumberLabel.text = "\(indexPath.row + 1)" |
85 | - cell.nameLabel.text = myData[indexPath.row].name | ||
86 | - cell.phoneNumberLabel.text = myData[indexPath.row].mobileNumber | ||
87 | - cell.managerButton.isSelected = myData[indexPath.row].manager | ||
88 | - cell.hiddenButton.isSelected = myData[indexPath.row].hidden | ||
89 | - cell.heartButton.isSelected = myData[indexPath.row].heart | 81 | + let data = myData[indexPath.row] |
82 | + cell.model(data) | ||
83 | + | ||
84 | + cell.removeCellButton.addTarget(self, action: #selector(removeCell(_:)), for: .touchUpInside) | ||
85 | + cell.managerButton.addTarget(self, action: #selector(didTapManagerButton), for: .touchUpInside) | ||
86 | + cell.hiddenButton.addTarget(self, action: #selector(didTapManagerButton), for: .touchUpInside) | ||
87 | + cell.heartButton.addTarget(self, action: #selector(didTapManagerButton), for: .touchUpInside) | ||
90 | return cell | 88 | return cell |
91 | } | 89 | } |
90 | + | ||
91 | + @objc private func removeCell(_ sender: UIButton) { | ||
92 | + myData.remove(at: sender.tag) | ||
93 | + mainView.tableView.deleteRows(at: [IndexPath(row: sender.tag, section: 0)], with: .fade) | ||
94 | + mainView.tableView.reloadData() | ||
95 | + } | ||
96 | + | ||
97 | + @objc private func didTapManagerButton(_ sender: UIButton) { | ||
98 | + if !sender.isSelected { | ||
99 | + sender.isSelected = true | ||
100 | + } else { | ||
101 | + sender.isSelected = false | ||
102 | + } | ||
103 | + } | ||
92 | } | 104 | } |
93 | -//MARK: - Protocol delegate | 105 | +//MARK: - ResidentSavable delegate |
94 | extension ResidentsViewController: ResidentSavable { | 106 | extension ResidentsViewController: ResidentSavable { |
95 | func save(_ data: [ResidentModel]) { | 107 | func save(_ data: [ResidentModel]) { |
96 | self.myData = data | 108 | self.myData = data |
@@ -15,8 +15,6 @@ enum SettingsModel: CaseIterable { | @@ -15,8 +15,6 @@ enum SettingsModel: CaseIterable { | ||
15 | case editResidents | 15 | case editResidents |
16 | case widgetLock | 16 | case widgetLock |
17 | 17 | ||
18 | - | ||
19 | - | ||
20 | func getTitle() -> String { | 18 | func getTitle() -> String { |
21 | switch self { | 19 | switch self { |
22 | case .displayName : | 20 | case .displayName : |
@@ -28,7 +26,7 @@ enum SettingsModel: CaseIterable { | @@ -28,7 +26,7 @@ enum SettingsModel: CaseIterable { | ||
28 | case .widgetLock: | 26 | case .widgetLock: |
29 | return "Widget lock" | 27 | return "Widget lock" |
30 | case .ringtone: | 28 | case .ringtone: |
31 | - return "Rringtone" | 29 | + return "Ringtone" |
32 | } | 30 | } |
33 | } | 31 | } |
34 | 32 |
@@ -10,30 +10,34 @@ import UIKit | @@ -10,30 +10,34 @@ import UIKit | ||
10 | class DisplayNameCell: UITableViewCell, Reusable { | 10 | class DisplayNameCell: UITableViewCell, Reusable { |
11 | var settingsIcon: UIImageView = { | 11 | var settingsIcon: UIImageView = { |
12 | var obj = UIImageView() | 12 | var obj = UIImageView() |
13 | - obj.image = UIImage(named: "Profile") | 13 | + obj.image = UIImage(named: .Image.profile) |
14 | return obj | 14 | return obj |
15 | }() | 15 | }() |
16 | + | ||
16 | var titleLabel: UILabel = { | 17 | var titleLabel: UILabel = { |
17 | var obj = UILabel() | 18 | var obj = UILabel() |
18 | - obj.text = "Your display name" | 19 | + obj.text = .Text.yourDisplayName |
19 | obj.font = .skModernist(type: .bold, ofSize: 16) | 20 | obj.font = .skModernist(type: .bold, ofSize: 16) |
20 | - obj.textColor = UIColor(red: 0.196, green: 0.216, blue: 0.333, alpha: 1) | 21 | + obj.textColor = .TextColor.darkBlue |
21 | return obj | 22 | return obj |
22 | }() | 23 | }() |
24 | + | ||
23 | var descriptionLabel: UILabel = { | 25 | var descriptionLabel: UILabel = { |
24 | var obj = UILabel() | 26 | var obj = UILabel() |
25 | - obj.text = "This name will be displayed everywhere" | 27 | + obj.text = .Text.nameWillBeDisplay |
26 | obj.font = .skModernist(type: .regular, ofSize: 14) | 28 | obj.font = .skModernist(type: .regular, ofSize: 14) |
27 | - obj.textColor = UIColor(red: 0.725, green: 0.725, blue: 0.725, alpha: 1) | 29 | + obj.textColor = .TextColor.lightGrey |
28 | return obj | 30 | return obj |
29 | }() | 31 | }() |
30 | - var displayNameTextField: UITextField = { | ||
31 | - var obj = UITextField() | ||
32 | - obj.text = "John Doe" | 32 | + |
33 | + var displayNameTextField: TextFieldWithPadding = { | ||
34 | + var obj = TextFieldWithPadding() | ||
35 | + obj.text = .Text.johnDoe | ||
33 | obj.returnKeyType = .done | 36 | obj.returnKeyType = .done |
34 | - obj.backgroundColor = UIColor(red: 0.971, green: 0.967, blue: 0.967, alpha: 1) | 37 | + obj.backgroundColor = .TextFieldColor.general |
35 | obj.clipsToBounds = true | 38 | obj.clipsToBounds = true |
36 | obj.layer.cornerRadius = 15 | 39 | obj.layer.cornerRadius = 15 |
40 | + obj.textPadding = UIEdgeInsets(top: 0, left: 24, bottom: 0, right: 15) | ||
37 | return obj | 41 | return obj |
38 | }() | 42 | }() |
39 | 43 | ||
@@ -57,14 +61,17 @@ class DisplayNameCell: UITableViewCell, Reusable { | @@ -57,14 +61,17 @@ class DisplayNameCell: UITableViewCell, Reusable { | ||
57 | make.top.equalToSuperview() | 61 | make.top.equalToSuperview() |
58 | make.leading.equalTo(snp.leading).offset(32) | 62 | make.leading.equalTo(snp.leading).offset(32) |
59 | } | 63 | } |
64 | + | ||
60 | titleLabel.snp.makeConstraints { make in | 65 | titleLabel.snp.makeConstraints { make in |
61 | make.top.equalTo(settingsIcon.snp.top) | 66 | make.top.equalTo(settingsIcon.snp.top) |
62 | make.leading.equalTo(settingsIcon.snp.trailing).offset(18) | 67 | make.leading.equalTo(settingsIcon.snp.trailing).offset(18) |
63 | } | 68 | } |
69 | + | ||
64 | descriptionLabel.snp.makeConstraints { make in | 70 | descriptionLabel.snp.makeConstraints { make in |
65 | make.top.equalTo(titleLabel.snp.bottom).offset(5) | 71 | make.top.equalTo(titleLabel.snp.bottom).offset(5) |
66 | make.leading.equalTo(titleLabel.snp.leading) | 72 | make.leading.equalTo(titleLabel.snp.leading) |
67 | } | 73 | } |
74 | + | ||
68 | displayNameTextField.snp.makeConstraints { make in | 75 | displayNameTextField.snp.makeConstraints { make in |
69 | make.top.equalTo(descriptionLabel.snp.bottom).offset(20) | 76 | make.top.equalTo(descriptionLabel.snp.bottom).offset(20) |
70 | make.leading.equalTo(snp.leading).offset(66) | 77 | make.leading.equalTo(snp.leading).offset(66) |
@@ -72,7 +79,6 @@ class DisplayNameCell: UITableViewCell, Reusable { | @@ -72,7 +79,6 @@ class DisplayNameCell: UITableViewCell, Reusable { | ||
72 | make.height.equalTo(47) | 79 | make.height.equalTo(47) |
73 | make.bottom.equalToSuperview().offset(-30) | 80 | make.bottom.equalToSuperview().offset(-30) |
74 | } | 81 | } |
75 | - | ||
76 | } | 82 | } |
77 | } | 83 | } |
78 | 84 |
@@ -8,25 +8,24 @@ | @@ -8,25 +8,24 @@ | ||
8 | import UIKit | 8 | import UIKit |
9 | 9 | ||
10 | class SettingsSwitchCell: UITableViewCell, Reusable { | 10 | class SettingsSwitchCell: UITableViewCell, Reusable { |
11 | - | ||
12 | var settingsIcon: UIImageView = { | 11 | var settingsIcon: UIImageView = { |
13 | var obj = UIImageView() | 12 | var obj = UIImageView() |
14 | - obj.image = UIImage(named: "Notification") | 13 | + obj.image = UIImage(named: .Image.notification) |
15 | return obj | 14 | return obj |
16 | }() | 15 | }() |
17 | 16 | ||
18 | var titleLabel: UILabel = { | 17 | var titleLabel: UILabel = { |
19 | var obj = UILabel() | 18 | var obj = UILabel() |
20 | - obj.text = "Do not disturb" | ||
21 | - obj.textColor = UIColor(red: 0.196, green: 0.216, blue: 0.333, alpha: 1) | 19 | + obj.text = .Text.doNotDisturb |
20 | + obj.textColor = .TextColor.darkBlue | ||
22 | obj.font = .skModernist(type: .bold, ofSize: 16) | 21 | obj.font = .skModernist(type: .bold, ofSize: 16) |
23 | return obj | 22 | return obj |
24 | }() | 23 | }() |
25 | 24 | ||
26 | var descriptionLabel: UILabel = { | 25 | var descriptionLabel: UILabel = { |
27 | var obj = UILabel() | 26 | var obj = UILabel() |
28 | - obj.text = "You will not be notified of any calls for one day. Auto reset at midnight" | ||
29 | - obj.textColor = UIColor(red: 0.725, green: 0.725, blue: 0.725, alpha: 1) | 27 | + obj.text = .Text.youWillNotBeNotified |
28 | + obj.textColor = .TextColor.lightGrey | ||
30 | obj.font = .skModernist(type: .regular, ofSize: 14) | 29 | obj.font = .skModernist(type: .regular, ofSize: 14) |
31 | obj.numberOfLines = 0 | 30 | obj.numberOfLines = 0 |
32 | return obj | 31 | return obj |
@@ -60,21 +59,23 @@ class SettingsSwitchCell: UITableViewCell, Reusable { | @@ -60,21 +59,23 @@ class SettingsSwitchCell: UITableViewCell, Reusable { | ||
60 | make.leading.equalToSuperview().offset(31) | 59 | make.leading.equalToSuperview().offset(31) |
61 | make.top.equalToSuperview().offset(38) | 60 | make.top.equalToSuperview().offset(38) |
62 | } | 61 | } |
62 | + | ||
63 | titleLabel.snp.makeConstraints { make in | 63 | titleLabel.snp.makeConstraints { make in |
64 | make.leading.equalTo(settingsIcon.snp.trailing).offset(17.5) | 64 | make.leading.equalTo(settingsIcon.snp.trailing).offset(17.5) |
65 | make.top.equalToSuperview().offset(38) | 65 | make.top.equalToSuperview().offset(38) |
66 | } | 66 | } |
67 | + | ||
67 | descriptionLabel.snp.makeConstraints { make in | 68 | descriptionLabel.snp.makeConstraints { make in |
68 | make.top.equalTo(titleLabel.snp.bottom).offset(5) | 69 | make.top.equalTo(titleLabel.snp.bottom).offset(5) |
69 | make.leading.equalTo(titleLabel.snp.leading) | 70 | make.leading.equalTo(titleLabel.snp.leading) |
70 | make.bottom.equalToSuperview().offset(-22) | 71 | make.bottom.equalToSuperview().offset(-22) |
71 | } | 72 | } |
73 | + | ||
72 | notificationSwitch.snp.makeConstraints { make in | 74 | notificationSwitch.snp.makeConstraints { make in |
73 | make.top.equalTo(snp.top).offset(36) | 75 | make.top.equalTo(snp.top).offset(36) |
74 | make.trailing.equalTo(snp.trailing).offset(-28) | 76 | make.trailing.equalTo(snp.trailing).offset(-28) |
75 | } | 77 | } |
76 | } | 78 | } |
77 | - | ||
78 | } | 79 | } |
79 | 80 | ||
80 | 81 |
@@ -10,31 +10,32 @@ import Foundation | @@ -10,31 +10,32 @@ import Foundation | ||
10 | import UIKit | 10 | import UIKit |
11 | 11 | ||
12 | class SettingsTableViewCell: UITableViewCell, Reusable { | 12 | class SettingsTableViewCell: UITableViewCell, Reusable { |
13 | - | ||
14 | var settingsIcon: UIImageView = { | 13 | var settingsIcon: UIImageView = { |
15 | var obj = UIImageView() | 14 | var obj = UIImageView() |
16 | - obj.image = UIImage(named: "Edit") | 15 | + obj.image = UIImage(named: .Image.edit) |
17 | obj.contentMode = .scaleAspectFill | 16 | obj.contentMode = .scaleAspectFill |
18 | return obj | 17 | return obj |
19 | }() | 18 | }() |
20 | 19 | ||
21 | var titleLabel: UILabel = { | 20 | var titleLabel: UILabel = { |
22 | var obj = UILabel() | 21 | var obj = UILabel() |
23 | - obj.text = "Edit residents" | ||
24 | - obj.textColor = UIColor(red: 0.196, green: 0.216, blue: 0.333, alpha: 1) | 22 | + obj.text = .Text.editResidents |
23 | + obj.textColor = .TextColor.darkBlue | ||
25 | obj.font = .skModernist(type: .bold, ofSize: 16) | 24 | obj.font = .skModernist(type: .bold, ofSize: 16) |
26 | return obj | 25 | return obj |
27 | }() | 26 | }() |
27 | + | ||
28 | var descriptionLabel: UILabel = { | 28 | var descriptionLabel: UILabel = { |
29 | var obj = UILabel() | 29 | var obj = UILabel() |
30 | - obj.text = "Edit the residents and their information" | ||
31 | - obj.textColor = UIColor(red: 0.725, green: 0.725, blue: 0.725, alpha: 1) | 30 | + obj.text = .Text.editResidentsAndInfo |
31 | + obj.textColor = .TextColor.lightGrey | ||
32 | obj.font = .skModernist(type: .regular, ofSize: 14) | 32 | obj.font = .skModernist(type: .regular, ofSize: 14) |
33 | return obj | 33 | return obj |
34 | }() | 34 | }() |
35 | + | ||
35 | var arrowImageView: UIImageView = { | 36 | var arrowImageView: UIImageView = { |
36 | var obj = UIImageView() | 37 | var obj = UIImageView() |
37 | - obj.image = UIImage(named: "NextPointer") | 38 | + obj.image = UIImage(named: .Image.nextPointer) |
38 | return obj | 39 | return obj |
39 | }() | 40 | }() |
40 | 41 | ||
@@ -60,15 +61,18 @@ class SettingsTableViewCell: UITableViewCell, Reusable { | @@ -60,15 +61,18 @@ class SettingsTableViewCell: UITableViewCell, Reusable { | ||
60 | make.leading.equalToSuperview().offset(32) | 61 | make.leading.equalToSuperview().offset(32) |
61 | make.height.width.equalTo(18) | 62 | make.height.width.equalTo(18) |
62 | } | 63 | } |
64 | + | ||
63 | titleLabel.snp.makeConstraints { make in | 65 | titleLabel.snp.makeConstraints { make in |
64 | make.top.equalToSuperview().offset(26) | 66 | make.top.equalToSuperview().offset(26) |
65 | make.leading.equalTo(settingsIcon.snp.trailing).offset(15) | 67 | make.leading.equalTo(settingsIcon.snp.trailing).offset(15) |
66 | } | 68 | } |
69 | + | ||
67 | descriptionLabel.snp.makeConstraints { make in | 70 | descriptionLabel.snp.makeConstraints { make in |
68 | make.top.equalTo(titleLabel.snp.bottom).offset(5) | 71 | make.top.equalTo(titleLabel.snp.bottom).offset(5) |
69 | make.leading.equalTo(titleLabel.snp.leading) | 72 | make.leading.equalTo(titleLabel.snp.leading) |
70 | make.bottom.equalToSuperview().offset(-22) | 73 | make.bottom.equalToSuperview().offset(-22) |
71 | } | 74 | } |
75 | + | ||
72 | arrowImageView.snp.makeConstraints { make in | 76 | arrowImageView.snp.makeConstraints { make in |
73 | make.centerY.equalToSuperview() | 77 | make.centerY.equalToSuperview() |
74 | make.trailing.equalTo(snp.trailing).offset(-28) | 78 | make.trailing.equalTo(snp.trailing).offset(-28) |
@@ -10,9 +10,9 @@ import UIKit | @@ -10,9 +10,9 @@ import UIKit | ||
10 | class SettingsView: UIView { | 10 | class SettingsView: UIView { |
11 | var backButton: UIButton = { | 11 | var backButton: UIButton = { |
12 | var obj = UIButton() | 12 | var obj = UIButton() |
13 | - obj.setImage(UIImage(named: "BackPointer"), for: .normal) | 13 | + obj.setImage(UIImage(named: .Image.backPointer), for: .normal) |
14 | obj.backgroundColor = .white | 14 | obj.backgroundColor = .white |
15 | - obj.layer.borderColor = UIColor(red: 224/255, green: 231/255, blue: 232/255, alpha: 1).cgColor | 15 | + obj.layer.borderColor = .BorderColor.lightGrey |
16 | obj.layer.cornerRadius = 13 | 16 | obj.layer.cornerRadius = 13 |
17 | obj.layer.borderWidth = 1 | 17 | obj.layer.borderWidth = 1 |
18 | return obj | 18 | return obj |
@@ -20,20 +20,20 @@ class SettingsView: UIView { | @@ -20,20 +20,20 @@ class SettingsView: UIView { | ||
20 | 20 | ||
21 | var logoImage: UIImageView = { | 21 | var logoImage: UIImageView = { |
22 | var obj = UIImageView() | 22 | var obj = UIImageView() |
23 | - obj.image = UIImage(named: "InterQR") | 23 | + obj.image = UIImage(named: .Image.interQR) |
24 | return obj | 24 | return obj |
25 | }() | 25 | }() |
26 | 26 | ||
27 | var gearImage: UIImageView = { | 27 | var gearImage: UIImageView = { |
28 | var obj = UIImageView() | 28 | var obj = UIImageView() |
29 | - obj.image = UIImage(named: "Gear") | 29 | + obj.image = UIImage(named: .Image.gear) |
30 | return obj | 30 | return obj |
31 | }() | 31 | }() |
32 | 32 | ||
33 | let settingsLabel: UILabel = { | 33 | let settingsLabel: UILabel = { |
34 | var obj = UILabel() | 34 | var obj = UILabel() |
35 | obj.font = .skModernist(type: .bold, ofSize: 35) | 35 | obj.font = .skModernist(type: .bold, ofSize: 35) |
36 | - obj.text = "Settings" | 36 | + obj.text = .Text.settings |
37 | return obj | 37 | return obj |
38 | }() | 38 | }() |
39 | 39 | ||
@@ -44,9 +44,9 @@ class SettingsView: UIView { | @@ -44,9 +44,9 @@ class SettingsView: UIView { | ||
44 | 44 | ||
45 | var logoutButton: UIButton = { | 45 | var logoutButton: UIButton = { |
46 | var obj = UIButton() | 46 | var obj = UIButton() |
47 | - obj.backgroundColor = UIColor(red: 1, green: 0, blue: 0.18, alpha: 0.07) | ||
48 | - obj.setTitle("Logout", for: .normal) | ||
49 | - obj.setTitleColor(UIColor(red: 1, green: 0, blue: 0.18, alpha: 0.98), for: .normal) | 47 | + obj.backgroundColor = .Background.lightRed?.withAlphaComponent(0.07) |
48 | + obj.setTitle(.Text.logout, for: .normal) | ||
49 | + obj.setTitleColor(.TextColor.redError, for: .normal) | ||
50 | obj.layer.cornerRadius = 15 | 50 | obj.layer.cornerRadius = 15 |
51 | return obj | 51 | return obj |
52 | }() | 52 | }() |
@@ -54,14 +54,14 @@ class SettingsView: UIView { | @@ -54,14 +54,14 @@ class SettingsView: UIView { | ||
54 | override init(frame: CGRect) { | 54 | override init(frame: CGRect) { |
55 | super.init(frame: frame) | 55 | super.init(frame: frame) |
56 | backgroundColor = .white | 56 | backgroundColor = .white |
57 | - layout() | 57 | + setup() |
58 | } | 58 | } |
59 | 59 | ||
60 | required init?(coder: NSCoder) { | 60 | required init?(coder: NSCoder) { |
61 | fatalError("init(coder:) has not been implemented") | 61 | fatalError("init(coder:) has not been implemented") |
62 | } | 62 | } |
63 | 63 | ||
64 | - func layout() { | 64 | + func setup() { |
65 | addSubview(backButton) | 65 | addSubview(backButton) |
66 | addSubview(logoImage) | 66 | addSubview(logoImage) |
67 | addSubview(gearImage) | 67 | addSubview(gearImage) |
@@ -74,14 +74,17 @@ class SettingsView: UIView { | @@ -74,14 +74,17 @@ class SettingsView: UIView { | ||
74 | $0.leading.equalTo(snp.leading).offset(25) | 74 | $0.leading.equalTo(snp.leading).offset(25) |
75 | $0.height.width.equalTo(45) | 75 | $0.height.width.equalTo(45) |
76 | } | 76 | } |
77 | + | ||
77 | logoImage.snp.makeConstraints { | 78 | logoImage.snp.makeConstraints { |
78 | $0.leading.equalTo(backButton.snp.trailing).offset(20) | 79 | $0.leading.equalTo(backButton.snp.trailing).offset(20) |
79 | $0.top.equalTo(snp.top).offset(79) | 80 | $0.top.equalTo(snp.top).offset(79) |
80 | } | 81 | } |
82 | + | ||
81 | gearImage.snp.makeConstraints { | 83 | gearImage.snp.makeConstraints { |
82 | $0.trailing.equalTo(snp.trailing) | 84 | $0.trailing.equalTo(snp.trailing) |
83 | $0.top.equalTo(snp.top).offset(106) | 85 | $0.top.equalTo(snp.top).offset(106) |
84 | } | 86 | } |
87 | + | ||
85 | settingsLabel.snp.makeConstraints { | 88 | settingsLabel.snp.makeConstraints { |
86 | $0.leading.equalTo(backButton.snp.leading) | 89 | $0.leading.equalTo(backButton.snp.leading) |
87 | $0.top.equalTo(backButton.snp.bottom).offset(46) | 90 | $0.top.equalTo(backButton.snp.bottom).offset(46) |
@@ -8,8 +8,8 @@ | @@ -8,8 +8,8 @@ | ||
8 | import UIKit | 8 | import UIKit |
9 | 9 | ||
10 | class SettingsViewController: UIViewController { | 10 | class SettingsViewController: UIViewController { |
11 | - | ||
12 | var mainView = SettingsView() | 11 | var mainView = SettingsView() |
12 | + var networkManager = AuthNetworkManager() | ||
13 | 13 | ||
14 | let settingsModel = SettingsModel.allCases | 14 | let settingsModel = SettingsModel.allCases |
15 | 15 | ||
@@ -22,27 +22,44 @@ class SettingsViewController: UIViewController { | @@ -22,27 +22,44 @@ class SettingsViewController: UIViewController { | ||
22 | } | 22 | } |
23 | 23 | ||
24 | private func initViewController() { | 24 | private func initViewController() { |
25 | - mainView.backButton.addTarget(self, action: #selector(didShowHomeVC), for: .touchUpInside) | ||
26 | - mainView.logoutButton.addTarget(self, action: #selector(didLogoutAndShowVerificationVC), for: .touchUpInside) | 25 | + mainView.settingsTableView.delegate = self |
26 | + mainView.settingsTableView.dataSource = self | ||
27 | 27 | ||
28 | mainView.settingsTableView.registerReusableCell(DisplayNameCell.self) | 28 | mainView.settingsTableView.registerReusableCell(DisplayNameCell.self) |
29 | mainView.settingsTableView.registerReusableCell(SettingsSwitchCell.self) | 29 | mainView.settingsTableView.registerReusableCell(SettingsSwitchCell.self) |
30 | mainView.settingsTableView.registerReusableCell(SettingsTableViewCell.self) | 30 | mainView.settingsTableView.registerReusableCell(SettingsTableViewCell.self) |
31 | 31 | ||
32 | - mainView.settingsTableView.delegate = self | ||
33 | - mainView.settingsTableView.dataSource = self | 32 | + mainView.backButton.addTarget(self, action: #selector(didShowHomeVC), for: .touchUpInside) |
33 | + mainView.logoutButton.addTarget(self, action: #selector(didLogoutAndShowVerificationVC), for: .touchUpInside) | ||
34 | } | 34 | } |
35 | } | 35 | } |
36 | 36 | ||
37 | extension SettingsViewController { | 37 | extension SettingsViewController { |
38 | - | ||
39 | - @objc func didShowHomeVC() { | 38 | + @objc private func didShowHomeVC() { |
40 | navigationController?.popViewController(animated: true) | 39 | navigationController?.popViewController(animated: true) |
41 | } | 40 | } |
42 | 41 | ||
43 | - @objc func didLogoutAndShowVerificationVC() { | 42 | + @objc private func didLogoutAndShowVerificationVC() { |
44 | let vc = VerificationViewController() | 43 | let vc = VerificationViewController() |
45 | navigationController?.pushViewController(vc, animated: true) | 44 | navigationController?.pushViewController(vc, animated: true) |
45 | + networking() | ||
46 | + } | ||
47 | + | ||
48 | + func networking() { | ||
49 | + guard let logoutUrl = URL(string: Constants.APIRoutes.logoutURL.urlString) else { return } | ||
50 | + guard let logoutModel = logoutModelFilling() else { return } | ||
51 | + networkManager.logoutRequest(logoutUrl, model: logoutModel) { response in | ||
52 | + print("5️⃣❇️\(response.message ?? "Data not received!")❇️") | ||
53 | + } fail: { error in | ||
54 | + print("5️⃣❗️\(error)❗️") | ||
55 | + } | ||
56 | + } | ||
57 | + | ||
58 | + func logoutModelFilling() -> LogoutRequestModel? { | ||
59 | + guard let deviceUUID = UIDevice.current.identifierForVendor?.uuidString else { | ||
60 | + return nil | ||
61 | + } | ||
62 | + return LogoutRequestModel(deviceUUID: deviceUUID) | ||
46 | } | 63 | } |
47 | } | 64 | } |
48 | 65 | ||
@@ -68,7 +85,6 @@ extension SettingsViewController: UITableViewDelegate, UITableViewDataSource { | @@ -68,7 +85,6 @@ extension SettingsViewController: UITableViewDelegate, UITableViewDataSource { | ||
68 | cell.titleLabel.text = model.getTitle() | 85 | cell.titleLabel.text = model.getTitle() |
69 | cell.descriptionLabel.text = model.getDescription() | 86 | cell.descriptionLabel.text = model.getDescription() |
70 | cell.settingsIcon.image = model.getIcon() | 87 | cell.settingsIcon.image = model.getIcon() |
71 | - // cell.delegate = self | ||
72 | return cell | 88 | return cell |
73 | case .editResidents, .widgetLock: | 89 | case .editResidents, .widgetLock: |
74 | let cell: SettingsTableViewCell = tableView.dequeueReusableCell(for: indexPath) | 90 | let cell: SettingsTableViewCell = tableView.dequeueReusableCell(for: indexPath) |
@@ -83,7 +99,6 @@ extension SettingsViewController: UITableViewDelegate, UITableViewDataSource { | @@ -83,7 +99,6 @@ extension SettingsViewController: UITableViewDelegate, UITableViewDataSource { | ||
83 | let vc = ChooseApartmentsViewController() | 99 | let vc = ChooseApartmentsViewController() |
84 | navigationController?.pushViewController(vc, animated: true) | 100 | navigationController?.pushViewController(vc, animated: true) |
85 | } | 101 | } |
86 | - | ||
87 | } | 102 | } |
88 | } | 103 | } |
89 | 104 |
@@ -9,7 +9,6 @@ import UIKit | @@ -9,7 +9,6 @@ import UIKit | ||
9 | import CoreTelephony | 9 | import CoreTelephony |
10 | 10 | ||
11 | class PhoneNumberView: UIView { | 11 | class PhoneNumberView: UIView { |
12 | - | ||
13 | var containerPickerView: UIView = { | 12 | var containerPickerView: UIView = { |
14 | var view = UIView() | 13 | var view = UIView() |
15 | view.backgroundColor = .systemRed | 14 | view.backgroundColor = .systemRed |
@@ -18,16 +17,16 @@ class PhoneNumberView: UIView { | @@ -18,16 +17,16 @@ class PhoneNumberView: UIView { | ||
18 | 17 | ||
19 | var titleButton: UIButton = { | 18 | var titleButton: UIButton = { |
20 | var obj = UIButton() | 19 | var obj = UIButton() |
21 | - obj.setTitle("Select your country", for: .normal) | ||
22 | - obj.setTitleColor(UIColor(red: 50/255, green: 55/255, blue: 85/255, alpha: 1), for: .normal) | ||
23 | - obj.titleLabel?.font = UIFont(name: SkModernistFontType.bold.rawValue, size: 18) | 20 | + obj.setTitle(.Text.selectYourCountry, for: .normal) |
21 | + obj.setTitleColor(.TextColor.darkBlue, for: .normal) | ||
22 | + obj.titleLabel?.font = .skModernist(type: .bold, ofSize: 18) | ||
24 | obj.titleLabel?.textAlignment = .center | 23 | obj.titleLabel?.textAlignment = .center |
25 | return obj | 24 | return obj |
26 | }() | 25 | }() |
27 | 26 | ||
28 | var dividingLineView: UIView = { | 27 | var dividingLineView: UIView = { |
29 | var view = UIView() | 28 | var view = UIView() |
30 | - view.backgroundColor = UIColor(red: 246/255, green: 246/255, blue: 246/255, alpha: 1) | 29 | + view.backgroundColor = .Background.lightGrey |
31 | return view | 30 | return view |
32 | }() | 31 | }() |
33 | 32 | ||
@@ -36,19 +35,27 @@ class PhoneNumberView: UIView { | @@ -36,19 +35,27 @@ class PhoneNumberView: UIView { | ||
36 | return picker | 35 | return picker |
37 | }() | 36 | }() |
38 | 37 | ||
38 | + var gradientBG: CAGradientLayer = { | ||
39 | + let obj = CAGradientLayer() | ||
40 | + var leftColor = CGColor.GradientBlue.left | ||
41 | + var rightColor = CGColor.GradientBlue.right | ||
42 | + obj.colors = [leftColor, rightColor] | ||
43 | + obj.startPoint = CGPoint(x: 0, y: 0.5) | ||
44 | + obj.endPoint = CGPoint(x: 1, y: 0.5) | ||
45 | + return obj | ||
46 | + }() | ||
47 | + | ||
39 | var selectButton: UIButton = { | 48 | var selectButton: UIButton = { |
40 | var button = UIButton() | 49 | var button = UIButton() |
41 | - | ||
42 | - button.backgroundColor = UIColor(red: 2/255, green: 115/255, blue: 185/255, alpha: 1) | ||
43 | button.clipsToBounds = true | 50 | button.clipsToBounds = true |
44 | - | 51 | + button.layer.masksToBounds = true |
45 | return button | 52 | return button |
46 | }() | 53 | }() |
47 | 54 | ||
48 | var selectLabel: UILabel = { | 55 | var selectLabel: UILabel = { |
49 | var label = UILabel() | 56 | var label = UILabel() |
50 | - label.text = "Select" | ||
51 | - label.font = UIFont(name: SkModernistFontType.bold.rawValue, size: 16) | 57 | + label.text = .Text.select |
58 | + label.font = .skModernist(type: .bold, ofSize: 16) | ||
52 | label.textColor = .white | 59 | label.textColor = .white |
53 | return label | 60 | return label |
54 | }() | 61 | }() |
@@ -71,6 +78,7 @@ class PhoneNumberView: UIView { | @@ -71,6 +78,7 @@ class PhoneNumberView: UIView { | ||
71 | addSubview(phoneNumberPicker) | 78 | addSubview(phoneNumberPicker) |
72 | addSubview(selectButton) | 79 | addSubview(selectButton) |
73 | 80 | ||
81 | + selectButton.layer.addSublayer(gradientBG) | ||
74 | selectButton.addSubview(selectLabel) | 82 | selectButton.addSubview(selectLabel) |
75 | 83 | ||
76 | titleButton.snp.makeConstraints { make in | 84 | titleButton.snp.makeConstraints { make in |
@@ -99,12 +107,15 @@ class PhoneNumberView: UIView { | @@ -99,12 +107,15 @@ class PhoneNumberView: UIView { | ||
99 | $0.top.equalTo(selectButton.snp.top).offset(20) | 107 | $0.top.equalTo(selectButton.snp.top).offset(20) |
100 | } | 108 | } |
101 | } | 109 | } |
110 | + | ||
111 | + override func layoutSubviews() { | ||
112 | + super.layoutSubviews() | ||
113 | + gradientBG.frame = selectButton.bounds | ||
114 | + } | ||
102 | } | 115 | } |
103 | 116 | ||
104 | extension PhoneNumberView { | 117 | extension PhoneNumberView { |
105 | - | ||
106 | func setup() { | 118 | func setup() { |
107 | - | ||
108 | let countryCode: String | 119 | let countryCode: String |
109 | if let carrier = CTTelephonyNetworkInfo().serviceSubscriberCellularProviders?.first?.value, | 120 | if let carrier = CTTelephonyNetworkInfo().serviceSubscriberCellularProviders?.first?.value, |
110 | let code = carrier.isoCountryCode?.uppercased() { | 121 | let code = carrier.isoCountryCode?.uppercased() { |
@@ -112,11 +123,8 @@ extension PhoneNumberView { | @@ -112,11 +123,8 @@ extension PhoneNumberView { | ||
112 | } else { | 123 | } else { |
113 | countryCode = "USA" | 124 | countryCode = "USA" |
114 | } | 125 | } |
115 | - | ||
116 | phoneNumberPicker.selectRow(0, inComponent: 0, animated: true) | 126 | phoneNumberPicker.selectRow(0, inComponent: 0, animated: true) |
117 | - | ||
118 | phoneNumberPicker.subviews[1].backgroundColor = .clear | 127 | phoneNumberPicker.subviews[1].backgroundColor = .clear |
119 | - | ||
120 | } | 128 | } |
121 | } | 129 | } |
122 | 130 |
@@ -17,27 +17,27 @@ final class PickerView: UIView { | @@ -17,27 +17,27 @@ final class PickerView: UIView { | ||
17 | }() | 17 | }() |
18 | private let label: UILabel = { | 18 | private let label: UILabel = { |
19 | var obj = UILabel() | 19 | var obj = UILabel() |
20 | - obj.textColor = UIColor(red: 50/255, green: 55/255, blue: 85/255, alpha: 1) | ||
21 | - obj.font = UIFont(name: SkModernistFontType.bold.rawValue, size: 15) | 20 | + obj.textColor = .TextColor.darkBlue |
21 | + obj.font = .skModernist(type: .bold, ofSize: 15) | ||
22 | return obj | 22 | return obj |
23 | }() | 23 | }() |
24 | private let countryCode: UILabel = { | 24 | private let countryCode: UILabel = { |
25 | var obj = UILabel() | 25 | var obj = UILabel() |
26 | - obj.textColor = UIColor(red: 50/255, green: 55/255, blue: 85/255, alpha: 1) | ||
27 | - obj.font = UIFont(name: SkModernistFontType.bold.rawValue, size: 15) | 26 | + obj.textColor = .TextColor.darkBlue |
27 | + obj.font = .skModernist(type: .bold, ofSize: 15) | ||
28 | return obj | 28 | return obj |
29 | }() | 29 | }() |
30 | override init(frame: CGRect) { | 30 | override init(frame: CGRect) { |
31 | super.init(frame: frame) | 31 | super.init(frame: frame) |
32 | - layout() | 32 | + setup() |
33 | } | 33 | } |
34 | 34 | ||
35 | required init?(coder: NSCoder) { | 35 | required init?(coder: NSCoder) { |
36 | super.init(coder: coder) | 36 | super.init(coder: coder) |
37 | - layout() | 37 | + setup() |
38 | } | 38 | } |
39 | 39 | ||
40 | - private func layout() { | 40 | + private func setup() { |
41 | addSubview(iconView) | 41 | addSubview(iconView) |
42 | addSubview(label) | 42 | addSubview(label) |
43 | addSubview(countryCode) | 43 | addSubview(countryCode) |
@@ -45,7 +45,6 @@ final class PickerView: UIView { | @@ -45,7 +45,6 @@ final class PickerView: UIView { | ||
45 | iconView.snp.makeConstraints { make in | 45 | iconView.snp.makeConstraints { make in |
46 | make.leading.equalToSuperview().offset(25) | 46 | make.leading.equalToSuperview().offset(25) |
47 | make.centerY.equalTo(snp.centerY) | 47 | make.centerY.equalTo(snp.centerY) |
48 | -// make.top.bottom.equalToSuperview() | ||
49 | make.height.width.equalTo(20) | 48 | make.height.width.equalTo(20) |
50 | } | 49 | } |
51 | 50 |
@@ -9,73 +9,80 @@ import Foundation | @@ -9,73 +9,80 @@ import Foundation | ||
9 | import UIKit | 9 | import UIKit |
10 | 10 | ||
11 | class VerificationView: UIView { | 11 | class VerificationView: UIView { |
12 | - | ||
13 | var isShow: Bool = false | 12 | var isShow: Bool = false |
14 | - | 13 | + var isChanged: Bool = false { |
14 | + didSet { | ||
15 | + handleUI(isChanged) | ||
16 | + } | ||
17 | + } | ||
15 | var logoImage: UIImageView = { | 18 | var logoImage: UIImageView = { |
16 | var view = UIImageView() | 19 | var view = UIImageView() |
17 | - view.image = UIImage(named: "InterQR") | 20 | + view.image = UIImage(named: .Image.interQR) |
18 | return view | 21 | return view |
19 | }() | 22 | }() |
23 | + | ||
20 | var greetingsLabel: UILabel = { | 24 | var greetingsLabel: UILabel = { |
21 | var label = UILabel() | 25 | var label = UILabel() |
22 | - label.text = "Hello" | ||
23 | - label.font = UIFont(name: SkModernistFontType.bold.rawValue, size: 35) | 26 | + label.text = .Text.hello |
27 | + label.font = .skModernist(type: .bold, ofSize: 35) | ||
24 | return label | 28 | return label |
25 | }() | 29 | }() |
30 | + | ||
26 | var verifyLabel: UILabel = { | 31 | var verifyLabel: UILabel = { |
27 | var label = UILabel() | 32 | var label = UILabel() |
28 | - label.text = "Lets verify your \naccount" | 33 | + label.text = .Text.letsVerifyYourAccount |
29 | label.numberOfLines = 2 | 34 | label.numberOfLines = 2 |
30 | - label.font = UIFont(name: SkModernistFontType.regular.rawValue, size: 28) | 35 | + label.font = .skModernist(type: .regular, ofSize: 38) |
31 | return label | 36 | return label |
32 | }() | 37 | }() |
38 | + | ||
33 | var shieldImage: UIImageView = { | 39 | var shieldImage: UIImageView = { |
34 | var view = UIImageView() | 40 | var view = UIImageView() |
35 | - view.image = UIImage(named: "Shield") | 41 | + view.image = UIImage(named: .Image.shield) |
36 | return view | 42 | return view |
37 | }() | 43 | }() |
44 | + | ||
38 | var chooseLabel: UILabel = { | 45 | var chooseLabel: UILabel = { |
39 | var label = UILabel() | 46 | var label = UILabel() |
40 | - label.text = "Choose what to start with" | ||
41 | - label.font = UIFont(name: SkModernistFontType.bold.rawValue, size: 16) | ||
42 | - label.font = .systemFont(ofSize: 16, weight: .bold) | 47 | + label.text = .Text.chooseWhatToStartWith |
48 | + label.font = .skModernist(type: .bold, ofSize: 16) | ||
43 | return label | 49 | return label |
44 | }() | 50 | }() |
51 | + | ||
45 | var emailButton: Checkbox = { | 52 | var emailButton: Checkbox = { |
46 | var button = Checkbox() | 53 | var button = Checkbox() |
47 | - button.checkboxTitle = "Email" | 54 | + button.checkboxTitle = .Text.email |
48 | button.isSelected = true | 55 | button.isSelected = true |
49 | return button | 56 | return button |
50 | }() | 57 | }() |
51 | - | 58 | + |
52 | var phoneNumberButton: Checkbox = { | 59 | var phoneNumberButton: Checkbox = { |
53 | var button = Checkbox() | 60 | var button = Checkbox() |
54 | - button.checkboxTitle = "Phone Number" | 61 | + button.checkboxTitle = .Text.phoneNumber |
55 | return button | 62 | return button |
56 | }() | 63 | }() |
57 | - | 64 | + |
58 | var dividingLineView: UIView = { | 65 | var dividingLineView: UIView = { |
59 | var view = UIView() | 66 | var view = UIView() |
60 | - view.backgroundColor = UIColor(red: 246/255, green: 246/255, blue: 246/255, alpha: 1) | 67 | + view.backgroundColor = .Background.lightGrey |
61 | return view | 68 | return view |
62 | }() | 69 | }() |
63 | 70 | ||
64 | var enterChosenAuthenticatorLabel: UILabel = { | 71 | var enterChosenAuthenticatorLabel: UILabel = { |
65 | var label = UILabel() | 72 | var label = UILabel() |
66 | - label.text = "Enter your email address" | 73 | + label.text = .Text.enterYourEmailAddress |
67 | label.font = UIFont(name: SkModernistFontType.bold.rawValue, size: 16) | 74 | label.font = UIFont(name: SkModernistFontType.bold.rawValue, size: 16) |
68 | return label | 75 | return label |
69 | }() | 76 | }() |
70 | 77 | ||
71 | var emailTextField: UITextField = { | 78 | var emailTextField: UITextField = { |
72 | var textField = UITextField() | 79 | var textField = UITextField() |
73 | - textField.backgroundColor = UIColor(red: 243/255, green: 243/255, blue: 243/255, alpha: 1) | 80 | + textField.backgroundColor = .TextFieldColor.general |
74 | textField.textAlignment = .left | 81 | textField.textAlignment = .left |
75 | textField.layer.cornerRadius = 15 | 82 | textField.layer.cornerRadius = 15 |
76 | textField.keyboardType = .emailAddress | 83 | textField.keyboardType = .emailAddress |
77 | - textField.placeholder = "Example: john.doe@gmail.com" | ||
78 | - textField.font = UIFont(name: SkModernistFontType.regular.rawValue, size: 15) | 84 | + textField.placeholder = .Text.exampleEmail |
85 | + textField.font = .skModernist(type: .regular, ofSize: 15) | ||
79 | textField.layer.masksToBounds = true | 86 | textField.layer.masksToBounds = true |
80 | textField.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 22, height: textField.frame.height)) | 87 | textField.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 22, height: textField.frame.height)) |
81 | textField.leftViewMode = .always | 88 | textField.leftViewMode = .always |
@@ -85,29 +92,29 @@ class VerificationView: UIView { | @@ -85,29 +92,29 @@ class VerificationView: UIView { | ||
85 | 92 | ||
86 | var phoneTextField: TextFieldWithPadding = { | 93 | var phoneTextField: TextFieldWithPadding = { |
87 | var textField = TextFieldWithPadding() | 94 | var textField = TextFieldWithPadding() |
88 | - textField.backgroundColor = UIColor(red: 243/255, green: 243/255, blue: 243/255, alpha: 1) | 95 | + textField.backgroundColor = .TextFieldColor.general |
89 | textField.textAlignment = .left | 96 | textField.textAlignment = .left |
90 | textField.layer.cornerRadius = 15 | 97 | textField.layer.cornerRadius = 15 |
91 | textField.keyboardType = .numberPad | 98 | textField.keyboardType = .numberPad |
92 | - textField.text = "+1" | ||
93 | - textField.font = UIFont(name: SkModernistFontType.regular.rawValue, size: 15) | 99 | + textField.text = .Text.plusOne |
100 | + textField.font = .skModernist(type: .regular, ofSize: 15) | ||
94 | textField.layer.masksToBounds = true | 101 | textField.layer.masksToBounds = true |
95 | textField.isHidden = true | 102 | textField.isHidden = true |
103 | + textField.textPadding = UIEdgeInsets(top: 0, left: 75, bottom: 0, right: 15) | ||
96 | return textField | 104 | return textField |
97 | }() | 105 | }() |
98 | 106 | ||
99 | var verificationDescriptionLabel: UILabel = { | 107 | var verificationDescriptionLabel: UILabel = { |
100 | var label = UILabel() | 108 | var label = UILabel() |
101 | label.numberOfLines = 0 | 109 | label.numberOfLines = 0 |
102 | - label.text = "Verification code will be sent to your e-mail" | ||
103 | - label.font = UIFont(name: "Sk-Modernist", size: 14) | ||
104 | - label.font = .systemFont(ofSize: 14, weight: .regular) | 110 | + label.text = .Text.verificationCodeWillBeSentToYourEmail |
111 | + label.font = .skModernist(type: .regular, ofSize: 14) | ||
105 | return label | 112 | return label |
106 | }() | 113 | }() |
107 | 114 | ||
108 | var continueButton: UIButton = { | 115 | var continueButton: UIButton = { |
109 | var button = UIButton() | 116 | var button = UIButton() |
110 | - button.setImage(UIImage(named: "RectangleWithShadow"), for: .normal) | 117 | + button.setImage(UIImage(named: .Image.RectangleWithShadow), for: .normal) |
111 | button.clipsToBounds = true | 118 | button.clipsToBounds = true |
112 | button.contentMode = .scaleAspectFit | 119 | button.contentMode = .scaleAspectFit |
113 | button.layer.cornerRadius = 15 | 120 | button.layer.cornerRadius = 15 |
@@ -116,15 +123,15 @@ class VerificationView: UIView { | @@ -116,15 +123,15 @@ class VerificationView: UIView { | ||
116 | 123 | ||
117 | var continueLabel: UILabel = { | 124 | var continueLabel: UILabel = { |
118 | var label = UILabel() | 125 | var label = UILabel() |
119 | - label.text = "Continue" | ||
120 | - label.font = UIFont(name: SkModernistFontType.bold.rawValue, size: 16) | 126 | + label.text = .Text.continueText |
127 | + label.font = .skModernist(type: .bold, ofSize: 16) | ||
121 | label.textColor = .white | 128 | label.textColor = .white |
122 | return label | 129 | return label |
123 | }() | 130 | }() |
124 | 131 | ||
125 | var pointerImage: UIImageView = { | 132 | var pointerImage: UIImageView = { |
126 | var image = UIImageView() | 133 | var image = UIImageView() |
127 | - image.image = UIImage(named: "Pointer") | 134 | + image.image = UIImage(named: .Image.pointer) |
128 | return image | 135 | return image |
129 | }() | 136 | }() |
130 | 137 | ||
@@ -142,7 +149,7 @@ class VerificationView: UIView { | @@ -142,7 +149,7 @@ class VerificationView: UIView { | ||
142 | 149 | ||
143 | var flagPickerView: UIImageView = { | 150 | var flagPickerView: UIImageView = { |
144 | var image = UIImageView() | 151 | var image = UIImageView() |
145 | - image.image = UIImage(named: "USA") | 152 | + image.image = UIImage(named: .Image.USA) |
146 | image.layer.cornerRadius = 11 | 153 | image.layer.cornerRadius = 11 |
147 | image.contentMode = .scaleAspectFit | 154 | image.contentMode = .scaleAspectFit |
148 | return image | 155 | return image |
@@ -150,22 +157,21 @@ class VerificationView: UIView { | @@ -150,22 +157,21 @@ class VerificationView: UIView { | ||
150 | 157 | ||
151 | var flagPointerView: UIImageView = { | 158 | var flagPointerView: UIImageView = { |
152 | var image = UIImageView() | 159 | var image = UIImageView() |
153 | - image.image = UIImage(named: "FlagPointer") | 160 | + image.image = UIImage(named: .Image.flagPointer) |
154 | return image | 161 | return image |
155 | }() | 162 | }() |
156 | 163 | ||
157 | override init(frame: CGRect) { | 164 | override init(frame: CGRect) { |
158 | super.init(frame: frame) | 165 | super.init(frame: frame) |
159 | backgroundColor = .white | 166 | backgroundColor = .white |
160 | - layout() | 167 | + setup() |
161 | } | 168 | } |
162 | 169 | ||
163 | required init?(coder: NSCoder) { | 170 | required init?(coder: NSCoder) { |
164 | fatalError("init(coder:) has not been implemented") | 171 | fatalError("init(coder:) has not been implemented") |
165 | } | 172 | } |
166 | 173 | ||
167 | - func layout() { | ||
168 | - | 174 | + func setup() { |
169 | addSubview(logoImage) | 175 | addSubview(logoImage) |
170 | addSubview(greetingsLabel) | 176 | addSubview(greetingsLabel) |
171 | addSubview(verifyLabel) | 177 | addSubview(verifyLabel) |
@@ -195,119 +201,112 @@ class VerificationView: UIView { | @@ -195,119 +201,112 @@ class VerificationView: UIView { | ||
195 | $0.top.equalTo(snp.top).offset(80) | 201 | $0.top.equalTo(snp.top).offset(80) |
196 | $0.left.equalTo(snp.left).offset(27) | 202 | $0.left.equalTo(snp.left).offset(27) |
197 | } | 203 | } |
204 | + | ||
198 | greetingsLabel.snp.makeConstraints { | 205 | greetingsLabel.snp.makeConstraints { |
199 | $0.top.equalTo(logoImage.snp.bottom).offset(42) | 206 | $0.top.equalTo(logoImage.snp.bottom).offset(42) |
200 | $0.left.equalTo(snp.left).offset(24) | 207 | $0.left.equalTo(snp.left).offset(24) |
201 | } | 208 | } |
209 | + | ||
202 | shieldImage.snp.makeConstraints { | 210 | shieldImage.snp.makeConstraints { |
203 | $0.right.equalToSuperview() | 211 | $0.right.equalToSuperview() |
204 | $0.top.equalTo(logoImage.snp.bottom).offset(27) | 212 | $0.top.equalTo(logoImage.snp.bottom).offset(27) |
205 | } | 213 | } |
214 | + | ||
206 | verifyLabel.snp.makeConstraints { | 215 | verifyLabel.snp.makeConstraints { |
207 | $0.left.equalTo(27) | 216 | $0.left.equalTo(27) |
208 | $0.top.equalTo(greetingsLabel.snp.bottom).offset(10) | 217 | $0.top.equalTo(greetingsLabel.snp.bottom).offset(10) |
209 | } | 218 | } |
219 | + | ||
210 | chooseLabel.snp.makeConstraints { | 220 | chooseLabel.snp.makeConstraints { |
211 | $0.top.equalTo(shieldImage.snp.bottom).offset(52) | 221 | $0.top.equalTo(shieldImage.snp.bottom).offset(52) |
212 | $0.left.equalTo(snp.left).offset(27) | 222 | $0.left.equalTo(snp.left).offset(27) |
213 | } | 223 | } |
224 | + | ||
214 | emailButton.snp.makeConstraints { | 225 | emailButton.snp.makeConstraints { |
215 | $0.left.equalTo(snp.left).offset(27) | 226 | $0.left.equalTo(snp.left).offset(27) |
216 | $0.top.equalTo(chooseLabel.snp.bottom).offset(29) | 227 | $0.top.equalTo(chooseLabel.snp.bottom).offset(29) |
217 | $0.height.equalTo(20) | 228 | $0.height.equalTo(20) |
218 | } | 229 | } |
230 | + | ||
219 | phoneNumberButton.snp.makeConstraints { | 231 | phoneNumberButton.snp.makeConstraints { |
220 | $0.top.equalTo(emailButton.snp.top) | 232 | $0.top.equalTo(emailButton.snp.top) |
221 | $0.height.equalTo(20) | 233 | $0.height.equalTo(20) |
222 | $0.left.equalTo(emailButton.snp.right).offset(44) | 234 | $0.left.equalTo(emailButton.snp.right).offset(44) |
223 | } | 235 | } |
236 | + | ||
224 | dividingLineView.snp.makeConstraints { | 237 | dividingLineView.snp.makeConstraints { |
225 | $0.left.right.equalToSuperview() | 238 | $0.left.right.equalToSuperview() |
226 | $0.top.equalTo(emailButton.snp.bottom).offset(41) | 239 | $0.top.equalTo(emailButton.snp.bottom).offset(41) |
227 | $0.height.equalTo(1) | 240 | $0.height.equalTo(1) |
228 | } | 241 | } |
242 | + | ||
229 | enterChosenAuthenticatorLabel.snp.makeConstraints { | 243 | enterChosenAuthenticatorLabel.snp.makeConstraints { |
230 | $0.top.equalTo(dividingLineView.snp.bottom).offset(39) | 244 | $0.top.equalTo(dividingLineView.snp.bottom).offset(39) |
231 | $0.left.equalTo(logoImage.snp.left) | 245 | $0.left.equalTo(logoImage.snp.left) |
232 | } | 246 | } |
247 | + | ||
233 | emailTextField.snp.makeConstraints { | 248 | emailTextField.snp.makeConstraints { |
234 | $0.left.equalTo(logoImage.snp.left) | 249 | $0.left.equalTo(logoImage.snp.left) |
235 | $0.right.equalTo(snp.right).offset(-27) | 250 | $0.right.equalTo(snp.right).offset(-27) |
236 | $0.top.equalTo(enterChosenAuthenticatorLabel.snp.bottom).offset(23) | 251 | $0.top.equalTo(enterChosenAuthenticatorLabel.snp.bottom).offset(23) |
237 | $0.height.equalTo(57) | 252 | $0.height.equalTo(57) |
238 | } | 253 | } |
254 | + | ||
239 | phoneTextField.snp.makeConstraints { | 255 | phoneTextField.snp.makeConstraints { |
240 | $0.left.equalTo(logoImage.snp.left) | 256 | $0.left.equalTo(logoImage.snp.left) |
241 | $0.right.equalTo(snp.right).offset(-27) | 257 | $0.right.equalTo(snp.right).offset(-27) |
242 | $0.top.equalTo(enterChosenAuthenticatorLabel.snp.bottom).offset(23) | 258 | $0.top.equalTo(enterChosenAuthenticatorLabel.snp.bottom).offset(23) |
243 | $0.height.equalTo(57) | 259 | $0.height.equalTo(57) |
244 | } | 260 | } |
261 | + | ||
245 | verificationDescriptionLabel.snp.makeConstraints { | 262 | verificationDescriptionLabel.snp.makeConstraints { |
246 | $0.top.equalTo(emailTextField.snp.bottom).offset(8) | 263 | $0.top.equalTo(emailTextField.snp.bottom).offset(8) |
247 | $0.left.equalTo(snp.left).offset(46) | 264 | $0.left.equalTo(snp.left).offset(46) |
248 | $0.right.equalTo(snp.right).offset(-22) | 265 | $0.right.equalTo(snp.right).offset(-22) |
249 | } | 266 | } |
267 | + | ||
250 | continueButton.snp.makeConstraints { | 268 | continueButton.snp.makeConstraints { |
251 | $0.left.equalTo(snp.left) | 269 | $0.left.equalTo(snp.left) |
252 | $0.right.equalTo(snp.right) | 270 | $0.right.equalTo(snp.right) |
253 | $0.top.equalTo(emailTextField.snp.bottom).offset(90) | 271 | $0.top.equalTo(emailTextField.snp.bottom).offset(90) |
254 | $0.height.equalTo(125) | 272 | $0.height.equalTo(125) |
255 | } | 273 | } |
274 | + | ||
256 | continueLabel.snp.makeConstraints { | 275 | continueLabel.snp.makeConstraints { |
257 | $0.left.equalTo(snp.left).offset(48) | 276 | $0.left.equalTo(snp.left).offset(48) |
258 | $0.top.equalTo(continueButton.snp.top).offset(33) | 277 | $0.top.equalTo(continueButton.snp.top).offset(33) |
259 | } | 278 | } |
279 | + | ||
260 | pointerImage.snp.makeConstraints { | 280 | pointerImage.snp.makeConstraints { |
261 | $0.top.equalTo(continueButton.snp.top).offset(31) | 281 | $0.top.equalTo(continueButton.snp.top).offset(31) |
262 | $0.right.equalTo(snp.right).offset(-51.5) | 282 | $0.right.equalTo(snp.right).offset(-51.5) |
263 | } | 283 | } |
284 | + | ||
264 | phonePickerView.snp.makeConstraints { make in | 285 | phonePickerView.snp.makeConstraints { make in |
265 | make.leading.trailing.equalToSuperview() | 286 | make.leading.trailing.equalToSuperview() |
266 | make.height.equalTo(390) | 287 | make.height.equalTo(390) |
267 | make.top.equalTo(self.snp.bottom) | 288 | make.top.equalTo(self.snp.bottom) |
268 | } | 289 | } |
290 | + | ||
269 | showPickerButton.snp.makeConstraints { | 291 | showPickerButton.snp.makeConstraints { |
270 | $0.height.equalTo(22) | 292 | $0.height.equalTo(22) |
271 | $0.width.equalTo(50) | 293 | $0.width.equalTo(50) |
272 | $0.left.equalTo(emailTextField.snp.left).offset(22) | 294 | $0.left.equalTo(emailTextField.snp.left).offset(22) |
273 | $0.top.equalTo(emailTextField.snp.top).offset(18) | 295 | $0.top.equalTo(emailTextField.snp.top).offset(18) |
274 | } | 296 | } |
297 | + | ||
275 | flagPickerView.snp.makeConstraints { | 298 | flagPickerView.snp.makeConstraints { |
276 | $0.left.equalToSuperview() | 299 | $0.left.equalToSuperview() |
277 | -// $0.top.equalToSuperview() | ||
278 | $0.size.equalTo(20) | 300 | $0.size.equalTo(20) |
279 | $0.centerY.equalTo(showPickerButton.snp.centerY) | 301 | $0.centerY.equalTo(showPickerButton.snp.centerY) |
280 | } | 302 | } |
303 | + | ||
281 | flagPointerView.snp.makeConstraints { | 304 | flagPointerView.snp.makeConstraints { |
282 | $0.left.equalTo(flagPickerView.snp.right).offset(10) | 305 | $0.left.equalTo(flagPickerView.snp.right).offset(10) |
283 | $0.centerYWithinMargins.equalTo(flagPickerView.snp.centerYWithinMargins) | 306 | $0.centerYWithinMargins.equalTo(flagPickerView.snp.centerYWithinMargins) |
284 | } | 307 | } |
285 | } | 308 | } |
286 | 309 | ||
287 | -// @objc func choosePhoneCode() { | ||
288 | -// emailTextField.isHidden = true | ||
289 | -// phoneTextField.isHidden = false | ||
290 | -// phoneNumberButton.isSelected = true | ||
291 | -// emailButton.isSelected = true | ||
292 | -// phoneNumberButton.image(for: .normal) | ||
293 | -// verificationDescriptionLabel.text = "Verification code will be sent to\nyour phone number" | ||
294 | -// enterChosenAuthenticatorLabel.text = "Enter your phone number" | ||
295 | -// emailTextField.text = "+1" | ||
296 | -// showPickerButton.isHidden = false | ||
297 | -// } | ||
298 | -// | ||
299 | -// @objc func chooseEmail() { | ||
300 | -// emailTextField.isHidden = false | ||
301 | -// phoneTextField.isHidden = true | ||
302 | -// phoneNumberButton.isSelected = false | ||
303 | -// emailButton.isSelected = false | ||
304 | -// verificationDescriptionLabel.text = "Verification code will be sent to your e-mail" | ||
305 | -// enterChosenAuthenticatorLabel.text = "Enter your email address" | ||
306 | -// emailTextField.text = "" | ||
307 | -// emailTextField.placeholder = "Example: john.doe@gmail.com" | ||
308 | -// showPickerButton.isHidden = true | ||
309 | -// } | ||
310 | - | ||
311 | func showPickerView() { | 310 | func showPickerView() { |
312 | UIView.animate(withDuration: 0.3) { | 311 | UIView.animate(withDuration: 0.3) { |
313 | self.phonePickerView.snp.updateConstraints { make in | 312 | self.phonePickerView.snp.updateConstraints { make in |
@@ -325,4 +324,31 @@ class VerificationView: UIView { | @@ -325,4 +324,31 @@ class VerificationView: UIView { | ||
325 | self.layoutIfNeeded() | 324 | self.layoutIfNeeded() |
326 | } | 325 | } |
327 | } | 326 | } |
327 | + | ||
328 | + func handleUI(_ isChanged: Bool) { | ||
329 | + switch isChanged { | ||
330 | + case emailButton.isSelected : | ||
331 | + emailTextField.isHidden = false | ||
332 | + phoneTextField.isHidden = true | ||
333 | + phoneNumberButton.isSelected = false | ||
334 | + emailButton.isSelected = true | ||
335 | + verificationDescriptionLabel.text = .Text.verificationCodeWillBeSentToYourEmail | ||
336 | + enterChosenAuthenticatorLabel.text = .Text.enterYourEmailAddress | ||
337 | + emailTextField.text = "" | ||
338 | + emailTextField.placeholder = .Text.exampleEmail | ||
339 | + showPickerButton.isHidden = true | ||
340 | + case phoneNumberButton.isSelected : | ||
341 | + emailTextField.isHidden = true | ||
342 | + phoneTextField.isHidden = false | ||
343 | + phoneNumberButton.isSelected = true | ||
344 | + emailButton.isSelected = false | ||
345 | + phoneNumberButton.image(for: .normal) | ||
346 | + verificationDescriptionLabel.text = .Text.verificationCodeWillBeSentToYourNumber | ||
347 | + enterChosenAuthenticatorLabel.text = .Text.enterYourPhoneNumber | ||
348 | + emailTextField.text = .Text.plusOne | ||
349 | + showPickerButton.isHidden = false | ||
350 | + default : | ||
351 | + return | ||
352 | + } | ||
353 | + } | ||
328 | } | 354 | } |
@@ -8,7 +8,7 @@ | @@ -8,7 +8,7 @@ | ||
8 | import UIKit | 8 | import UIKit |
9 | 9 | ||
10 | class VerificationViewController: UIViewController { | 10 | class VerificationViewController: UIViewController { |
11 | - | 11 | + var networkManager = AuthNetworkManager() |
12 | var isKeyboardAppear = false | 12 | var isKeyboardAppear = false |
13 | private let mainView = VerificationView() | 13 | private let mainView = VerificationView() |
14 | 14 | ||
@@ -30,25 +30,46 @@ class VerificationViewController: UIViewController { | @@ -30,25 +30,46 @@ class VerificationViewController: UIViewController { | ||
30 | override func loadView() { | 30 | override func loadView() { |
31 | view = mainView | 31 | view = mainView |
32 | } | 32 | } |
33 | + | ||
33 | override func viewDidLoad() { | 34 | override func viewDidLoad() { |
34 | super.viewDidLoad() | 35 | super.viewDidLoad() |
35 | initViewController() | 36 | initViewController() |
36 | } | 37 | } |
37 | 38 | ||
38 | - | ||
39 | private func initViewController() { | 39 | private func initViewController() { |
40 | mainView.phonePickerView.phoneNumberPicker.delegate = self | 40 | mainView.phonePickerView.phoneNumberPicker.delegate = self |
41 | mainView.phonePickerView.phoneNumberPicker.dataSource = self | 41 | mainView.phonePickerView.phoneNumberPicker.dataSource = self |
42 | + | ||
42 | mainView.phoneNumberButton.addTarget(self, action: #selector(didCheckboxTapped(_:)), for: .touchUpInside) | 43 | mainView.phoneNumberButton.addTarget(self, action: #selector(didCheckboxTapped(_:)), for: .touchUpInside) |
43 | mainView.emailButton.addTarget(self, action: #selector(didCheckboxTapped(_:)), for: .touchUpInside) | 44 | mainView.emailButton.addTarget(self, action: #selector(didCheckboxTapped(_:)), for: .touchUpInside) |
44 | mainView.showPickerButton.addTarget(self, action: #selector(didshowPickerButtonTapped(_:)), for: .touchUpInside) | 45 | mainView.showPickerButton.addTarget(self, action: #selector(didshowPickerButtonTapped(_:)), for: .touchUpInside) |
45 | mainView.phonePickerView.selectButton.addTarget(self, action: #selector(didshowPickerButtonTapped(_:)), for: .touchUpInside) | 46 | mainView.phonePickerView.selectButton.addTarget(self, action: #selector(didshowPickerButtonTapped(_:)), for: .touchUpInside) |
46 | mainView.phonePickerView.titleButton.addTarget(self, action: #selector(didshowPickerButtonTapped(_:)), for: .touchDragInside) | 47 | mainView.phonePickerView.titleButton.addTarget(self, action: #selector(didshowPickerButtonTapped(_:)), for: .touchDragInside) |
47 | - mainView.continueButton.addTarget(self, action: #selector(didShowCodeVerificationVC), for: .touchUpInside) | 48 | + |
49 | + mainView.continueButton.addTarget(self, action: #selector(didTapContinueButton), for: .touchUpInside) | ||
48 | NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil) | 50 | NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil) |
49 | NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil) | 51 | NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil) |
50 | } | 52 | } |
51 | 53 | ||
54 | + func networking() { | ||
55 | + guard let startUrl = URL(string: Constants.APIRoutes.startURL.urlString) else { return } | ||
56 | + guard let startModel = startModelFilling() else { return } | ||
57 | + networkManager.startRequest(startUrl, model: startModel) { response in | ||
58 | + print("2️⃣✅\(response.message)✅") | ||
59 | + } fail: { error in | ||
60 | + print("2️⃣❌\(error)❌") | ||
61 | + } | ||
62 | + } | ||
63 | + | ||
64 | + func startModelFilling() -> StartRequestModel? { | ||
65 | + let number = mainView.phoneTextField.text | ||
66 | + let email = mainView.emailTextField.text | ||
67 | + if number == nil { | ||
68 | + return StartRequestModel(emailOrNumber: (String(describing: email))) | ||
69 | + } else { | ||
70 | + return StartRequestModel(emailOrNumber: (String(describing: number))) | ||
71 | + } | ||
72 | + } | ||
52 | } | 73 | } |
53 | 74 | ||
54 | //MARK: helpers and handlers | 75 | //MARK: helpers and handlers |
@@ -58,32 +79,9 @@ extension VerificationViewController { | @@ -58,32 +79,9 @@ extension VerificationViewController { | ||
58 | 79 | ||
59 | //MARK: targets | 80 | //MARK: targets |
60 | extension VerificationViewController { | 81 | extension VerificationViewController { |
61 | - | ||
62 | @objc private func didCheckboxTapped(_ sender: Checkbox) { | 82 | @objc private func didCheckboxTapped(_ sender: Checkbox) { |
63 | - switch sender { | ||
64 | - case mainView.emailButton : | ||
65 | - mainView.emailTextField.isHidden = false | ||
66 | - mainView.phoneTextField.isHidden = true | ||
67 | - mainView.phoneNumberButton.isSelected = false | ||
68 | - mainView.emailButton.isSelected = true | ||
69 | - mainView.verificationDescriptionLabel.text = "Verification code will be sent to your e-mail" | ||
70 | - mainView.enterChosenAuthenticatorLabel.text = "Enter your email address" | ||
71 | - mainView.emailTextField.text = "" | ||
72 | - mainView.emailTextField.placeholder = "Example: john.doe@gmail.com" | ||
73 | - mainView.showPickerButton.isHidden = true | ||
74 | - case mainView.phoneNumberButton: | ||
75 | - mainView.emailTextField.isHidden = true | ||
76 | - mainView.phoneTextField.isHidden = false | ||
77 | - mainView.phoneNumberButton.isSelected = true | ||
78 | - mainView.emailButton.isSelected = false | ||
79 | - mainView.phoneNumberButton.image(for: .normal) | ||
80 | - mainView.verificationDescriptionLabel.text = "Verification code will be sent to\nyour phone number" | ||
81 | - mainView.enterChosenAuthenticatorLabel.text = "Enter your phone number" | ||
82 | - mainView.emailTextField.text = "+1" | ||
83 | - mainView.showPickerButton.isHidden = false | ||
84 | - default : | ||
85 | - return | ||
86 | - } | 83 | + mainView.isChanged ? mainView.handleUI(true) : mainView.handleUI(false) |
84 | + mainView.isChanged.toggle() | ||
87 | } | 85 | } |
88 | 86 | ||
89 | @objc private func didshowPickerButtonTapped(_ sender: UIButton) { | 87 | @objc private func didshowPickerButtonTapped(_ sender: UIButton) { |
@@ -91,13 +89,33 @@ extension VerificationViewController { | @@ -91,13 +89,33 @@ extension VerificationViewController { | ||
91 | mainView.isShow.toggle() | 89 | mainView.isShow.toggle() |
92 | } | 90 | } |
93 | 91 | ||
94 | - @objc private func didShowCodeVerificationVC() { | ||
95 | - let vc = CodeVerificationViewController() | ||
96 | - vc.navigationItem.hidesBackButton = true | ||
97 | - navigationController?.pushViewController(vc, animated: true) | 92 | + @objc private func didTapContinueButton() { |
93 | + didShowCodeVerificationVC() | ||
94 | + } | ||
95 | + | ||
96 | + private func didShowCodeVerificationVC() { | ||
97 | + guard let email = mainView.emailTextField.text else { return } | ||
98 | + guard let number = mainView.phoneTextField.text else { return } | ||
99 | + let userCode: String = .Text.userCode | ||
100 | + if email.isEmpty || number.isEmpty{ | ||
101 | + let alert = UIAlertController(title: "Enter email or number fields", message: "", preferredStyle: .alert) | ||
102 | + alert.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil)) | ||
103 | + present(alert, animated: true) | ||
104 | + } else { if email == userCode || number == userCode { | ||
105 | + let vc = CodeVerificationViewController() | ||
106 | + vc.navigationItem.hidesBackButton = true | ||
107 | + navigationController?.pushViewController(vc, animated: true) | ||
108 | + networking() | ||
109 | + } else { if email != userCode || number != userCode { | ||
110 | + let alert = UIAlertController(title: "User does not exist", message: "", preferredStyle: .alert) | ||
111 | + alert.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil)) | ||
112 | + present(alert, animated: true) | ||
113 | + } | ||
114 | + } | ||
115 | + } | ||
98 | } | 116 | } |
99 | 117 | ||
100 | - @objc func keyboardWillShow(notification: NSNotification) { | 118 | + @objc private func keyboardWillShow(notification: NSNotification) { |
101 | let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double | 119 | let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double |
102 | if !isKeyboardAppear { | 120 | if !isKeyboardAppear { |
103 | UIView.animate(withDuration: duration ?? 0) { | 121 | UIView.animate(withDuration: duration ?? 0) { |
@@ -116,9 +134,9 @@ extension VerificationViewController { | @@ -116,9 +134,9 @@ extension VerificationViewController { | ||
116 | } | 134 | } |
117 | } | 135 | } |
118 | 136 | ||
119 | - @objc func keyboardWillHide(notification: NSNotification) { | 137 | + @objc private func keyboardWillHide(notification: NSNotification) { |
120 | let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double | 138 | let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double |
121 | - | 139 | + |
122 | if isKeyboardAppear { | 140 | if isKeyboardAppear { |
123 | 141 | ||
124 | UIView.animate(withDuration: duration ?? 0) { | 142 | UIView.animate(withDuration: duration ?? 0) { |
@@ -139,8 +157,9 @@ extension VerificationViewController { | @@ -139,8 +157,9 @@ extension VerificationViewController { | ||
139 | } | 157 | } |
140 | 158 | ||
141 | extension VerificationViewController: UIPickerViewDataSource, UIPickerViewDelegate { | 159 | extension VerificationViewController: UIPickerViewDataSource, UIPickerViewDelegate { |
142 | - | ||
143 | - func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } | 160 | + func numberOfComponents(in pickerView: UIPickerView) -> Int { |
161 | + return 1 | ||
162 | + } | ||
144 | 163 | ||
145 | func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { | 164 | func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { |
146 | return phonePickerModels.count | 165 | return phonePickerModels.count |
1 | +// | ||
2 | +// NetworkManager.swift | ||
3 | +// InterQR-Internship | ||
4 | +// | ||
5 | +// Created by Дмитрий Тимофеев on 25.06.2022. | ||
6 | +// | ||
7 | + | ||
8 | +import Foundation | ||
9 | +import Alamofire | ||
10 | + | ||
11 | +class AuthNetworkManager { | ||
12 | + var networkToken: String? { | ||
13 | + get { | ||
14 | + // обязательно ключи на подобии NETWORK_TOKEN выносить в Constants.networkTokenKey | ||
15 | + return UserDefaults.standard.string(forKey: "NETWORK_TOKEN") | ||
16 | + } | ||
17 | + | ||
18 | + set (newValue) { | ||
19 | + UserDefaults.standard.set(newValue, forKey: "NETWORK_TOKEN") | ||
20 | + } | ||
21 | + } | ||
22 | + | ||
23 | + typealias InitWebServiceResponse = (InitResponseModel) -> Void | ||
24 | + typealias StartWebServiceResponse = (StartResponseModel) -> Void | ||
25 | + typealias VerifyWebServiceResponse = (VerifyResponseModel) -> Void | ||
26 | + typealias LoginWebServiceResponse = (LoginResponseModel) -> Void | ||
27 | + typealias LogoutWebServiceResponse = (LogoutResponseModel) -> Void | ||
28 | + | ||
29 | + typealias FailedHandler = (Error) -> Void | ||
30 | + | ||
31 | + func initRequest(_ url: URL, model: InitRequestModel, completion: @escaping InitWebServiceResponse, fail: @escaping FailedHandler) { | ||
32 | + | ||
33 | + let params = ["device_uuid": model.deviceUUID, | ||
34 | + "manufacturer": model.manufacturer, | ||
35 | + "model": model.model, | ||
36 | + "platform": model.platform, | ||
37 | + "os_version": model.osVersion, | ||
38 | + "app_version": model.appVersion] as [String: Any] | ||
39 | + | ||
40 | + AF.request(url, method: .post, parameters: params, encoding: JSONEncoding.default).responseDecodable(of: InitResponseModel.self ) { response in | ||
41 | + | ||
42 | + if let error = response.error { | ||
43 | + fail(error) | ||
44 | + } else { | ||
45 | + if let res = response.value { | ||
46 | + completion(res) | ||
47 | + } | ||
48 | + } | ||
49 | + } | ||
50 | + } | ||
51 | + | ||
52 | + func startRequest(_ url: URL, model: StartRequestModel, completion: @escaping StartWebServiceResponse, fail: @escaping FailedHandler) { | ||
53 | + | ||
54 | + let params = ["email_or_number": model.emailOrNumber] as [String: Any] | ||
55 | + | ||
56 | + AF.request(url, method: .post, parameters: params, encoding: JSONEncoding.default).responseDecodable(of: StartResponseModel.self ) { response in | ||
57 | + | ||
58 | + if let error = response.error { | ||
59 | + fail(error) | ||
60 | + } else { | ||
61 | + if let res = response.value { | ||
62 | + completion(res) | ||
63 | + } | ||
64 | + } | ||
65 | + } | ||
66 | + } | ||
67 | + | ||
68 | + func verifyRequest(_ url: URL, model: VerifyRequestModel, completion: @escaping VerifyWebServiceResponse, fail: @escaping FailedHandler) { | ||
69 | + | ||
70 | + let params = ["email_or_number": model.emailOrNumber, | ||
71 | + "code": model.code, | ||
72 | + "second_auth_token": model.secondAuthToken] as [String: Any] | ||
73 | + | ||
74 | + AF.request(url, method: .post, parameters: params, encoding: JSONEncoding.default).responseDecodable(of: VerifyResponseModel.self ) { response in | ||
75 | + | ||
76 | + if let error = response.error { | ||
77 | + fail(error) | ||
78 | + } else { | ||
79 | + if let res = response.value { | ||
80 | + self.networkToken = res.data.token | ||
81 | + completion(res) | ||
82 | + } | ||
83 | + } | ||
84 | + } | ||
85 | + } | ||
86 | + | ||
87 | + func loginRequest(_ url: URL, model: LoginRequestModel, completion: @escaping LoginWebServiceResponse, fail: @escaping FailedHandler) { | ||
88 | + let headers = ["Authorization": "Bearer \(self.networkToken ?? "")"] | ||
89 | + let params = ["device_uuid": model.deviceUUID] as [String: Any] | ||
90 | + AF.request(url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: HTTPHeaders(headers), interceptor: nil).responseDecodable(of: LoginResponseModel.self ) { response in | ||
91 | + if let error = response.error { | ||
92 | + fail(error) | ||
93 | + } else { | ||
94 | + if let res = response.value { | ||
95 | + completion(res) | ||
96 | + } | ||
97 | + } | ||
98 | + } | ||
99 | + } | ||
100 | + | ||
101 | + func logoutRequest(_ url: URL, model: LogoutRequestModel, completion: @escaping LogoutWebServiceResponse, fail: @escaping FailedHandler) { | ||
102 | + let headers = ["Authorization": "Bearer \(self.networkToken ?? "")"] | ||
103 | + let params = ["device_uuid": model.deviceUUID] as [String: Any] | ||
104 | + | ||
105 | + AF.request(url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: HTTPHeaders(headers), interceptor: nil).responseDecodable(of: LogoutResponseModel.self ) { response in | ||
106 | + | ||
107 | + if let error = response.error { | ||
108 | + fail(error) | ||
109 | + } else { | ||
110 | + if let res = response.value { | ||
111 | + completion(res) | ||
112 | + } | ||
113 | + } | ||
114 | + } | ||
115 | + } | ||
116 | +} |
1 | -// | ||
2 | -// NetworkManager.swift | ||
3 | -// InterQR-Internship | ||
4 | -// | ||
5 | -// Created by Дмитрий Тимофеев on 25.06.2022. | ||
6 | -// | ||
7 | - | ||
8 | -import Foundation | ||
9 | -import Alamofire | ||
10 | -struct RequestModel: Codable { | ||
11 | - var deviceUUID: String | ||
12 | - var manufacturer: String | ||
13 | - var model: String | ||
14 | - var platform: String | ||
15 | - var osVersion: String | ||
16 | - var appVersion: String | ||
17 | -} | ||
18 | -class NetworkManager { | ||
19 | - typealias WebServiceResponse = (RequestModel) -> Void | ||
20 | - typealias FailedHandler = (Error) -> Void | ||
21 | - | ||
22 | - func authorizationRequest(_ url: URL, model: RequestModel, completion: @escaping WebServiceResponse, fail: @escaping FailedHandler) { | ||
23 | - | ||
24 | - let params = ["device_uuid": model.deviceUUID, | ||
25 | - "manufacturer": model.manufacturer, | ||
26 | - "model": model.model, | ||
27 | - "platform": model.platform, | ||
28 | - "os_version": model.osVersion, | ||
29 | - "app_version": model.appVersion] as [String: Any] | ||
30 | - | ||
31 | - AF.request(url, method: .post, parameters: params, encoding: JSONEncoding.default).responseDecodable(of: RequestModel.self ) { response in | ||
32 | - | ||
33 | - if let error = response.error { | ||
34 | - fail(error) | ||
35 | - } else { | ||
36 | - if let res = response.value { | ||
37 | - completion(res) | ||
38 | - } | ||
39 | - } | ||
40 | - } | ||
41 | - | ||
42 | - // AF.request(url).response { response in | ||
43 | - // guard let data = response.data else { return } | ||
44 | - // do { | ||
45 | - // let decoder = JSONDecoder() | ||
46 | - // let json = try decoder.decode(Initialize.self, from: data) | ||
47 | - // | ||
48 | - // DispatchQueue.main.async { | ||
49 | - // completion(json) | ||
50 | - // } | ||
51 | - // } | ||
52 | - // catch { | ||
53 | - // print("❌\(error)❌") | ||
54 | - // } | ||
55 | - // } | ||
56 | - } | ||
57 | -} |
Please
register
or
login
to post a comment