You've already forked hotpocket
162 lines
6.0 KiB
Objective-C
162 lines
6.0 KiB
Objective-C
//
|
|
// AuthorizationProgressViewController.m
|
|
// HotPocket (iOS)
|
|
//
|
|
// Created by Tomek Wójcik on 25/09/2025.
|
|
//
|
|
|
|
#import "AuthorizationProgressViewController.h"
|
|
|
|
#import "AppDelegate.h"
|
|
#import "HPAuthFlow.h"
|
|
#import "HPCredentialsHelper.h"
|
|
#import "MultilineLabel.h"
|
|
#import "NSBundle+HotPocketExtensions.h"
|
|
|
|
@interface AuthorizationProgressViewController (AuthorizationProgressViewControllerPrivate)
|
|
|
|
#pragma mark - Private interface
|
|
|
|
-(void)presentAuthorizationError;
|
|
|
|
@end
|
|
|
|
@implementation AuthorizationProgressViewController
|
|
|
|
#pragma mark - View lifecycle
|
|
|
|
-(instancetype)initWithCoder:(NSCoder *)coder {
|
|
if (self = [super initWithCoder:coder]) {
|
|
self.authorizationURL = nil;
|
|
self.webAuthenticationSession = nil;
|
|
self.userCancelledSession = NO;
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
-(void)viewDidLoad {
|
|
[super viewDidLoad];
|
|
self.progressLabel.text = NSLocalizedString(@"Continue to sign in in your browser...", @"Continue to sign in in your browser...");
|
|
}
|
|
|
|
-(void)viewWillAppear:(BOOL)animated {
|
|
[super viewWillAppear:animated];
|
|
[self.progressIndicator startAnimating];
|
|
|
|
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
|
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
selector:@selector(onAuthFlowDidFinish:)
|
|
name:@"AuthFlowDidFinish"
|
|
object:appDelegate.authFlow];
|
|
|
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
selector:@selector(onAuthFlowDidReceiveAuthParams:)
|
|
name:@"AuthFlowDidReceiveAuthParams"
|
|
object:appDelegate.authFlow];
|
|
}
|
|
|
|
-(void)viewDidAppear:(BOOL)animated {
|
|
[super viewDidAppear:animated];
|
|
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
|
|
|
|
ASWebAuthenticationSessionCompletionHandler completionHandler = ^(NSURL *url, NSError *error) {
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
if (error != nil) {
|
|
#ifdef DEBUG
|
|
NSLog(@"[AuthorizationViewController.session completionHandler] error=`%@`", error);
|
|
#endif
|
|
if (error.code == ASWebAuthenticationSessionErrorCodeCanceledLogin) {
|
|
self.userCancelledSession = YES;
|
|
}
|
|
[self presentAuthorizationError];
|
|
} else {
|
|
HPAuthParams *receivedAuthParams = [appDelegate.authFlow handlePostAuthenticateURL:url];
|
|
if (receivedAuthParams != nil) {
|
|
[appDelegate.authFlow handleAuthParams:receivedAuthParams];
|
|
} else {
|
|
[self presentAuthorizationError];
|
|
}
|
|
}
|
|
|
|
self.webAuthenticationSession = nil;
|
|
});
|
|
};
|
|
|
|
ASWebAuthenticationSessionCallback *callback = [ASWebAuthenticationSessionCallback callbackWithCustomScheme:[NSBundle postAuthenticateURLScheme]];
|
|
self.webAuthenticationSession = [[ASWebAuthenticationSession alloc] initWithURL:self.authorizationURL
|
|
callback:callback
|
|
completionHandler:completionHandler];
|
|
self.webAuthenticationSession.presentationContextProvider = self;
|
|
#ifdef DEBUG
|
|
self.webAuthenticationSession.prefersEphemeralWebBrowserSession = YES;
|
|
#endif
|
|
|
|
if (self.webAuthenticationSession.canStart == NO) {
|
|
[self presentAuthorizationError];
|
|
return;
|
|
}
|
|
|
|
[self.webAuthenticationSession start];
|
|
}
|
|
|
|
-(void)viewDidDisappear:(BOOL)animated {
|
|
[super viewDidDisappear:animated];
|
|
self.webAuthenticationSession = nil;
|
|
|
|
[self.progressIndicator stopAnimating];
|
|
|
|
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
|
}
|
|
|
|
# pragma mark - Private interface
|
|
|
|
-(void)presentAuthorizationError {
|
|
if (self.userCancelledSession == NO) {
|
|
UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Oops!", @"Oops!")
|
|
message:NSLocalizedString(@"HotPocket couldn't complete this operation.", @"HotPocket couldn't complete this operation.")
|
|
preferredStyle:UIAlertControllerStyleAlert];
|
|
|
|
[alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Oh well", @"Oh well")
|
|
style:UIAlertActionStyleDefault
|
|
handler:^(UIAlertAction *action) {
|
|
[alert dismissViewControllerAnimated:YES completion:^{
|
|
[self.navigationController popViewControllerAnimated:YES];
|
|
}];
|
|
}]];
|
|
|
|
[self presentViewController:alert animated:YES completion:nil];
|
|
} else {
|
|
[self.navigationController popViewControllerAnimated:YES];
|
|
}
|
|
}
|
|
|
|
#pragma mark - Notification handlers
|
|
|
|
-(void)onAuthFlowDidFinish:(NSNotification *)notification {
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
#ifdef DEBUG
|
|
NSLog(@"-[AuthorizationViewController onAuthFlowDidFinish:] notification=`%@`", notification);
|
|
#endif
|
|
HPCredentials *credentials = [[HPCredentialsHelper sharedHelper] getCredentials];
|
|
|
|
if (credentials.usable == NO) {
|
|
[self presentAuthorizationError];
|
|
} else {
|
|
[self.navigationController popToRootViewControllerAnimated:YES];
|
|
}
|
|
});
|
|
}
|
|
|
|
-(void)onAuthFlowDidReceiveAuthParams:(NSNotification *)notification {
|
|
self.progressLabel.text = NSLocalizedString(@"Processing authorization...", @"Processing authorization...");
|
|
}
|
|
|
|
# pragma mark - ASWebAuthenticationPresentationContextProviding implementation
|
|
|
|
-(ASPresentationAnchor)presentationAnchorForWebAuthenticationSession:(ASWebAuthenticationSession *)session {
|
|
return self.view.window;
|
|
}
|
|
|
|
@end
|