git.iko.soy/dashared/GDproject
on master help sign in
GDproject.xcodeproj/project.pbxproj+4
since splitsnapshots
unifiedsplit
@@ -10,6 +10,7 @@
10 1210A0BB223940310080686D /* SimplifiedChannelsList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1210A0BA223940310080686D /* SimplifiedChannelsList.swift */; };
10 1210A0BB223940310080686D /* SimplifiedChannelsList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1210A0BA223940310080686D /* SimplifiedChannelsList.swift */; };
11 121A8972226B1EAC005EE599 /* TagsSuggestionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 121A8971226B1EAC005EE599 /* TagsSuggestionController.swift */; };
11 121A8972226B1EAC005EE599 /* TagsSuggestionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 121A8971226B1EAC005EE599 /* TagsSuggestionController.swift */; };
12 1220FF94227C41270092C6BC /* TaggsSelectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1220FF93227C41270092C6BC /* TaggsSelectionViewController.swift */; };
12 1220FF94227C41270092C6BC /* TaggsSelectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1220FF93227C41270092C6BC /* TaggsSelectionViewController.swift */; };
13+ 123589FD22899339002F8028 /* MessageViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 123589FC22899339002F8028 /* MessageViewCell.swift */; };
13 123E37A5221F1B3200F6E42A /* LogInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 123E37A4221F1B3200F6E42A /* LogInViewController.swift */; };
14 123E37A5221F1B3200F6E42A /* LogInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 123E37A4221F1B3200F6E42A /* LogInViewController.swift */; };
14 123E37A7221F1DD700F6E42A /* MainController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 123E37A6221F1DD700F6E42A /* MainController.swift */; };
15 123E37A7221F1DD700F6E42A /* MainController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 123E37A6221F1DD700F6E42A /* MainController.swift */; };
15 124CC7032221C00C009DF531 /* Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124CC7022221C00C009DF531 /* Model.swift */; };
16 124CC7032221C00C009DF531 /* Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124CC7022221C00C009DF531 /* Model.swift */; };
@@ -108,6 +109,7 @@
108 1210A0BA223940310080686D /* SimplifiedChannelsList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimplifiedChannelsList.swift; sourceTree = "<group>"; };
109 1210A0BA223940310080686D /* SimplifiedChannelsList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimplifiedChannelsList.swift; sourceTree = "<group>"; };
109 121A8971226B1EAC005EE599 /* TagsSuggestionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TagsSuggestionController.swift; sourceTree = "<group>"; };
110 121A8971226B1EAC005EE599 /* TagsSuggestionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TagsSuggestionController.swift; sourceTree = "<group>"; };
110 1220FF93227C41270092C6BC /* TaggsSelectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaggsSelectionViewController.swift; sourceTree = "<group>"; };
111 1220FF93227C41270092C6BC /* TaggsSelectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaggsSelectionViewController.swift; sourceTree = "<group>"; };
112+ 123589FC22899339002F8028 /* MessageViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageViewCell.swift; sourceTree = "<group>"; };
111 123E37A4221F1B3200F6E42A /* LogInViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogInViewController.swift; sourceTree = "<group>"; };
113 123E37A4221F1B3200F6E42A /* LogInViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogInViewController.swift; sourceTree = "<group>"; };
112 123E37A6221F1DD700F6E42A /* MainController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainController.swift; sourceTree = "<group>"; };
114 123E37A6221F1DD700F6E42A /* MainController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainController.swift; sourceTree = "<group>"; };
113 124CC7022221C00C009DF531 /* Model.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Model.swift; sourceTree = "<group>"; };
115 124CC7022221C00C009DF531 /* Model.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Model.swift; sourceTree = "<group>"; };
@@ -238,6 +240,7 @@
238 129320082279C3B50035C7B3 /* PeopleToWriteViewController.swift */,
240 129320082279C3B50035C7B3 /* PeopleToWriteViewController.swift */,
239 1298810C227F138C0032ACA3 /* Dialog */,
241 1298810C227F138C0032ACA3 /* Dialog */,
240 129320032279B4270035C7B3 /* MessagesViewController.swift */,
242 129320032279B4270035C7B3 /* MessagesViewController.swift */,
243+ 123589FC22899339002F8028 /* MessageViewCell.swift */,
241 );
244 );
242 path = Messages;
245 path = Messages;
243 sourceTree = "<group>";
246 sourceTree = "<group>";
@@ -451,6 +454,7 @@
451 1298810B227F13840032ACA3 /* DialogCell.swift in Sources */,
454 1298810B227F13840032ACA3 /* DialogCell.swift in Sources */,
452 125A9A922286100800513E2A /* FacultyTableViewController.swift in Sources */,
455 125A9A922286100800513E2A /* FacultyTableViewController.swift in Sources */,
453 125A9A8E2286068A00513E2A /* RegisterTableViewController.swift in Sources */,
456 125A9A8E2286068A00513E2A /* RegisterTableViewController.swift in Sources */,
457+ 123589FD22899339002F8028 /* MessageViewCell.swift in Sources */,
454 12E36DCC22144725006FCDD7 /* PostViewCell.swift in Sources */,
458 12E36DCC22144725006FCDD7 /* PostViewCell.swift in Sources */,
455 123E37A5221F1B3200F6E42A /* LogInViewController.swift in Sources */,
459 123E37A5221F1B3200F6E42A /* LogInViewController.swift in Sources */,
456 125BD57F22171D73008A3575 /* Extentions.swift in Sources */,
460 125BD57F22171D73008A3575 /* Extentions.swift in Sources */,
GDproject/Base.lproj/Main.storyboard+38−21
@@ -778,29 +778,53 @@
778 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
778 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
779 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
779 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
780 <prototypes>
780 <prototypes>
781− <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="MessagesCell" textLabel="9br-gb-mg8" detailTextLabel="Jxd-We-VyC" style="IBUITableViewCellStyleSubtitle" id="67C-fT-WEV">
781+ <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="MessageViewCell" rowHeight="78" id="67C-fT-WEV" customClass="MessageViewCell" customModule="GDproject" customModuleProvider="target">
782− <rect key="frame" x="0.0" y="28" width="375" height="44"/>
782+ <rect key="frame" x="0.0" y="28" width="375" height="78"/>
783 <autoresizingMask key="autoresizingMask"/>
783 <autoresizingMask key="autoresizingMask"/>
784 <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="67C-fT-WEV" id="O3b-Xv-UNk">
784 <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="67C-fT-WEV" id="O3b-Xv-UNk">
785− <rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/>
785+ <rect key="frame" x="0.0" y="0.0" width="375" height="77.5"/>
786 <autoresizingMask key="autoresizingMask"/>
786 <autoresizingMask key="autoresizingMask"/>
787 <subviews>
787 <subviews>
788+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xAY-IF-RpX">
789+ <rect key="frame" x="229" y="11" width="130" height="15"/>
790+ <constraints>
791+ <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="130" id="f99-ZF-f8h"/>
792+ </constraints>
793+ <fontDescription key="fontDescription" type="system" pointSize="12"/>
794+ <color key="textColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
795+ <nil key="highlightedColor"/>
796+ </label>
788− <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Title" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="9br-gb-mg8">
797+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="FG3-gU-0r1">
789− <rect key="frame" x="16" y="5" width="33.5" height="20.5"/>
798+ <rect key="frame" x="16" y="11" width="46" height="22"/>
790− <autoresizingMask key="autoresizingMask"/>
791− <fontDescription key="fontDescription" type="system" pointSize="17"/>
799+ <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="18"/>
792 <nil key="textColor"/>
800 <nil key="textColor"/>
793 <nil key="highlightedColor"/>
801 <nil key="highlightedColor"/>
794 </label>
802 </label>
795− <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Detail" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Jxd-We-VyC">
803+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nTy-rK-XTr">
796− <rect key="frame" x="16" y="25.5" width="33" height="14.5"/>
804+ <rect key="frame" x="16" y="49" width="343" height="18"/>
797− <autoresizingMask key="autoresizingMask"/>
798− <fontDescription key="fontDescription" type="system" pointSize="12"/>
805+ <fontDescription key="fontDescription" type="system" pointSize="15"/>
799 <nil key="textColor"/>
806 <nil key="textColor"/>
800 <nil key="highlightedColor"/>
807 <nil key="highlightedColor"/>
801 </label>
808 </label>
802 </subviews>
809 </subviews>
810+ <constraints>
811+ <constraint firstItem="nTy-rK-XTr" firstAttribute="top" secondItem="xAY-IF-RpX" secondAttribute="bottom" constant="23" id="09Y-aK-nD9"/>
812+ <constraint firstItem="FG3-gU-0r1" firstAttribute="top" secondItem="O3b-Xv-UNk" secondAttribute="topMargin" id="4Hp-d5-9An"/>
813+ <constraint firstItem="xAY-IF-RpX" firstAttribute="top" secondItem="O3b-Xv-UNk" secondAttribute="topMargin" id="G4f-oJ-7ud"/>
814+ <constraint firstItem="nTy-rK-XTr" firstAttribute="trailing" secondItem="O3b-Xv-UNk" secondAttribute="trailingMargin" id="MaE-VM-KhL"/>
815+ <constraint firstItem="nTy-rK-XTr" firstAttribute="leading" secondItem="O3b-Xv-UNk" secondAttribute="leadingMargin" id="OIX-rY-Leo"/>
816+ <constraint firstItem="nTy-rK-XTr" firstAttribute="top" secondItem="FG3-gU-0r1" secondAttribute="bottom" constant="16" id="Qdj-s3-t60"/>
817+ <constraint firstItem="nTy-rK-XTr" firstAttribute="bottom" secondItem="O3b-Xv-UNk" secondAttribute="bottomMargin" id="Rv3-Mz-Aed"/>
818+ <constraint firstItem="FG3-gU-0r1" firstAttribute="leading" secondItem="O3b-Xv-UNk" secondAttribute="leadingMargin" id="iN1-KG-dYn"/>
819+ <constraint firstItem="xAY-IF-RpX" firstAttribute="trailing" secondItem="O3b-Xv-UNk" secondAttribute="trailingMargin" id="opV-4x-VCk"/>
820+ <constraint firstItem="xAY-IF-RpX" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="FG3-gU-0r1" secondAttribute="trailing" constant="4" id="x9r-sM-t4x"/>
821+ </constraints>
803 </tableViewCellContentView>
822 </tableViewCellContentView>
823+ <connections>
824+ <outlet property="dateLabel" destination="xAY-IF-RpX" id="fcz-re-BXk"/>
825+ <outlet property="dialogName" destination="FG3-gU-0r1" id="gd7-ND-wCi"/>
826+ <outlet property="lastMessagePreview" destination="nTy-rK-XTr" id="Cmo-IJ-2r0"/>
827+ </connections>
804 </tableViewCell>
828 </tableViewCell>
805 </prototypes>
829 </prototypes>
806 <connections>
830 <connections>
@@ -811,7 +835,7 @@
811 </tableViewController>
835 </tableViewController>
812 <placeholder placeholderIdentifier="IBFirstResponder" id="fu3-z4-EY7" userLabel="First Responder" sceneMemberID="firstResponder"/>
836 <placeholder placeholderIdentifier="IBFirstResponder" id="fu3-z4-EY7" userLabel="First Responder" sceneMemberID="firstResponder"/>
813 </objects>
837 </objects>
814− <point key="canvasLocation" x="2798" y="932"/>
838+ <point key="canvasLocation" x="2681" y="918"/>
815 </scene>
839 </scene>
816 <!--People To Write View Controller-->
840 <!--People To Write View Controller-->
817 <scene sceneID="6Td-bq-Ebf">
841 <scene sceneID="6Td-bq-Ebf">
@@ -822,7 +846,7 @@
822 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
846 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
823 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
847 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
824 <prototypes>
848 <prototypes>
825− <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="peopleToWriteCell" textLabel="e4H-yo-W57" detailTextLabel="QSb-Bd-4gu" style="IBUITableViewCellStyleValue1" id="5ue-Sf-Blf">
849+ <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="peopleToWriteCell" textLabel="e4H-yo-W57" style="IBUITableViewCellStyleDefault" id="5ue-Sf-Blf">
826 <rect key="frame" x="0.0" y="28" width="375" height="44"/>
850 <rect key="frame" x="0.0" y="28" width="375" height="44"/>
827 <autoresizingMask key="autoresizingMask"/>
851 <autoresizingMask key="autoresizingMask"/>
828 <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="5ue-Sf-Blf" id="8Dr-YE-x7M">
852 <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="5ue-Sf-Blf" id="8Dr-YE-x7M">
@@ -830,14 +854,7 @@
830 <autoresizingMask key="autoresizingMask"/>
854 <autoresizingMask key="autoresizingMask"/>
831 <subviews>
855 <subviews>
832 <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Title" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="e4H-yo-W57">
856 <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Title" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="e4H-yo-W57">
833− <rect key="frame" x="16" y="12" width="33.5" height="20.5"/>
857+ <rect key="frame" x="16" y="0.0" width="343" height="43.5"/>
834− <autoresizingMask key="autoresizingMask"/>
835− <fontDescription key="fontDescription" type="system" pointSize="17"/>
836− <nil key="textColor"/>
837− <nil key="highlightedColor"/>
838− </label>
839− <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Detail" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="QSb-Bd-4gu">
840− <rect key="frame" x="315" y="12" width="44" height="20.5"/>
841 <autoresizingMask key="autoresizingMask"/>
858 <autoresizingMask key="autoresizingMask"/>
842 <fontDescription key="fontDescription" type="system" pointSize="17"/>
859 <fontDescription key="fontDescription" type="system" pointSize="17"/>
843 <nil key="textColor"/>
860 <nil key="textColor"/>
GDproject/Controller/ News and channels/ChannelController.swift+1−1
@@ -73,7 +73,7 @@ class ChannelController: UIViewController, UITableViewDelegate, UITableViewDataS
73 if let _ = channel?.id { print("update")
73 if let _ = channel?.id { print("update")
74 Model.updateChannel(with: channel!)
74 Model.updateChannel(with: channel!)
75 } else { print("create")
75 } else { print("create")
76− Model.createChannel(with: channel!)
76+ //Model.createChannel(with: channel!)
77 }
77 }
78 return
78 return
79 }
79 }
GDproject/Controller/ News and channels/ChannelListController.swift+2−2
@@ -30,7 +30,7 @@ class ChannelListController: UITableViewController {
30 var displayingChannel: Model.Channels?
30 var displayingChannel: Model.Channels?
31
31
32 var toReload: Bool = false {
32 var toReload: Bool = false {
33− didSet{
33+ didSet {
34 tableView.reloadData()
34 tableView.reloadData()
35 }
35 }
36 }
36 }
@@ -100,7 +100,7 @@ class ChannelListController: UITableViewController {
100 @objc func addChannel()
100 @objc func addChannel()
101 {
101 {
102 // editing mode is on automatically
102 // editing mode is on automatically
103− onEditingModeBegins?(Model.Channels(people: [], name: "Untitled", tags: []),IndexPath(row: 1, section: 0))
103+ onEditingModeBegins?(Model.Channels(people: [], name: "Untitled", id: 0, tags: []),IndexPath(row: 1, section: 0))
104 }
104 }
105
105
106 static let generalChannel = Model.Channels(people: [], name: "General", id: -1, tags: [])
106 static let generalChannel = Model.Channels(people: [], name: "General", id: -1, tags: [])
GDproject/Controller/ News and channels/ChannelViewController.swift+8−3
@@ -60,12 +60,17 @@ class ChannelViewController: UITableViewController, UpdatableName, UpdatableChan
60 super.viewWillDisappear(animated)
60 super.viewWillDisappear(animated)
61 }
61 }
62
62
63− guard let _ = self.navigationController?.viewControllers.lastIndex(of: self) else {
63+ guard let _ = self.navigationController?.viewControllers.lastIndex(of: self) else
64+ {
64− if let _ = channel?.id
65+ if let id = channel?.id, id != 0
65 {
66 {
66 Model.updateChannel(with: channel!)
67 Model.updateChannel(with: channel!)
67 } else {
68 } else {
68− Model.createChannel(with: channel!)
69+ Model.createChannel(with: channel!) {
70+ [weak self] in
71+ self?.showAlertOn(result: $0)
72+ return
73+ }
69 }
74 }
70 return
75 return
71 }
76 }
GDproject/Controller/ News and channels/FullPostController.swift+1−18
@@ -26,26 +26,9 @@ class FullPostController: UITableViewController {
26 func setUpNavigationBar(){
26 func setUpNavigationBar(){
27 navigationItem.largeTitleDisplayMode = .never
27 navigationItem.largeTitleDisplayMode = .never
28 navigationItem.title = "Post"
28 navigationItem.title = "Post"
29− navigationItem.rightBarButtonItems = [UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(self.options))]
30 }
29 }
31
30
32− @objc func options(){
31+
33− // drafts
34− // saved
35−
36− let optionMenu = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
37− let editAction = UIAlertAction(title: "Send via message", style: .default)
38− let shareAction = UIAlertAction(title: "Send via project", style: .default)
39− let settingsAction = UIAlertAction(title: "Copy link", style: .default)
40− let cancelAction = UIAlertAction(title: "Cancel", style: .cancel)
41−
42− optionMenu.addAction(editAction)
43− optionMenu.addAction(shareAction)
44− optionMenu.addAction(settingsAction)
45− optionMenu.addAction(cancelAction)
46−
47− self.present(optionMenu, animated: true, completion: nil)
48− }
49 // MARK: - Table view data source
32 // MARK: - Table view data source
50
33
51 override func numberOfSections(in tableView: UITableView) -> Int {
34 override func numberOfSections(in tableView: UITableView) -> Int {
GDproject/Controller/ News and channels/NewPostViewController.swift+26−8
@@ -41,7 +41,7 @@ class NewPostViewController: UIViewController, UITextViewDelegate, TagsReceiver
41 let textStorage = MarklightTextStorage()
41 let textStorage = MarklightTextStorage()
42
42
43 static var draft: String = ""
43 static var draft: String = ""
44− static var hashTagsDraft: [String] = ["tt"]
44+ static var hashTagsDraft: [String] = [ ]
45
45
46 var textView: UITextView!
46 var textView: UITextView!
47
47
@@ -72,7 +72,7 @@ class NewPostViewController: UIViewController, UITextViewDelegate, TagsReceiver
72
72
73 setUpMD()
73 setUpMD()
74 setUpTextView()
74 setUpTextView()
75− setUpAccessoryView()
75+ // setUpAccessoryView()
76 //setUpTagsView()
76 //setUpTagsView()
77 }
77 }
78
78
@@ -109,7 +109,8 @@ class NewPostViewController: UIViewController, UITextViewDelegate, TagsReceiver
109 override func viewWillAppear(_ animated: Bool) {
109 override func viewWillAppear(_ animated: Bool) {
110 super.viewWillAppear(animated)
110 super.viewWillAppear(animated)
111
111
112− navigationController?.navigationBar.prefersLargeTitles = false
112+ //navigationController?.navigationBar.prefersLargeTitles = false
113+ navigationItem.largeTitleDisplayMode = .never
113 navigationItem.title = "New post"
114 navigationItem.title = "New post"
114 textView.text = NewPostViewController.draft
115 textView.text = NewPostViewController.draft
115 // tagsField.addTags(NewPostViewController.hashTagsDraft)
116 // tagsField.addTags(NewPostViewController.hashTagsDraft)
@@ -140,7 +141,7 @@ class NewPostViewController: UIViewController, UITextViewDelegate, TagsReceiver
140 func setUpTextView(){
141 func setUpTextView(){
141 view.addConstraint(bottomTextViewConstraint)
142 view.addConstraint(bottomTextViewConstraint)
142 view1.addSubview(textView)
143 view1.addSubview(textView)
143− textView.edgesToSuperview(insets: .top(8) + .left(8) + .bottom(40+8) + .right(8))
144+ textView.edgesToSuperview(insets: .top(8) + .left(8) + .bottom(8) + .right(8))
144
145
145 if #available(iOS 11.0, *) {
146 if #available(iOS 11.0, *) {
146 textView.smartDashesType = .no
147 textView.smartDashesType = .no
@@ -209,7 +210,7 @@ class NewPostViewController: UIViewController, UITextViewDelegate, TagsReceiver
209 }
210 }
210
211
211 func setUpMD(){
212 func setUpMD(){
212− textStorage.marklightTextProcessor.codeColor = UIColor.orange
213+ textStorage.marklightTextProcessor.codeColor = UIColor.gray
213 textStorage.marklightTextProcessor.quoteColor = UIColor.darkGray
214 textStorage.marklightTextProcessor.quoteColor = UIColor.darkGray
214 textStorage.marklightTextProcessor.syntaxColor = UIColor.blue
215 textStorage.marklightTextProcessor.syntaxColor = UIColor.blue
215 textStorage.marklightTextProcessor.codeFontName = "Courier"
216 textStorage.marklightTextProcessor.codeFontName = "Courier"
@@ -231,10 +232,27 @@ class NewPostViewController: UIViewController, UITextViewDelegate, TagsReceiver
231 var indexOfPost = 0
232 var indexOfPost = 0
232 // MARK:- new post
233 // MARK:- new post
233 @objc func newPost(){
234 @objc func newPost(){
235+ self.navigationItem.title = "Sending..."
234− Model.createAndPublish(body: [Model.Attachments(markdown: textView!.text)], tags: currentTags)
236+ Model.createAndPublish(body: [Model.Attachments(markdown: textView!.text)], tags: currentTags) {
237+ [weak self] in
238+
239+ switch $0 {
240+ case .success1, .success:
241+ NewPostViewController.draft = ""
242+ NewPostViewController.hashTagsDraft = []
243+ self?.moveBackToParentVC?()
244+ default:
245+ self?.showAlertOn(result: $0)
246+ self?.navigationItem.title = "New post"
247+ }
248+
249+ }
250+
251+ // NewPostViewController.draft = ""
252+ // NewPostViewController.hashTagsDraft = []
235 // adding row to uiTableView after adding new post
253 // adding row to uiTableView after adding new post
236 // myProtocol?.addPost(post: p)
254 // myProtocol?.addPost(post: p)
237− moveBackToParentVC?()
255+ // moveBackToParentVC?()
238 // somewhere here i will be sending server notifications about new post arrival
256 // somewhere here i will be sending server notifications about new post arrival
239 }
257 }
240
258
@@ -246,7 +264,7 @@ class NewPostViewController: UIViewController, UITextViewDelegate, TagsReceiver
246 [weak self]
264 [weak self]
247 _ in
265 _ in
248 NewPostViewController.draft = self?.textView.text ?? ""
266 NewPostViewController.draft = self?.textView.text ?? ""
249− NewPostViewController.hashTagsDraft = /*self?.tagsField.tags.map { $0.text } ??*/ []
267+ NewPostViewController.hashTagsDraft = self?.currentTags ?? []
250 self?.moveBackToParentVC?()
268 self?.moveBackToParentVC?()
251 }
269 }
252
270
GDproject/Controller/ News and channels/NewsController.swift+3−1
@@ -52,6 +52,7 @@ class NewsController: UIViewController, UISearchControllerDelegate, UpdateableWi
52 let updater = TagsSuggestionController()
52 let updater = TagsSuggestionController()
53 updater.delegate = self
53 updater.delegate = self
54 searchController = UISearchController(searchResultsController: updater)
54 searchController = UISearchController(searchResultsController: updater)
55+ navigationItem.largeTitleDisplayMode = .always
55
56
56 navigationController?.navigationBar.prefersLargeTitles = true
57 navigationController?.navigationBar.prefersLargeTitles = true
57 navigationItem.title = "Loading ..."
58 navigationItem.title = "Loading ..."
@@ -81,7 +82,7 @@ class NewsController: UIViewController, UISearchControllerDelegate, UpdateableWi
81 searchController?.searchBar.placeholder = "Search tags"
82 searchController?.searchBar.placeholder = "Search tags"
82 }
83 }
83
84
84− @objc func refreshPostsData( _ ff: UIRefreshControl){
85+ @objc func refreshPostsData( _ ff: UIRefreshControl) {
85 decideWhatChannelDisplay()
86 decideWhatChannelDisplay()
86 }
87 }
87
88
@@ -121,6 +122,7 @@ class NewsController: UIViewController, UISearchControllerDelegate, UpdateableWi
121 }
122 }
122 }
123 }
123 default:
124 default:
125+ refreshContr.endRefreshing()
124 break
126 break
125 }
127 }
126
128
GDproject/Controller/ News and channels/NewsVC.swift+3−1
@@ -19,7 +19,9 @@ struct PostCellData{
19
19
20 let markdownParser = MarkdownParser(font: UIFont.systemFont(ofSize: 16))
20 let markdownParser = MarkdownParser(font: UIFont.systemFont(ofSize: 16))
21 markdownParser.enabledElements = .disabledAutomaticLink
21 markdownParser.enabledElements = .disabledAutomaticLink
22+ markdownParser.code.font = UIFont(name: "Menlo", size: 16)
22− markdownParser.code.textBackgroundColor = #colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)
23+ markdownParser.code.textBackgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
24+ markdownParser.code.color = #colorLiteral(red: 0.2549019754, green: 0.2745098174, blue: 0.3019607961, alpha: 1)
23
25
24 return markdownParser.parse(markdown)
26 return markdownParser.parse(markdown)
25 }
27 }
GDproject/Controller/ News and channels/PostViewCell.swift+1−1
@@ -87,7 +87,7 @@ class PostViewCell: UITableViewCell
87 nameLabel.setTitle("\(post.user?.firstName ?? "") \(post.user?.lastName ?? "")", for: .normal)
87 nameLabel.setTitle("\(post.user?.firstName ?? "") \(post.user?.lastName ?? "")", for: .normal)
88 nameLabel.addTarget(self, action: #selector(displayProfile), for: .touchUpInside)
88 nameLabel.addTarget(self, action: #selector(displayProfile), for: .touchUpInside)
89 if let user = post.user{
89 if let user = post.user{
90− fullNameLabel.text = "\(user.firstName) \(user.middleName) \(user.lastName)"
90+ fullNameLabel.text = "\(user.faculty.name)"
91 }
91 }
92 else {
92 else {
93 fullNameLabel.text = "\(post.authorId)"
93 fullNameLabel.text = "\(post.authorId)"
GDproject/Controller/Coordinators/ProfileCoordinator.swift+15−13
@@ -36,23 +36,25 @@ class ProfileCoordinator: BaseCoordinator {
36 }
36 }
37 }
37 }
38
38
39− profile.onSettings = { [weak self, weak storyboard] in
39+ profile.deleteAllSessions = {
40− let vc = storyboard?.instantiateViewController(withIdentifier: "SettingsViewController") as! SettingsViewController
40+ Model.deactivateAll() {
41− self?.navigationController?.pushViewController(vc, animated: true)
41+ [weak self] in
42+
43+ DataStorage.standard.setIsLoggedIn(value: false, with: 0)
44+ self?.didEndSession?()
45+ }
42 }
46 }
43
47
44− profile.onChannelsListToAddAPerson = { [weak self, weak storyboard] (user) in
48+ profile.onSettings = { [weak self, weak storyboard, weak profile] in
49+
45− let vc = storyboard?.instantiateViewController(withIdentifier: simplifiedChannelsList) as! SimplifiedChannelsList
50+ let vc = storyboard?.instantiateViewController(withIdentifier: "RegisterTableViewController") as! RegisterTableViewController
46− vc.user = user
51+ vc.delegate = profile
52+ vc.userActive = profile?.user
47
53
48− let transition = CATransition()
49− transition.duration = 0.5
50− transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
51− transition.type = CATransitionType.moveIn
52− transition.subtype = CATransitionSubtype.fromTop
53− self?.navigationController?.view.layer.add(transition, forKey: nil)
54− self?.navigationController?.pushViewController(vc, animated: false)
54+ self?.navigationController?.pushViewController(vc, animated: true)
55 }
55 }
56+
57+
56 navigationController?.setViewControllers([profile], animated: false)
58 navigationController?.setViewControllers([profile], animated: false)
57 }
59 }
58}
60}
GDproject/Controller/Log In/RegisterTableViewController.swift+53−11
@@ -11,9 +11,9 @@ import UIKit
11class RegisterTableViewController: UITableViewController, ChosenFactulty
11class RegisterTableViewController: UITableViewController, ChosenFactulty
12{
12{
13
13
14− func presentAlertInvalidData()
14+ func presentAlertInvalidData(message: String)
15 {
15 {
16− let alert = UIAlertController(title: "Invalid data", message: "Some fields are missing. Add more information", preferredStyle: .alert)
16+ let alert = UIAlertController(title: "Invalid data", message: message, preferredStyle: .alert)
17 alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
17 alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
18 self.present(alert, animated: true, completion: nil)
18 self.present(alert, animated: true, completion: nil)
19 }
19 }
@@ -23,37 +23,79 @@ class RegisterTableViewController: UITableViewController, ChosenFactulty
23 tableView.reloadData()
23 tableView.reloadData()
24 }
24 }
25
25
26−
26+ weak var delegate: UpdateUser?
27+
27 var onRegistration: (()->())?
28 var onRegistration: (()->())?
28
29
29 var faculty: Model.Faculty?
30 var faculty: Model.Faculty?
30 var user: Model.NewRegistration = Model.NewRegistration(email: DataStorage.standard.getEmail()!, firstName: nil, middleName: nil, lastName: nil, faculty: nil)
31 var user: Model.NewRegistration = Model.NewRegistration(email: DataStorage.standard.getEmail()!, firstName: nil, middleName: nil, lastName: nil, faculty: nil)
31
32
33+ var userActive: Model.Users? {
34+ didSet {
35+ if let userA = userActive {
36+ user.firstName = userA.firstName
37+ user.middleName = userA.middleName
38+ user.lastName = userA.lastName
39+
40+ faculty = userA.faculty
41+ self.updateUserIfCan = true
42+ tableView.reloadData()
43+ }
44+ }
45+ }
46+
47+ var updateUserIfCan: Bool = false
48+
32 override func viewDidLoad()
49 override func viewDidLoad()
33 {
50 {
34 super.viewDidLoad()
51 super.viewDidLoad()
35
52
53+ navigationItem.largeTitleDisplayMode = .never
36 tableView.keyboardDismissMode = .interactive
54 tableView.keyboardDismissMode = .interactive
37 navigationItem.title = user.email
55 navigationItem.title = user.email
38 navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(endRegistration))
56 navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(endRegistration))
39 }
57 }
40
58
59+
41 @objc func endRegistration()
60 @objc func endRegistration()
42 {
61 {
62+ let fieldsMissing = "Some fields are missing. Add more information"
43 updateUser()
63 updateUser()
44− guard let faculty = faculty else { presentAlertInvalidData(); return }
64+ guard let faculty = faculty else { presentAlertInvalidData(message: fieldsMissing); return }
45
65
46 user.faculty = faculty.url
66 user.faculty = faculty.url
47
67
48− guard let _ = user.firstName else { presentAlertInvalidData(); return }
68+ guard let name = user.firstName else { presentAlertInvalidData(message: fieldsMissing); return }
49− guard let _ = user.middleName else { presentAlertInvalidData(); return }
69+ guard let middle = user.middleName else { presentAlertInvalidData(message: fieldsMissing); return }
50− guard let _ = user.lastName else { presentAlertInvalidData(); return }
70+ guard let last = user.lastName else { presentAlertInvalidData(message: fieldsMissing); return }
51
71
72+ if updateUserIfCan {
73+ guard let delegate = delegate else { return }
74+ guard var userA = userActive else { return }
75+
76+ // updating current
77+ userA.firstName = name
78+ userA.faculty = faculty
79+ userA.middleName = middle
80+ userA.lastName = last
81+
82+ Model.userUpdate(with: user) { [weak self] in
83+
84+ if $0 {
85+ delegate.updateUserObj(with: userA)
86+ self?.navigationController?.popViewController(animated: true)
87+ } else {
88+ self?.presentAlertInvalidData(message: "Something went wrong! Try again")
89+ }
90+
91+ }
92+ } else {
93+
52− Model.register(object: user)
94+ Model.register(object: user)
53− { [weak self] in
95+ { [weak self] in
54− self?.onRegistration?()
96+ self?.onRegistration?()
97+ }
55 }
98 }
56−
57 }
99 }
58 // MARK: - Table view data source
100 // MARK: - Table view data source
59
101
GDproject/Controller/Messages/ChatInfoViewController.swift+25−4
@@ -91,10 +91,12 @@ class ChatInfoViewController: UITableViewController {
91 switch indexPath.section {
91 switch indexPath.section {
92 case 0:
92 case 0:
93 cell.textLabel?.text = groupChat!.name
93 cell.textLabel?.text = groupChat!.name
94+ cell.selectionStyle = .none
94 return cell
95 return cell
95 case 1:
96 case 1:
96 cell.textLabel?.text = "Leave chat"
97 cell.textLabel?.text = "Leave chat"
97 cell.textLabel?.textColor = #colorLiteral(red: 1, green: 0.1491314173, blue: 0, alpha: 1)
98 cell.textLabel?.textColor = #colorLiteral(red: 1, green: 0.1491314173, blue: 0, alpha: 1)
99+ cell.selectionStyle = .none
98 return cell
100 return cell
99 default:
101 default:
100 switch myPermissions{
102 switch myPermissions{
@@ -104,6 +106,7 @@ class ChatInfoViewController: UITableViewController {
104 case .ordinary:
106 case .ordinary:
105 cell.textLabel?.text = name(for: users[usersArray[indexPath.row]])
107 cell.textLabel?.text = name(for: users[usersArray[indexPath.row]])
106 }
108 }
109+ cell.selectionStyle = .none
107 return cell
110 return cell
108 }
111 }
109 }
112 }
@@ -114,7 +117,7 @@ class ChatInfoViewController: UITableViewController {
114 case .ordinary:
117 case .ordinary:
115 cell.textLabel?.text = name(for: users[usersArray[indexPath.row]])
118 cell.textLabel?.text = name(for: users[usersArray[indexPath.row]])
116 }
119 }
117−
120+ cell.selectionStyle = .none
118 return cell
121 return cell
119 }
122 }
120
123
@@ -143,9 +146,9 @@ class ChatInfoViewController: UITableViewController {
143
146
144
147
145 func editName(for cell: UITableViewCell){
148 func editName(for cell: UITableViewCell){
146− let alert = UIAlertController(title: "Вы уверены?", message: "Название:", preferredStyle: .alert)
149+ let alert = UIAlertController(title: "Are you sure?", message: "Title:", preferredStyle: .alert)
147
150
148− let action1 = UIAlertAction(title: "Oтмена", style: .cancel, handler: nil)
151+ let action1 = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
149
152
150 alert.addTextField { [weak self] (tf) in
153 alert.addTextField { [weak self] (tf) in
151 tf.textColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)
154 tf.textColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)
@@ -194,10 +197,28 @@ class ChatInfoViewController: UITableViewController {
194 case .admin:
197 case .admin:
195 showUserChoiceVC()
198 showUserChoiceVC()
196 default:
199 default:
197− break
200+ showParticipantPage(with: usersArray[indexPath.row])
198 }
201 }
199 }
202 }
200 }
203 }
204+
205+
206+ if indexPath.section == 2 && indexPath.row != 0 {
207+ switch myPermissions{
208+ case .admin:
209+ showParticipantPage(with: usersArray[indexPath.row-1])
210+ default:
211+ showParticipantPage(with: usersArray[indexPath.row])
212+ }
213+ }
214+ }
215+
216+ var onUserDiplay: ((Int)->())?
217+
218+ func showParticipantPage(with user: Int?) {
219+ if let user = user {
220+ onUserDiplay?(user)
221+ }
201 }
222 }
202
223
203 func showUserChoiceVC()
224 func showUserChoiceVC()
GDproject/Controller/Messages/Dialog/DialogViewController.swift+17−7
@@ -61,7 +61,9 @@ class DialogViewController: UIViewController, UpdatableGroup, UITableViewDelegat
61
61
62 self.tableView.delegate = self
62 self.tableView.delegate = self
63 self.tableView.dataSource = self
63 self.tableView.dataSource = self
64−
64+
65+ tableView.setContentOffset(CGPoint(x: 0, y: 50), animated: false)
66+
65 navigationItem.largeTitleDisplayMode = .never
67 navigationItem.largeTitleDisplayMode = .never
66
68
67 tableView.keyboardDismissMode = .onDrag
69 tableView.keyboardDismissMode = .onDrag
@@ -114,6 +116,7 @@ class DialogViewController: UIViewController, UpdatableGroup, UITableViewDelegat
114 let button = UIButton()
116 let button = UIButton()
115 button.setTitle("Send", for: .normal)
117 button.setTitle("Send", for: .normal)
116 button.setTitleColor(.blue, for: .normal)
118 button.setTitleColor(.blue, for: .normal)
119+ button.titleLabel?.font = UIFont.systemFont(ofSize: 17, weight: .semibold)
117 button.addTarget(self, action: #selector(sendMessage), for: .touchUpInside)
120 button.addTarget(self, action: #selector(sendMessage), for: .touchUpInside)
118 return button
121 return button
119 }()
122 }()
@@ -132,8 +135,13 @@ class DialogViewController: UIViewController, UpdatableGroup, UITableViewDelegat
132 {
135 {
133 Model.sendMessage(message: Model.SendMessage(body: Model.Attachments(markdown: messageTextView.text), destination: destination)) { [unowned self] in
136 Model.sendMessage(message: Model.SendMessage(body: Model.Attachments(markdown: messageTextView.text), destination: destination)) { [unowned self] in
134
137
138+ switch $0 {
139+ case .success, .success1:
135− self.getMessagesNew(for: self.dialog!)
140+ self.getMessagesNew(for: self.dialog!)
136− self.messageTextView.text = ""
141+ self.messageTextView.text = ""
142+ default:
143+ self.showAlertOn(result: $0)
144+ }
137 }
145 }
138
146
139 prevLast = -1
147 prevLast = -1
@@ -158,7 +166,7 @@ class DialogViewController: UIViewController, UpdatableGroup, UITableViewDelegat
158
166
159 messageSendView.edgesToSuperview(excluding: [.top,.bottom])
167 messageSendView.edgesToSuperview(excluding: [.top,.bottom])
160
168
161− bottomConstraint = NSLayoutConstraint(item: messageSendView, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0)
169+ bottomConstraint = NSLayoutConstraint(item: messageSendView, attribute: .bottom, relatedBy: .equal, toItem: self.view.safeAreaLayoutGuide, attribute: .bottom, multiplier: 1, constant: 0)
162 view.addConstraint(bottomConstraint)
170 view.addConstraint(bottomConstraint)
163
171
164 messageSendView.height(60)
172 messageSendView.height(60)
@@ -191,7 +199,7 @@ class DialogViewController: UIViewController, UpdatableGroup, UITableViewDelegat
191
199
192 let keyBoardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
200 let keyBoardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
193
201
194− bottomConstraint.constant = notification.name == UIResponder.keyboardWillShowNotification ? -(keyBoardFrame.height) : 0
202+ bottomConstraint.constant = notification.name == UIResponder.keyboardWillShowNotification ? -(keyBoardFrame.height) + self.view.safeAreaInsets.bottom : 0
195
203
196 UIView.animate(withDuration: 0, delay: 0, options: .curveEaseOut, animations: {
204 UIView.animate(withDuration: 0, delay: 0, options: .curveEaseOut, animations: {
197 self.view.layoutIfNeeded()
205 self.view.layoutIfNeeded()
@@ -223,6 +231,7 @@ class DialogViewController: UIViewController, UpdatableGroup, UITableViewDelegat
223
231
224 vc.delegate = self
232 vc.delegate = self
225 vc.users = users!
233 vc.users = users!
234+ vc.onUserDiplay = onUserDisplay
226
235
227 if let groupChat = groupChat {
236 if let groupChat = groupChat {
228 vc.groupChat = groupChat.group
237 vc.groupChat = groupChat.group
@@ -248,7 +257,8 @@ class DialogViewController: UIViewController, UpdatableGroup, UITableViewDelegat
248 return cellData.count
257 return cellData.count
249 }
258 }
250
259
251− override func viewWillAppear(_ animated: Bool) {
260+ override func viewWillAppear(_ animated: Bool)
261+ {
252 super.viewWillAppear(animated)
262 super.viewWillAppear(animated)
253 tabBarController?.tabBar.isHidden = true
263 tabBarController?.tabBar.isHidden = true
254
264
@@ -313,7 +323,7 @@ class DialogViewController: UIViewController, UpdatableGroup, UITableViewDelegat
313 var canBePaginated = false
323 var canBePaginated = false
314 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
324 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
315 {
325 {
316− if indexPath.row == cellData.count - 1 && prevLast != indexPath.row && canBePaginated
326+ if indexPath.row == cellData.count - 1 && prevLast != indexPath.row && canBePaginated && cellData.count >= 24
317 {
327 {
318 print("exclusiveFrom \(currentMessagesInChat.last?.id ?? 0)")
328 print("exclusiveFrom \(currentMessagesInChat.last?.id ?? 0)")
319 if let dialog = dialog
329 if let dialog = dialog
GDproject/Controller/Messages/MessageViewCell.swiftnew file+38
@@ -0,0 +1,38 @@
1+//
2+// MessageViewCell.swift
3+// GDproject
4+//
5+// Created by cstore on 13/05/2019.
6+// Copyright © 2019 drHSE. All rights reserved.
7+//
8+
9+import UIKit
10+
11+class MessageViewCell: UITableViewCell {
12+
13+ @IBOutlet weak var dialogName: UILabel!
14+
15+ @IBOutlet weak var lastMessagePreview: UILabel!
16+
17+ @IBOutlet weak var dateLabel: UILabel!
18+
19+ override func awakeFromNib() {
20+ super.awakeFromNib()
21+ // Initialization code
22+ }
23+
24+ func fill(with dialog: Model.Dialog, user: Model.Users? = nil)
25+ {
26+ switch dialog {
27+
28+ case .groupChat(let group):
29+ dialogName.text = group.group.name
30+ lastMessagePreview.text = group.lastMessage?.body.markdown
31+ dateLabel.text = group.lastMessage?.time.getDate()
32+ case .userChat(let userChat):
33+ dialogName.text = "👤 \(user!.fullName())"
34+ lastMessagePreview.text = userChat.lastMessage?.body.markdown
35+ dateLabel.text = userChat.lastMessage?.time.getDate()
36+ }
37+ }
38+}
GDproject/Controller/Messages/MessagesViewController.swift+107−12
@@ -8,8 +8,44 @@
8
8
9import UIKit
9import UIKit
10
10
11−class MessagesViewController: UITableViewController {
11+protocol SelectableDialog: class {
12+ func openDialog(with dialog: Model.Dialog)
13+}
12
14
15+class MessagesViewController: UITableViewController, UISearchControllerDelegate, UISearchResultsUpdating, SelectableDialog {
16+
17+ func openDialog(with dialog: Model.Dialog) {
18+ onDialogDisplay?((dialog, users))
19+ }
20+
21+ func updateSearchResults(for searchController: UISearchController) {
22+
23+ let filteredData = currentActiveDialogs
24+ let inputText = searchController.searchBar.text ?? ""
25+
26+ let filteredResults = filteredData.filter {
27+
28+ switch $0 {
29+ case .groupChat(let gropuChat):
30+ return gropuChat.group.name.contains(inputText)
31+
32+ case .userChat(let userChat):
33+ let user = users[userChat.user]
34+ guard let u = user else { return false }
35+ return u.fullName().contains(inputText)
36+
37+ }
38+
39+ }
40+
41+ // Apply the filtered results to the search results table.
42+ if let resultsController = searchController.searchResultsController as? SuggestedDialogsTableViewController {
43+ resultsController.users = users
44+ resultsController.currentDialogs = filteredResults
45+ resultsController.tableView.reloadData()
46+ }
47+ }
48+
13 // curreent Active which can be displayed
49 // curreent Active which can be displayed
14 var currentActiveDialogs: [Model.Dialog] = [] {
50 var currentActiveDialogs: [Model.Dialog] = [] {
15 didSet {
51 didSet {
@@ -17,6 +53,17 @@ class MessagesViewController: UITableViewController {
17 }
53 }
18 }
54 }
19
55
56+ func setUpSearchContr(){
57+
58+ searchController?.delegate = self
59+ searchController?.obscuresBackgroundDuringPresentation = true
60+ navigationItem.searchController = searchController
61+ definesPresentationContext = true
62+ searchController?.searchResultsUpdater = self
63+ searchController?.searchBar.placeholder = "Search dialogs"
64+
65+ }
66+
20 // curreent users
67 // curreent users
21 var users: [Int: Model.Users] = [:]
68 var users: [Int: Model.Users] = [:]
22
69
@@ -24,17 +71,22 @@ class MessagesViewController: UITableViewController {
24
71
25 var onDialogDisplay: (((dialog: Model.Dialog, users: [Int:Model.Users]))->())?
72 var onDialogDisplay: (((dialog: Model.Dialog, users: [Int:Model.Users]))->())?
26
73
27− let searchC = UISearchController(searchResultsController: nil)
74+ var searchController: UISearchController?
28
75
29 override func viewDidLoad() {
76 override func viewDidLoad() {
30 super.viewDidLoad()
77 super.viewDidLoad()
31−
78+
79+ let updater = SuggestedDialogsTableViewController()
80+
81+ updater.delegate = self
82+ searchController = UISearchController(searchResultsController: updater)
83+
32 // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
84 // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
33 self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Write", style: .plain, target: self, action: #selector(choosePerson))
85 self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Write", style: .plain, target: self, action: #selector(choosePerson))
34
86
35 self.navigationItem.title = "Messages"
87 self.navigationItem.title = "Messages"
36 // self.navigationItem.largeTitleDisplayMode = .always
88 // self.navigationItem.largeTitleDisplayMode = .always
37− self.navigationItem.searchController = searchC
89+ setUpSearchContr()
38 navigationController?.navigationBar.prefersLargeTitles = true
90 navigationController?.navigationBar.prefersLargeTitles = true
39 self.navigationItem.hidesSearchBarWhenScrolling = false
91 self.navigationItem.hidesSearchBarWhenScrolling = false
40 }
92 }
@@ -64,18 +116,15 @@ class MessagesViewController: UITableViewController {
64
116
65 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
117 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
66 {
118 {
67− let cell = tableView.dequeueReusableCell(withIdentifier: "MessagesCell", for: indexPath)
119+ let cell = tableView.dequeueReusableCell(withIdentifier: "MessageViewCell", for: indexPath) as! MessageViewCell
68
120
69 switch currentActiveDialogs[indexPath.row].self {
121 switch currentActiveDialogs[indexPath.row].self {
70−
71− case .groupChat(let group):
122+ case .groupChat:
72− cell.textLabel?.text = group.group.name
123+ cell.fill(with: currentActiveDialogs[indexPath.row])
73− cell.detailTextLabel?.text = group.lastMessage!.body.markdown
74 case .userChat(let userChat):
124 case .userChat(let userChat):
75− cell.textLabel?.text = "👤 \(users[userChat.user]!.fullName())"
125+ cell.fill(with: currentActiveDialogs[indexPath.row], user: users[userChat.user])
76− cell.detailTextLabel?.text = userChat.lastMessage!.body.markdown
77 }
126 }
78−
127+
79 return cell
128 return cell
80 }
129 }
81
130
@@ -84,3 +133,49 @@ class MessagesViewController: UITableViewController {
84 onDialogDisplay?(tuple)
133 onDialogDisplay?(tuple)
85 }
134 }
86}
135}
136+
137+
138+class SuggestedDialogsTableViewController: UITableViewController {
139+
140+ var idCell = "cell"
141+
142+ var users: [Int: Model.Users] = [:]
143+
144+ weak var delegate: SelectableDialog?
145+
146+ var currentDialogs: [Model.Dialog] = []
147+
148+ override func viewDidLoad() {
149+ super.viewDidLoad()
150+ tableView.register(UITableViewCell.self, forCellReuseIdentifier: idCell)
151+ tableView.reloadData()
152+ }
153+
154+ override func numberOfSections(in tableView: UITableView) -> Int {
155+ return 1
156+ }
157+
158+ override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
159+ return currentDialogs.count
160+ }
161+
162+ override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
163+ {
164+ let cell = tableView.dequeueReusableCell(withIdentifier: idCell, for: indexPath)
165+
166+ switch currentDialogs[indexPath.row] {
167+ case .groupChat(let groupChat):
168+ cell.textLabel?.text = groupChat.group.name
169+ case .userChat(let userChat):
170+ cell.textLabel?.text = users[userChat.user]?.fullName()
171+ }
172+
173+ cell.accessoryType = .disclosureIndicator
174+ return cell
175+ }
176+
177+ override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
178+ delegate?.openDialog(with: currentDialogs[indexPath.row])
179+ // self.dismiss(animated: true)
180+ }
181+}
GDproject/Controller/Messages/PeopleToWriteViewController.swift−1
@@ -53,7 +53,6 @@ class PeopleToWriteViewController: UITableViewController {
53 let cell = tableView.dequeueReusableCell(withIdentifier: "peopleToWriteCell", for: indexPath)
53 let cell = tableView.dequeueReusableCell(withIdentifier: "peopleToWriteCell", for: indexPath)
54
54
55 cell.textLabel?.text = users[indexPath.row].fullName()
55 cell.textLabel?.text = users[indexPath.row].fullName()
56− cell.detailTextLabel?.text = "\(users[indexPath.row].id)"
57
56
58 return cell
57 return cell
59 }
58 }
GDproject/Controller/Profile/BasicInfoController.swift+16−11
@@ -16,17 +16,20 @@ struct CellData{
16
16
17class BasicInfoController: UIViewController, UITableViewDelegate, UITableViewDataSource {
17class BasicInfoController: UIViewController, UITableViewDelegate, UITableViewDataSource {
18
18
19− var dataSourse: [CellData] = [
19+ var userInfo: Model.Users? {
20− CellData(opened: false, title: "Phone", sectionData: ["+7 901 733 01 79"]),
20+ didSet {
21+ if let userInfo = userInfo {
21− CellData(opened: false, title: "Mail", sectionData: ["vbogomazova@edu.hse.ru"]),
22+ dataSourse = [CellData(opened: false, title: "Contacts", sectionData: [userInfo.email, userInfo.faculty.address]),
22− CellData(opened: false, title: "Research ID", sectionData: ["4567834336789456737"]),
23+ CellData(opened: false, title: "Faculty", sectionData: [userInfo.faculty.campusName, userInfo.faculty.name, userInfo.faculty.address, userInfo.faculty.path]),
23− CellData(opened: false, title: "Published", sectionData: ["Это будет очень длинное название книги 1, чтобы сделать проверку", "Книга 2", "Книга 3"]),
24− CellData(opened: false, title: "Courses", sectionData: ["Курс 1", "Курс 2"]),
24+ CellData(opened: false, title: "Interests", sectionData: userInfo.faculty.tags)]
25− CellData(opened: false, title: "Link", sectionData: ["https://wwww.hse.ru"])
25+ }
26− ]
26+ }
27+ }
28+
29+ var dataSourse: [CellData] = [ ]
27
30
28 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
31 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
29− if (dataSourse[section].opened){
32+ if (dataSourse[section].opened) {
30 return dataSourse[section].sectionData.count + 1
33 return dataSourse[section].sectionData.count + 1
31 } else {
34 } else {
32 return 1
35 return 1
@@ -45,8 +48,10 @@ class BasicInfoController: UIViewController, UITableViewDelegate, UITableViewDat
45 cell.selectionStyle = .none
48 cell.selectionStyle = .none
46 return cell
49 return cell
47 } else {
50 } else {
48− let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
51+ let cell = tableView.dequeueReusableCell(withIdentifier: infoCellId, for: indexPath) as! InfoCell
49− cell.textLabel?.text = dataSourse[indexPath.section].sectionData[indexPath.row - 1]
52+ cell.fill(title: dataSourse[indexPath.section].sectionData[indexPath.row - 1])
53+ cell.accessoryType = .none
54+ cell.selectionStyle = .none
50 return cell
55 return cell
51 }
56 }
52 }
57 }
GDproject/Controller/Profile/InfoCell.swift+2−1
@@ -16,8 +16,9 @@ class InfoCell: UITableViewCell{
16 label.font = UIFont.systemFont(ofSize: 16)
16 label.font = UIFont.systemFont(ofSize: 16)
17 label.sizeToFit()
17 label.sizeToFit()
18 label.isScrollEnabled = false
18 label.isScrollEnabled = false
19− label.isUserInteractionEnabled = false
19+ // label.isUserInteractionEnabled = false
20 label.isEditable = false
20 label.isEditable = false
21+ label.dataDetectorTypes = .all
21 label.textColor = .black
22 label.textColor = .black
22 return label
23 return label
23 }()
24 }()
GDproject/Controller/Profile/ProfileViewController.swift+87−22
@@ -9,8 +9,17 @@
9import UIKit
9import UIKit
10import TinyConstraints
10import TinyConstraints
11
11
12+protocol UpdateUser: class {
13+ func updateUserObj(with user: Model.Users)
14+}
15+
12−class ProfileViewController: UIViewController
16+class ProfileViewController: UIViewController, UpdateUser
13{
17{
18+ func updateUserObj(with user: Model.Users)
19+ {
20+ self.user = user
21+ Model.Channels.fullPeopleDict[user.id] = user
22+ }
14
23
15 @IBOutlet weak var segmentedControl: UISegmentedControl!
24 @IBOutlet weak var segmentedControl: UISegmentedControl!
16
25
@@ -32,6 +41,8 @@ class ProfileViewController: UIViewController
32
41
33 var logOut: (()->())?
42 var logOut: (()->())?
34
43
44+ var deleteAllSessions: (()->())?
45+
35 var onSettings: (()->())?
46 var onSettings: (()->())?
36
47
37 @IBAction func sendMessage(_ sender: UIButton)
48 @IBAction func sendMessage(_ sender: UIButton)
@@ -46,8 +57,6 @@ class ProfileViewController: UIViewController
46 }
57 }
47 }
58 }
48
59
49− var onChannelsListToAddAPerson: ((Model.Users)->())?
50−
51 var protoDictionary: [String: UIImage] = ["135213": #imageLiteral(resourceName: "9"), "135288": #imageLiteral(resourceName: "5051"), "22723" : #imageLiteral(resourceName: "69"), "135083": #imageLiteral(resourceName: "42")]
60 var protoDictionary: [String: UIImage] = ["135213": #imageLiteral(resourceName: "9"), "135288": #imageLiteral(resourceName: "5051"), "22723" : #imageLiteral(resourceName: "69"), "135083": #imageLiteral(resourceName: "42")]
52
61
53 func fill(with user: Model.Users)
62 func fill(with user: Model.Users)
@@ -106,6 +115,15 @@ class ProfileViewController: UIViewController
106 posts.type = .NONE
115 posts.type = .NONE
107 posts.currChannel = channel
116 posts.currChannel = channel
108
117
118+ posts.onFullPost = {
119+ [weak self] (type,post) in
120+
121+ let vc = self?.storyboard?.instantiateViewController(withIdentifier: fullPostControllerId) as! FullPostController
122+ vc.type = type
123+ vc.post = post
124+ self?.navigationController!.pushViewController(vc, animated: true)
125+ }
126+
109 tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
127 tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
110
128
111 tableView.register(PostViewCell.self, forCellReuseIdentifier: postCellId)
129 tableView.register(PostViewCell.self, forCellReuseIdentifier: postCellId)
@@ -141,7 +159,7 @@ class ProfileViewController: UIViewController
141 }
159 }
142
160
143 func setUpNavigarionBar(){
161 func setUpNavigarionBar(){
144− navigationController?.navigationBar.prefersLargeTitles = true
162+ // navigationController?.navigationBar.prefersLargeTitles = true
145 let uibarbutton = UIBarButtonItem(title: "More", style: .plain, target: self, action: #selector(showInformation))
163 let uibarbutton = UIBarButtonItem(title: "More", style: .plain, target: self, action: #selector(showInformation))
146 navigationItem.rightBarButtonItems = [uibarbutton]
164 navigationItem.rightBarButtonItems = [uibarbutton]
147 navigationItem.largeTitleDisplayMode = .always
165 navigationItem.largeTitleDisplayMode = .always
@@ -151,29 +169,75 @@ class ProfileViewController: UIViewController
151
169
152 let optionMenu = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
170 let optionMenu = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
153
171
154− let channelAction = UIAlertAction(title: "Add to a channel", style: .default){
172+
155− [weak self] (_) in
156− self?.onChannelsListToAddAPerson?(self!.user!)
157− }
158−
159− let settingsAction = UIAlertAction(title: "Setting", style: .default)
160− { [weak self] (_) in
161− self?.onSettings?()
162− }
163−
164 let cancelAction = UIAlertAction(title: "Cancel", style: .cancel)
173 let cancelAction = UIAlertAction(title: "Cancel", style: .cancel)
165
174
175+
176+ if idProfile == DataStorage.standard.getUserId() {
166− let logoutAction = UIAlertAction(title: "Log out", style: .destructive)
177+ let logoutAction = UIAlertAction(title: "Log out", style: .destructive)
167− { [weak self]
178+ { [weak self] (_) in
179+
180+ if let logOut = self?.logOut {
181+ logOut()
182+ } else {
183+ Model.logout() {
184+ DataStorage.standard.setIsLoggedIn(value: false, with: 0)
185+ (UIApplication.shared.delegate as! AppDelegate).relaunch()
186+ }
187+ }
188+ }
189+
190+ let deleetAllSessionsAction = UIAlertAction(title: "Delete all sessions", style: .destructive)
191+ { [weak self] _ in
192+
193+ if let delete = self?.deleteAllSessions {
194+ delete()
195+ } else {
196+ Model.deactivateAll() {
197+ DataStorage.standard.setIsLoggedIn(value: false, with: 0)
198+ (UIApplication.shared.delegate as! AppDelegate).relaunch()
199+ }
200+ }
201+ }
202+
203+ let settingsAction = UIAlertAction(title: "Edit profile", style: .default)
168− (_) in
204+ { [weak self] (_) in
169− self?.logOut?()
205+
206+ if let settings = self?.onSettings{
207+ settings()
208+ } else {
209+ let vc = self?.storyboard?.instantiateViewController(withIdentifier: "RegisterTableViewController") as! RegisterTableViewController
210+ vc.delegate = self
211+ vc.userActive = self?.user
212+
213+ self?.navigationController?.pushViewController(vc, animated: true)
214+ }
215+ }
216+
217+ optionMenu.addAction(settingsAction)
218+ optionMenu.addAction(logoutAction)
219+ optionMenu.addAction(deleetAllSessionsAction)
220+ } else {
221+ let channelAction = UIAlertAction(title: "Add to a channel", style: .default)
222+ {
223+ [weak self] (_) in
224+
225+ let vc = self?.storyboard?.instantiateViewController(withIdentifier: simplifiedChannelsList) as! SimplifiedChannelsList
226+ vc.user = self?.user
227+
228+ let transition = CATransition()
229+ transition.duration = 0.5
230+ transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
231+ transition.type = CATransitionType.moveIn
232+ transition.subtype = CATransitionSubtype.fromTop
233+ self?.navigationController?.view.layer.add(transition, forKey: nil)
234+ self?.navigationController?.pushViewController(vc, animated: false)
235+ }
236+
237+ optionMenu.addAction(channelAction)
170 }
238 }
171
239
172− optionMenu.addAction(channelAction)
173− optionMenu.addAction(settingsAction)
174− optionMenu.addAction(logoutAction)
175 optionMenu.addAction(cancelAction)
240 optionMenu.addAction(cancelAction)
176−
177 self.present(optionMenu, animated: true, completion: nil)
241 self.present(optionMenu, animated: true, completion: nil)
178 }
242 }
179
243
@@ -203,6 +267,7 @@ class ProfileViewController: UIViewController
203 func changeToBasicInfo(){
267 func changeToBasicInfo(){
204 tableView.delegate = basicInfo
268 tableView.delegate = basicInfo
205 tableView.dataSource = basicInfo
269 tableView.dataSource = basicInfo
270+ basicInfo.userInfo = self.user
206 tableView.reloadData()
271 tableView.reloadData()
207 }
272 }
208}
273}
GDproject/Extentions.swift+30
@@ -77,3 +77,33 @@ extension String {
77 return timeStamp
77 return timeStamp
78 }
78 }
79}
79}
80+
81+extension UIViewController {
82+ func showAlertOn(result: ResultR) {
83+
84+ let message: String
85+
86+ switch result {
87+ case .impossibleContent:
88+ message = "Impossible content"
89+ case .exceededContent:
90+ message = "The content exceeded"
91+ case .longContent:
92+ message = "The content is too long"
93+ case .badAccess:
94+ message = "Try reloading the page again"
95+ case .alreadyRegistered:
96+ message = "User is already registered"
97+ case .tooMuchToAdd:
98+ message = "Limit of channels exceeded"
99+ case .success, .success1:
100+ return
101+ default:
102+ message = "Something went wrong"
103+ }
104+
105+ let alert = UIAlertController(title: "Error", message: message, preferredStyle: .alert)
106+ alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
107+ self.present(alert, animated: true, completion: nil)
108+ }
109+}
GDproject/Simple model/Model.swift+79−13
@@ -10,6 +10,22 @@ import Foundation
10import UIKit
10import UIKit
11import Alamofire
11import Alamofire
12
12
13+enum ResultR: Int {
14+ case internalServerError = 500
15+ case exceededContent = 470
16+ case longContent = 471
17+ case incorrectContent = 472
18+ case impossibleContent = 473
19+ case invalidTocken = 498
20+ case alreadyRegistered = 409
21+ case invalidCode = 403
22+ case badAccess = 400
23+ case tooMuchToAdd = 406
24+ case notFound = 404
25+ case success1 = 204
26+ case success = 200
27+}
28+
13class Model{
29class Model{
14
30
15 static let invalidTocken = 498
31 static let invalidTocken = 498
@@ -17,7 +33,7 @@ class Model{
17 static var hashTagTree: CompletionTree?
33 static var hashTagTree: CompletionTree?
18
34
19 private static var isValidTocken: ((Int)->())? = { responce in
35 private static var isValidTocken: ((Int)->())? = { responce in
20−
36+ print(responce)
21 if responce == invalidTocken {
37 if responce == invalidTocken {
22
38
23 DataStorage.standard.setIsLoggedIn(value: false, with: 0)
39 DataStorage.standard.setIsLoggedIn(value: false, with: 0)
@@ -33,6 +49,7 @@ class Model{
33 static let decoder = JSONDecoder()
49 static let decoder = JSONDecoder()
34
50
35 static let authMeURL = URL(string: "\(baseUrl)/authentication/me")!
51 static let authMeURL = URL(string: "\(baseUrl)/authentication/me")!
52+ static let deactivateURL = URL(string: "\(baseUrl)/deactivateAll")!
36 static let registerMeURL = URL(string: "\(baseUrl)/authentication/register")!
53 static let registerMeURL = URL(string: "\(baseUrl)/authentication/register")!
37 static let authVerifyURL = URL(string: "\(baseUrl)/authentication/verify")!
54 static let authVerifyURL = URL(string: "\(baseUrl)/authentication/verify")!
38 static let authenticationURL = URL(string:"\(baseUrl)/authentication/login")!
55 static let authenticationURL = URL(string:"\(baseUrl)/authentication/login")!
@@ -42,6 +59,7 @@ class Model{
42 static let postsPublishURL = URL(string:"\(baseUrl)/posts/publish")!
59 static let postsPublishURL = URL(string:"\(baseUrl)/posts/publish")!
43 static let usersURL = URL(string:"\(baseUrl)/users")!
60 static let usersURL = URL(string:"\(baseUrl)/users")!
44 static let usersAllURL = URL(string:"\(baseUrl)/users/all")!
61 static let usersAllURL = URL(string:"\(baseUrl)/users/all")!
62+ static let usersUpdateURL = URL(string:"\(baseUrl)/users/update")!
45 static let channelsGetURL = URL(string: "\(baseUrl)/channels/get")!
63 static let channelsGetURL = URL(string: "\(baseUrl)/channels/get")!
46 static let channelsUpdateURL = URL(string: "\(baseUrl)/channels/update")!
64 static let channelsUpdateURL = URL(string: "\(baseUrl)/channels/update")!
47 static let channelsListURL = URL(string: "\(baseUrl)/channels")!
65 static let channelsListURL = URL(string: "\(baseUrl)/channels")!
@@ -251,15 +269,13 @@ class Model{
251 }
269 }
252
270
253 if code == 204 {
271 if code == 204 {
254− let fields = responce.response?.allHeaderFields as? [String :String]
255
272
273+ let fields = responce.response?.allHeaderFields as? [String :String]
256 let cookies = HTTPCookie.cookies(withResponseHeaderFields: fields!, for: responce.response!.url!)
274 let cookies = HTTPCookie.cookies(withResponseHeaderFields: fields!, for: responce.response!.url!)
257−
258 HTTPCookieStorage.shared.setCookie(cookies[0])
275 HTTPCookieStorage.shared.setCookie(cookies[0])
259
276
260 completion()
277 completion()
261 }
278 }
262−
263 }
279 }
264 }
280 }
265
281
@@ -411,7 +427,7 @@ class Model{
411 }
427 }
412
428
413
429
414− static func createAndPublish(body: [Attachments], tags: [String]){
430+ static func createAndPublish(body: [Attachments], tags: [String], completion: @escaping ((ResultR)->())){
415 let jsonUpd = CreatedPost(body: body, tags: tags)
431 let jsonUpd = CreatedPost(body: body, tags: tags)
416 var request = URLRequest(url: postsPublishURL)
432 var request = URLRequest(url: postsPublishURL)
417
433
@@ -429,6 +445,14 @@ class Model{
429 if let code = response.response?.statusCode, code == 498 {
445 if let code = response.response?.statusCode, code == 498 {
430 return
446 return
431 }
447 }
448+
449+ if let code = response.response?.statusCode,
450+ let result = ResultR(rawValue: code)
451+ {
452+ completion(result)
453+ } else {
454+ completion(.internalServerError)
455+ }
432 }
456 }
433 }
457 }
434
458
@@ -470,7 +494,7 @@ class Model{
470
494
471 static func getUsers(for ids: [Int], completion: @escaping (([Int:Users])->())){
495 static func getUsers(for ids: [Int], completion: @escaping (([Int:Users])->())){
472 let json = "\(Set(ids))"
496 let json = "\(Set(ids))"
473− print(json)
497+
474 var request = URLRequest(url: usersURL)
498 var request = URLRequest(url: usersURL)
475
499
476 request.httpMethod = "POST"
500 request.httpMethod = "POST"
@@ -534,7 +558,7 @@ class Model{
534 }
558 }
535
559
536
560
537− static func createChannel(with channel: Channels) {
561+ static func createChannel(with channel: Channels, completion: @escaping ((ResultR)->())) {
538
562
539 var request = URLRequest(url: channelsCreateURL)
563 var request = URLRequest(url: channelsCreateURL)
540 request.httpMethod = "POST"
564 request.httpMethod = "POST"
@@ -545,9 +569,13 @@ class Model{
545 (response) in
569 (response) in
546
570
547 isValidTocken?(response.response?.statusCode ?? 498)
571 isValidTocken?(response.response?.statusCode ?? 498)
572+
548− if let code = response.response?.statusCode, code == 498 {
573+ if let code = response.response?.statusCode, let result = ResultR(rawValue: code) {
574+ completion(result)
549 return
575 return
550 }
576 }
577+
578+ completion(ResultR.internalServerError)
551 }
579 }
552
580
553 }
581 }
@@ -709,8 +737,6 @@ class Model{
709 guard let json = response.data else { return }
737 guard let json = response.data else { return }
710
738
711 guard let newQueery = try? decoder.decode(QueryPosts<Posts>.self, from: json) else { return }
739 guard let newQueery = try? decoder.decode(QueryPosts<Posts>.self, from: json) else { return }
712−
713− print("\(anonymousChannel) \(newQueery)")
714 completion((newQueery.users, newQueery.response))
740 completion((newQueery.users, newQueery.response))
715 }
741 }
716 }
742 }
@@ -927,7 +953,7 @@ class Model{
927 }
953 }
928 }
954 }
929
955
930− static func getMessagesFor(typeOfChat: Model.Dialog, chat id: Int, exclusiveFrom: Int? = nil, limit l: Int = 10, direction: String = "backward", completion: @escaping (([LastMessage])->()))
956+ static func getMessagesFor(typeOfChat: Model.Dialog, chat id: Int, exclusiveFrom: Int? = nil, limit l: Int = 25, direction: String = "backward", completion: @escaping (([LastMessage])->()))
931 {
957 {
932 let req = GeneralRequest<Int>(direction: direction, limit: l, exclusiveFrom: exclusiveFrom, request: id)
958 let req = GeneralRequest<Int>(direction: direction, limit: l, exclusiveFrom: exclusiveFrom, request: id)
933 var request: URLRequest?
959 var request: URLRequest?
@@ -1030,7 +1056,7 @@ class Model{
1030 }
1056 }
1031 }
1057 }
1032
1058
1033− static func sendMessage(message: SendMessage, completion: @escaping (()->())){
1059+ static func sendMessage(message: SendMessage, completion: @escaping ((ResultR)->())){
1034
1060
1035 var request = URLRequest(url: messagesSendURL)
1061 var request = URLRequest(url: messagesSendURL)
1036 request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
1062 request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
@@ -1044,7 +1070,11 @@ class Model{
1044 return
1070 return
1045 }
1071 }
1046
1072
1073+ if let result = ResultR(rawValue: response.response!.statusCode){
1074+ completion(result)
1075+ } else {
1047− completion()
1076+ completion(.internalServerError)
1077+ }
1048 }
1078 }
1049 }
1079 }
1050
1080
@@ -1081,4 +1111,40 @@ class Model{
1081 completion(faculties)
1111 completion(faculties)
1082 }
1112 }
1083 }
1113 }
1114+
1115+ static func userUpdate(with newUser: NewRegistration, completion: @escaping ((Bool)->())) {
1116+ var request = URLRequest(url: usersUpdateURL)
1117+ request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
1118+ request.httpMethod = "POST"
1119+ request.httpBody = try? JSONEncoder().encode(newUser)
1120+
1121+ AF.request(request).response { (response) in
1122+ isValidTocken?(response.response?.statusCode ?? 498)
1123+
1124+ if let code = response.response?.statusCode, code == 498 {
1125+ return
1126+ }
1127+
1128+ if let code = response.response?.statusCode, code != 204{
1129+ completion (false)
1130+ } else {
1131+ completion(true)
1132+ }
1133+ }
1134+ }
1135+
1136+ static func deactivateAll(completion: @escaping (()->())){
1137+ var request = URLRequest(url: deactivateURL)
1138+ request.httpMethod = "DELETE"
1139+
1140+ AF.request(request).response { (responce) in
1141+ isValidTocken?(responce.response?.statusCode ?? 498)
1142+
1143+ if let code = responce.response?.statusCode, code == 498 {
1144+ return
1145+ }
1146+
1147+ completion()
1148+ }
1149+ }
1084}
1150}