2015-03-26 00:33:54 +00:00
|
|
|
/**
|
|
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* This source code is licensed under the BSD-style license found in the
|
|
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#import "RCTDevMenu.h"
|
|
|
|
|
|
|
|
#import "RCTRedBox.h"
|
|
|
|
#import "RCTRootView.h"
|
2015-04-02 14:33:21 +00:00
|
|
|
#import "RCTSourceCode.h"
|
2015-03-26 00:33:54 +00:00
|
|
|
|
|
|
|
@interface RCTDevMenu () <UIActionSheetDelegate> {
|
|
|
|
BOOL _liveReload;
|
|
|
|
}
|
|
|
|
|
2015-04-02 14:33:21 +00:00
|
|
|
@property (nonatomic, weak) RCTBridge *bridge;
|
2015-03-26 00:33:54 +00:00
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
@implementation RCTDevMenu
|
|
|
|
|
2015-04-02 14:33:21 +00:00
|
|
|
- (instancetype)initWithBridge:(RCTBridge *)bridge
|
2015-03-26 00:33:54 +00:00
|
|
|
{
|
|
|
|
if (self = [super init]) {
|
2015-04-02 14:33:21 +00:00
|
|
|
_bridge = bridge;
|
2015-03-26 00:33:54 +00:00
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)show
|
|
|
|
{
|
2015-04-02 14:33:21 +00:00
|
|
|
NSString *debugTitle = self.bridge.executorClass == Nil ? @"Enable Debugging" : @"Disable Debugging";
|
2015-03-26 00:33:54 +00:00
|
|
|
NSString *liveReloadTitle = _liveReload ? @"Disable Live Reload" : @"Enable Live Reload";
|
|
|
|
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"React Native: Development"
|
|
|
|
delegate:self
|
|
|
|
cancelButtonTitle:@"Cancel"
|
|
|
|
destructiveButtonTitle:nil
|
|
|
|
otherButtonTitles:@"Reload", debugTitle, liveReloadTitle, nil];
|
|
|
|
actionSheet.actionSheetStyle = UIBarStyleBlack;
|
2015-04-02 14:33:21 +00:00
|
|
|
[actionSheet showInView:[[[[UIApplication sharedApplication] keyWindow] rootViewController] view]];
|
2015-03-26 00:33:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
|
|
|
|
{
|
|
|
|
if (buttonIndex == 0) {
|
2015-04-02 14:33:21 +00:00
|
|
|
[self.bridge reload];
|
2015-03-26 00:33:54 +00:00
|
|
|
} else if (buttonIndex == 1) {
|
2015-04-02 14:33:21 +00:00
|
|
|
self.bridge.executorClass = self.bridge.executorClass == Nil ? NSClassFromString(@"RCTWebSocketExecutor") : nil;
|
|
|
|
[self.bridge reload];
|
2015-03-26 00:33:54 +00:00
|
|
|
} else if (buttonIndex == 2) {
|
|
|
|
_liveReload = !_liveReload;
|
|
|
|
[self _pollAndReload];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)_pollAndReload
|
|
|
|
{
|
|
|
|
if (_liveReload) {
|
2015-04-02 14:33:21 +00:00
|
|
|
RCTSourceCode *sourceCodeModule = self.bridge.modules[NSStringFromClass([RCTSourceCode class])];
|
|
|
|
NSURL *url = sourceCodeModule.scriptURL;
|
2015-03-26 00:33:54 +00:00
|
|
|
NSURL *longPollURL = [[NSURL alloc] initWithString:@"/onchange" relativeToURL:url];
|
|
|
|
[self performSelectorInBackground:@selector(_checkForUpdates:) withObject:longPollURL];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)_checkForUpdates:(NSURL *)URL
|
|
|
|
{
|
|
|
|
NSMutableURLRequest *longPollRequest = [NSMutableURLRequest requestWithURL:URL];
|
|
|
|
longPollRequest.timeoutInterval = 30;
|
|
|
|
NSHTTPURLResponse *response;
|
|
|
|
[NSURLConnection sendSynchronousRequest:longPollRequest returningResponse:&response error:nil];
|
|
|
|
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
if (_liveReload && response.statusCode == 205) {
|
|
|
|
[[RCTRedBox sharedInstance] dismiss];
|
2015-04-02 14:33:21 +00:00
|
|
|
[self.bridge reload];
|
2015-03-26 00:33:54 +00:00
|
|
|
}
|
|
|
|
[self _pollAndReload];
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|