mirror of
https://github.com/zhigang1992/GitHawk.git
synced 2026-04-28 12:04:59 +08:00
refactor issue fetch result into object
This commit is contained in:
@@ -11,12 +11,23 @@ import IGListKit
|
||||
|
||||
extension GithubClient {
|
||||
|
||||
enum IssueResultType {
|
||||
case error
|
||||
case success(IssueResult)
|
||||
}
|
||||
|
||||
struct IssueResult {
|
||||
let subjectId: String
|
||||
let timelineViewModels: [ListDiffable]
|
||||
let mentionableUsers: [AutocompleteUser]
|
||||
}
|
||||
|
||||
func fetch(
|
||||
owner: String,
|
||||
repo: String,
|
||||
number: Int,
|
||||
width: CGFloat,
|
||||
completion: @escaping (String?, [ListDiffable], [UserAutocomplete.User]) -> ()
|
||||
completion: @escaping (IssueResultType) -> ()
|
||||
) {
|
||||
|
||||
let query = IssueOrPullRequestQuery(owner: owner, repo: repo, number: number, pageSize: 100)
|
||||
@@ -25,14 +36,21 @@ extension GithubClient {
|
||||
let issueOrPullRequest = repository?.issueOrPullRequest
|
||||
if let issueType: IssueType = issueOrPullRequest?.asIssue ?? issueOrPullRequest?.asPullRequest {
|
||||
DispatchQueue.global().async {
|
||||
let result = createViewModels(issue: issueType, width: width)
|
||||
let users = repository?.mentionableUsers.userAutocompletes ?? []
|
||||
|
||||
let viewModels = createViewModels(issue: issueType, width: width)
|
||||
let mentionableUsers = repository?.mentionableUsers.autocompleteUsers ?? []
|
||||
let result = IssueResult(
|
||||
subjectId: issueType.id,
|
||||
timelineViewModels: viewModels,
|
||||
mentionableUsers: mentionableUsers
|
||||
)
|
||||
|
||||
DispatchQueue.main.async {
|
||||
completion(issueType.id, result, users)
|
||||
completion(.success(result))
|
||||
}
|
||||
}
|
||||
} else {
|
||||
completion(nil, [], [])
|
||||
completion(.error)
|
||||
}
|
||||
ShowErrorStatusBar(graphQLErrors: result?.errors, networkError: error)
|
||||
}
|
||||
|
||||
@@ -216,16 +216,18 @@ FeedSelectionProviding {
|
||||
repo: repo,
|
||||
number: number,
|
||||
width: view.bounds.width
|
||||
) { subjectId, results, users in
|
||||
if let subjectId = subjectId {
|
||||
let addCommentClient = AddCommentClient(client: self.client, subjectId: subjectId)
|
||||
) { resultType in
|
||||
|
||||
switch resultType {
|
||||
case .success(let result):
|
||||
let addCommentClient = AddCommentClient(client: self.client, subjectId: result.subjectId)
|
||||
addCommentClient.addListener(listener: self)
|
||||
self.addCommentClient = addCommentClient
|
||||
self.autocomplete.add(UserAutocomplete(mentionableUsers: result.mentionableUsers))
|
||||
|
||||
self.autocomplete.add(UserAutocomplete(mentionableUsers: users))
|
||||
self.models = result.timelineViewModels
|
||||
default: break
|
||||
}
|
||||
|
||||
self.models = results
|
||||
self.feed.finishLoading(dismissRefresh: true)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,12 +10,11 @@ import Foundation
|
||||
|
||||
extension IssueOrPullRequestQuery.Data.Repository.MentionableUser {
|
||||
|
||||
typealias User = UserAutocomplete.User
|
||||
var userAutocompletes: [User] {
|
||||
var results = [User]()
|
||||
var autocompleteUsers: [AutocompleteUser] {
|
||||
var results = [AutocompleteUser]()
|
||||
for node in nodes ?? [] {
|
||||
guard let node = node, let avatarURL = URL(string: node.avatarUrl) else { continue }
|
||||
results.append(User(avatarURL: avatarURL, login: node.login))
|
||||
results.append(AutocompleteUser(avatarURL: avatarURL, login: node.login))
|
||||
}
|
||||
return results
|
||||
}
|
||||
|
||||
@@ -8,18 +8,18 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
struct AutocompleteUser {
|
||||
let avatarURL: URL
|
||||
let login: String
|
||||
}
|
||||
|
||||
final class UserAutocomplete: AutocompleteType {
|
||||
|
||||
struct User {
|
||||
let avatarURL: URL
|
||||
let login: String
|
||||
}
|
||||
private var cachedResults = [String: [AutocompleteUser]]()
|
||||
private var results = [AutocompleteUser]()
|
||||
private let mentionableUsers: [AutocompleteUser]
|
||||
|
||||
private var cachedResults = [String: [User]]()
|
||||
private var results = [User]()
|
||||
private let mentionableUsers: [User]
|
||||
|
||||
init(mentionableUsers: [User]) {
|
||||
init(mentionableUsers: [AutocompleteUser]) {
|
||||
self.mentionableUsers = mentionableUsers
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ final class UserAutocomplete: AutocompleteType {
|
||||
completion(cached.count > 0)
|
||||
}
|
||||
|
||||
var results = [User]()
|
||||
var results = [AutocompleteUser]()
|
||||
|
||||
let lowerword = word.lowercased()
|
||||
for u in mentionableUsers {
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1109</string>
|
||||
<string>1111</string>
|
||||
<key>ITSAppUsesNonExemptEncryption</key>
|
||||
<false/>
|
||||
<key>LSApplicationQueriesSchemes</key>
|
||||
|
||||
Reference in New Issue
Block a user