diff --git a/Classes/Issues/AddCommentClient.swift b/Classes/Issues/AddCommentClient.swift new file mode 100644 index 00000000..9fc3ec4e --- /dev/null +++ b/Classes/Issues/AddCommentClient.swift @@ -0,0 +1,61 @@ +// +// AddCommentClient.swift +// Freetime +// +// Created by Ryan Nystrom on 7/15/17. +// Copyright © 2017 Ryan Nystrom. All rights reserved. +// + +import Foundation + +protocol AddCommentListener: class { + func didSendComment(client: AddCommentClient, id: String, commentFields: CommentFields, reactionFields: ReactionFields) + func didFailSendingComment(client: AddCommentClient) +} + +final class AddCommentClient { + + private class ListenerWrapper: NSObject { + weak var listener: AddCommentListener? = nil + } + private var listeners = [ListenerWrapper]() + + private let client: GithubClient + private let subjectId: String + + init(client: GithubClient, subjectId: String) { + self.client = client + self.subjectId = subjectId + } + + // MARK: Public API + + func addListener(listener: AddCommentListener) { + let wrapper = ListenerWrapper() + wrapper.listener = listener + listeners.append(wrapper) + } + + func addComment(body: String) { + client.apollo.perform(mutation: AddCommentMutation(subjectId: subjectId, body: body)) { (result, error) in + if let commentNode = result?.data?.addComment?.commentEdge.node { + let fragments = commentNode.fragments + for listener in self.listeners { + listener.listener?.didSendComment( + client: self, + id: fragments.nodeFields.id, + commentFields: fragments.commentFields, + reactionFields: fragments.reactionFields + ) + } + } else { + for listener in self.listeners { + listener.listener?.didFailSendingComment(client: self) + } + } + + ShowErrorStatusBar(graphQLErrors: result?.errors, networkError: error) + } + } + +} diff --git a/Classes/Issues/IssuesViewController.swift b/Classes/Issues/IssuesViewController.swift index f5211e43..79b3d895 100644 --- a/Classes/Issues/IssuesViewController.swift +++ b/Classes/Issues/IssuesViewController.swift @@ -22,7 +22,7 @@ AddCommentListener { private let repo: String private let number: Int - private var subjectId: String? = nil + private var addCommentClient: AddCommentClient? = nil private var models = [ListDiffable]() lazy private var feed: Feed = { Feed(viewController: self, delegate: self, collectionView: self.collectionView) }() @@ -161,7 +161,12 @@ AddCommentListener { number: number, width: view.bounds.width ) { subjectId, results in - self.subjectId = subjectId + if let subjectId = subjectId { + let addCommentClient = AddCommentClient(client: self.client, subjectId: subjectId) + addCommentClient.addListener(listener: self) + self.addCommentClient = addCommentClient + } + self.models = results self.feed.finishLoading(dismissRefresh: true) } diff --git a/Resources/Info.plist b/Resources/Info.plist index aba4837e..4e3daecc 100644 --- a/Resources/Info.plist +++ b/Resources/Info.plist @@ -32,7 +32,7 @@ CFBundleVersion - 951 + 952 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes