-
Notifications
You must be signed in to change notification settings - Fork 3
/
DetailViewController.swift
152 lines (127 loc) · 3.66 KB
/
DetailViewController.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
//
// DetailViewController.swift
// Repose
//
// Created by Derrick Hathaway on 4/2/18.
// Copyright © 2018 Derrick Hathaway. All rights reserved.
//
import UIKit
import Apollo
import Kingfisher
class DetailViewController: UITableViewController {
@IBOutlet weak var avatarContainerView: UIView!
@IBOutlet weak var avatarView: UIImageView!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var bioLabel: UILabel!
@IBOutlet weak var loadingView: UIView!
var repos: [GetUserQuery.Data.User.Repository.Node] = []
enum LoadingStatus {
case empty
case loading
case data(GetUserQuery.Data)
case error(Error)
}
override func viewDidLoad() {
super.viewDidLoad()
updateView(status: .empty)
avatarContainerView.layer.cornerRadius = 30
}
var login: String = "" {
didSet {
guard login != oldValue else {
return
}
title = "@" + login
updateView(status: .loading)
refresh()
}
}
func refresh() {
ApolloClient.gitStalk.fetch(
query: GetUserQuery(login: login)
) { [weak self] response, error in
guard let me = self else { return }
let status: LoadingStatus
if let e = error {
status = .error(e)
} else if let data = response?.data {
status = .data(data)
} else {
status = .empty
}
me.updateView(status: status)
}
}
func updateView(status: LoadingStatus) {
guard isViewLoaded else { return }
var isLoading = true
var name = ""
var bio = ""
var imageURL: URL? = nil
switch status {
case .data(let data):
isLoading = false
name = data.user?.name ?? ""
bio = data.user?.bio ?? ""
imageURL = (data.user?.avatarUrl).flatMap(URL.init(string:))
repos = data.user?.repositories.nodes?.compactMap { $0 } ?? []
case .error(let error):
isLoading = false
let alert = UIAlertController(
title: "Error",
message: error.localizedDescription,
preferredStyle: .alert
)
alert.addAction(UIAlertAction(title: "Dismiss", style: .default))
present(alert, animated: true, completion: nil)
case .empty:
isLoading = false
default:
break
}
loadingView.isHidden = !isLoading
nameLabel.isHidden = isLoading
nameLabel.text = name
bioLabel.text = bio
avatarView.kf.setImage(with: imageURL)
tableView.reloadData()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
guard let headerView = tableView.tableHeaderView else {
return
}
let height = headerView.systemLayoutSizeFitting(
UILayoutFittingCompressedSize
).height
if height != headerView.bounds.height {
headerView.frame.size.height = height
tableView.tableHeaderView = headerView
tableView.layoutIfNeeded()
}
}
// MARK - Table
override func numberOfSections(in tableView: UITableView) -> Int {
return 2
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if section == 0 {
return "Repositories"
} else if section == 1 {
return "Recent Comments"
}
return ""
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == 0 {
return repos.count
}
return 0
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "RepoCell")!
let repo = repos[indexPath.row]
cell.textLabel?.text = repo.name
return cell
}
}