Skip to content

Commit 0e83798

Browse files
Mudaafijjl014
andauthored
[CSL-2391] Add Quiz Tracking Methods (#183)
* Add Quizzes Tracking * Lint * Do not surface url in trackQuizResultsLoaded * fix typo * Remove unecessary defaults * Adds docs into Readme and fix single quotes * fix Readme spacings * Make readme examples consistent * readme: Fix examples * Minor fixes --------- Co-authored-by: Jimmy Li <[email protected]>
1 parent 8ec5b69 commit 0e83798

15 files changed

+944
-12
lines changed

AutocompleteClient.xcodeproj/project.pbxproj

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,15 @@
7878
8A5572812A1429930041DB65 /* CIOBrowseGroupsQuery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A5572802A1429930041DB65 /* CIOBrowseGroupsQuery.swift */; };
7979
8A5572832A1433350041DB65 /* CIOBrowseGroupsQueryBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A5572822A1433350041DB65 /* CIOBrowseGroupsQueryBuilder.swift */; };
8080
8A5572852A143E840041DB65 /* ConstructorIOBrowseGroupsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A5572842A143E840041DB65 /* ConstructorIOBrowseGroupsTests.swift */; };
81+
8A93F13C2A6F44BF000ED6B3 /* CIOTrackQuizConversionData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A93F1392A6F44BF000ED6B3 /* CIOTrackQuizConversionData.swift */; };
82+
8A93F13D2A6F44BF000ED6B3 /* CIOTrackQuizResultsLoadedData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A93F13A2A6F44BF000ED6B3 /* CIOTrackQuizResultsLoadedData.swift */; };
83+
8A93F13E2A6F44BF000ED6B3 /* CIOTrackQuizResultClickData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A93F13B2A6F44BF000ED6B3 /* CIOTrackQuizResultClickData.swift */; };
84+
8A93F1402A70491D000ED6B3 /* ConstructorIOTrackQuizResultClick.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A93F13F2A70491D000ED6B3 /* ConstructorIOTrackQuizResultClick.swift */; };
85+
8A93F1422A797E13000ED6B3 /* ConstructorIOTrackQuizResultsLoadedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A93F1412A797E13000ED6B3 /* ConstructorIOTrackQuizResultsLoadedTests.swift */; };
86+
8A93F1442A7983B4000ED6B3 /* ConstructorIOTrackQuizConversionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A93F1432A7983B4000ED6B3 /* ConstructorIOTrackQuizConversionTests.swift */; };
87+
8A93F1462A79B365000ED6B3 /* TrackQuizResultsLoadedRequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A93F1452A79B365000ED6B3 /* TrackQuizResultsLoadedRequestBuilder.swift */; };
88+
8A93F1482A79C530000ED6B3 /* TrackQuizResultClickRequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A93F1472A79C530000ED6B3 /* TrackQuizResultClickRequestBuilder.swift */; };
89+
8A93F14A2A79C963000ED6B3 /* TrackQuizConversionRequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A93F1492A79C963000ED6B3 /* TrackQuizConversionRequestBuilder.swift */; };
8190
8AE1429F2A53832E003E7E0E /* response_browse_json.json in Resources */ = {isa = PBXBuildFile; fileRef = 8AE1429E2A53832E003E7E0E /* response_browse_json.json */; };
8291
8AE142A12A538384003E7E0E /* BrowseResponseParserTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AE142A02A538384003E7E0E /* BrowseResponseParserTest.swift */; };
8392
8D0308702A1ED67C0084AB85 /* CIOBrowseFacetOptionsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D03086F2A1ED67C0084AB85 /* CIOBrowseFacetOptionsResponse.swift */; };
@@ -433,6 +442,15 @@
433442
8A5572802A1429930041DB65 /* CIOBrowseGroupsQuery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIOBrowseGroupsQuery.swift; sourceTree = "<group>"; };
434443
8A5572822A1433350041DB65 /* CIOBrowseGroupsQueryBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIOBrowseGroupsQueryBuilder.swift; sourceTree = "<group>"; };
435444
8A5572842A143E840041DB65 /* ConstructorIOBrowseGroupsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConstructorIOBrowseGroupsTests.swift; sourceTree = "<group>"; };
445+
8A93F1392A6F44BF000ED6B3 /* CIOTrackQuizConversionData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CIOTrackQuizConversionData.swift; sourceTree = "<group>"; };
446+
8A93F13A2A6F44BF000ED6B3 /* CIOTrackQuizResultsLoadedData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CIOTrackQuizResultsLoadedData.swift; sourceTree = "<group>"; };
447+
8A93F13B2A6F44BF000ED6B3 /* CIOTrackQuizResultClickData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CIOTrackQuizResultClickData.swift; sourceTree = "<group>"; };
448+
8A93F13F2A70491D000ED6B3 /* ConstructorIOTrackQuizResultClick.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConstructorIOTrackQuizResultClick.swift; sourceTree = "<group>"; };
449+
8A93F1412A797E13000ED6B3 /* ConstructorIOTrackQuizResultsLoadedTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConstructorIOTrackQuizResultsLoadedTests.swift; sourceTree = "<group>"; };
450+
8A93F1432A7983B4000ED6B3 /* ConstructorIOTrackQuizConversionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConstructorIOTrackQuizConversionTests.swift; sourceTree = "<group>"; };
451+
8A93F1452A79B365000ED6B3 /* TrackQuizResultsLoadedRequestBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrackQuizResultsLoadedRequestBuilder.swift; sourceTree = "<group>"; };
452+
8A93F1472A79C530000ED6B3 /* TrackQuizResultClickRequestBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrackQuizResultClickRequestBuilder.swift; sourceTree = "<group>"; };
453+
8A93F1492A79C963000ED6B3 /* TrackQuizConversionRequestBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrackQuizConversionRequestBuilder.swift; sourceTree = "<group>"; };
436454
8AE1429E2A53832E003E7E0E /* response_browse_json.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = response_browse_json.json; sourceTree = "<group>"; };
437455
8AE142A02A538384003E7E0E /* BrowseResponseParserTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BrowseResponseParserTest.swift; sourceTree = "<group>"; };
438456
8D03086F2A1ED67C0084AB85 /* CIOBrowseFacetOptionsResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIOBrowseFacetOptionsResponse.swift; sourceTree = "<group>"; };
@@ -854,6 +872,9 @@
854872
08A7E40C2575E37A000FA02F /* CIOTrackBrowseResultClickData.swift */,
855873
8D815F87294117B0001E3DAE /* CIOTrackItemDetailLoadData.swift */,
856874
08A7E40D2575E37A000FA02F /* CIOTrackBrowseResultsLoadedData.swift */,
875+
8A93F1392A6F44BF000ED6B3 /* CIOTrackQuizConversionData.swift */,
876+
8A93F13B2A6F44BF000ED6B3 /* CIOTrackQuizResultClickData.swift */,
877+
8A93F13A2A6F44BF000ED6B3 /* CIOTrackQuizResultsLoadedData.swift */,
857878
F19E28A61F5F44C30022C814 /* CIOTrackConversionData.swift */,
858879
08C1E6042193BE3600A2E24E /* CIOTrackPurchaseData.swift */,
859880
088F7D1D210FA3C6005B9FB4 /* CIOTrackInputFocusData.swift */,
@@ -962,9 +983,12 @@
962983
isa = PBXGroup;
963984
children = (
964985
08A7E4102575FA15000FA02F /* ConstructorIOTrackInputFocusTests.swift */,
986+
8A93F13F2A70491D000ED6B3 /* ConstructorIOTrackQuizResultClick.swift */,
965987
0855BA4D25B010CC00CC35F9 /* ConstructorIOIntegrationTests.swift */,
966988
08A7E4142575FA95000FA02F /* ConstructorIOTrackAutocompleteSelectTests.swift */,
989+
8A93F1412A797E13000ED6B3 /* ConstructorIOTrackQuizResultsLoadedTests.swift */,
967990
08A7E4112575FA15000FA02F /* ConstructorIOTrackSearchSubmitTests.swift */,
991+
8A93F1432A7983B4000ED6B3 /* ConstructorIOTrackQuizConversionTests.swift */,
968992
087F4BDB228B100D0058B467 /* ConstructorIOTrackSearchResultClickTests.swift */,
969993
F64E94DC212D7EC300E50EDE /* ConstructorIOTrackSearchResultsLoadedTests.swift */,
970994
08A7E4162575FDA0000FA02F /* ConstructorIOTrackBrowseResultClickTests.swift */,
@@ -1013,6 +1037,9 @@
10131037
F60FE9071F5C5B860037A0AB /* Request */ = {
10141038
isa = PBXGroup;
10151039
children = (
1040+
8A93F1452A79B365000ED6B3 /* TrackQuizResultsLoadedRequestBuilder.swift */,
1041+
8A93F1492A79C963000ED6B3 /* TrackQuizConversionRequestBuilder.swift */,
1042+
8A93F1472A79C530000ED6B3 /* TrackQuizResultClickRequestBuilder.swift */,
10161043
F66B217921E275DC00AAB030 /* QueryItemCollection */,
10171044
F6852554213BCE8B00A27FAA /* Mock */,
10181045
F64E94E0212D835700E50EDE /* Matchers */,
@@ -2428,6 +2455,7 @@
24282455
08FFB76C215EBBF8008CAA7D /* CIOTrackAutocompleteSelectData.swift in Sources */,
24292456
8DCA83E52A1BFE9E00CD2110 /* BrowseFacetsResponseParser.swift in Sources */,
24302457
F6B220ED209C692D003A5D48 /* CustomSearchController.swift in Sources */,
2458+
8A93F13D2A6F44BF000ED6B3 /* CIOTrackQuizResultsLoadedData.swift in Sources */,
24312459
F6DF7B9420849E8D00A7CDAD /* CIOTrackSearchResultClickData.swift in Sources */,
24322460
8DCA83DD2A1BD82F00CD2110 /* CIOBrowseFacetsQuery.swift in Sources */,
24332461
F69C2CA2207FADAD0060B2B9 /* CIOLogger.swift in Sources */,
@@ -2449,6 +2477,7 @@
24492477
08A7E40E2575E37A000FA02F /* CIOTrackBrowseResultClickData.swift in Sources */,
24502478
BFC9503225D49EC600118D4C /* RecommendationsTaskResponse.swift in Sources */,
24512479
F6D2E9CC20E21022007F8761 /* CIOTrackSearchResultsLoadedData.swift in Sources */,
2480+
8A93F13E2A6F44BF000ED6B3 /* CIOTrackQuizResultClickData.swift in Sources */,
24522481
08A7E40F2575E37A000FA02F /* CIOTrackBrowseResultsLoadedData.swift in Sources */,
24532482
7D06CCA328E516BC00AB6A8C /* CIOQuizResult.swift in Sources */,
24542483
F650154E1F58724B008E50C0 /* UIColor+RGB.swift in Sources */,
@@ -2510,6 +2539,7 @@
25102539
8DF2172D2888AE5E006384A5 /* CIOResultSources.swift in Sources */,
25112540
0885D84425718AD10038AE96 /* CIOBrowseQuery.swift in Sources */,
25122541
0885D83E2571870B0038AE96 /* BrowseResponseParser.swift in Sources */,
2542+
8A93F13C2A6F44BF000ED6B3 /* CIOTrackQuizConversionData.swift in Sources */,
25132543
7D45384428DC19A500490BFE /* CIOQuizOption.swift in Sources */,
25142544
F67868DB2224328D00C76C0D /* AutocompleteTaskResponse.swift in Sources */,
25152545
0828954A256C5A85009A00BC /* CIOResultFacet.swift in Sources */,
@@ -2602,23 +2632,29 @@
26022632
F66B216521DF851F00AAB030 /* StringTrimTests.swift in Sources */,
26032633
08465ECC2161D0B100AEBD76 /* TrackSessionStartRequestBuilder.swift in Sources */,
26042634
F64F46BE1F59846E0094C697 /* XCTest+TimeoutFail.swift in Sources */,
2635+
8A93F1442A7983B4000ED6B3 /* ConstructorIOTrackQuizConversionTests.swift in Sources */,
2636+
8A93F14A2A79C963000ED6B3 /* TrackQuizConversionRequestBuilder.swift in Sources */,
26052637
8D815F862935997D001E3DAE /* ConstructorIOBrowseItemsTests.swift in Sources */,
26062638
8DCA83E72A1C010100CD2110 /* ConstructorIOBrowseFacetsTests.swift in Sources */,
2639+
8A93F1402A70491D000ED6B3 /* ConstructorIOTrackQuizResultClick.swift in Sources */,
26072640
0885D84A257195620038AE96 /* ConstructorIOBrowseTests.swift in Sources */,
26082641
8D815F8C29413B31001E3DAE /* ConstructorIOTrackItemDetailLoadTests.swift in Sources */,
26092642
F60FE90A1F5C5B9D0037A0AB /* AutocompleteQueryRequestBuilderTests.swift in Sources */,
2643+
8A93F1462A79B365000ED6B3 /* TrackQuizResultsLoadedRequestBuilder.swift in Sources */,
26102644
F64F46A61F595B980094C697 /* CIOAutocompleteResponseParserTests.swift in Sources */,
26112645
08A7E41D257601CF000FA02F /* TrackBrowseResultsLoadedRequestBuilder.swift in Sources */,
26122646
BFBB2BB029231E2800C458FF /* ConstructorIOQuizIntegrationTests.swift in Sources */,
26132647
087F4BE0228B100E0058B467 /* ConstructorIOTrackConversionTests.swift in Sources */,
26142648
F6D110BD21E50C7600094D71 /* AbstractAutocompleteViewModel+Mock.swift in Sources */,
26152649
8D03087C2A1EDB0C0084AB85 /* ConstructorIOBrowseFacetOptionsTests.swift in Sources */,
26162650
F64E94DD212D7EC300E50EDE /* ConstructorIOTrackSearchResultsLoadedTests.swift in Sources */,
2651+
8A93F1482A79C530000ED6B3 /* TrackQuizResultClickRequestBuilder.swift in Sources */,
26172652
F6D86B16216BAD7F00077388 /* ConstructorIOSearchTests.swift in Sources */,
26182653
F6EC29B421762BD700DCFA07 /* NoSessionLoader.swift in Sources */,
26192654
089399DF2161B92600BFE3D9 /* TrackInputFocusRequestBuilderTests.swift in Sources */,
26202655
F66B216921DF8A8C00AAB030 /* SearchBarTextFieldTests.swift in Sources */,
26212656
089399E32161C67D00BFE3D9 /* TrackSearchResultsLoadedRequestBuilder.swift in Sources */,
2657+
8A93F1422A797E13000ED6B3 /* ConstructorIOTrackQuizResultsLoadedTests.swift in Sources */,
26222658
F64F46AD1F5963AF0094C697 /* Bundle+Test.swift in Sources */,
26232659
8AE142A12A538384003E7E0E /* BrowseResponseParserTest.swift in Sources */,
26242660
7DDA7D9728DCFDC4004C8AC8 /* QuizzesQueryRequestBuilderTests.swift in Sources */,

AutocompleteClient/Constants/Constants.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,18 @@ struct Constants {
253253
static let format = "%@/v2/behavioral_action/purchase"
254254
}
255255

256+
struct trackQuizResultsLoaded {
257+
static let format = "%@/v2/behavioral_action/quiz_result_load"
258+
}
259+
260+
struct trackQuizResultClick {
261+
static let format = "%@/v2/behavioral_action/quiz_result_click"
262+
}
263+
264+
struct trackQuizConversion {
265+
static let format = "%@/v2/behavioral_action/quiz_conversion"
266+
}
267+
256268
struct Logging {
257269
private static let prefix = "[ConstructorIO]:"
258270
private static let format: (_ message: String) -> String = { message in return "\(Logging.prefix) \(message)" }
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
//
2+
// CIOTrackQuizConversionData.swift
3+
// Constructor.io
4+
//
5+
// Copyright © Constructor.io. All rights reserved.
6+
// http://constructor.io/
7+
//
8+
9+
import Foundation
10+
11+
/**
12+
Struct encapsulating the parameters that must/can be set set in order to track quiz conversion
13+
*/
14+
struct CIOTrackQuizConversionData: CIORequestData {
15+
16+
let quizID: String
17+
let quizVersionID: String
18+
let quizSessionID: String
19+
let customerID: String
20+
let variationID: String?
21+
let itemName: String?
22+
let revenue: Double?
23+
let conversionType: String?
24+
let isCustomType: Bool?
25+
let displayName: String?
26+
var sectionName: String?
27+
28+
func url(with baseURL: String) -> String {
29+
return String(format: Constants.trackQuizConversion.format, baseURL)
30+
}
31+
32+
init(quizID: String, quizVersionID: String, quizSessionID: String, customerID: String, variationID: String? = nil, itemName: String? = nil, revenue: Double? = nil, conversionType: String? = nil, isCustomType: Bool? = nil, displayName: String? = nil, sectionName: String? = nil) {
33+
self.quizID = quizID
34+
self.quizVersionID = quizVersionID
35+
self.quizSessionID = quizSessionID
36+
self.customerID = customerID
37+
self.variationID = variationID
38+
self.itemName = itemName
39+
self.revenue = revenue
40+
self.conversionType = conversionType
41+
self.isCustomType = isCustomType
42+
self.displayName = displayName
43+
self.sectionName = sectionName
44+
}
45+
46+
func decorateRequest(requestBuilder: RequestBuilder) {
47+
requestBuilder.set(autocompleteSection: self.sectionName)
48+
}
49+
50+
func httpMethod() -> String {
51+
return "POST"
52+
}
53+
54+
func httpBody(baseParams: [String: Any]) -> Data? {
55+
var dict = [
56+
"quiz_id": self.quizID,
57+
"quiz_version_id": self.quizVersionID,
58+
"quiz_session_id": self.quizSessionID,
59+
"item_id": self.customerID,
60+
] as [String: Any]
61+
62+
if self.variationID != nil {
63+
dict["variation_id"] = self.variationID
64+
}
65+
if self.itemName != nil {
66+
dict["item_name"] = self.itemName
67+
}
68+
if self.revenue != nil {
69+
dict["revenue"] = String(self.revenue!)
70+
}
71+
if self.conversionType != nil {
72+
dict["type"] = self.conversionType
73+
}
74+
if self.isCustomType != nil {
75+
dict["is_custom_type"] = self.isCustomType
76+
}
77+
if self.displayName != nil {
78+
dict["display_name"] = self.displayName
79+
}
80+
81+
dict["beacon"] = true
82+
dict.merge(baseParams) { current, _ in current }
83+
84+
return try? JSONSerialization.data(withJSONObject: dict)
85+
}
86+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
//
2+
// CIOTrackQuizResultClickData.swift
3+
// Constructor.io
4+
//
5+
// Copyright © Constructor.io. All rights reserved.
6+
// http://constructor.io/
7+
//
8+
9+
import Foundation
10+
11+
/**
12+
Struct encapsulating the parameters that must/can be set set in order to track quiz result click
13+
*/
14+
struct CIOTrackQuizResultClickData: CIORequestData {
15+
16+
let quizID: String
17+
let quizVersionID: String
18+
let quizSessionID: String
19+
let customerID: String
20+
let variationID: String?
21+
let itemName: String?
22+
let resultID: String?
23+
let resultPage: Int?
24+
let resultCount: Int?
25+
let numResultsPerPage: Int?
26+
let resultPositionOnPage: Int?
27+
var sectionName: String?
28+
29+
func url(with baseURL: String) -> String {
30+
return String(format: Constants.trackQuizResultClick.format, baseURL)
31+
}
32+
33+
init(quizID: String, quizVersionID: String, quizSessionID: String, customerID: String, variationID: String? = nil, itemName: String? = nil, resultID: String? = nil, resultPage: Int? = nil, resultCount: Int? = nil, numResultsPerPage: Int? = nil, resultPositionOnPage: Int? = nil, sectionName: String? = nil) {
34+
self.quizID = quizID
35+
self.quizVersionID = quizVersionID
36+
self.quizSessionID = quizSessionID
37+
self.customerID = customerID
38+
self.variationID = variationID
39+
self.itemName = itemName
40+
self.resultID = resultID
41+
self.resultPage = resultPage
42+
self.resultCount = resultCount
43+
self.numResultsPerPage = numResultsPerPage
44+
self.resultPositionOnPage = resultPositionOnPage
45+
self.sectionName = sectionName
46+
}
47+
48+
func decorateRequest(requestBuilder: RequestBuilder) {
49+
requestBuilder.set(autocompleteSection: self.sectionName)
50+
}
51+
52+
func httpMethod() -> String {
53+
return "POST"
54+
}
55+
56+
func httpBody(baseParams: [String: Any]) -> Data? {
57+
var dict = [
58+
"quiz_id": self.quizID,
59+
"quiz_version_id": self.quizVersionID,
60+
"quiz_session_id": self.quizSessionID,
61+
"item_id": self.customerID,
62+
] as [String: Any]
63+
64+
if self.variationID != nil {
65+
dict["variation_id"] = self.variationID
66+
}
67+
if self.itemName != nil {
68+
dict["item_name"] = self.itemName
69+
}
70+
if self.resultID != nil {
71+
dict["result_id"] = self.resultID
72+
}
73+
if self.resultPage != nil {
74+
dict["result_page"] = Int(self.resultPage!)
75+
}
76+
if self.resultCount != nil {
77+
dict["result_count"] = Int(self.resultCount!)
78+
}
79+
if self.numResultsPerPage != nil {
80+
dict["num_results_per_page"] = Int(self.numResultsPerPage!)
81+
}
82+
if self.resultPositionOnPage != nil {
83+
dict["result_position_on_page"] = Int(self.resultPositionOnPage!)
84+
}
85+
86+
dict["beacon"] = true
87+
dict.merge(baseParams) { current, _ in current }
88+
89+
return try? JSONSerialization.data(withJSONObject: dict)
90+
}
91+
}

0 commit comments

Comments
 (0)