Files
jitsi-meet/ios/sdk/src/dropbox/Dropbox.m
theluyuan 38ba663466
Some checks failed
Close stale issues and PRs / stale (push) Has been cancelled
init
2025-09-02 14:49:16 +08:00

181 lines
6.4 KiB
Objective-C

/*
* Copyright @ 2017-present Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import <React/RCTBridgeModule.h>
#import <ObjectiveDropboxOfficial/ObjectiveDropboxOfficial.h>
#import "Dropbox.h"
RCTPromiseResolveBlock currentResolve = nil;
RCTPromiseRejectBlock currentReject = nil;
@implementation Dropbox
+ (NSString *)getAppKey{
NSArray *urlTypes
= [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleURLTypes"];
for (NSDictionary<NSString *, NSArray *> *urlType in urlTypes) {
NSArray *urlSchemes = urlType[@"CFBundleURLSchemes"];
if (urlSchemes) {
for (NSString *urlScheme in urlSchemes) {
if (urlScheme && [urlScheme hasPrefix:@"db-"]) {
return [urlScheme substringFromIndex:3];
}
}
}
}
return nil;
}
RCT_EXPORT_MODULE();
+ (BOOL)requiresMainQueueSetup {
return NO;
}
- (NSDictionary *)constantsToExport {
BOOL enabled = [Dropbox getAppKey] != nil;
return @{
@"ENABLED": [NSNumber numberWithBool:enabled]
};
};
RCT_EXPORT_METHOD(authorize:(RCTPromiseResolveBlock)resolve
reject:(__unused RCTPromiseRejectBlock)reject) {
currentResolve = resolve;
currentReject = reject;
dispatch_async(dispatch_get_main_queue(), ^{
DBScopeRequest *scopeRequest = [[DBScopeRequest alloc] initWithScopeType:DBScopeTypeUser
scopes:@[]
includeGrantedScopes:NO];
[DBClientsManager authorizeFromControllerV2:[UIApplication sharedApplication]
controller:[[self class] topMostController]
loadingStatusDelegate:nil
openURL:^(NSURL *url) { [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil]; }
scopeRequest:scopeRequest];
});
}
RCT_EXPORT_METHOD(getDisplayName: (NSString *)token
resolve: (RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject) {
DBUserClient *client = [[DBUserClient alloc] initWithAccessToken:token];
[[client.usersRoutes getCurrentAccount] setResponseBlock:^(DBUSERSFullAccount *result, DBNilObject *routeError, DBRequestError *networkError) {
if (result) {
resolve(result.name.displayName);
} else {
NSString *msg = @"Failed!";
if (networkError) {
msg = [NSString stringWithFormat:@"Failed! Error: %@", networkError];
}
reject(@"getDisplayName", @"Failed", nil);
}
}];
}
RCT_EXPORT_METHOD(getSpaceUsage: (NSString *)token
resolve: (RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject) {
DBUserClient *client = [[DBUserClient alloc] initWithAccessToken:token];
[[client.usersRoutes getSpaceUsage] setResponseBlock:^(DBUSERSSpaceUsage *result, DBNilObject *routeError, DBRequestError *networkError) {
if (result) {
DBUSERSSpaceAllocation *allocation = result.allocation;
NSNumber *allocated = 0;
NSNumber *used = 0;
if ([allocation isIndividual]) {
allocated = allocation.individual.allocated;
used = result.used;
} else if ([allocation isTeam]) {
allocated = allocation.team.allocated;
used = allocation.team.used;
}
id objects[] = { used, allocated };
id keys[] = { @"used", @"allocated" };
NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects
forKeys:keys
count:2];
resolve(dictionary);
} else {
NSString *msg = @"Failed!";
if (networkError) {
msg = [NSString stringWithFormat:@"Failed! Error: %@", networkError];
}
reject(@"getSpaceUsage", msg, nil);
}
}];
}
+ (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
if (currentReject == nil || currentResolve == nil) {
return NO;
}
BOOL canHandle = [DBClientsManager handleRedirectURL:url completion:^(DBOAuthResult *authResult) {
if (authResult) {
if ([authResult isSuccess]) {
NSInteger msTimestamp = authResult.accessToken.tokenExpirationTimestamp * 1000;
NSDictionary *authInfo = @{@"token": authResult.accessToken.accessToken,
@"rToken": authResult.accessToken.refreshToken,
@"expireDate": @(msTimestamp)
};
currentResolve(authInfo);
} else {
NSString *msg;
if ([authResult isError]) {
msg = [NSString stringWithFormat:@"%@, error type: %zd", [authResult errorDescription], [authResult errorType]];
} else {
msg = @"OAuth canceled!";
}
currentReject(@"authorize", msg, nil);
}
currentResolve = nil;
currentReject = nil;
}
}];
return canHandle;
}
+ (UIViewController *)topMostController {
UIViewController *topController
= [UIApplication sharedApplication].keyWindow.rootViewController;
while (topController.presentedViewController) {
topController = topController.presentedViewController;
}
return topController;
}
+ (void)setAppKey {
NSString *appKey = [self getAppKey];
if (appKey) {
[DBClientsManager setupWithAppKey:appKey];
}
}
@end