Skip to content

Commit 85aa198

Browse files
author
queue-it
committed
Preparing release 3.3.0
1 parent c38faa8 commit 85aa198

21 files changed

+950
-331
lines changed

QueueITLib/IOSUtils.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22
#import "QueueConsts.h"
33

44
@interface IOSUtils : NSObject
5+
56
+(NSString*)getUserId;
67
+(void)getUserAgent:(void (^)(NSString*))completionHandler;
78
+(NSString*)getLibraryVersion;
89
+(NSString*)getSdkVersion;
10+
+(NSString*)convertTtlMinutesToSecondsString:(int)ttlMinutes;
11+
912
@end

QueueITLib/IOSUtils.m

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#import "IOSUtils.h"
33

44
@implementation IOSUtils
5+
56
WKWebView* webView;
67

78
+(NSString*)getUserId{
@@ -42,4 +43,13 @@ +(NSString*)getSdkVersion{
4243
return SDKVersion;
4344
}
4445

46+
+(NSString*)convertTtlMinutesToSecondsString:(int)ttlMinutes
47+
{
48+
long currentTime = (long)(NSTimeInterval)([[NSDate date] timeIntervalSince1970]);
49+
int secondsToAdd = ttlMinutes * 60.0;
50+
long timeStamp = currentTime + secondsToAdd;
51+
NSString* urlTtlString = [NSString stringWithFormat:@"%li", timeStamp];
52+
return urlTtlString;
53+
}
54+
4555
@end

QueueITLib/QueueConsts.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33

44
#define QueueCloseUrl @"queueit://close"
55
#define QueueRestartSessionUrl @"queueit://restartSession"
6-
#define SDKVersion @"iOS-3.0.14";
6+
#define SDKVersion @"iOS-3.3.0";
77

88
#endif

QueueITLib/QueueITApiClient.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#import <Foundation/Foundation.h>
2+
#import "QueueStatus.h"
3+
4+
typedef void (^QueueServiceSuccess)(NSData *data);
5+
typedef void (^QueueServiceFailure)(NSError *error, NSString* errorMessage);
6+
7+
@interface QueueITApiClient: NSObject
8+
9+
+ (QueueITApiClient *)getInstance;
10+
+ (void) setTesting:(bool)enabled;
11+
12+
-(NSString*)enqueue:(NSString*)customerId
13+
eventOrAliasId:(NSString*)eventorAliasId
14+
userId:(NSString*)userId
15+
userAgent:(NSString*)userAgent
16+
sdkVersion:(NSString*)sdkVersion
17+
layoutName:(NSString*)layoutName
18+
language:(NSString*)language
19+
enqueueToken:(NSString*)enqueueToken
20+
enqueueKey:(NSString*)enqueueKey
21+
success:(void(^)(QueueStatus* queueStatus))success
22+
failure:(QueueServiceFailure)failure;
23+
24+
@end

QueueITLib/QueueITApiClient.m

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
#import "QueueITApiClient.h"
2+
#import "QueueITApiClient_NSURLConnection.h"
3+
4+
static QueueITApiClient *SharedInstance;
5+
6+
static NSString * const API_ROOT = @"https://%@.queue-it.net/api/mobileapp/queue";
7+
static NSString * const TESTING_API_ROOT = @"https://%@.test.queue-it.net/api/mobileapp/queue";
8+
static bool testingIsEnabled = NO;
9+
10+
@implementation QueueITApiClient
11+
12+
+ (QueueITApiClient *)getInstance
13+
{
14+
static dispatch_once_t onceToken;
15+
dispatch_once(&onceToken, ^{
16+
SharedInstance = [[QueueITApiClient_NSURLConnection alloc] init];
17+
});
18+
19+
return SharedInstance;
20+
}
21+
22+
+ (void) setTesting:(bool)enabled
23+
{
24+
testingIsEnabled = enabled;
25+
}
26+
27+
-(NSString*)enqueue:(NSString *)customerId
28+
eventOrAliasId:(NSString *)eventorAliasId
29+
userId:(NSString *)userId
30+
userAgent:(NSString *)userAgent
31+
sdkVersion:(NSString*)sdkVersion
32+
layoutName:(NSString*)layoutName
33+
language:(NSString*)language
34+
enqueueToken:(NSString*)enqueueToken
35+
enqueueKey:(NSString*)enqueueKey
36+
success:(void (^)(QueueStatus *))success
37+
failure:(QueueServiceFailure)failure
38+
{
39+
NSMutableDictionary* bodyDict = [[NSMutableDictionary alloc] init];
40+
[bodyDict setObject:userId forKey:@"userId"];
41+
[bodyDict setObject:userAgent forKey:@"userAgent"];
42+
[bodyDict setObject:sdkVersion forKey:@"sdkVersion"];
43+
44+
if(layoutName){
45+
[bodyDict setObject:layoutName forKey:@"layoutName"];
46+
}
47+
48+
if(language){
49+
[bodyDict setObject:language forKey:@"language"];
50+
}
51+
52+
if(enqueueToken){
53+
[bodyDict setObject:enqueueToken forKey:@"enqueueToken"];
54+
}
55+
56+
if(enqueueKey){
57+
[bodyDict setObject:enqueueKey forKey:@"enqueueKey"];
58+
}
59+
60+
NSString* urlAsString;
61+
if(testingIsEnabled){
62+
urlAsString = [NSString stringWithFormat:TESTING_API_ROOT, customerId];
63+
}else{
64+
urlAsString = [NSString stringWithFormat:API_ROOT, customerId];
65+
}
66+
urlAsString = [urlAsString stringByAppendingString:[NSString stringWithFormat:@"/%@", customerId]];
67+
urlAsString = [urlAsString stringByAppendingString:[NSString stringWithFormat:@"/%@", eventorAliasId]];
68+
urlAsString = [urlAsString stringByAppendingString:[NSString stringWithFormat:@"/enqueue"]];
69+
70+
return [self submitPOSTPath:urlAsString body:bodyDict
71+
success:^(NSData *data)
72+
{
73+
NSError *error = nil;
74+
NSDictionary *userDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
75+
if (userDict && [userDict isKindOfClass:[NSDictionary class]])
76+
{
77+
QueueStatus* queueStatus = [[QueueStatus alloc] initWithDictionary:userDict];
78+
79+
if (success != NULL) {
80+
success(queueStatus);
81+
}
82+
} else if (success != NULL) {
83+
success(NULL);
84+
}
85+
}
86+
failure:^(NSError *error, NSString* errorMessage)
87+
{
88+
failure(error, errorMessage);
89+
}
90+
];
91+
}
92+
93+
- (NSString *)submitPOSTPath:(NSString *)path
94+
body:(NSDictionary *)bodyDict
95+
success:(QueueServiceSuccess)success
96+
failure:(QueueServiceFailure)failure
97+
{
98+
NSURL *url = [NSURL URLWithString:path];
99+
return [self submitRequestWithURL:url
100+
method:@"POST"
101+
body:bodyDict
102+
expectedStatus:200
103+
success:success
104+
failure:failure];
105+
}
106+
107+
#pragma mark - Abstract methods
108+
- (NSString *)submitRequestWithURL:(NSURL *)URL
109+
method:(NSString *)httpMethod
110+
body:(NSDictionary *)bodyDict
111+
expectedStatus:(NSInteger)expectedStatus
112+
success:(QueueServiceSuccess)success
113+
failure:(QueueServiceFailure)failure
114+
{
115+
return nil;
116+
}
117+
118+
@end
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#import <Foundation/Foundation.h>
2+
#import "QueueITApiClient.h"
3+
4+
@interface QueueITApiClient_NSURLConnection : QueueITApiClient
5+
6+
@end
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#import "QueueITApiClient_NSURLConnection.h"
2+
#import "QueueITApiClient_NSURLConnectionRequest.h"
3+
4+
@interface QueueITApiClient_NSURLConnection()<QueueService_NSURLConnectionRequestDelegate>
5+
@end
6+
7+
8+
@implementation QueueITApiClient_NSURLConnection
9+
10+
- (NSString *)submitRequestWithURL:(NSURL *)URL
11+
method:(NSString *)httpMethod
12+
body:(NSDictionary *)bodyDict
13+
expectedStatus:(NSInteger)expectedStatus
14+
success:(QueueServiceSuccess)success
15+
failure:(QueueServiceFailure)failure
16+
{
17+
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
18+
[request setHTTPMethod:httpMethod];
19+
20+
NSError *error;
21+
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:bodyDict
22+
options:0
23+
error:&error];
24+
[request setHTTPBody: jsonData];
25+
[request addValue:@"application/json" forHTTPHeaderField:@"Accept"];
26+
[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
27+
28+
QueueITApiClient_NSURLConnectionRequest *connectionRequest;
29+
connectionRequest = [[QueueITApiClient_NSURLConnectionRequest alloc] initWithRequest:request
30+
expectedStatusCode:expectedStatus
31+
success:success
32+
failure:failure
33+
delegate:self];
34+
35+
NSString *connectionID = [connectionRequest uniqueIdentifier];
36+
37+
return connectionID;
38+
}
39+
40+
#pragma mark - NSURLConnectionRequestDelegate
41+
42+
- (void)requestDidComplete:(QueueITApiClient_NSURLConnectionRequest *)request
43+
{
44+
}
45+
46+
@end
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#import <Foundation/Foundation.h>
2+
#import "QueueITApiClient.h"
3+
4+
@protocol QueueService_NSURLConnectionRequestDelegate;
5+
6+
@interface QueueITApiClient_NSURLConnectionRequest : NSObject<NSURLConnectionDelegate, NSURLConnectionDataDelegate>
7+
8+
- (NSString *)uniqueIdentifier;
9+
10+
- (instancetype)initWithRequest:(NSURLRequest *)request
11+
expectedStatusCode:(NSInteger)statusCode
12+
success:(QueueServiceSuccess)success
13+
failure:(QueueServiceFailure)failure
14+
delegate:(id<QueueService_NSURLConnectionRequestDelegate>)delegate;
15+
16+
@end
17+
18+
@protocol QueueService_NSURLConnectionRequestDelegate <NSObject>
19+
- (void)requestDidComplete:(QueueITApiClient_NSURLConnectionRequest *)request;
20+
@end
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
#import "QueueITApiClient_NSURLConnectionRequest.h"
2+
3+
4+
@interface QueueITApiClient_NSURLConnectionRequest()
5+
6+
@property (nonatomic, strong) NSURLConnection *connection;
7+
@property (nonatomic, strong) NSURLRequest *request;
8+
@property (nonatomic, strong) NSURLResponse *response;
9+
@property (nonatomic, strong) NSMutableData *data;
10+
@property (nonatomic, copy) QueueServiceSuccess successCallback;
11+
@property (nonatomic, copy) QueueServiceFailure failureCallback;
12+
@property (nonatomic, weak) id<QueueService_NSURLConnectionRequestDelegate> delegate;
13+
@property (nonatomic, strong) NSString *uniqueIdentifier;
14+
@property (nonatomic, assign) NSInteger expectedStatusCode;
15+
@property (nonatomic, assign) NSInteger actualStatusCode;
16+
17+
@end
18+
19+
@implementation QueueITApiClient_NSURLConnectionRequest
20+
21+
- (instancetype)initWithRequest:(NSURLRequest *)request
22+
expectedStatusCode:(NSInteger)statusCode
23+
success:(QueueServiceSuccess)success
24+
failure:(QueueServiceFailure)failure
25+
delegate:(id<QueueService_NSURLConnectionRequestDelegate>)delegate
26+
{
27+
if ((self = [super init])) {
28+
self.request = request;
29+
self.expectedStatusCode = statusCode;
30+
self.successCallback = success;
31+
self.failureCallback = failure;
32+
self.uniqueIdentifier = [[NSUUID UUID] UUIDString];
33+
self.delegate = delegate;
34+
35+
[self initiateRequest];
36+
}
37+
38+
return self;
39+
}
40+
41+
- (void)initiateRequest
42+
{
43+
self.response = nil;
44+
self.data = [NSMutableData data];
45+
self.actualStatusCode = NSNotFound;
46+
#pragma GCC diagnostic push
47+
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
48+
self.connection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self];
49+
#pragma GCC diagnostic pop
50+
}
51+
52+
#pragma mark - NSURLConnectionDelegate
53+
54+
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
55+
{
56+
dispatch_async(dispatch_get_main_queue(), ^{
57+
self.failureCallback(error, @"Unexpected failure occured.");
58+
});
59+
60+
[self.delegate requestDidComplete:self];
61+
}
62+
63+
#pragma mark - NSURLConnectionDataDelegate
64+
65+
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
66+
{
67+
self.response = response;
68+
NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];
69+
self.actualStatusCode = responseCode;
70+
}
71+
72+
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
73+
{
74+
[self appendData:data];
75+
}
76+
77+
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
78+
{
79+
if ([self hasExpectedStatusCode]) {
80+
dispatch_async(dispatch_get_main_queue(), ^{
81+
self.successCallback(self.data);
82+
});
83+
}
84+
else {
85+
NSString *message = [NSString stringWithFormat:@"Unexpected response code: %li", (long)self.actualStatusCode];
86+
87+
if (self.actualStatusCode >= 400 && self.actualStatusCode < 500)
88+
{
89+
message = [NSString stringWithCString:[self.data bytes] encoding:NSASCIIStringEncoding];
90+
}
91+
else
92+
{
93+
if (self.data) {
94+
NSError *jsonError = nil;
95+
id json = [NSJSONSerialization JSONObjectWithData:self.data options:0 error:&jsonError];
96+
if (json && [json isKindOfClass:[NSDictionary class]]) {
97+
NSString *errorMessage = [(NSDictionary *)json valueForKey:@"error"];
98+
if (errorMessage) {
99+
message = errorMessage;
100+
}
101+
}
102+
}
103+
}
104+
105+
NSError *error = [NSError errorWithDomain:@"QueueService"
106+
code:self.actualStatusCode
107+
userInfo:@{ NSLocalizedDescriptionKey: message }];
108+
109+
dispatch_async(dispatch_get_main_queue(), ^{
110+
self.failureCallback(error, message);
111+
});
112+
}
113+
114+
[self.delegate requestDidComplete:self];
115+
}
116+
117+
#pragma mark - Private helpers
118+
119+
- (void)appendData:(NSData *)data
120+
{
121+
[self.data appendData:data];
122+
}
123+
124+
- (BOOL)hasExpectedStatusCode
125+
{
126+
if (self.actualStatusCode != NSNotFound) {
127+
return self.expectedStatusCode == self.actualStatusCode;
128+
}
129+
130+
return NO;
131+
}
132+
133+
@end

0 commit comments

Comments
 (0)