git.iko.soy/dashared/GDproject
on master help sign in
GDproject/Base.lproj/Main.storyboard+2−9
since splitsnapshots
unifiedsplit
@@ -846,7 +846,7 @@
846 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
846 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
847 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
847 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
848 <prototypes>
848 <prototypes>
849− <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">
850 <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"/>
851 <autoresizingMask key="autoresizingMask"/>
851 <autoresizingMask key="autoresizingMask"/>
852 <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">
@@ -854,14 +854,7 @@
854 <autoresizingMask key="autoresizingMask"/>
854 <autoresizingMask key="autoresizingMask"/>
855 <subviews>
855 <subviews>
856 <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">
857− <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"/>
858− <autoresizingMask key="autoresizingMask"/>
859− <fontDescription key="fontDescription" type="system" pointSize="17"/>
860− <nil key="textColor"/>
861− <nil key="highlightedColor"/>
862− </label>
863− <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Detail" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="QSb-Bd-4gu">
864− <rect key="frame" x="315" y="12" width="44" height="20.5"/>
865 <autoresizingMask key="autoresizingMask"/>
858 <autoresizingMask key="autoresizingMask"/>
866 <fontDescription key="fontDescription" type="system" pointSize="17"/>
859 <fontDescription key="fontDescription" type="system" pointSize="17"/>
867 <nil key="textColor"/>
860 <nil key="textColor"/>
GDproject/Controller/ News and channels/NewPostViewController.swift+18−4
@@ -232,13 +232,27 @@ class NewPostViewController: UIViewController, UITextViewDelegate, TagsReceiver
232 var indexOfPost = 0
232 var indexOfPost = 0
233 // MARK:- new post
233 // MARK:- new post
234 @objc func newPost(){
234 @objc func newPost(){
235+ self.navigationItem.title = "Sending..."
235− 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+ }
236
250
237− NewPostViewController.draft = ""
251+ // NewPostViewController.draft = ""
238− NewPostViewController.hashTagsDraft = []
252+ // NewPostViewController.hashTagsDraft = []
239 // adding row to uiTableView after adding new post
253 // adding row to uiTableView after adding new post
240 // myProtocol?.addPost(post: p)
254 // myProtocol?.addPost(post: p)
241− moveBackToParentVC?()
255+ // moveBackToParentVC?()
242 // 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
243 }
257 }
244
258
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/Log In/RegisterTableViewController.swift+1
@@ -50,6 +50,7 @@ class RegisterTableViewController: UITableViewController, ChosenFactulty
50 {
50 {
51 super.viewDidLoad()
51 super.viewDidLoad()
52
52
53+ navigationItem.largeTitleDisplayMode = .never
53 tableView.keyboardDismissMode = .interactive
54 tableView.keyboardDismissMode = .interactive
54 navigationItem.title = user.email
55 navigationItem.title = user.email
55 navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(endRegistration))
56 navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(endRegistration))
GDproject/Controller/Messages/Dialog/DialogViewController.swift+12−4
@@ -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
@@ -315,7 +323,7 @@ class DialogViewController: UIViewController, UpdatableGroup, UITableViewDelegat
315 var canBePaginated = false
323 var canBePaginated = false
316 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
324 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
317 {
325 {
318− if indexPath.row == cellData.count - 1 && prevLast != indexPath.row && canBePaginated && cellData.count >= 9
326+ if indexPath.row == cellData.count - 1 && prevLast != indexPath.row && canBePaginated && cellData.count >= 24
319 {
327 {
320 print("exclusiveFrom \(currentMessagesInChat.last?.id ?? 0)")
328 print("exclusiveFrom \(currentMessagesInChat.last?.id ?? 0)")
321 if let dialog = dialog
329 if let dialog = dialog
GDproject/Controller/Messages/MessagesViewController.swift+102−4
@@ -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 }
@@ -81,3 +133,49 @@ class MessagesViewController: UITableViewController {
81 onDialogDisplay?(tuple)
133 onDialogDisplay?(tuple)
82 }
134 }
83}
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/Profile/ProfileViewController.swift+1−1
@@ -159,7 +159,7 @@ class ProfileViewController: UIViewController, UpdateUser
159 }
159 }
160
160
161 func setUpNavigarionBar(){
161 func setUpNavigarionBar(){
162− navigationController?.navigationBar.prefersLargeTitles = true
162+ // navigationController?.navigationBar.prefersLargeTitles = true
163 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))
164 navigationItem.rightBarButtonItems = [uibarbutton]
164 navigationItem.rightBarButtonItems = [uibarbutton]
165 navigationItem.largeTitleDisplayMode = .always
165 navigationItem.largeTitleDisplayMode = .always
GDproject/Simple model/Model.swift+16−4
@@ -427,7 +427,7 @@ class Model{
427 }
427 }
428
428
429
429
430− static func createAndPublish(body: [Attachments], tags: [String]){
430+ static func createAndPublish(body: [Attachments], tags: [String], completion: @escaping ((ResultR)->())){
431 let jsonUpd = CreatedPost(body: body, tags: tags)
431 let jsonUpd = CreatedPost(body: body, tags: tags)
432 var request = URLRequest(url: postsPublishURL)
432 var request = URLRequest(url: postsPublishURL)
433
433
@@ -445,6 +445,14 @@ class Model{
445 if let code = response.response?.statusCode, code == 498 {
445 if let code = response.response?.statusCode, code == 498 {
446 return
446 return
447 }
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+ }
448 }
456 }
449 }
457 }
450
458
@@ -945,7 +953,7 @@ class Model{
945 }
953 }
946 }
954 }
947
955
948− 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])->()))
949 {
957 {
950 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)
951 var request: URLRequest?
959 var request: URLRequest?
@@ -1048,7 +1056,7 @@ class Model{
1048 }
1056 }
1049 }
1057 }
1050
1058
1051− static func sendMessage(message: SendMessage, completion: @escaping (()->())){
1059+ static func sendMessage(message: SendMessage, completion: @escaping ((ResultR)->())){
1052
1060
1053 var request = URLRequest(url: messagesSendURL)
1061 var request = URLRequest(url: messagesSendURL)
1054 request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
1062 request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
@@ -1062,7 +1070,11 @@ class Model{
1062 return
1070 return
1063 }
1071 }
1064
1072
1073+ if let result = ResultR(rawValue: response.response!.statusCode){
1074+ completion(result)
1075+ } else {
1065− completion()
1076+ completion(.internalServerError)
1077+ }
1066 }
1078 }
1067 }
1079 }
1068
1080