commit 1d0494faf58bca253759861fb5818c032760a167 Author: QuDian Date: Wed Nov 14 18:50:40 2018 +0800 first commit diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..eb39591 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.pbxproj -text \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9cadbfe --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ + +# OSX +# +.DS_Store + +# node.js +# +node_modules/ +npm-debug.log +yarn-error.log + + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +project.xcworkspace + + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml + +# BUCK +buck-out/ +\.buckd/ +*.keystore + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..61886fc --- /dev/null +++ b/README.md @@ -0,0 +1,45 @@ + +# react-native-dialog + +## Getting started + +`$ npm install react-native-dialog --save` + +### Mostly automatic installation + +`$ react-native link react-native-dialog` + +### Manual installation + + +#### iOS + +1. In XCode, in the project navigator, right click `Libraries` ➜ `Add Files to [your project's name]` +2. Go to `node_modules` ➜ `react-native-dialog` and add `RNDialog.xcodeproj` +3. In XCode, in the project navigator, select your project. Add `libRNDialog.a` to your project's `Build Phases` ➜ `Link Binary With Libraries` +4. Run your project (`Cmd+R`)< + +#### Android + +1. Open up `android/app/src/main/java/[...]/MainActivity.java` + - Add `import com.qudian.quxuexi.RNDialogPackage;` to the imports at the top of the file + - Add `new RNDialogPackage()` to the list returned by the `getPackages()` method +2. Append the following lines to `android/settings.gradle`: + ``` + include ':react-native-dialog' + project(':react-native-dialog').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-dialog/android') + ``` +3. Insert the following lines inside the dependencies block in `android/app/build.gradle`: + ``` + compile project(':react-native-dialog') + ``` + + +## Usage +```javascript +import RNDialog from 'react-native-dialog'; + +// TODO: What to do with the module? +RNDialog; +``` + \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..a28f0dd --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,36 @@ + +buildscript { + repositories { + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:1.3.1' + } +} + +apply plugin: 'com.android.library' + +android { + compileSdkVersion 23 + buildToolsVersion "23.0.1" + + defaultConfig { + minSdkVersion 16 + targetSdkVersion 22 + versionCode 1 + versionName "1.0" + } + lintOptions { + abortOnError false + } +} + +repositories { + mavenCentral() +} + +dependencies { + compile 'com.facebook.react:react-native:+' +} + \ No newline at end of file diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a865dfa --- /dev/null +++ b/android/src/main/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/android/src/main/java/com/qudian/quxuexi/RNDialogModule.java b/android/src/main/java/com/qudian/quxuexi/RNDialogModule.java new file mode 100644 index 0000000..ecba50a --- /dev/null +++ b/android/src/main/java/com/qudian/quxuexi/RNDialogModule.java @@ -0,0 +1,22 @@ + +package com.qudian.quxuexi; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.Callback; + +public class RNDialogModule extends ReactContextBaseJavaModule { + + private final ReactApplicationContext reactContext; + + public RNDialogModule(ReactApplicationContext reactContext) { + super(reactContext); + this.reactContext = reactContext; + } + + @Override + public String getName() { + return "RNDialog"; + } +} \ No newline at end of file diff --git a/android/src/main/java/com/qudian/quxuexi/RNDialogPackage.java b/android/src/main/java/com/qudian/quxuexi/RNDialogPackage.java new file mode 100644 index 0000000..5629f77 --- /dev/null +++ b/android/src/main/java/com/qudian/quxuexi/RNDialogPackage.java @@ -0,0 +1,28 @@ + +package com.qudian.quxuexi; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import com.facebook.react.ReactPackage; +import com.facebook.react.bridge.NativeModule; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.uimanager.ViewManager; +import com.facebook.react.bridge.JavaScriptModule; +public class RNDialogPackage implements ReactPackage { + @Override + public List createNativeModules(ReactApplicationContext reactContext) { + return Arrays.asList(new RNDialogModule(reactContext)); + } + + // Deprecated from RN 0.47 + public List> createJSModules() { + return Collections.emptyList(); + } + + @Override + public List createViewManagers(ReactApplicationContext reactContext) { + return Collections.emptyList(); + } +} \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..d0dd9aa --- /dev/null +++ b/index.js @@ -0,0 +1,47 @@ + +import {NativeModules, Platform} from 'react-native'; + +let handler; +if (Platform.OS === 'ios') { + handler = NativeModules.QXXDialogModule; +} else { + handler = NativeModules.QXXDialogModule; +} + +/** + * 调用Dialog + */ +function showContentDialog(title, content, confirmStr, canBack, touchOutSideDismiss) { + return handler.showContentDialog(title, content, confirmStr, canBack, touchOutSideDismiss); +} + +function showInfoDialog(title, content, confirmStr, cancelStr, canBack, touchOutSideDismiss) { + return handler.showInfoDialog(title, content, confirmStr, cancelStr, canBack, touchOutSideDismiss); +} + +function showLoadingDialog(title) { + if (Platform.OS === 'ios') { + handler.showLoadingDialog(title); + } else { + console.log(handler) + handler.showLoadingDialog(title); + } + +} + +function hideLoadingDialog() { + if (Platform.OS === 'ios') { + handler.hideLoadingDialog(); + } else { + handler.hideLoadingDialog(); + } + +} + + +export default { + showInfoDialog, + showContentDialog, + showLoadingDialog, + hideLoadingDialog +} diff --git a/ios/RNDialog.h b/ios/RNDialog.h new file mode 100644 index 0000000..ef40413 --- /dev/null +++ b/ios/RNDialog.h @@ -0,0 +1,11 @@ + +#if __has_include("RCTBridgeModule.h") +#import "RCTBridgeModule.h" +#else +#import +#endif + +@interface RNDialog : NSObject + +@end + \ No newline at end of file diff --git a/ios/RNDialog.m b/ios/RNDialog.m new file mode 100644 index 0000000..262c0fd --- /dev/null +++ b/ios/RNDialog.m @@ -0,0 +1,91 @@ +// +// QXXRectDialogModule.m +// QuXueXiTeacherRN +// +// Created by QuDian on 2018/11/5. +// Copyright © 2018年 Facebook. All rights reserved. +// + +#import "RNDialog.h" +#import +#import +#import +#import +#import "ScottAlertController.h" +#import "UIViewController+QXXViewController.h" +@interface RNDialog () + +@end +@implementation RNDialog + +RCT_EXPORT_MODULE() + +- (dispatch_queue_t)methodQueue { + return dispatch_get_main_queue(); +} + ++ (BOOL)requiresMainQueueSetup { + return YES; +} + +RCT_EXPORT_METHOD(showLoadingDialog:(NSString*)title) +{ + UIView* view = [RNDialog getCurrentNavTopViewController].view; + MBProgressHUD* progressHUD = [[MBProgressHUD alloc] initWithFrame:view.bounds]; + progressHUD.mode = MBProgressHUDModeIndeterminate; + progressHUD.removeFromSuperViewOnHide = YES; + progressHUD.center = view.center; + progressHUD.label.text = title; + [view addSubview:progressHUD]; + [progressHUD showAnimated:YES]; +} + +RCT_EXPORT_METHOD(hideLoadingDialog) +{ + UIView* view = [RNDialog getCurrentNavTopViewController].view; + [MBProgressHUD hideAllHUDsForView:view animated:YES]; + +} +RCT_EXPORT_METHOD(showContentDialog:(NSString*)title content:(NSString*)content buttonText:(NSString*)buttonText canBack:(BOOL)canBack canDismiss:(BOOL)canDismiss) +{ + ScottAlertView *alertView = [ScottAlertView alertViewWithTitle:title message:content]; + alertView.buttonDestructiveBgColor = [UIColor whiteColor]; + alertView.buttonDestructiveTextColor = [UIColor grayColor]; + alertView.layer.masksToBounds = YES; + alertView.layer.cornerRadius = 8.0; + ScottAlertAction *action = [ScottAlertAction actionWithTitle:buttonText style:ScottAlertActionStyleDestructive handler:nil]; + [alertView addAction:action]; + + [ScottShowAlertView showAlertViewWithView:alertView backgroundDismissEnable:canDismiss]; + + +} + ++ (UIViewController *)getCurrentNavTopViewController { + UIWindow *rootWindow = nil; + // 此处不能通过 keywindow 简单获取, 应取 windows 中有 rootViewController 的 + for (UIWindow *window in [UIApplication sharedApplication].windows) { + if ([window.rootViewController isKindOfClass:[UITabBarController class]]) { + // 现有框架是以 tabBarController 作为根控制器的 + rootWindow = window; + break; + } + } + if ([UIApplication sharedApplication].keyWindow && (rootWindow == nil)) { + rootWindow = [UIApplication sharedApplication].keyWindow; + NSAssert(rootWindow != nil, @"获取当前程序window的根控制器出错"); + } + UIViewController *topViewController = rootWindow.rootViewController; + if ([topViewController isKindOfClass:[UITabBarController class]]) { + if ((((UITabBarController *)topViewController).selectedViewController)) { + topViewController = ((UITabBarController *)topViewController).selectedViewController; + } + } + if ([topViewController isKindOfClass:[UINavigationController class]]) { + if (((UINavigationController *)topViewController).topViewController) { + topViewController = ((UINavigationController *)topViewController).topViewController; + } + } + return topViewController; +} +@end diff --git a/ios/RNDialog.podspec b/ios/RNDialog.podspec new file mode 100644 index 0000000..cfc06da --- /dev/null +++ b/ios/RNDialog.podspec @@ -0,0 +1,24 @@ + +Pod::Spec.new do |s| + s.name = "RNDialog" + s.version = "1.0.0" + s.summary = "RNDialog" + s.description = <<-DESC + RNDialog + DESC + s.homepage = "" + s.license = "MIT" + # s.license = { :type => "MIT", :file => "FILE_LICENSE" } + s.author = { "author" => "author@domain.cn" } + s.platform = :ios, "7.0" + s.source = { :git => "https://github.com/author/RNDialog.git", :tag => "master" } + s.source_files = "RNDialog/**/*.{h,m}" + s.requires_arc = true + + + s.dependency "React" + #s.dependency "others" + s.dependency "MBProgressHUD" +end + + \ No newline at end of file diff --git a/ios/RNDialog.xcodeproj/project.pbxproj b/ios/RNDialog.xcodeproj/project.pbxproj new file mode 100644 index 0000000..358ad1f --- /dev/null +++ b/ios/RNDialog.xcodeproj/project.pbxproj @@ -0,0 +1,259 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + B3E7B58A1CC2AC0600A0062D /* RNDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = B3E7B5891CC2AC0600A0062D /* RNDialog.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 58B511D91A9E6C8500147676 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 134814201AA4EA6300B7C361 /* libRNDialog.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNDialog.a; sourceTree = BUILT_PRODUCTS_DIR; }; + B3E7B5881CC2AC0600A0062D /* RNDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RNDialog.h; sourceTree = ""; }; + B3E7B5891CC2AC0600A0062D /* RNDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNDialog.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 58B511D81A9E6C8500147676 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 134814211AA4EA7D00B7C361 /* Products */ = { + isa = PBXGroup; + children = ( + 134814201AA4EA6300B7C361 /* libRNDialog.a */, + ); + name = Products; + sourceTree = ""; + }; + 58B511D21A9E6C8500147676 = { + isa = PBXGroup; + children = ( + B3E7B5881CC2AC0600A0062D /* RNDialog.h */, + B3E7B5891CC2AC0600A0062D /* RNDialog.m */, + 134814211AA4EA7D00B7C361 /* Products */, + ); + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 58B511DA1A9E6C8500147676 /* RNDialog */ = { + isa = PBXNativeTarget; + buildConfigurationList = 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "RNDialog" */; + buildPhases = ( + 58B511D71A9E6C8500147676 /* Sources */, + 58B511D81A9E6C8500147676 /* Frameworks */, + 58B511D91A9E6C8500147676 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RNDialog; + productName = RCTDataManager; + productReference = 134814201AA4EA6300B7C361 /* libRNDialog.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 58B511D31A9E6C8500147676 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = Facebook; + TargetAttributes = { + 58B511DA1A9E6C8500147676 = { + CreatedOnToolsVersion = 6.1.1; + }; + }; + }; + buildConfigurationList = 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "RNDialog" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 58B511D21A9E6C8500147676; + productRefGroup = 58B511D21A9E6C8500147676; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 58B511DA1A9E6C8500147676 /* RNDialog */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 58B511D71A9E6C8500147676 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B3E7B58A1CC2AC0600A0062D /* RNDialog.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 58B511ED1A9E6C8500147676 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 58B511EE1A9E6C8500147676 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 58B511F01A9E6C8500147676 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(SRCROOT)/../../../React/**", + "$(SRCROOT)/../../react-native/React/**", + ); + LIBRARY_SEARCH_PATHS = "$(inherited)"; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = RNDialog; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 58B511F11A9E6C8500147676 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(SRCROOT)/../../../React/**", + "$(SRCROOT)/../../react-native/React/**", + ); + LIBRARY_SEARCH_PATHS = "$(inherited)"; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = RNDialog; + SKIP_INSTALL = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "RNDialog" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 58B511ED1A9E6C8500147676 /* Debug */, + 58B511EE1A9E6C8500147676 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "RNDialog" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 58B511F01A9E6C8500147676 /* Debug */, + 58B511F11A9E6C8500147676 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 58B511D31A9E6C8500147676 /* Project object */; +} diff --git a/ios/RNDialog.xcworkspace/contents.xcworkspacedata b/ios/RNDialog.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..8be807b --- /dev/null +++ b/ios/RNDialog.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,9 @@ +// !$*UTF8*$! + + + + + + \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..b8cba21 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ + +{ + "name": "react-native-dialog", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "react-native" + ], + "author": "", + "license": "", + "peerDependencies": { + "react-native": "^0.41.2" + } +}