Skip to content

Commit 2891f45

Browse files
authored
Merge pull request #8828 from woocommerce/issue/8794-api-providers
[Support Requests] Add support to create an API-Provider request
2 parents 3f02129 + 4908c49 commit 2891f45

File tree

9 files changed

+360
-23
lines changed

9 files changed

+360
-23
lines changed

Podfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ target 'WooCommerce' do
107107
cocoa_lumberjack
108108
keychain
109109
pod 'XLPagerTabStrip', '~> 9.0'
110-
pod 'ZendeskSupportSDK', '~> 5.0'
110+
pod 'ZendeskSupportSDK', '~> 6.0'
111111
stripe_terminal
112112
pod 'Kingfisher', '~> 7.2.2'
113113
pod 'Wormholy', '~> 1.6.5', configurations: ['Debug']

Podfile.lock

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -59,19 +59,19 @@ PODS:
5959
- WPMediaPicker (1.8.1)
6060
- wpxmlrpc (0.10.0)
6161
- XLPagerTabStrip (9.0.0)
62-
- ZendeskCommonUISDK (6.1.1)
63-
- ZendeskCoreSDK (2.5.1)
64-
- ZendeskMessagingAPISDK (3.8.2):
65-
- ZendeskSDKConfigurationsSDK (~> 1.1.8)
66-
- ZendeskMessagingSDK (3.8.2):
67-
- ZendeskCommonUISDK (~> 6.1.1)
68-
- ZendeskMessagingAPISDK (~> 3.8.2)
69-
- ZendeskSDKConfigurationsSDK (1.1.8)
70-
- ZendeskSupportProvidersSDK (5.3.0):
71-
- ZendeskCoreSDK (~> 2.5.1)
72-
- ZendeskSupportSDK (5.3.0):
73-
- ZendeskMessagingSDK (~> 3.8.2)
74-
- ZendeskSupportProvidersSDK (~> 5.3.0)
62+
- ZendeskCommonUISDK (7.0.0)
63+
- ZendeskCoreSDK (3.0.0)
64+
- ZendeskMessagingAPISDK (4.0.0):
65+
- ZendeskSDKConfigurationsSDK (= 2.0.0)
66+
- ZendeskMessagingSDK (4.0.0):
67+
- ZendeskCommonUISDK (= 7.0.0)
68+
- ZendeskMessagingAPISDK (= 4.0.0)
69+
- ZendeskSDKConfigurationsSDK (2.0.0)
70+
- ZendeskSupportProvidersSDK (6.0.0):
71+
- ZendeskCoreSDK (= 3.0.0)
72+
- ZendeskSupportSDK (6.0.0):
73+
- ZendeskMessagingSDK (= 4.0.0)
74+
- ZendeskSupportProvidersSDK (= 6.0.0)
7575

7676
DEPENDENCIES:
7777
- Alamofire (~> 4.8)
@@ -91,7 +91,7 @@ DEPENDENCIES:
9191
- Wormholy (~> 1.6.5)
9292
- WPMediaPicker (~> 1.8.1)
9393
- XLPagerTabStrip (~> 9.0)
94-
- ZendeskSupportSDK (~> 5.0)
94+
- ZendeskSupportSDK (~> 6.0)
9595

9696
SPEC REPOS:
9797
https://github.com/wordpress-mobile/cocoapods-specs.git:
@@ -170,14 +170,14 @@ SPEC CHECKSUMS:
170170
WPMediaPicker: 9011a0ec1f468c039af7485c244576b4c9889a0f
171171
wpxmlrpc: 68db063041e85d186db21f674adf08d9c70627fd
172172
XLPagerTabStrip: 61c57fd61f611ee5f01ff1495ad6fbee8bf496c5
173-
ZendeskCommonUISDK: 5808802951ad2bb424f0bed4259dc3c0ce9b52ec
174-
ZendeskCoreSDK: 19a18e5ef2edcb18f4dbc0ea0d12bd31f515712a
175-
ZendeskMessagingAPISDK: 144e0fb0e633a3c4e73149b781ab65338938d5a8
176-
ZendeskMessagingSDK: 500e83d9413481e95180c37ddca0d4ef9d515600
177-
ZendeskSDKConfigurationsSDK: 8371b468db0d09e9198f6c5a97818826943ee1ee
178-
ZendeskSupportProvidersSDK: 2bdf8544f7cd0fd4c002546f5704b813845beb2a
179-
ZendeskSupportSDK: 3a8e508ab1d9dd22dc038df6c694466414e037ba
173+
ZendeskCommonUISDK: f06dbac6c9e74c3afff75ecdc6bec3832b23258c
174+
ZendeskCoreSDK: ce6dbb5eb4d61d2d061547a92bd0b0fe98602e9d
175+
ZendeskMessagingAPISDK: 95a99f1eab9482b4106ec88466b93a89f9f7c5fa
176+
ZendeskMessagingSDK: 4f5f3d43766bb3b2ea6411d1331cfe609ff33618
177+
ZendeskSDKConfigurationsSDK: a5c21010e17b71d02bc2cfe73dcc9da1efa0a7b2
178+
ZendeskSupportProvidersSDK: 685b5d185af47ced0ec40564ec46355c838bbd06
179+
ZendeskSupportSDK: 92e6f9d334e81e9186f8a17583862350460a5393
180180

181-
PODFILE CHECKSUM: a09e3ee200fbf92e30759055ee99fd73f879837d
181+
PODFILE CHECKSUM: 069fec0d7db5d08f2248504260b92ab63bc898da
182182

183183
COCOAPODS: 1.11.3

RELEASE-NOTES.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
12.3
44
-----
5+
- [Internal] We have updated the Zendesk SDK to version 6.0 [https://github.com/woocommerce/woocommerce-ios/pull/8828]
56

67

78
12.2

WooCommerce/Classes/Tools/Zendesk/ZendeskManager.swift

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,15 @@ protocol ZendeskManagerProtocol: SupportManagerAdapter {
3535
func showNewWCPayRequestIfPossible(from controller: UIViewController, with sourceTag: String?)
3636
func showNewWCPayRequestIfPossible(from controller: UIViewController)
3737

38+
/// Creates a support request using the API-Providers SDK.
39+
///
40+
func createSupportRequest(formID: Int64,
41+
customFields: [Int64: String],
42+
tags: [String],
43+
subject: String,
44+
description: String,
45+
onCompletion: @escaping (Result<Void, Error>) -> Void)
46+
3847
var zendeskEnabled: Bool { get }
3948
func userSupportEmail() -> String?
4049
func showHelpCenter(from controller: UIViewController)
@@ -45,6 +54,18 @@ protocol ZendeskManagerProtocol: SupportManagerAdapter {
4554
func fetchSystemStatusReport()
4655
func initialize()
4756
func reset()
57+
58+
/// To Refactor: These methods would end-up living outside this class. Exposing them here temporarily.
59+
/// https://github.com/woocommerce/woocommerce-ios/issues/8795
60+
///
61+
func formID() -> Int64
62+
func wcPayFormID() -> Int64
63+
64+
func generalTags() -> [String]
65+
func wcPayTags() -> [String]
66+
67+
func generalCustomFields() -> [Int64: String]
68+
func wcPayCustomFields() -> [Int64: String]
4869
}
4970

5071
struct NoZendeskManager: ZendeskManagerProtocol {
@@ -68,6 +89,15 @@ struct NoZendeskManager: ZendeskManagerProtocol {
6889
// no-op
6990
}
7091

92+
func createSupportRequest(formID: Int64,
93+
customFields: [Int64: String],
94+
tags: [String],
95+
subject: String,
96+
description: String,
97+
onCompletion: @escaping (Result<Void, Error>) -> Void) {
98+
// no-op
99+
}
100+
71101
var zendeskEnabled = false
72102

73103
func userSupportEmail() -> String? {
@@ -107,6 +137,35 @@ struct NoZendeskManager: ZendeskManagerProtocol {
107137
}
108138
}
109139

140+
/// To Refactor: These methods would end-up living outside this class. Exposing them here temporarily.
141+
/// https://github.com/woocommerce/woocommerce-ios/issues/8795
142+
///
143+
extension NoZendeskManager {
144+
func formID() -> Int64 {
145+
.zero
146+
}
147+
148+
func wcPayFormID() -> Int64 {
149+
.zero
150+
}
151+
152+
func generalTags() -> [String] {
153+
[]
154+
}
155+
156+
func wcPayTags() -> [String] {
157+
[]
158+
}
159+
160+
func generalCustomFields() -> [Int64: String] {
161+
[:]
162+
}
163+
164+
func wcPayCustomFields() -> [Int64: String] {
165+
[:]
166+
}
167+
}
168+
110169
extension NoZendeskManager: SupportManagerAdapter {
111170
/// Executed whenever the app receives a Push Notifications Token.
112171
///
@@ -361,6 +420,25 @@ final class ZendeskManager: NSObject, ZendeskManagerProtocol {
361420
}
362421
}
363422

423+
/// Creates a support request using the API-Providers SDK.
424+
///
425+
func createSupportRequest(formID: Int64,
426+
customFields: [Int64: String],
427+
tags: [String],
428+
subject: String,
429+
description: String,
430+
onCompletion: @escaping (Result<Void, Error>) -> Void) {
431+
432+
let requestProvider = ZDKRequestProvider()
433+
let request = createAPIRequest(formID: formID, customFields: customFields, tags: tags, subject: subject, description: description)
434+
requestProvider.createRequest(request) { _, error in
435+
if let error {
436+
return onCompletion(.failure(error))
437+
}
438+
onCompletion(.success(()))
439+
}
440+
}
441+
364442
/// Displays the Zendesk Request List view from the given controller, allowing user to access their tickets.
365443
///
366444
func showTicketListIfPossible(from controller: UIViewController, with sourceTag: String?) {
@@ -457,6 +535,47 @@ final class ZendeskManager: NSObject, ZendeskManagerProtocol {
457535
}
458536
}
459537

538+
/// To Refactor: These methods would end-up living outside this class. Exposing them here temporarily.
539+
/// https://github.com/woocommerce/woocommerce-ios/issues/8795
540+
///
541+
extension ZendeskManager {
542+
func formID() -> Int64 {
543+
createRequest(supportSourceTag: nil).ticketFormID?.int64Value ?? .zero
544+
}
545+
546+
func wcPayFormID() -> Int64 {
547+
createWCPayRequest(supportSourceTag: nil).ticketFormID?.int64Value ?? .zero
548+
}
549+
550+
func generalTags() -> [String] {
551+
getTags(supportSourceTag: nil)
552+
}
553+
554+
func wcPayTags() -> [String] {
555+
getWCPayTags(supportSourceTag: nil)
556+
}
557+
558+
func generalCustomFields() -> [Int64: String] {
559+
// Extracts the custom fields from the `createRequest` method
560+
createRequest(supportSourceTag: nil).customFields.reduce([:]) { dict, field in
561+
guard let value = field.value as? String else { return dict } // Guards that all values are string
562+
var mutableDict = dict
563+
mutableDict[field.fieldId] = value
564+
return mutableDict
565+
}
566+
}
567+
568+
func wcPayCustomFields() -> [Int64: String] {
569+
// Extracts the custom fields from the `createWCPayRequest` method.
570+
createWCPayRequest(supportSourceTag: nil).customFields.reduce([:]) { dict, field in
571+
guard let value = field.value as? String else { return dict } // Guards that all values are string
572+
var mutableDict = dict
573+
mutableDict[field.fieldId] = value
574+
return mutableDict
575+
}
576+
}
577+
}
578+
460579
// MARK: - Push Notifications
461580
//
462581
extension ZendeskManager {
@@ -749,6 +868,18 @@ private extension ZendeskManager {
749868
return requestConfig
750869
}
751870

871+
/// Creates a Zendesk Request to be consumed by a Request Provider.
872+
///
873+
func createAPIRequest(formID: Int64, customFields: [Int64: String], tags: [String], subject: String, description: String) -> ZDKCreateRequest {
874+
let request = ZDKCreateRequest()
875+
request.ticketFormId = formID as NSNumber
876+
request.customFields = customFields.map { CustomField(fieldId: $0, value: $1) }
877+
request.tags = tags
878+
request.subject = subject
879+
request.requestDescription = description
880+
return request
881+
}
882+
752883
// MARK: - View
753884
//
754885
func showZendeskView(_ zendeskView: UIViewController, from controller: UIViewController) {
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import Foundation
2+
3+
/// Data Source for the Support Request
4+
///
5+
public protocol SupportFormMetaDataSource {
6+
/// Zendesk Form ID.
7+
///
8+
var formID: Int64 { get }
9+
10+
/// Zendesk tags
11+
///
12+
var tags: [String] { get }
13+
14+
/// Zendesk Custom Fields
15+
///
16+
var customFields: [Int64: String] { get }
17+
}
18+
19+
20+
/// View Model for the support form.
21+
///
22+
public final class SupportFormViewModel {
23+
24+
/// Zendesk metadata provider.
25+
///
26+
private let dataSource: SupportFormMetaDataSource
27+
28+
init(dataSource: SupportFormMetaDataSource) {
29+
self.dataSource = dataSource
30+
}
31+
32+
/// Submits the support request using the Zendesk Provider.
33+
///
34+
func submitSupportRequest(onCompletion: @escaping (Result<Void, Error>) -> Void) {
35+
ZendeskProvider.shared.createSupportRequest(formID: dataSource.formID,
36+
customFields: dataSource.customFields,
37+
tags: dataSource.tags,
38+
subject: "Temporary Subject",
39+
description: "Temporary Description",
40+
onCompletion: onCompletion)
41+
}
42+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import Foundation
2+
3+
/// Provides general Zendesk metadata.
4+
///
5+
struct GeneralSupportDataSource: SupportFormMetaDataSource {
6+
var formID: Int64 {
7+
ZendeskProvider.shared.formID()
8+
}
9+
10+
var tags: [String] {
11+
ZendeskProvider.shared.generalTags()
12+
}
13+
14+
var customFields: [Int64: String] {
15+
ZendeskProvider.shared.generalCustomFields()
16+
}
17+
}
18+
19+
/// Provides WCPay Zendesk metadata.
20+
///
21+
struct WCPaySupportDataSource: SupportFormMetaDataSource {
22+
var formID: Int64 {
23+
ZendeskProvider.shared.wcPayFormID()
24+
}
25+
26+
var tags: [String] {
27+
ZendeskProvider.shared.wcPayTags()
28+
}
29+
30+
var customFields: [Int64: String] {
31+
ZendeskProvider.shared.wcPayCustomFields()
32+
}
33+
}

0 commit comments

Comments
 (0)