// // ShareViewController.m // iOS (Share Extension) // // Created by Tomek Wójcik on 25/09/2025. // #import #import "ShareViewController.h" #import "HPAPI.h" #import "HPCredentialsHelper.h" #import "HPShareExtensionHelper.h" @implementation ShareViewController (ShareViewControllerPrivate) #pragma mark - Private interface -(void)saveURL:(NSURL *)url { #ifdef DEBUG NSLog(@"-[ShareViewController save:] url=`%@`", url); #endif BOOL callResult = [self.api save:url completionHandler:^(NSString * _Nullable callId, HPRPCCallResult * _Nullable result) { dispatch_async(dispatch_get_main_queue(), ^{ self.savingView.hidden = YES; if (result.error != nil) { #ifdef DEBUG NSLog(@"-[ShareViewController resolveLinkAndSave] saveError=`%@`", result.error); #endif self.errorView.hidden = NO; } else { self.doneView.hidden = NO; } }); }]; if (callResult == NO) { self.savingView.hidden = YES; self.errorView.hidden = NO; } } -(void)resolveLinkAndSave { HPShareExtensionHelper *helper = [[HPShareExtensionHelper alloc] initWithContext:self.extensionContext]; [helper processItems:^(NSURL *url) { if (url == nil) { self.savingView.hidden = YES; self.unprocessableEntityView.hidden = NO; } else { [self saveURL:url]; } }]; } @end @implementation ShareViewController #pragma mark - View lifecycle -(void)viewDidLoad { [super viewDidLoad]; self.savingView.hidden = NO; self.needsSetupView.hidden = YES; self.doneView.hidden = YES; self.errorView.hidden = YES; self.unprocessableEntityView.hidden = YES; NSBundle *mainBundle = [NSBundle mainBundle]; self.unameLabel.text = [NSString stringWithFormat:@"HotPocket v%@ (%@)", [mainBundle.infoDictionary valueForKey:@"CFBundleShortVersionString"], [mainBundle.infoDictionary valueForKey:@"CFBundleVersion"]]; self.api = [[HPAPI alloc] init]; if (self.api.rpcClient.hasCredentials == YES) { self.savingView.hidden = NO; self.needsSetupView.hidden = YES; } else { self.savingView.hidden = YES; self.needsSetupView.hidden = NO; } } -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.progressIndicator startAnimating]; } -(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.progressIndicator stopAnimating]; } -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self.api checkAuth:^(BOOL authValid, NSError *error, NSString *callId) { dispatch_async(dispatch_get_main_queue(), ^{ if (authValid == NO) { #ifdef DEBUG NSLog(@"-[ShareViewController viewDidAppear:] checkAuthError=`%@`", error); #endif self.savingView.hidden = YES; self.needsSetupView.hidden = NO; } else { [self resolveLinkAndSave]; } }); }]; } #pragma mark - Actions -(IBAction)doCancel:(id)sender { NSError *cancelError = [NSError errorWithDomain:NSCocoaErrorDomain code:NSUserCancelledError userInfo:nil]; [self.extensionContext cancelRequestWithError:cancelError]; } -(IBAction)doClose:(id)sender { NSExtensionItem *outputItem = [[NSExtensionItem alloc] init]; NSArray *outputItems = @[outputItem]; [self.extensionContext completeRequestReturningItems:outputItems completionHandler:nil]; } @end