├── .babelrc ├── .buckconfig ├── .editorconfig ├── .flowconfig ├── .gitattributes ├── .gitignore ├── .vscode └── settings.json ├── .watchmanconfig ├── README.md ├── android ├── app │ ├── BUCK │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ └── appcenter-config.json │ │ ├── java │ │ └── im │ │ │ └── rdev │ │ │ └── nowmobile │ │ │ ├── MainActivity.java │ │ │ └── MainApplication.java │ │ └── res │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_notification.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_notification.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_notification.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_notification.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_notification.png │ │ └── values │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── keystores │ ├── BUCK │ └── debug.keystore.properties └── settings.gradle ├── app.json ├── assets ├── go.png ├── gradient.jpg ├── instance-icon.png ├── now-white.png ├── plus.png ├── zeit-logo-white.png └── zeit-logo.png ├── flow-typed └── npm │ └── react-native-keyboard-aware-scroll-view_vx.x.x.js ├── index.js ├── ios ├── Now.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── Podfile ├── Podfile.lock ├── Pods │ ├── Alamofire │ │ ├── LICENSE │ │ ├── README.md │ │ └── Source │ │ │ ├── AFError.swift │ │ │ ├── Alamofire.swift │ │ │ ├── DispatchQueue+Alamofire.swift │ │ │ ├── MultipartFormData.swift │ │ │ ├── NetworkReachabilityManager.swift │ │ │ ├── Notifications.swift │ │ │ ├── ParameterEncoding.swift │ │ │ ├── Request.swift │ │ │ ├── Response.swift │ │ │ ├── ResponseSerialization.swift │ │ │ ├── Result.swift │ │ │ ├── ServerTrustPolicy.swift │ │ │ ├── SessionDelegate.swift │ │ │ ├── SessionManager.swift │ │ │ ├── TaskDelegate.swift │ │ │ ├── Timeline.swift │ │ │ └── Validation.swift │ ├── AppCenter │ │ └── AppCenter-SDK-Apple │ │ │ └── iOS │ │ │ ├── AppCenter.framework │ │ │ ├── AppCenter │ │ │ ├── Headers │ │ │ │ ├── AppCenter.h │ │ │ │ ├── MSAbstractLog.h │ │ │ │ ├── MSAppCenter.h │ │ │ │ ├── MSAppCenterErrors.h │ │ │ │ ├── MSChannelDelegate.h │ │ │ │ ├── MSChannelGroupProtocol.h │ │ │ │ ├── MSChannelProtocol.h │ │ │ │ ├── MSConstants.h │ │ │ │ ├── MSCustomProperties.h │ │ │ │ ├── MSDevice.h │ │ │ │ ├── MSEnable.h │ │ │ │ ├── MSLog.h │ │ │ │ ├── MSLogWithProperties.h │ │ │ │ ├── MSLogger.h │ │ │ │ ├── MSService.h │ │ │ │ ├── MSServiceAbstract.h │ │ │ │ ├── MSWrapperLogger.h │ │ │ │ └── MSWrapperSdk.h │ │ │ └── Modules │ │ │ │ └── module.modulemap │ │ │ ├── AppCenterAnalytics.framework │ │ │ ├── AppCenterAnalytics │ │ │ ├── Headers │ │ │ │ ├── AppCenterAnalytics.h │ │ │ │ ├── MSAbstractLog.h │ │ │ │ ├── MSAnalytics.h │ │ │ │ ├── MSAnalyticsTransmissionTarget.h │ │ │ │ ├── MSEventLog.h │ │ │ │ ├── MSLogWithNameAndProperties.h │ │ │ │ ├── MSLogWithProperties.h │ │ │ │ ├── MSService.h │ │ │ │ └── MSServiceAbstract.h │ │ │ └── Modules │ │ │ │ └── module.modulemap │ │ │ ├── AppCenterCrashes.framework │ │ │ ├── AppCenterCrashes │ │ │ ├── Headers │ │ │ │ ├── AppCenterCrashes.h │ │ │ │ ├── MSAbstractLog.h │ │ │ │ ├── MSCrashHandlerSetupDelegate.h │ │ │ │ ├── MSCrashes.h │ │ │ │ ├── MSCrashesDelegate.h │ │ │ │ ├── MSErrorAttachmentLog+Utility.h │ │ │ │ ├── MSErrorAttachmentLog.h │ │ │ │ ├── MSErrorReport.h │ │ │ │ ├── MSService.h │ │ │ │ ├── MSServiceAbstract.h │ │ │ │ └── MSWrapperCrashesHelper.h │ │ │ └── Modules │ │ │ │ └── module.modulemap │ │ │ └── LICENSE │ ├── AppCenterReactNativeShared │ │ └── AppCenterReactNativeShared │ │ │ ├── AppCenterReactNativeShared.framework │ │ │ ├── AppCenterReactNativeShared │ │ │ ├── Headers │ │ │ │ └── AppCenterReactNativeShared.h │ │ │ └── Modules │ │ │ │ └── module.modulemap │ │ │ └── LICENSE.md │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ └── project.pbxproj │ ├── SwiftyJSON │ │ ├── LICENSE │ │ ├── README.md │ │ └── Source │ │ │ └── SwiftyJSON.swift │ └── Target Support Files │ │ ├── Alamofire │ │ ├── Alamofire-dummy.m │ │ ├── Alamofire-prefix.pch │ │ ├── Alamofire-umbrella.h │ │ ├── Alamofire.modulemap │ │ ├── Alamofire.xcconfig │ │ └── Info.plist │ │ ├── Pods-WatchApp Extension │ │ ├── Info.plist │ │ ├── Pods-WatchApp Extension-acknowledgements.markdown │ │ ├── Pods-WatchApp Extension-acknowledgements.plist │ │ ├── Pods-WatchApp Extension-dummy.m │ │ ├── Pods-WatchApp Extension-frameworks.sh │ │ ├── Pods-WatchApp Extension-resources.sh │ │ ├── Pods-WatchApp Extension-umbrella.h │ │ ├── Pods-WatchApp Extension.debug.xcconfig │ │ ├── Pods-WatchApp Extension.modulemap │ │ └── Pods-WatchApp Extension.release.xcconfig │ │ ├── Pods-now │ │ ├── Info.plist │ │ ├── Pods-now-acknowledgements.markdown │ │ ├── Pods-now-acknowledgements.plist │ │ ├── Pods-now-dummy.m │ │ ├── Pods-now-frameworks.sh │ │ ├── Pods-now-resources.sh │ │ ├── Pods-now-umbrella.h │ │ ├── Pods-now.debug.xcconfig │ │ ├── Pods-now.modulemap │ │ └── Pods-now.release.xcconfig │ │ └── SwiftyJSON │ │ ├── Info.plist │ │ ├── SwiftyJSON-dummy.m │ │ ├── SwiftyJSON-prefix.pch │ │ ├── SwiftyJSON-umbrella.h │ │ ├── SwiftyJSON.modulemap │ │ └── SwiftyJSON.xcconfig ├── TodayExtension │ ├── Base.lproj │ │ └── MainInterface.storyboard │ ├── Info.plist │ ├── TodayExtension.entitlements │ ├── TodayViewController.swift │ └── WidgetTableRowController.swift ├── TodayUsageExtension │ ├── Base.lproj │ │ └── MainInterface.storyboard │ ├── Info.plist │ ├── TodayUsageExtension.entitlements │ └── TodayViewController.swift ├── WatchApp Extension │ ├── AliasRowController.swift │ ├── AliasesController.swift │ ├── Assets.xcassets │ │ ├── Complication.complicationset │ │ │ ├── Circular.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── Icon 4.png │ │ │ │ └── Icon 5.png │ │ │ ├── Contents.json │ │ │ ├── Extra Large.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── Icon 2.png │ │ │ │ └── Icon 3.png │ │ │ ├── Modular.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── Icon 6.png │ │ │ │ └── Icon 7.png │ │ │ └── Utilitarian.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── Icon 8.png │ │ │ │ └── Icon 9.png │ │ └── Contents.json │ ├── ComplicationController.swift │ ├── DeploymentGroup.swift │ ├── DeploymentRowController.swift │ ├── DeploymentsController.swift │ ├── ExtensionDelegate.swift │ ├── Info.plist │ ├── UsageController.swift │ └── Utils.swift ├── WatchApp │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── AppIcon24x24@2x.png │ │ │ ├── AppIcon27.5x27.5@2x.png │ │ │ ├── AppIcon40x40@2x.png │ │ │ ├── AppIcon44x44@2x.png │ │ │ ├── AppIcon58x58@2x.png │ │ │ ├── AppIcon86x86@2x.png │ │ │ ├── AppIcon87x87@3x.png │ │ │ ├── AppIcon98x98@2x.png │ │ │ ├── Contents.json │ │ │ └── ios-marketing-1024x1024-1x.png │ │ ├── Contents.json │ │ ├── instance.imageset │ │ │ ├── Contents.json │ │ │ ├── instance.png │ │ │ ├── instance@2x.png │ │ │ └── instance@3x.png │ │ └── zeit-logo.imageset │ │ │ ├── Contents.json │ │ │ └── zeit-logo.png │ ├── Base.lproj │ │ └── Interface.storyboard │ └── Info.plist ├── now-tvOS │ └── Info.plist ├── now-tvOSTests │ └── Info.plist ├── now.xcodeproj │ ├── project.pbxproj │ └── xcshareddata │ │ └── xcschemes │ │ ├── now-tvOS.xcscheme │ │ └── now.xcscheme ├── now │ ├── AppCenter-Config.plist │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Base.lproj │ │ └── LaunchScreen.xib │ ├── Images.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── ios-marketing-1024x1024-1x.png │ │ │ ├── ipad-20x20-1x.png │ │ │ ├── ipad-20x20-2x.png │ │ │ ├── ipad-29x29-1x.png │ │ │ ├── ipad-29x29-2x.png │ │ │ ├── ipad-40x40-1x.png │ │ │ ├── ipad-40x40-2x.png │ │ │ ├── ipad-50x50-1x.png │ │ │ ├── ipad-50x50-2x.png │ │ │ ├── ipad-72x72-1x.png │ │ │ ├── ipad-72x72-2x.png │ │ │ ├── ipad-76x76-1x.png │ │ │ ├── ipad-76x76-2x.png │ │ │ ├── ipad-83.5x83.5-2x.png │ │ │ ├── iphone-20x20-2x.png │ │ │ ├── iphone-20x20-3x.png │ │ │ ├── iphone-29x29-1x.png │ │ │ ├── iphone-29x29-2x.png │ │ │ ├── iphone-29x29-3x.png │ │ │ ├── iphone-40x40-2x.png │ │ │ ├── iphone-40x40-3x.png │ │ │ ├── iphone-57x57-1x.png │ │ │ ├── iphone-57x57-2x.png │ │ │ ├── iphone-60x60-2x.png │ │ │ └── iphone-60x60-3x.png │ │ ├── Contents.json │ │ ├── LaunchImage.launchimage │ │ │ ├── Contents.json │ │ │ ├── Default-568h@2x.png │ │ │ ├── Default-667h@2x.png │ │ │ ├── Default-Landscape-736h@3x.png │ │ │ ├── Default-Landscape-812h@3x.png │ │ │ ├── Default-Landscape.png │ │ │ ├── Default-Landscape@2x.png │ │ │ ├── Default-Portrait-736h@3x.png │ │ │ ├── Default-Portrait-812h@3x.png │ │ │ ├── Default-Portrait.png │ │ │ ├── Default-Portrait@2x.png │ │ │ └── Default@2x.png │ │ └── today-instance.imageset │ │ │ ├── Contents.json │ │ │ ├── instance.png │ │ │ ├── instance@2x.png │ │ │ └── instance@3x.png │ ├── Info.plist │ ├── main.m │ └── now.entitlements └── nowTests │ ├── Info.plist │ └── nowTests.m ├── package.json ├── src ├── App.js ├── Provider.js ├── components │ ├── Dropdown.js │ ├── EmptyResults.js │ ├── ErrorBoundary.js │ ├── Header.js │ ├── Logo.js │ ├── NetworkError.js │ ├── View.js │ ├── elements │ │ ├── AuthInput.js │ │ ├── DropdownRow.js │ │ ├── LoadingIndicator.js │ │ ├── TimeAgo.js │ │ ├── aliases │ │ │ ├── Alias.js │ │ │ ├── AliasGroup.js │ │ │ └── PathAlias.js │ │ ├── deployment-details │ │ │ ├── AddAliasButton.js │ │ │ ├── DeploymentAlias.js │ │ │ ├── Details.js │ │ │ ├── EventList.js │ │ │ ├── Item.js │ │ │ └── ScaleTable.js │ │ ├── deployments │ │ │ ├── Deployment.js │ │ │ └── DeploymentGroup.js │ │ ├── domains │ │ │ ├── Domain.js │ │ │ └── ExpireDate.js │ │ ├── history │ │ │ ├── HistoryItem.js │ │ │ ├── ItemComponents.js │ │ │ ├── ModeSwitcher.js │ │ │ └── messages │ │ │ │ ├── alias-chown.js │ │ │ │ ├── alias-delete.js │ │ │ │ ├── alias.js │ │ │ │ ├── avatar.js │ │ │ │ ├── cert-autorenew.js │ │ │ │ ├── cert-chown.js │ │ │ │ ├── cert-clone.js │ │ │ │ ├── cert-delete.js │ │ │ │ ├── cert-renew.js │ │ │ │ ├── cert-replace.js │ │ │ │ ├── cert.js │ │ │ │ ├── deployment-chown.js │ │ │ │ ├── deployment-delete.js │ │ │ │ ├── deployment-freeze.js │ │ │ │ ├── deployment-unfreeze.js │ │ │ │ ├── deployment.js │ │ │ │ ├── dns-add.js │ │ │ │ ├── dns-delete.js │ │ │ │ ├── dns-update.js │ │ │ │ ├── domain-buy.js │ │ │ │ ├── domain-chown.js │ │ │ │ ├── domain-delete.js │ │ │ │ ├── domain.js │ │ │ │ ├── index.js │ │ │ │ ├── login.js │ │ │ │ ├── message.js │ │ │ │ ├── plan.js │ │ │ │ ├── scale-auto.js │ │ │ │ ├── scale.js │ │ │ │ ├── secret-add.js │ │ │ │ ├── secret-delete.js │ │ │ │ ├── secret-rename.js │ │ │ │ ├── set-scale.js │ │ │ │ ├── team-avatar-update.js │ │ │ │ ├── team-delete.js │ │ │ │ ├── team-member-add.js │ │ │ │ ├── team-member-delete.js │ │ │ │ ├── team-member-role-update.js │ │ │ │ ├── team-name-update.js │ │ │ │ ├── team-slug-update.js │ │ │ │ ├── team.js │ │ │ │ └── username.js │ │ ├── settings │ │ │ ├── Button.js │ │ │ ├── Input.js │ │ │ ├── Profile.js │ │ │ ├── ProfilePic.js │ │ │ ├── RowText.js │ │ │ ├── Separator.js │ │ │ ├── SettingsRow.js │ │ │ ├── TouchId.js │ │ │ ├── UsageLimitInput.js │ │ │ └── UsageLimits.js │ │ └── usage │ │ │ └── UsageEntry.js │ └── views │ │ ├── Aliases.js │ │ ├── Deployments.js │ │ ├── Domains.js │ │ ├── History.js │ │ └── Usage.js ├── extensions │ ├── spotlight │ │ └── index.js │ └── today │ │ └── index.js ├── lib │ ├── api │ │ ├── actions │ │ │ ├── aliases.js │ │ │ ├── auth.js │ │ │ ├── deployments.js │ │ │ ├── domains.js │ │ │ ├── events.js │ │ │ ├── teams.js │ │ │ ├── usage.js │ │ │ └── user.js │ │ ├── index.js │ │ └── request.js │ ├── background-task.js │ ├── touch-id-prompt.js │ ├── useragent.js │ └── utils.js └── screens │ ├── Authentication.js │ ├── DeploymentDetails.js │ ├── Main.js │ ├── Settings.js │ ├── SplashScreen.js │ └── WhatsNew.js ├── storybook ├── addons.js ├── index.android.js ├── index.ios.js ├── index.js ├── stories │ ├── _center.js │ ├── aliases.js │ ├── common.js │ ├── deployments.js │ ├── domains.js │ ├── history.js │ ├── index.js │ ├── settings.js │ └── usage.js └── storybook.js ├── types ├── types.js └── zeit.js └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["react-native"], 3 | "plugins": ["transform-decorators-legacy"] 4 | } 5 | -------------------------------------------------------------------------------- /.buckconfig: -------------------------------------------------------------------------------- 1 | 2 | [android] 3 | target = Google Inc.:Google APIs:23 4 | 5 | [maven_repositories] 6 | central = https://repo1.maven.org/maven2 7 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = tab 5 | indent_size = 4 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | end_of_line = lf 10 | # editorconfig-tools is unable to ignore longs strings or urls 11 | max_line_length = null 12 | -------------------------------------------------------------------------------- /.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | ; We fork some components by platform 3 | .*/*[.]android.js 4 | 5 | ; Ignore "BUCK" generated dirs 6 | /\.buckd/ 7 | 8 | ; Ignore unexpected extra "@providesModule" 9 | .*/node_modules/.*/node_modules/fbjs/.* 10 | 11 | ; Ignore duplicate module providers 12 | ; For RN Apps installed via npm, "Libraries" folder is inside 13 | ; "node_modules/react-native" but in the source repo it is in the root 14 | .*/Libraries/react-native/React.js 15 | 16 | ; Ignore polyfills 17 | .*/Libraries/polyfills/.* 18 | 19 | ; Ignore metro 20 | .*/node_modules/metro/.* 21 | 22 | .*/node_modules/react-native-keyboard-aware-scroll-view/* 23 | 24 | [include] 25 | 26 | [libs] 27 | node_modules/react-native/Libraries/react-native/react-native-interface.js 28 | node_modules/react-native/flow/ 29 | node_modules/react-native/flow-github/ 30 | types/ 31 | 32 | [options] 33 | emoji=true 34 | 35 | module.system=haste 36 | 37 | munge_underscores=true 38 | 39 | module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' 40 | 41 | module.file_ext=.js 42 | module.file_ext=.jsx 43 | module.file_ext=.json 44 | module.file_ext=.native.js 45 | 46 | suppress_type=$FlowIssue 47 | suppress_type=$FlowFixMe 48 | suppress_type=$FlowFixMeProps 49 | suppress_type=$FlowFixMeState 50 | 51 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) 52 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ 53 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy 54 | suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError 55 | 56 | esproposal.decorators=ignore 57 | 58 | [version] 59 | ^0.67.0 60 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Xcode 6 | # 7 | build/ 8 | *.pbxuser 9 | !default.pbxuser 10 | *.mode1v3 11 | !default.mode1v3 12 | *.mode2v3 13 | !default.mode2v3 14 | *.perspectivev3 15 | !default.perspectivev3 16 | xcuserdata 17 | *.xccheckout 18 | *.moved-aside 19 | DerivedData 20 | *.hmap 21 | *.ipa 22 | *.xcuserstate 23 | project.xcworkspace 24 | 25 | # Android/IntelliJ 26 | # 27 | build/ 28 | .idea 29 | .gradle 30 | local.properties 31 | *.iml 32 | 33 | # node.js 34 | # 35 | node_modules/ 36 | npm-debug.log 37 | yarn-error.log 38 | 39 | # BUCK 40 | buck-out/ 41 | \.buckd/ 42 | *.keystore 43 | 44 | # fastlane 45 | # 46 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 47 | # screenshots whenever they are needed. 48 | # For more information about the recommended setup visit: 49 | # https://docs.fastlane.tools/best-practices/source-control/ 50 | 51 | */fastlane/report.xml 52 | */fastlane/Preview.html 53 | */fastlane/screenshots 54 | 55 | # Bundle artifact 56 | *.jsbundle 57 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "search.exclude": { 3 | "coverage/": true, 4 | "bower_components/": true, 5 | "node_modules/": true, 6 | "jspm_packages/": true, 7 | ".sass-cache/": true, 8 | "dist/": true, 9 | ".idea/": true, 10 | "temp/": true 11 | }, 12 | "files.exclude": { 13 | "coverage/": true, 14 | "bower_components/": true, 15 | "node_modules/": true, 16 | "jspm_packages/": true, 17 | ".sass-cache/": true, 18 | "dist/": true, 19 | ".idea/": true, 20 | "temp/": true 21 | }, 22 | "javascript.format.enable": false, 23 | "eslint.autoFixOnSave": true, 24 | "prettier.eslintIntegration": true, 25 | "flow.useNPMPackagedFlow": true, 26 | "prettier.disableLanguages": [ 27 | "markdown" 28 | ], 29 | "javascript.validate.enable": false, 30 | "files.associations": { 31 | "*.js": "javascriptreact" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /android/app/BUCK: -------------------------------------------------------------------------------- 1 | # To learn about Buck see [Docs](https://buckbuild.com/). 2 | # To run your application with Buck: 3 | # - install Buck 4 | # - `npm start` - to start the packager 5 | # - `cd android` 6 | # - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` 7 | # - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck 8 | # - `buck install -r android/app` - compile, install and run application 9 | # 10 | 11 | lib_deps = [] 12 | 13 | for jarfile in glob(['libs/*.jar']): 14 | name = 'jars__' + jarfile[jarfile.rindex('/') + 1: jarfile.rindex('.jar')] 15 | lib_deps.append(':' + name) 16 | prebuilt_jar( 17 | name = name, 18 | binary_jar = jarfile, 19 | ) 20 | 21 | for aarfile in glob(['libs/*.aar']): 22 | name = 'aars__' + aarfile[aarfile.rindex('/') + 1: aarfile.rindex('.aar')] 23 | lib_deps.append(':' + name) 24 | android_prebuilt_aar( 25 | name = name, 26 | aar = aarfile, 27 | ) 28 | 29 | android_library( 30 | name = "all-libs", 31 | exported_deps = lib_deps, 32 | ) 33 | 34 | android_library( 35 | name = "app-code", 36 | srcs = glob([ 37 | "src/main/java/**/*.java", 38 | ]), 39 | deps = [ 40 | ":all-libs", 41 | ":build_config", 42 | ":res", 43 | ], 44 | ) 45 | 46 | android_build_config( 47 | name = "build_config", 48 | package = "im.rdev.now-mobile", 49 | ) 50 | 51 | android_resource( 52 | name = "res", 53 | package = "im.rdev.now-mobile", 54 | res = "src/main/res", 55 | ) 56 | 57 | android_binary( 58 | name = "app", 59 | keystore = "//android/keystores:debug", 60 | manifest = "src/main/AndroidManifest.xml", 61 | package_type = "debug", 62 | deps = [ 63 | ":app-code", 64 | ], 65 | ) 66 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /android/app/src/main/assets/appcenter-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "app_secret": "bcdff391-c92d-44b7-983e-c1c47e8faf96" 3 | } 4 | -------------------------------------------------------------------------------- /android/app/src/main/java/im/rdev/nowmobile/MainActivity.java: -------------------------------------------------------------------------------- 1 | package im.rdev.nowmobile; 2 | 3 | import com.facebook.react.ReactActivity; 4 | 5 | public class MainActivity extends ReactActivity { 6 | 7 | /** 8 | * Returns the name of the main component registered from JavaScript. 9 | * This is used to schedule rendering of the component. 10 | */ 11 | @Override 12 | protected String getMainComponentName() { 13 | return "now"; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/android/app/src/main/res/mipmap-hdpi/ic_notification.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/android/app/src/main/res/mipmap-mdpi/ic_notification.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/android/app/src/main/res/mipmap-xhdpi/ic_notification.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/android/app/src/main/res/mipmap-xxhdpi/ic_notification.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/android/app/src/main/res/mipmap-xxxhdpi/ic_notification.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | _ZKCzjN2nJ6scR5cUnw6bI-XopCWrylTbmE87 3 | Now 4 | ALWAYS_SEND 5 | ALWAYS_SEND 6 | 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:2.2.3' 9 | 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | mavenLocal() 18 | jcenter() 19 | maven { 20 | url 'https://maven.google.com' 21 | } 22 | maven { 23 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 24 | url "$rootDir/../node_modules/react-native/android" 25 | } 26 | // Google now hosts their latest API dependencies on their own maven server. 27 | // React Native will eventually add this to their app template. 28 | maven { 29 | url "$rootDir/../node_modules/react-native-background-fetch/android/libs" 30 | } 31 | } 32 | } 33 | 34 | ext { 35 | compileSdkVersion = 26 36 | targetSdkVersion = 26 37 | buildToolsVersion = "26.0.2" 38 | supportLibVersion = "26.1.0" 39 | playServicesVersion = "11.8.0" 40 | } -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m 13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true 19 | 20 | android.useDeprecatedNdk=true 21 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip 6 | -------------------------------------------------------------------------------- /android/keystores/BUCK: -------------------------------------------------------------------------------- 1 | keystore( 2 | name = "debug", 3 | properties = "debug.keystore.properties", 4 | store = "debug.keystore", 5 | visibility = [ 6 | "PUBLIC", 7 | ], 8 | ) 9 | -------------------------------------------------------------------------------- /android/keystores/debug.keystore.properties: -------------------------------------------------------------------------------- 1 | key.store=debug.keystore 2 | key.alias=androiddebugkey 3 | key.store.password=android 4 | key.alias.password=android 5 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'now' 2 | include ':react-native-code-push' 3 | project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-code-push/android/app') 4 | include ':appcenter-crashes' 5 | project(':appcenter-crashes').projectDir = new File(rootProject.projectDir, '../node_modules/appcenter-crashes/android') 6 | include ':appcenter-analytics' 7 | project(':appcenter-analytics').projectDir = new File(rootProject.projectDir, '../node_modules/appcenter-analytics/android') 8 | include ':appcenter' 9 | project(':appcenter').projectDir = new File(rootProject.projectDir, '../node_modules/appcenter/android') 10 | include ':react-native-push-notification' 11 | project(':react-native-push-notification').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-push-notification/android') 12 | include ':react-native-prompt-android' 13 | project(':react-native-prompt-android').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-prompt-android/android') 14 | include ':react-native-background-fetch' 15 | project(':react-native-background-fetch').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-background-fetch/android') 16 | include ':react-native-shared-group-preferences' 17 | project(':react-native-shared-group-preferences').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-shared-group-preferences/android') 18 | include ':react-native-touch-id' 19 | project(':react-native-touch-id').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-touch-id/android') 20 | include ':react-native-fetch-blob' 21 | project(':react-native-fetch-blob').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-fetch-blob/android') 22 | 23 | include ':app' 24 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "now", 3 | "displayName": "Now" 4 | } 5 | -------------------------------------------------------------------------------- /assets/go.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/assets/go.png -------------------------------------------------------------------------------- /assets/gradient.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/assets/gradient.jpg -------------------------------------------------------------------------------- /assets/instance-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/assets/instance-icon.png -------------------------------------------------------------------------------- /assets/now-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/assets/now-white.png -------------------------------------------------------------------------------- /assets/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/assets/plus.png -------------------------------------------------------------------------------- /assets/zeit-logo-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/assets/zeit-logo-white.png -------------------------------------------------------------------------------- /assets/zeit-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/assets/zeit-logo.png -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import { AppRegistry, YellowBox } from 'react-native'; 2 | import BackgroundFetch from 'react-native-background-fetch'; 3 | import App from './src/App'; 4 | import StorybookUI from './storybook'; 5 | import { task as BackgroundTask } from './src/lib/background-task'; 6 | 7 | YellowBox.ignoreWarnings(['Warning: isMounted(...) is deprecated', 'Module RCTImageLoader']); 8 | 9 | const STORYBOOK = false; 10 | 11 | AppRegistry.registerComponent('now', () => (__DEV__ && STORYBOOK ? StorybookUI : App)); 12 | BackgroundFetch.registerHeadlessTask(BackgroundTask); 13 | -------------------------------------------------------------------------------- /ios/Now.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Now.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | workspace 'Now.xcworkspace' 4 | project 'now.xcodeproj' 5 | 6 | target 'WatchApp Extension' do 7 | platform :watchos, '4.0' 8 | pod 'Alamofire', '~> 4.7' 9 | pod 'SwiftyJSON', '~> 4.0' 10 | end 11 | 12 | target 'now' do 13 | # Pods for AppCenter 14 | pod 'AppCenter/Crashes', '~> 1.8.0' 15 | pod 'AppCenter/Analytics', '~> 1.8.0' 16 | pod 'AppCenterReactNativeShared', '~> 1.7.1' 17 | 18 | platform :ios, '9.0' 19 | pod 'CodePush', :path => '../node_modules/react-native-code-push' 20 | 21 | end -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Alamofire (4.7.3) 3 | - AppCenter/Analytics (1.8.0): 4 | - AppCenter/Core 5 | - AppCenter/Core (1.8.0) 6 | - AppCenter/Crashes (1.8.0): 7 | - AppCenter/Core 8 | - AppCenterReactNativeShared (1.7.1): 9 | - AppCenter/Core (= 1.8.0) 10 | - SwiftyJSON (4.1.0) 11 | 12 | DEPENDENCIES: 13 | - Alamofire (~> 4.7) 14 | - AppCenter/Analytics (~> 1.8.0) 15 | - AppCenter/Crashes (~> 1.8.0) 16 | - AppCenterReactNativeShared (~> 1.7.1) 17 | - SwiftyJSON (~> 4.0) 18 | 19 | SPEC REPOS: 20 | https://github.com/cocoapods/specs.git: 21 | - Alamofire 22 | - AppCenter 23 | - AppCenterReactNativeShared 24 | - SwiftyJSON 25 | 26 | SPEC CHECKSUMS: 27 | Alamofire: c7287b6e5d7da964a70935e5db17046b7fde6568 28 | AppCenter: 7e7b42e94b70294d1de3d747f164f0c1668a28e1 29 | AppCenterReactNativeShared: 713c4b8da168d517297061d4168f7e2f4d2df9c5 30 | SwiftyJSON: c29297daf073d2aa016295d5809cdd68045c39b3 31 | 32 | PODFILE CHECKSUM: dc2e283412523314c395e6dc1e13a1f11a6b3408 33 | 34 | COCOAPODS: 1.5.3 35 | -------------------------------------------------------------------------------- /ios/Pods/Alamofire/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /ios/Pods/Alamofire/Source/DispatchQueue+Alamofire.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DispatchQueue+Alamofire.swift 3 | // 4 | // Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | // 24 | 25 | import Dispatch 26 | import Foundation 27 | 28 | extension DispatchQueue { 29 | static var userInteractive: DispatchQueue { return DispatchQueue.global(qos: .userInteractive) } 30 | static var userInitiated: DispatchQueue { return DispatchQueue.global(qos: .userInitiated) } 31 | static var utility: DispatchQueue { return DispatchQueue.global(qos: .utility) } 32 | static var background: DispatchQueue { return DispatchQueue.global(qos: .background) } 33 | 34 | func after(_ delay: TimeInterval, execute closure: @escaping () -> Void) { 35 | asyncAfter(deadline: .now() + delay, execute: closure) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/AppCenter: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/AppCenter -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/AppCenter.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSAppCenter.h" 4 | #import "MSAppCenterErrors.h" 5 | #import "MSAbstractLog.h" 6 | #import "MSChannelDelegate.h" 7 | #import "MSChannelGroupProtocol.h" 8 | #import "MSChannelProtocol.h" 9 | #import "MSConstants.h" 10 | #import "MSDevice.h" 11 | #import "MSEnable.h" 12 | #import "MSLog.h" 13 | #import "MSLogger.h" 14 | #import "MSLogWithProperties.h" 15 | #import "MSService.h" 16 | #import "MSServiceAbstract.h" 17 | #import "MSWrapperLogger.h" 18 | #import "MSWrapperSdk.h" 19 | 20 | #if !TARGET_OS_TV 21 | #import "MSCustomProperties.h" 22 | #endif 23 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSAbstractLog.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface MSAbstractLog : NSObject 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSAppCenterErrors.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | NS_ASSUME_NONNULL_BEGIN 4 | 5 | #pragma mark - Domain 6 | 7 | extern NSString *const kMSACErrorDomain; 8 | 9 | #pragma mark - Log 10 | 11 | // Error codes 12 | NS_ENUM(NSInteger){kMSACLogInvalidContainerErrorCode = 1}; 13 | 14 | // Error descriptions 15 | extern NSString const *kMSACLogInvalidContainerErrorDesc; 16 | 17 | #pragma mark - Connection 18 | 19 | // Error codes 20 | NS_ENUM(NSInteger){kMSACConnectionSuspendedErrorCode = 100, kMSACConnectionHttpErrorCode = 101}; 21 | 22 | // Error descriptions 23 | extern NSString const *kMSACConnectionHttpErrorDesc; 24 | extern NSString const *kMSACConnectionSuspendedErrorDesc; 25 | 26 | // Error user info keys 27 | extern NSString const *kMSACConnectionHttpCodeErrorKey; 28 | 29 | NS_ASSUME_NONNULL_END 30 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSChannelGroupProtocol.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSChannelProtocol.h" 4 | 5 | NS_ASSUME_NONNULL_BEGIN 6 | 7 | @protocol MSIngestionProtocol; 8 | @protocol MSChannelUnitProtocol; 9 | @class MSChannelUnitConfiguration; 10 | 11 | /** 12 | * `MSChannelGroupProtocol` represents a kind of channel that contains 13 | * constituent MSChannelUnit objects. When an operation from the `MSChannelProtocol` 14 | * is performed on the group, that operation should be propagated to its 15 | * constituent MSChannelUnit objects. 16 | */ 17 | @protocol MSChannelGroupProtocol 18 | 19 | /** 20 | * Initialize a channel unit with the given configuration. 21 | * 22 | * @param configuration channel configuration. 23 | * 24 | * @return The added `MSChannelUnitProtocol`. Use this object to enqueue logs. 25 | */ 26 | - (id)addChannelUnitWithConfiguration:(MSChannelUnitConfiguration *)configuration; 27 | 28 | /** 29 | * Initialize a channel unit with the given configuration. 30 | * 31 | * @param configuration channel configuration. 32 | * @param ingestion The alternative ingestion object 33 | * 34 | * @return The added `MSChannelUnitProtocol`. Use this object to enqueue logs. 35 | */ 36 | - (id)addChannelUnitWithConfiguration:(MSChannelUnitConfiguration *)configuration 37 | withIngestion:(nullable id)ingestion; 38 | 39 | /** 40 | * Change the base URL (schema + authority + port only) used to communicate with the backend. 41 | * 42 | * @param logUrl base URL to use for backend communication. 43 | */ 44 | - (void)setLogUrl:(NSString *)logUrl; 45 | 46 | @end 47 | 48 | NS_ASSUME_NONNULL_END 49 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSChannelProtocol.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSEnable.h" 4 | 5 | NS_ASSUME_NONNULL_BEGIN 6 | 7 | @protocol MSChannelDelegate; 8 | 9 | /** 10 | * `MSChannelProtocol` contains the essential operations of a channel. Channels are 11 | * broadly responsible for enqueuing logs to be sent to the backend and/or stored 12 | * on disk. 13 | */ 14 | @protocol MSChannelProtocol 15 | 16 | /** 17 | * Add delegate. 18 | * 19 | * @param delegate delegate. 20 | */ 21 | - (void)addDelegate:(id)delegate; 22 | 23 | /** 24 | * Remove delegate. 25 | * 26 | * @param delegate delegate. 27 | */ 28 | - (void)removeDelegate:(id)delegate; 29 | 30 | /** 31 | * Suspend operations, logs will be stored but not sent. 32 | */ 33 | - (void)suspend; 34 | 35 | /** 36 | * Resume operations, logs can be sent again. 37 | */ 38 | - (void)resume; 39 | 40 | @end 41 | 42 | NS_ASSUME_NONNULL_END 43 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSConstants.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | /** 4 | * Log Levels 5 | */ 6 | typedef NS_ENUM(NSUInteger, MSLogLevel) { 7 | 8 | /** 9 | * Logging will be very chatty 10 | */ 11 | MSLogLevelVerbose = 2, 12 | 13 | /** 14 | * Debug information will be logged 15 | */ 16 | MSLogLevelDebug = 3, 17 | 18 | /** 19 | * Information will be logged 20 | */ 21 | MSLogLevelInfo = 4, 22 | 23 | /** 24 | * Errors and warnings will be logged 25 | */ 26 | MSLogLevelWarning = 5, 27 | 28 | /** 29 | * Errors will be logged 30 | */ 31 | MSLogLevelError = 6, 32 | 33 | /** 34 | * Only critical errors will be logged 35 | */ 36 | MSLogLevelAssert = 7, 37 | 38 | /** 39 | * Logging is disabled 40 | */ 41 | MSLogLevelNone = 99 42 | }; 43 | 44 | typedef NSString * (^MSLogMessageProvider)(void); 45 | typedef void (^MSLogHandler)(MSLogMessageProvider messageProvider, MSLogLevel logLevel, NSString *tag, const char *file, 46 | const char *function, uint line); 47 | 48 | /** 49 | * Channel priorities, check the kMSPriorityCount if you add a new value. 50 | * The order matters here! Values NEED to range from low priority to high priority. 51 | */ 52 | typedef NS_ENUM(NSInteger, MSPriority) { MSPriorityBackground, MSPriorityDefault, MSPriorityHigh }; 53 | static short const kMSPriorityCount = MSPriorityHigh + 1; 54 | 55 | /** 56 | * The priority by which the modules are initialized. 57 | * MSPriorityMax is reserved for only 1 module and this needs to be Crashes. Crashes needs to be initialized first to 58 | * catch crashes in our other SDK Modules (which will hopefully never happen) and to avoid losing any log at crash 59 | * time. 60 | */ 61 | typedef NS_ENUM(NSInteger, MSInitializationPriority) { 62 | MSInitializationPriorityDefault = 500, 63 | MSInitializationPriorityHigh = 750, 64 | MSInitializationPriorityMax = 999 65 | }; 66 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSEnable.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | /** 4 | * Protocol to define an instance that can be enabled/disabled. 5 | */ 6 | @protocol MSEnable 7 | 8 | @required 9 | 10 | /** 11 | * Enable/disable this instance and delete data on disabled state. 12 | * 13 | * @param isEnabled A boolean value set to YES to enable the instance or NO to disable it. 14 | * @param deleteData A boolean value set to YES to delete data or NO to keep it. 15 | */ 16 | - (void)setEnabled:(BOOL)isEnabled andDeleteDataOnDisabled:(BOOL)deleteData; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSLog.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @class MSDevice; 4 | 5 | @protocol MSLog 6 | 7 | /** 8 | * Log type. 9 | */ 10 | @property(nonatomic, copy) NSString *type; 11 | 12 | /** 13 | * Log timestamp. 14 | */ 15 | @property(nonatomic) NSDate *timestamp; 16 | 17 | /** 18 | * A session identifier is used to correlate logs together. A session is an abstract concept in the API and 19 | * is not necessarily an analytics session, it can be used to only track crashes. 20 | */ 21 | @property(nonatomic, copy) NSString *sid; 22 | 23 | /** 24 | * Optional distribution group ID value. 25 | */ 26 | @property(nonatomic, copy) NSString *distributionGroupId; 27 | 28 | /** 29 | * Device properties associated to this log. 30 | */ 31 | @property(nonatomic) MSDevice *device; 32 | 33 | /** 34 | * Checks if the object's values are valid. 35 | * 36 | * @return YES, if the object is valid. 37 | */ 38 | - (BOOL)isValid; 39 | 40 | /** 41 | * Adds a transmission target token that this log should be sent to. 42 | * 43 | * @param token The transmission target token. 44 | */ 45 | - (void)addTransmissionTargetToken:(NSString *)token; 46 | 47 | /** 48 | * Gets all transmission target tokens that this log should be sent to. 49 | * 50 | * @returns Collection of transmission target tokens that this log should be sent to. 51 | */ 52 | - (NSSet *)transmissionTargetTokens; 53 | 54 | @end 55 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSLogWithProperties.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSAbstractLog.h" 4 | 5 | @interface MSLogWithProperties : MSAbstractLog 6 | 7 | /** 8 | * Additional key/value pair parameters. [optional] 9 | */ 10 | @property(nonatomic) NSDictionary *properties; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSService.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | /** 4 | * Protocol declaring service logic. 5 | */ 6 | @protocol MSService 7 | 8 | /** 9 | * Enable/disable this service. 10 | * 11 | * @param isEnabled whether this service is enabled or not. 12 | * @see isEnabled 13 | */ 14 | + (void)setEnabled:(BOOL)isEnabled; 15 | 16 | /** 17 | * Is this service enabled. 18 | * 19 | * @return a boolean whether this service is enabled or not. 20 | * @see setEnabled: 21 | */ 22 | + (BOOL)isEnabled; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSServiceAbstract.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSService.h" 4 | 5 | @protocol MSChannelGroupProtocol; 6 | 7 | /** 8 | * Abstraction of services common logic. 9 | * This class is intended to be subclassed only not instantiated directly. 10 | */ 11 | @interface MSServiceAbstract : NSObject 12 | 13 | /** 14 | * The flag indicates whether the service is started from application or not. 15 | */ 16 | @property(nonatomic) BOOL startedFromApplication; 17 | 18 | /** 19 | * Start this service with a channel group. Also sets the flag that indicates that a service has been started. 20 | * 21 | * @param channelGroup channel group used to persist and send logs. 22 | * @param appSecret app secret for the SDK. 23 | * @param token default transmission target token for this service. 24 | * @param fromApplication indicates whether the service started from an application or not. 25 | */ 26 | - (void)startWithChannelGroup:(id)channelGroup 27 | appSecret:(NSString *)appSecret 28 | transmissionTargetToken:(NSString *)token 29 | fromApplication:(BOOL)fromApplication; 30 | 31 | /** 32 | * Update configuration when the service requires to start again. This method should only be called if the service is 33 | * started from libraries and then is being started from an application. 34 | * 35 | * @param appSecret app secret for the SDK. 36 | * @param token default transmission target token for this service. 37 | */ 38 | - (void)updateConfigurationWithAppSecret:(NSString *)appSecret transmissionTargetToken:(NSString *)token; 39 | 40 | /** 41 | * Checks if the service needs the application secret. 42 | * 43 | * @return `YES` if the application secret is required, `NO` otherwise. 44 | */ 45 | - (BOOL)isAppSecretRequired; 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSWrapperLogger.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSConstants.h" 4 | 5 | /** 6 | * This is a utility for producing App Center style log messages. It is only 7 | * intended for use by App Center services and wrapper SDKs of App Center. 8 | */ 9 | @interface MSWrapperLogger : NSObject 10 | 11 | + (void)MSWrapperLog:(MSLogMessageProvider)message tag:(NSString *)tag level:(MSLogLevel)level; 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module AppCenter { 2 | umbrella header "AppCenter.h" 3 | 4 | export * 5 | module * { export * } 6 | 7 | link framework "Foundation" 8 | link framework "CoreTelephony" 9 | link framework "SystemConfiguration" 10 | link framework "UIKit" 11 | link "sqlite3" 12 | link "z" 13 | } 14 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/AppCenterAnalytics: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/AppCenterAnalytics -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/AppCenterAnalytics.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSAbstractLog.h" 4 | #import "MSAnalytics.h" 5 | #import "MSEventLog.h" 6 | #import "MSAnalyticsTransmissionTarget.h" 7 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSAbstractLog.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface MSAbstractLog : NSObject 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSAnalytics.h: -------------------------------------------------------------------------------- 1 | #import "MSServiceAbstract.h" 2 | #import "MSAnalyticsTransmissionTarget.h" 3 | 4 | NS_ASSUME_NONNULL_BEGIN 5 | 6 | /** 7 | * App Center analytics service. 8 | */ 9 | @interface MSAnalytics : MSServiceAbstract 10 | 11 | /** 12 | * Track an event. 13 | * 14 | * @param eventName event name. 15 | */ 16 | + (void)trackEvent:(NSString *)eventName; 17 | 18 | /** 19 | * Track an event. 20 | * 21 | * @param eventName event name. 22 | * @param properties dictionary of properties. 23 | */ 24 | + (void)trackEvent:(NSString *)eventName withProperties:(nullable NSDictionary *)properties; 25 | 26 | /** 27 | * Get a transmission target. 28 | * 29 | * @param token The token of the transmission target to retrieve. 30 | * 31 | * @returns The transmission target object. 32 | */ 33 | + (MSAnalyticsTransmissionTarget *)transmissionTargetForToken:(NSString *)token; 34 | 35 | @end 36 | 37 | NS_ASSUME_NONNULL_END 38 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSEventLog.h: -------------------------------------------------------------------------------- 1 | #import "MSLogWithNameAndProperties.h" 2 | 3 | @interface MSEventLog : MSLogWithNameAndProperties 4 | 5 | /** 6 | * Unique identifier for this event. 7 | */ 8 | @property(nonatomic, copy) NSString *eventId; 9 | 10 | @end 11 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSLogWithNameAndProperties.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSLogWithProperties.h" 4 | 5 | @interface MSLogWithNameAndProperties : MSLogWithProperties 6 | 7 | /** 8 | * Name of the event. 9 | */ 10 | @property(nonatomic, copy) NSString *name; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSLogWithProperties.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSAbstractLog.h" 4 | 5 | @interface MSLogWithProperties : MSAbstractLog 6 | 7 | /** 8 | * Additional key/value pair parameters. [optional] 9 | */ 10 | @property(nonatomic) NSDictionary *properties; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSService.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | /** 4 | * Protocol declaring service logic. 5 | */ 6 | @protocol MSService 7 | 8 | /** 9 | * Enable/disable this service. 10 | * 11 | * @param isEnabled whether this service is enabled or not. 12 | * @see isEnabled 13 | */ 14 | + (void)setEnabled:(BOOL)isEnabled; 15 | 16 | /** 17 | * Is this service enabled. 18 | * 19 | * @return a boolean whether this service is enabled or not. 20 | * @see setEnabled: 21 | */ 22 | + (BOOL)isEnabled; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSServiceAbstract.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSService.h" 4 | 5 | @protocol MSChannelGroupProtocol; 6 | 7 | /** 8 | * Abstraction of services common logic. 9 | * This class is intended to be subclassed only not instantiated directly. 10 | */ 11 | @interface MSServiceAbstract : NSObject 12 | 13 | /** 14 | * The flag indicates whether the service is started from application or not. 15 | */ 16 | @property(nonatomic) BOOL startedFromApplication; 17 | 18 | /** 19 | * Start this service with a channel group. Also sets the flag that indicates that a service has been started. 20 | * 21 | * @param channelGroup channel group used to persist and send logs. 22 | * @param appSecret app secret for the SDK. 23 | * @param token default transmission target token for this service. 24 | * @param fromApplication indicates whether the service started from an application or not. 25 | */ 26 | - (void)startWithChannelGroup:(id)channelGroup 27 | appSecret:(NSString *)appSecret 28 | transmissionTargetToken:(NSString *)token 29 | fromApplication:(BOOL)fromApplication; 30 | 31 | /** 32 | * Update configuration when the service requires to start again. This method should only be called if the service is 33 | * started from libraries and then is being started from an application. 34 | * 35 | * @param appSecret app secret for the SDK. 36 | * @param token default transmission target token for this service. 37 | */ 38 | - (void)updateConfigurationWithAppSecret:(NSString *)appSecret transmissionTargetToken:(NSString *)token; 39 | 40 | /** 41 | * Checks if the service needs the application secret. 42 | * 43 | * @return `YES` if the application secret is required, `NO` otherwise. 44 | */ 45 | - (BOOL)isAppSecretRequired; 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module AppCenterAnalytics { 2 | umbrella header "AppCenterAnalytics.h" 3 | 4 | export * 5 | module * { export * } 6 | 7 | link framework "Foundation" 8 | link framework "UIKit" 9 | } 10 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/AppCenterCrashes: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/AppCenterCrashes -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/AppCenterCrashes.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSCrashes.h" 4 | #import "MSCrashesDelegate.h" 5 | #import "MSCrashHandlerSetupDelegate.h" 6 | #import "MSErrorAttachmentLog.h" 7 | #import "MSErrorAttachmentLog+Utility.h" 8 | #import "MSWrapperCrashesHelper.h" 9 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSAbstractLog.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface MSAbstractLog : NSObject 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSCrashHandlerSetupDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | /** 4 | * This is required for Wrapper SDKs that need to provide custom behavior surrounding the setup of crash handlers. 5 | */ 6 | @protocol MSCrashHandlerSetupDelegate 7 | 8 | @optional 9 | 10 | /** 11 | * Callback method that will be called immediately before crash handlers are set up. 12 | */ 13 | - (void)willSetUpCrashHandlers; 14 | 15 | /** 16 | * Callback method that will be called immediately after crash handlers are set up. 17 | */ 18 | - (void)didSetUpCrashHandlers; 19 | 20 | /** 21 | * Callback method that gets a value indicating whether the SDK should enable an uncaught exception handler. 22 | * 23 | * @return YES if SDK should enable uncaught exception handler, otherwise NO. 24 | * 25 | * @discussion Do not register an UncaughtExceptionHandler for Xamarin as we rely on the Xamarin runtime to report 26 | * NSExceptions. Registering our own UncaughtExceptionHandler will cause the Xamarin debugger to not work properly (it 27 | * will not stop for NSExceptions). 28 | */ 29 | - (BOOL)shouldEnableUncaughtExceptionHandler; 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSErrorAttachmentLog+Utility.h: -------------------------------------------------------------------------------- 1 | #import "MSErrorAttachmentLog.h" 2 | 3 | // Exporting symbols for category. 4 | extern NSString *MSMSErrorLogAttachmentLogUtilityCategory; 5 | 6 | @interface MSErrorAttachmentLog (Utility) 7 | 8 | /** 9 | * Create an attachment with a given filename and text. 10 | * 11 | * @param filename The filename the attachment should get. If nil will get an automatically generated filename. 12 | * @param text The attachment text. 13 | * 14 | * @return An instance of `MSErrorAttachmentLog`. 15 | */ 16 | + (MSErrorAttachmentLog *)attachmentWithText:(NSString *)text filename:(NSString *)filename; 17 | 18 | /** 19 | * Create an attachement with a given filename and `NSData` object. 20 | * 21 | * @param filename The filename the attachment should get. If nil will get an automatically generated filename. 22 | * @param data The attachment data as NSData. 23 | * @param contentType The content type of your data as MIME type. 24 | * 25 | * @return An instance of `MSErrorAttachmentLog`. 26 | */ 27 | + (MSErrorAttachmentLog *)attachmentWithBinary:(NSData *)data 28 | filename:(NSString *)filename 29 | contentType:(NSString *)contentType; 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSErrorAttachmentLog.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSAbstractLog.h" 4 | 5 | /** 6 | * Error attachment log. 7 | */ 8 | @interface MSErrorAttachmentLog : MSAbstractLog 9 | 10 | /** 11 | * Content type (text/plain for text). 12 | */ 13 | @property(nonatomic, copy) NSString *contentType; 14 | 15 | /** 16 | * File name. 17 | */ 18 | @property(nonatomic, copy) NSString *filename; 19 | 20 | /** 21 | * The attachment data. 22 | */ 23 | @property(nonatomic, copy) NSData *data; 24 | 25 | /** 26 | * Initialize an attachment with a given filename and `NSData` object. 27 | * 28 | * @param filename The filename the attachment should get. If nil will get an automatically generated filename. 29 | * @param data The attachment data as `NSData`. 30 | * @param contentType The content type of your data as MIME type. 31 | * 32 | * @return An instance of `MSErrorAttachmentLog`. 33 | */ 34 | - (instancetype)initWithFilename:(NSString *)filename 35 | attachmentBinary:(NSData *)data 36 | contentType:(NSString *)contentType; 37 | 38 | /** 39 | * Initialize an attachment with a given filename and text. 40 | * 41 | * @param filename The filename the attachment should get. If nil will get an automatically generated filename. 42 | * @param text The attachment text. 43 | * 44 | * @return An instance of `MSErrorAttachmentLog`. 45 | */ 46 | - (instancetype)initWithFilename:(NSString *)filename attachmentText:(NSString *)text; 47 | 48 | @end 49 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSService.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | /** 4 | * Protocol declaring service logic. 5 | */ 6 | @protocol MSService 7 | 8 | /** 9 | * Enable/disable this service. 10 | * 11 | * @param isEnabled whether this service is enabled or not. 12 | * @see isEnabled 13 | */ 14 | + (void)setEnabled:(BOOL)isEnabled; 15 | 16 | /** 17 | * Is this service enabled. 18 | * 19 | * @return a boolean whether this service is enabled or not. 20 | * @see setEnabled: 21 | */ 22 | + (BOOL)isEnabled; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSServiceAbstract.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSService.h" 4 | 5 | @protocol MSChannelGroupProtocol; 6 | 7 | /** 8 | * Abstraction of services common logic. 9 | * This class is intended to be subclassed only not instantiated directly. 10 | */ 11 | @interface MSServiceAbstract : NSObject 12 | 13 | /** 14 | * The flag indicates whether the service is started from application or not. 15 | */ 16 | @property(nonatomic) BOOL startedFromApplication; 17 | 18 | /** 19 | * Start this service with a channel group. Also sets the flag that indicates that a service has been started. 20 | * 21 | * @param channelGroup channel group used to persist and send logs. 22 | * @param appSecret app secret for the SDK. 23 | * @param token default transmission target token for this service. 24 | * @param fromApplication indicates whether the service started from an application or not. 25 | */ 26 | - (void)startWithChannelGroup:(id)channelGroup 27 | appSecret:(NSString *)appSecret 28 | transmissionTargetToken:(NSString *)token 29 | fromApplication:(BOOL)fromApplication; 30 | 31 | /** 32 | * Update configuration when the service requires to start again. This method should only be called if the service is 33 | * started from libraries and then is being started from an application. 34 | * 35 | * @param appSecret app secret for the SDK. 36 | * @param token default transmission target token for this service. 37 | */ 38 | - (void)updateConfigurationWithAppSecret:(NSString *)appSecret transmissionTargetToken:(NSString *)token; 39 | 40 | /** 41 | * Checks if the service needs the application secret. 42 | * 43 | * @return `YES` if the application secret is required, `NO` otherwise. 44 | */ 45 | - (BOOL)isAppSecretRequired; 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSWrapperCrashesHelper.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSCrashHandlerSetupDelegate.h" 4 | 5 | @class MSErrorReport; 6 | @class MSErrorAttachmentLog; 7 | 8 | /** 9 | * This general class allows wrappers to supplement the Crashes SDK with their own behavior. 10 | */ 11 | @interface MSWrapperCrashesHelper : NSObject 12 | 13 | /** 14 | * Sets the crash handler setup delegate. 15 | * 16 | * @param delegate The delegate to set. 17 | */ 18 | + (void)setCrashHandlerSetupDelegate:(id)delegate; 19 | 20 | /** 21 | * Gets the crash handler setup delegate. 22 | * 23 | * @return The delegate being used by Crashes. 24 | */ 25 | + (id)getCrashHandlerSetupDelegate; 26 | 27 | /** 28 | * Enables or disables automatic crash processing. 29 | * 30 | * @param automaticProcessing Passing NO causes SDK not to send reports immediately, even if "Always Send" is true. 31 | */ 32 | + (void)setAutomaticProcessing:(BOOL)automaticProcessing; 33 | 34 | /** 35 | * Gets a list of unprocessed crash reports. Will block until the service starts. 36 | * 37 | * @return An array of unprocessed error reports. 38 | */ 39 | + (NSArray *)unprocessedCrashReports; 40 | 41 | /** 42 | * Resumes processing for a given subset of the unprocessed reports. 43 | * 44 | * @param filteredIds An array containing the errorId/incidentIdentifier of each report that should be sent. 45 | * @return YES if should "Always Send" is true. 46 | */ 47 | + (BOOL)sendCrashReportsOrAwaitUserConfirmationForFilteredIds:(NSArray *)filteredIds; 48 | 49 | /** 50 | * Sends error attachments for a particular error report. 51 | * 52 | * @param errorAttachments An array of error attachments that should be sent. 53 | * @param incidentIdentifier The identifier of the error report that the attachments will be associated with. 54 | */ 55 | + (void)sendErrorAttachments:(NSArray *)errorAttachments 56 | withIncidentIdentifier:(NSString *)incidentIdentifier; 57 | 58 | @end 59 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module AppCenterCrashes { 2 | umbrella header "AppCenterCrashes.h" 3 | 4 | export * 5 | module * { export * } 6 | 7 | link framework "Foundation" 8 | link "c++" 9 | link "z" 10 | } 11 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/LICENSE: -------------------------------------------------------------------------------- 1 | Visual Studio App Center SDK for Apple platforms 2 | 3 | Copyright (c) Microsoft Corporation 4 | 5 | All rights reserved. 6 | 7 | MIT License 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining a copy 10 | of this software and associated documentation files (the "Software"), to deal 11 | in the Software without restriction, including without limitation the rights 12 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | copies of the Software, and to permit persons to whom the Software is 14 | furnished to do so, subject to the following conditions: 15 | 16 | The above copyright notice and this permission notice shall be included in 17 | all copies or substantial portions of the Software. 18 | 19 | THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | THE SOFTWARE. -------------------------------------------------------------------------------- /ios/Pods/AppCenterReactNativeShared/AppCenterReactNativeShared/AppCenterReactNativeShared.framework/AppCenterReactNativeShared: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/Pods/AppCenterReactNativeShared/AppCenterReactNativeShared/AppCenterReactNativeShared.framework/AppCenterReactNativeShared -------------------------------------------------------------------------------- /ios/Pods/AppCenterReactNativeShared/AppCenterReactNativeShared/AppCenterReactNativeShared.framework/Headers/AppCenterReactNativeShared.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @class MSWrapperSdk; 4 | 5 | @interface AppCenterReactNativeShared : NSObject 6 | 7 | + (void) setAppSecret: (NSString *)secret; 8 | 9 | + (NSString *) getAppSecret; 10 | 11 | + (void) configureAppCenter; 12 | 13 | + (MSWrapperSdk *) getWrapperSdk; 14 | 15 | + (void) setWrapperSdk:(MSWrapperSdk *)sdk; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /ios/Pods/AppCenterReactNativeShared/AppCenterReactNativeShared/AppCenterReactNativeShared.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module AppCenterReactNativeShared { 2 | umbrella header "AppCenterReactNativeShared.h" 3 | 4 | export * 5 | module * { export * } 6 | 7 | link framework "Foundation" 8 | } 9 | -------------------------------------------------------------------------------- /ios/Pods/AppCenterReactNativeShared/AppCenterReactNativeShared/LICENSE.md: -------------------------------------------------------------------------------- 1 | Visual Studio App Center Plugin for React Native 2 | 3 | Copyright (c) Microsoft Corporation 4 | 5 | All rights reserved. 6 | 7 | MIT License 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /ios/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Alamofire (4.7.3) 3 | - AppCenter/Analytics (1.8.0): 4 | - AppCenter/Core 5 | - AppCenter/Core (1.8.0) 6 | - AppCenter/Crashes (1.8.0): 7 | - AppCenter/Core 8 | - AppCenterReactNativeShared (1.7.1): 9 | - AppCenter/Core (= 1.8.0) 10 | - SwiftyJSON (4.1.0) 11 | 12 | DEPENDENCIES: 13 | - Alamofire (~> 4.7) 14 | - AppCenter/Analytics (~> 1.8.0) 15 | - AppCenter/Crashes (~> 1.8.0) 16 | - AppCenterReactNativeShared (~> 1.7.1) 17 | - SwiftyJSON (~> 4.0) 18 | 19 | SPEC REPOS: 20 | https://github.com/cocoapods/specs.git: 21 | - Alamofire 22 | - AppCenter 23 | - AppCenterReactNativeShared 24 | - SwiftyJSON 25 | 26 | SPEC CHECKSUMS: 27 | Alamofire: c7287b6e5d7da964a70935e5db17046b7fde6568 28 | AppCenter: 7e7b42e94b70294d1de3d747f164f0c1668a28e1 29 | AppCenterReactNativeShared: 713c4b8da168d517297061d4168f7e2f4d2df9c5 30 | SwiftyJSON: c29297daf073d2aa016295d5809cdd68045c39b3 31 | 32 | PODFILE CHECKSUM: dc2e283412523314c395e6dc1e13a1f11a6b3408 33 | 34 | COCOAPODS: 1.5.3 35 | -------------------------------------------------------------------------------- /ios/Pods/SwiftyJSON/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Ruoyu Fu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Alamofire/Alamofire-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Alamofire : NSObject 3 | @end 4 | @implementation PodsDummy_Alamofire 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Alamofire/Alamofire-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Alamofire/Alamofire-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double AlamofireVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char AlamofireVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Alamofire/Alamofire.modulemap: -------------------------------------------------------------------------------- 1 | framework module Alamofire { 2 | umbrella header "Alamofire-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Alamofire/Alamofire.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Alamofire 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Alamofire 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Alamofire/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 4.7.3 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-WatchApp Extension/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-WatchApp Extension/Pods-WatchApp Extension-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_WatchApp_Extension : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_WatchApp_Extension 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-WatchApp Extension/Pods-WatchApp Extension-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_WatchApp_ExtensionVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_WatchApp_ExtensionVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-WatchApp Extension/Pods-WatchApp Extension.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON/SwiftyJSON.framework/Headers" 6 | OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "SwiftyJSON" 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-WatchApp Extension/Pods-WatchApp Extension.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_WatchApp_Extension { 2 | umbrella header "Pods-WatchApp Extension-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-WatchApp Extension/Pods-WatchApp Extension.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON/SwiftyJSON.framework/Headers" 6 | OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "SwiftyJSON" 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-now/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-now/Pods-now-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_now : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_now 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-now/Pods-now-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_nowVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_nowVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-now/Pods-now.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple/iOS" "${PODS_ROOT}/AppCenterReactNativeShared/AppCenterReactNativeShared" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"z" -framework "AppCenter" -framework "AppCenterAnalytics" -framework "AppCenterCrashes" -framework "AppCenterReactNativeShared" -framework "CoreTelephony" -framework "Foundation" -framework "SystemConfiguration" -framework "UIKit" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 8 | PODS_ROOT = ${SRCROOT}/Pods 9 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-now/Pods-now.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_now { 2 | umbrella header "Pods-now-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-now/Pods-now.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple/iOS" "${PODS_ROOT}/AppCenterReactNativeShared/AppCenterReactNativeShared" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"z" -framework "AppCenter" -framework "AppCenterAnalytics" -framework "AppCenterCrashes" -framework "AppCenterReactNativeShared" -framework "CoreTelephony" -framework "Foundation" -framework "SystemConfiguration" -framework "UIKit" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 8 | PODS_ROOT = ${SRCROOT}/Pods 9 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/SwiftyJSON/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 4.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_SwiftyJSON : NSObject 3 | @end 4 | @implementation PodsDummy_SwiftyJSON 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double SwiftyJSONVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char SwiftyJSONVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.modulemap: -------------------------------------------------------------------------------- 1 | framework module SwiftyJSON { 2 | umbrella header "SwiftyJSON-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/SwiftyJSON 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /ios/TodayExtension/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Now Deployments 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | XPC! 19 | CFBundleShortVersionString 20 | 1.1.1 21 | CFBundleVersion 22 | 10 23 | NSExtension 24 | 25 | NSExtensionMainStoryboard 26 | MainInterface 27 | NSExtensionPointIdentifier 28 | com.apple.widget-extension 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /ios/TodayExtension/TodayExtension.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.im.rdev.now-mobile 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/TodayExtension/WidgetTableRowController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | class WidgetTableRowController: UITableViewCell { 4 | @IBOutlet weak var deploymentURL: UILabel! 5 | @IBOutlet weak var instanceCount: UILabel! 6 | @IBOutlet weak var deploymentState: UILabel! 7 | @IBOutlet weak var deploymentDate: UILabel! 8 | @IBOutlet weak var instanceImage: UIImageView! 9 | @IBOutlet weak var instanceImageWidthConstraint: NSLayoutConstraint! 10 | @IBOutlet weak var instanceCountLeftConstraint: NSLayoutConstraint! 11 | @IBOutlet weak var deploymentStateLeftConstraint: NSLayoutConstraint! 12 | } 13 | -------------------------------------------------------------------------------- /ios/TodayUsageExtension/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Now Usage 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | XPC! 19 | CFBundleShortVersionString 20 | 1.1.1 21 | CFBundleVersion 22 | 10 23 | NSExtension 24 | 25 | NSExtensionMainStoryboard 26 | MainInterface 27 | NSExtensionPointIdentifier 28 | com.apple.widget-extension 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /ios/TodayUsageExtension/TodayUsageExtension.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.im.rdev.now-mobile 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/TodayUsageExtension/TodayViewController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import NotificationCenter 3 | 4 | // This is used for deserializing JSON 5 | struct UsageWidgetJSON: Decodable { 6 | let data: UsageWidgetData 7 | } 8 | 9 | struct UsageWidgetData: Codable { 10 | let instances: Int? 11 | let instancesLimit: String? 12 | let bandwidth: String? 13 | let bandwidthLimit: String? 14 | 15 | private enum CodingKeys: String, CodingKey { 16 | case instances 17 | case instancesLimit 18 | case bandwidth 19 | case bandwidthLimit 20 | } 21 | } 22 | 23 | class TodayViewController: UIViewController, NCWidgetProviding { 24 | @IBOutlet weak var instances: UILabel! 25 | @IBOutlet weak var instancesLimit: UILabel! 26 | @IBOutlet weak var bandwidth: UILabel! 27 | @IBOutlet weak var bandwidthLimit: UILabel! 28 | 29 | override func viewDidLoad() { 30 | super.viewDidLoad() 31 | // Do any additional setup after loading the view from its nib. 32 | } 33 | 34 | func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) { 35 | self.refreshData() 36 | completionHandler(NCUpdateResult.newData) 37 | } 38 | 39 | func refreshData() { 40 | let sharedContainer = UserDefaults(suiteName: "group.im.rdev.now-mobile") 41 | let usageJSON = sharedContainer?.string(forKey: "usage") 42 | 43 | do { 44 | let decoder = JSONDecoder() 45 | let usage = try decoder.decode(UsageWidgetJSON.self, from: (usageJSON?.data(using: .utf8))!) 46 | 47 | self.instances.text = String(usage.data.instances!) 48 | self.instancesLimit.text = String(usage.data.instancesLimit!) 49 | self.bandwidth.text = usage.data.bandwidth! 50 | self.bandwidthLimit.text = usage.data.bandwidthLimit! 51 | } catch let err { 52 | print("Error decoding JSON", err) 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /ios/WatchApp Extension/AliasRowController.swift: -------------------------------------------------------------------------------- 1 | import WatchKit 2 | 3 | class AliasRowController: NSObject { 4 | @IBOutlet var wrapper: WKInterfaceGroup! 5 | @IBOutlet var domain: WKInterfaceLabel! 6 | @IBOutlet var deploymentUrl: WKInterfaceLabel! 7 | } 8 | -------------------------------------------------------------------------------- /ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "idiom": "watch", 5 | "filename": "Icon 4.png", 6 | "screen-width": "<=145", 7 | "scale": "2x" 8 | }, 9 | { 10 | "idiom": "watch", 11 | "filename": "Icon 5.png", 12 | "screen-width": ">145", 13 | "scale": "2x" 14 | } 15 | ], 16 | "info": { 17 | "version": 1, 18 | "author": "xcode" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Icon 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Icon 4.png -------------------------------------------------------------------------------- /ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Icon 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Icon 5.png -------------------------------------------------------------------------------- /ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "assets": [ 3 | { 4 | "idiom": "watch", 5 | "filename": "Circular.imageset", 6 | "role": "circular" 7 | }, 8 | { 9 | "idiom": "watch", 10 | "filename": "Extra Large.imageset", 11 | "role": "extra-large" 12 | }, 13 | { 14 | "idiom": "watch", 15 | "filename": "Modular.imageset", 16 | "role": "modular" 17 | }, 18 | { 19 | "idiom": "watch", 20 | "filename": "Utilitarian.imageset", 21 | "role": "utilitarian" 22 | } 23 | ], 24 | "info": { 25 | "version": 1, 26 | "author": "xcode" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "idiom": "watch", 5 | "filename": "Icon 2.png", 6 | "screen-width": "<=145", 7 | "scale": "2x" 8 | }, 9 | { 10 | "idiom": "watch", 11 | "filename": "Icon 3.png", 12 | "screen-width": ">145", 13 | "scale": "2x" 14 | } 15 | ], 16 | "info": { 17 | "version": 1, 18 | "author": "xcode" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Icon 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Icon 2.png -------------------------------------------------------------------------------- /ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Icon 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Icon 3.png -------------------------------------------------------------------------------- /ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "idiom": "watch", 5 | "filename": "Icon 6.png", 6 | "screen-width": "<=145", 7 | "scale": "2x" 8 | }, 9 | { 10 | "idiom": "watch", 11 | "filename": "Icon 7.png", 12 | "screen-width": ">145", 13 | "scale": "2x" 14 | } 15 | ], 16 | "info": { 17 | "version": 1, 18 | "author": "xcode" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Icon 6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Icon 6.png -------------------------------------------------------------------------------- /ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Icon 7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Icon 7.png -------------------------------------------------------------------------------- /ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "idiom": "watch", 5 | "filename": "Icon 8.png", 6 | "screen-width": "<=145", 7 | "scale": "2x" 8 | }, 9 | { 10 | "idiom": "watch", 11 | "filename": "Icon 9.png", 12 | "screen-width": ">145", 13 | "scale": "2x" 14 | } 15 | ], 16 | "info": { 17 | "version": 1, 18 | "author": "xcode" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Icon 8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Icon 8.png -------------------------------------------------------------------------------- /ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Icon 9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Icon 9.png -------------------------------------------------------------------------------- /ios/WatchApp Extension/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info": { 3 | "version": 1, 4 | "author": "xcode" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/WatchApp Extension/DeploymentGroup.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DeploymentGroup.swift 3 | // WatchApp Extension 4 | // 5 | // Created by Max Rovensky on 23/07/2018. 6 | // Copyright © 2018 Facebook. All rights reserved. 7 | // 8 | 9 | import WatchKit 10 | 11 | class DeploymentGroup: WKInterfaceGroup { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /ios/WatchApp Extension/DeploymentRowController.swift: -------------------------------------------------------------------------------- 1 | import WatchKit 2 | import Foundation 3 | import Alamofire 4 | import SwiftyJSON 5 | 6 | class DeploymentRowController: NSObject { 7 | @IBOutlet var groupName: WKInterfaceLabel! 8 | @IBOutlet var deploymentId: WKInterfaceLabel! 9 | @IBOutlet var instanceIndicator: WKInterfaceGroup! 10 | @IBOutlet var instanceCount: WKInterfaceLabel! 11 | @IBOutlet var state: WKInterfaceLabel! 12 | @IBOutlet var date: WKInterfaceLabel! 13 | @IBOutlet var wrapper: WKInterfaceGroup! 14 | @IBOutlet var separator: WKInterfaceSeparator! 15 | } 16 | -------------------------------------------------------------------------------- /ios/WatchApp Extension/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | WatchApp Extension 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | XPC! 19 | CFBundleShortVersionString 20 | 1.1.1 21 | CFBundleVersion 22 | 10 23 | CLKComplicationPrincipalClass 24 | $(PRODUCT_MODULE_NAME).ComplicationController 25 | CLKComplicationSupportedFamilies 26 | 27 | CLKComplicationFamilyModularSmall 28 | CLKComplicationFamilyModularLarge 29 | CLKComplicationFamilyUtilitarianSmall 30 | CLKComplicationFamilyUtilitarianSmallFlat 31 | CLKComplicationFamilyUtilitarianLarge 32 | CLKComplicationFamilyCircularSmall 33 | CLKComplicationFamilyExtraLarge 34 | 35 | NSExtension 36 | 37 | NSExtensionAttributes 38 | 39 | WKAppBundleIdentifier 40 | im.rdev.now-mobile.watchkitapp 41 | 42 | NSExtensionPointIdentifier 43 | com.apple.watchkit 44 | 45 | WKExtensionDelegateClassName 46 | $(PRODUCT_MODULE_NAME).ExtensionDelegate 47 | 48 | 49 | -------------------------------------------------------------------------------- /ios/WatchApp/Assets.xcassets/AppIcon.appiconset/AppIcon24x24@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp/Assets.xcassets/AppIcon.appiconset/AppIcon24x24@2x.png -------------------------------------------------------------------------------- /ios/WatchApp/Assets.xcassets/AppIcon.appiconset/AppIcon27.5x27.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp/Assets.xcassets/AppIcon.appiconset/AppIcon27.5x27.5@2x.png -------------------------------------------------------------------------------- /ios/WatchApp/Assets.xcassets/AppIcon.appiconset/AppIcon40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp/Assets.xcassets/AppIcon.appiconset/AppIcon40x40@2x.png -------------------------------------------------------------------------------- /ios/WatchApp/Assets.xcassets/AppIcon.appiconset/AppIcon44x44@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp/Assets.xcassets/AppIcon.appiconset/AppIcon44x44@2x.png -------------------------------------------------------------------------------- /ios/WatchApp/Assets.xcassets/AppIcon.appiconset/AppIcon58x58@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp/Assets.xcassets/AppIcon.appiconset/AppIcon58x58@2x.png -------------------------------------------------------------------------------- /ios/WatchApp/Assets.xcassets/AppIcon.appiconset/AppIcon86x86@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp/Assets.xcassets/AppIcon.appiconset/AppIcon86x86@2x.png -------------------------------------------------------------------------------- /ios/WatchApp/Assets.xcassets/AppIcon.appiconset/AppIcon87x87@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp/Assets.xcassets/AppIcon.appiconset/AppIcon87x87@3x.png -------------------------------------------------------------------------------- /ios/WatchApp/Assets.xcassets/AppIcon.appiconset/AppIcon98x98@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp/Assets.xcassets/AppIcon.appiconset/AppIcon98x98@2x.png -------------------------------------------------------------------------------- /ios/WatchApp/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "size": "24x24", 5 | "idiom": "watch", 6 | "filename": "AppIcon24x24@2x.png", 7 | "scale": "2x", 8 | "role": "notificationCenter", 9 | "subtype": "38mm" 10 | }, 11 | { 12 | "size": "27.5x27.5", 13 | "idiom": "watch", 14 | "filename": "AppIcon27.5x27.5@2x.png", 15 | "scale": "2x", 16 | "role": "notificationCenter", 17 | "subtype": "42mm" 18 | }, 19 | { 20 | "size": "29x29", 21 | "idiom": "watch", 22 | "filename": "AppIcon58x58@2x.png", 23 | "role": "companionSettings", 24 | "scale": "2x" 25 | }, 26 | { 27 | "size": "29x29", 28 | "idiom": "watch", 29 | "filename": "AppIcon87x87@3x.png", 30 | "role": "companionSettings", 31 | "scale": "3x" 32 | }, 33 | { 34 | "size": "40x40", 35 | "idiom": "watch", 36 | "filename": "AppIcon40x40@2x.png", 37 | "scale": "2x", 38 | "role": "appLauncher", 39 | "subtype": "38mm" 40 | }, 41 | { 42 | "size": "44x44", 43 | "idiom": "watch", 44 | "filename": "AppIcon44x44@2x.png", 45 | "scale": "2x", 46 | "role": "longLook", 47 | "subtype": "42mm" 48 | }, 49 | { 50 | "size": "86x86", 51 | "idiom": "watch", 52 | "filename": "AppIcon86x86@2x.png", 53 | "scale": "2x", 54 | "role": "quickLook", 55 | "subtype": "38mm" 56 | }, 57 | { 58 | "size": "98x98", 59 | "idiom": "watch", 60 | "filename": "AppIcon98x98@2x.png", 61 | "scale": "2x", 62 | "role": "quickLook", 63 | "subtype": "42mm" 64 | }, 65 | { 66 | "size": "1024x1024", 67 | "idiom": "watch-marketing", 68 | "filename": "ios-marketing-1024x1024-1x.png", 69 | "scale": "1x" 70 | } 71 | ], 72 | "info": { 73 | "version": 1, 74 | "author": "xcode" 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /ios/WatchApp/Assets.xcassets/AppIcon.appiconset/ios-marketing-1024x1024-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp/Assets.xcassets/AppIcon.appiconset/ios-marketing-1024x1024-1x.png -------------------------------------------------------------------------------- /ios/WatchApp/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info": { 3 | "version": 1, 4 | "author": "xcode" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/WatchApp/Assets.xcassets/instance.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "idiom": "universal", 5 | "filename": "instance.png", 6 | "scale": "1x" 7 | }, 8 | { 9 | "idiom": "universal", 10 | "filename": "instance@2x.png", 11 | "scale": "2x" 12 | }, 13 | { 14 | "idiom": "universal", 15 | "filename": "instance@3x.png", 16 | "scale": "3x" 17 | } 18 | ], 19 | "info": { 20 | "version": 1, 21 | "author": "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/WatchApp/Assets.xcassets/instance.imageset/instance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp/Assets.xcassets/instance.imageset/instance.png -------------------------------------------------------------------------------- /ios/WatchApp/Assets.xcassets/instance.imageset/instance@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp/Assets.xcassets/instance.imageset/instance@2x.png -------------------------------------------------------------------------------- /ios/WatchApp/Assets.xcassets/instance.imageset/instance@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp/Assets.xcassets/instance.imageset/instance@3x.png -------------------------------------------------------------------------------- /ios/WatchApp/Assets.xcassets/zeit-logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "idiom": "universal", 5 | "scale": "1x" 6 | }, 7 | { 8 | "idiom": "universal", 9 | "filename": "zeit-logo.png", 10 | "scale": "2x" 11 | }, 12 | { 13 | "idiom": "universal", 14 | "scale": "3x" 15 | } 16 | ], 17 | "info": { 18 | "version": 1, 19 | "author": "xcode" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /ios/WatchApp/Assets.xcassets/zeit-logo.imageset/zeit-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/WatchApp/Assets.xcassets/zeit-logo.imageset/zeit-logo.png -------------------------------------------------------------------------------- /ios/WatchApp/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Now 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.1.1 21 | CFBundleVersion 22 | 10 23 | UISupportedInterfaceOrientations 24 | 25 | UIInterfaceOrientationPortrait 26 | UIInterfaceOrientationPortraitUpsideDown 27 | 28 | WKCompanionAppBundleIdentifier 29 | im.rdev.now-mobile 30 | WKWatchKitApp 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /ios/now-tvOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UIViewControllerBasedStatusBarAppearance 38 | 39 | NSLocationWhenInUseUsageDescription 40 | 41 | NSAppTransportSecurity 42 | 43 | 44 | NSExceptionDomains 45 | 46 | localhost 47 | 48 | NSExceptionAllowsInsecureHTTPLoads 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /ios/now-tvOSTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /ios/now/AppCenter-Config.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AppSecret 6 | 70bcea65-4587-4408-91fd-fb98be01d894 7 | 8 | -------------------------------------------------------------------------------- /ios/now/AppDelegate.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | */ 7 | 8 | #import 9 | 10 | @interface AppDelegate : UIResponder 11 | 12 | @property (nonatomic, strong) UIWindow *window; 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/ios-marketing-1024x1024-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/ios-marketing-1024x1024-1x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/ipad-20x20-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/ipad-20x20-1x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/ipad-20x20-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/ipad-20x20-2x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/ipad-29x29-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/ipad-29x29-1x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/ipad-29x29-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/ipad-29x29-2x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/ipad-40x40-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/ipad-40x40-1x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/ipad-40x40-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/ipad-40x40-2x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/ipad-50x50-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/ipad-50x50-1x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/ipad-50x50-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/ipad-50x50-2x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/ipad-72x72-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/ipad-72x72-1x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/ipad-72x72-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/ipad-72x72-2x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/ipad-76x76-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/ipad-76x76-1x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/ipad-76x76-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/ipad-76x76-2x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/ipad-83.5x83.5-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/ipad-83.5x83.5-2x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/iphone-20x20-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/iphone-20x20-2x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/iphone-20x20-3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/iphone-20x20-3x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/iphone-29x29-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/iphone-29x29-1x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/iphone-29x29-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/iphone-29x29-2x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/iphone-29x29-3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/iphone-29x29-3x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/iphone-40x40-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/iphone-40x40-2x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/iphone-40x40-3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/iphone-40x40-3x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/iphone-57x57-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/iphone-57x57-1x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/iphone-57x57-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/iphone-57x57-2x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/iphone-60x60-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/iphone-60x60-2x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/AppIcon.appiconset/iphone-60x60-3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/AppIcon.appiconset/iphone-60x60-3x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info": { 3 | "version": 1, 4 | "author": "xcode" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/now/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/LaunchImage.launchimage/Default-667h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/LaunchImage.launchimage/Default-667h@2x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/LaunchImage.launchimage/Default-Landscape-736h@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/LaunchImage.launchimage/Default-Landscape-736h@3x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/LaunchImage.launchimage/Default-Landscape-812h@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/LaunchImage.launchimage/Default-Landscape-812h@3x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/LaunchImage.launchimage/Default-Landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/LaunchImage.launchimage/Default-Landscape.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/LaunchImage.launchimage/Default-Portrait-736h@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/LaunchImage.launchimage/Default-Portrait-736h@3x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/LaunchImage.launchimage/Default-Portrait-812h@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/LaunchImage.launchimage/Default-Portrait-812h@3x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/LaunchImage.launchimage/Default-Portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/LaunchImage.launchimage/Default-Portrait.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/LaunchImage.launchimage/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/LaunchImage.launchimage/Default@2x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/today-instance.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "idiom": "universal", 5 | "filename": "instance.png", 6 | "scale": "1x" 7 | }, 8 | { 9 | "idiom": "universal", 10 | "filename": "instance@2x.png", 11 | "scale": "2x" 12 | }, 13 | { 14 | "idiom": "universal", 15 | "filename": "instance@3x.png", 16 | "scale": "3x" 17 | } 18 | ], 19 | "info": { 20 | "version": 1, 21 | "author": "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/now/Images.xcassets/today-instance.imageset/instance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/today-instance.imageset/instance.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/today-instance.imageset/instance@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/today-instance.imageset/instance@2x.png -------------------------------------------------------------------------------- /ios/now/Images.xcassets/today-instance.imageset/instance@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdev/now-mobile/cdb34fb73e6145c276600988b4006d6a5c665edb/ios/now/Images.xcassets/today-instance.imageset/instance@3x.png -------------------------------------------------------------------------------- /ios/now/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | Now 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.1.1 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 10 25 | CodePushDeploymentKey 26 | SkkJPg8aMRjLRiKH485py3J00cKTSJt5VMVIm 27 | LSRequiresIPhoneOS 28 | 29 | NSAppTransportSecurity 30 | 31 | NSExceptionDomains 32 | 33 | localhost 34 | 35 | NSExceptionAllowsInsecureHTTPLoads 36 | 37 | 38 | 39 | 40 | NSFaceIDUsageDescription 41 | Enabling Face ID allows you quick and secure access to your account. 42 | NSLocationWhenInUseUsageDescription 43 | 44 | UIBackgroundModes 45 | 46 | fetch 47 | 48 | UIRequiredDeviceCapabilities 49 | 50 | armv7 51 | 52 | UISupportedInterfaceOrientations 53 | 54 | UIInterfaceOrientationPortrait 55 | 56 | UIViewControllerBasedStatusBarAppearance 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /ios/now/main.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | */ 7 | 8 | #import 9 | 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /ios/now/now.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.im.rdev.now-mobile 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/nowTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/components/EmptyResults.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import React from 'react'; 3 | import styled from 'styled-components'; 4 | 5 | const EmtpyContainer = styled.View` 6 | padding-horizontal: 6%; 7 | margin-top: 28px; 8 | align-items: center; 9 | justify-content: center; 10 | `; 11 | 12 | const EmtpyMessage = styled.Text` 13 | font-size: 16px; 14 | font-weight: 300; 15 | color: ${props => props.theme.lightText}; 16 | `; 17 | 18 | const EmptyResults = (props: { viewName: string }) => ( 19 | 20 | No {props.viewName} to show 21 | 22 | ); 23 | 24 | export default EmptyResults; 25 | -------------------------------------------------------------------------------- /src/components/ErrorBoundary.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import React from 'react'; 3 | import styled from 'styled-components'; 4 | 5 | type Props = { 6 | children: any, 7 | viewName: string, 8 | }; 9 | 10 | type State = { 11 | hasError: boolean, 12 | // error: any, 13 | // errorInfo: any, 14 | }; 15 | 16 | const Error = styled.View` 17 | padding-horizontal: 6%; 18 | margin-top: 28px; 19 | align-items: center; 20 | justify-content: center; 21 | `; 22 | 23 | const ErrorMessage = styled.Text` 24 | font-size: 16px; 25 | font-weight: 300; 26 | color: ${props => props.theme.lightText}; 27 | `; 28 | 29 | // @TODO I feel like some kind of error reporting is necessary after all 30 | export default class ErrorBoundary extends React.Component { 31 | state = { 32 | hasError: false, 33 | // error: null, 34 | // errorInfo: null, 35 | }; 36 | 37 | componentDidCatch(error: any, errorInfo: any) { 38 | this.setState({ 39 | hasError: true, 40 | // error, 41 | // errorInfo, 42 | }); 43 | console.log(JSON.stringify(error, null, 2)); 44 | console.log(errorInfo.componentStack); 45 | } 46 | 47 | render() { 48 | if (this.state.hasError) { 49 | return ( 50 | 51 | 52 | Something went wrong while loading {this.props.viewName} 53 | 54 | 55 | ); 56 | } 57 | return this.props.children; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/components/Logo.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import styled from 'styled-components'; 4 | import { connect } from '../Provider'; 5 | import ZeitLogo from '../../assets/zeit-logo.png'; 6 | import ZeitLogoWhite from '../../assets/zeit-logo-white.png'; 7 | 8 | type Props = { 9 | size?: string, 10 | style?: any, 11 | context: any | Context, 12 | }; 13 | 14 | // We need Zeit logo to be bigger in some cases (authentication) 15 | function setLogoSize(size: string) { 16 | if (size === 'large') { 17 | return { h: '57px', w: '64px' }; 18 | } 19 | 20 | return { h: '30px', w: '34px' }; 21 | } 22 | 23 | const Image = styled.Image` 24 | height: ${({ size }) => setLogoSize(size).h}; 25 | width: ${({ size }) => setLogoSize(size).w}; 26 | `; 27 | 28 | const Logo = ({ size, style, context }: Props) => ( 29 | 30 | ); 31 | 32 | Logo.defaultProps = { 33 | size: '', 34 | style: null, 35 | }; 36 | 37 | export default connect(Logo); 38 | -------------------------------------------------------------------------------- /src/components/View.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styled from 'styled-components'; 3 | import History from './views/History'; 4 | import Deployments from './views/Deployments'; 5 | import Aliases from './views/Aliases'; 6 | import Domains from './views/Domains'; 7 | import Usage from './views/Usage'; 8 | 9 | const Wrapper = styled.View``; 10 | 11 | // Add paddings 12 | const wrap = Component => {Component}; 13 | 14 | export default ({ name }) => { 15 | switch (name) { 16 | case 'History': 17 | return wrap(); 18 | case 'Deployments': 19 | return wrap(); 20 | case 'Aliases': 21 | return wrap(); 22 | case 'Domains': 23 | return wrap(); 24 | case 'Usage': 25 | return wrap(); 26 | default: 27 | return null; 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /src/components/elements/LoadingIndicator.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Dimensions } from 'react-native'; 3 | import * as Animatable from 'react-native-animatable'; 4 | import styled from 'styled-components'; 5 | import Logo from '../Logo'; 6 | 7 | const LoadingIndicator = styled.View` 8 | width: 100%; 9 | height: ${Dimensions.get('window').height * 0.8}; 10 | align-items: center; 11 | justify-content: center; 12 | `; 13 | 14 | export default () => ( 15 | 16 | 23 | 24 | 25 | 26 | ); 27 | -------------------------------------------------------------------------------- /src/components/elements/TimeAgo.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import styled from 'styled-components'; 4 | import moment from 'moment'; 5 | 6 | type Props = { 7 | date: ?string, 8 | bracketed?: boolean, 9 | }; 10 | 11 | moment.updateLocale('en', { 12 | relativeTime: { 13 | s: '%ds', 14 | ss: '%ds', 15 | m: '%dm', 16 | mm: '%dm', 17 | h: '%dh', 18 | hh: '%dh', 19 | d: '%dd', 20 | dd: '%dd', 21 | }, 22 | }); 23 | 24 | const Text = styled.Text` 25 | color: ${props => props.theme.lightText}; 26 | font-weight: 300; 27 | font-size: 16px; 28 | `; 29 | 30 | export default ({ date, bracketed }: Props) => { 31 | const diff = moment().diff(moment(date), 'days'); 32 | if (diff > 1) { 33 | return {bracketed ? `[${diff}d]` : `${diff}d`}; 34 | } 35 | return ( 36 | 37 | {bracketed ? `[${moment(date).fromNow(true)}]` : moment(date).fromNow(true)} 38 | 39 | ); 40 | }; 41 | -------------------------------------------------------------------------------- /src/components/elements/aliases/Alias.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { TouchableOpacity } from 'react-native'; 4 | import styled from 'styled-components'; 5 | import TimeAgo from '../TimeAgo'; 6 | import { isAndroid, promptOpen } from '../../../lib/utils'; 7 | import GoIcon from '../../../../assets/go.png'; 8 | 9 | type Props = { 10 | alias: Zeit$Alias, 11 | last: boolean, 12 | }; 13 | 14 | const View = styled.View` 15 | flex-direction: row; 16 | padding-vertical: 15px; 17 | ${({ last, theme }) => { 18 | if (last) { 19 | return ''; 20 | } 21 | return ` 22 | border-bottom-width: 1px; 23 | border-bottom-color: ${theme.border};`; 24 | }}; 25 | `; 26 | 27 | const LeftSide = styled.View` 28 | flex-direction: column; 29 | flex: 1; 30 | `; 31 | 32 | const TitleWrap = styled.View` 33 | flex-direction: row; 34 | align-items: ${isAndroid ? 'flex-start' : 'baseline'}; 35 | `; 36 | 37 | const Title = styled.Text` 38 | font-size: 18px; 39 | font-weight: 700; 40 | margin-bottom: 5px; 41 | color: ${props => props.theme.text}; 42 | `; 43 | 44 | const Deployment = styled.Text` 45 | font-size: 16px 46 | font-weight: 300; 47 | color: ${props => props.theme.text}; 48 | `; 49 | 50 | const Go = styled.Image` 51 | width: 15px; 52 | height: 14px; 53 | margin-left: 10px; 54 | margin-top: ${isAndroid ? '6px' : 0}; 55 | `; 56 | 57 | export default ({ alias, last }: Props) => ( 58 | 59 | {/* $FlowFixMe */} 60 | 61 | 62 | promptOpen(alias.alias)}> 63 | 64 | {alias.alias} 65 | 66 | 67 | 68 | {alias.deployment.url} 69 | 70 | 71 | 72 | 73 | ); 74 | -------------------------------------------------------------------------------- /src/components/elements/aliases/AliasGroup.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import styled from 'styled-components'; 4 | import TimeAgo from '../TimeAgo'; 5 | import PathAlias from './PathAlias'; 6 | 7 | type Props = { 8 | alias: Zeit$Alias, 9 | last: boolean, 10 | }; 11 | 12 | const View = styled.View` 13 | flex-direction: column; 14 | padding-vertical: 15px; 15 | ${({ last, theme }) => { 16 | if (last) { 17 | return ''; 18 | } 19 | return ` 20 | border-bottom-width: 1px; 21 | border-bottom-color: ${theme.border};`; 22 | }}; 23 | `; 24 | 25 | const Group = styled.View` 26 | flex-direction: column; 27 | padding-left: 20px; 28 | `; 29 | 30 | const TitleWrap = styled.View` 31 | flex-direction: row; 32 | justify-content: space-between; 33 | align-items: center; 34 | `; 35 | 36 | const Title = styled.Text` 37 | font-size: 18px; 38 | font-weight: 700; 39 | margin-bottom: 5px; 40 | color: ${props => props.theme.text}; 41 | `; 42 | 43 | export default ({ alias, last }: Props) => ( 44 | 45 | 46 | {alias.alias} 47 | 48 | 49 | 50 | {/* $FlowFixMe rules is not undefined if this is being rendered */} 51 | {alias.rules.map(({ pathname, dest }, i) => ( 52 | 57 | ))} 58 | 59 | 60 | ); 61 | -------------------------------------------------------------------------------- /src/components/elements/aliases/PathAlias.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { TouchableOpacity } from 'react-native'; 4 | import styled from 'styled-components'; 5 | import { isAndroid, promptOpen } from '../../../lib/utils'; 6 | import GoIcon from '../../../../assets/go.png'; 7 | 8 | type Props = { 9 | pathname?: string, 10 | dest: string, 11 | }; 12 | 13 | const View = styled.View` 14 | flex-direction: column; 15 | padding-vertical: 10px; 16 | `; 17 | 18 | const Address = styled.Text` 19 | font-size: 16px 20 | font-weight: 300; 21 | color: ${props => props.theme.text}; 22 | `; 23 | 24 | const Path = styled.Text` 25 | margin-top: 2px; 26 | font-size: 16px; 27 | font-weight: 300; 28 | color: ${props => props.theme.dimmedText}; 29 | `; 30 | 31 | const TitleWrap = styled.View` 32 | flex-direction: row; 33 | align-items: ${isAndroid ? 'flex-start' : 'baseline'}; 34 | `; 35 | 36 | const Go = styled.Image` 37 | width: 15px; 38 | height: 14px; 39 | margin-left: 10px; 40 | margin-top: ${isAndroid ? '4px' : 0}; 41 | `; 42 | 43 | export default ({ pathname = '*', dest }: Props) => ( 44 | 45 | promptOpen(dest)}> 46 | 47 |
{dest}
48 | 49 |
50 |
51 | {pathname} 52 |
53 | ); 54 | -------------------------------------------------------------------------------- /src/components/elements/deployment-details/AddAliasButton.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import React, { Component } from 'react'; 3 | import { TouchableOpacity, AlertIOS, Alert } from 'react-native'; 4 | // $FlowFixMe 5 | import Prompt from 'react-native-prompt-android'; // eslint-disable-line import/no-unresolved, import/extensions 6 | import styled from 'styled-components'; 7 | import api from '../../../lib/api'; 8 | import { isAndroid } from '../../../lib/utils'; 9 | 10 | type Props = { 11 | deploymentId: string, 12 | reload: () => void, 13 | marginTop: number, 14 | }; 15 | 16 | const ButtonText = styled.Text` 17 | font-weight: 300; 18 | font-size: 16px; 19 | color: ${props => props.theme.dimmedText}; 20 | `; 21 | 22 | export default class AddAliasButton extends Component { 23 | createAlias = () => { 24 | const handler = isAndroid ? Prompt : AlertIOS.prompt; 25 | handler('Enter domain to alias', null, [ 26 | { 27 | text: 'Cancel', 28 | onPress: () => console.log('Aliasing cancelled'), 29 | style: 'cancel', 30 | }, 31 | { 32 | text: 'Alias', 33 | onPress: this.handleCreateAlias, 34 | }, 35 | ]); 36 | }; 37 | 38 | handleCreateAlias = async (alias: string) => { 39 | const { deploymentId } = this.props; 40 | 41 | const { error } = await api.aliases.createAlias(deploymentId, alias); 42 | 43 | if (error) { 44 | console.log('ALIAS CREATION ERROR', error); 45 | Alert.alert('There was error creating alias', error.message); 46 | } else { 47 | this.props.reload(); 48 | } 49 | }; 50 | 51 | render() { 52 | return ( 53 | 58 | Add new alias... 59 | 60 | ); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/components/elements/deployment-details/DeploymentAlias.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import React, { Component } from 'react'; 3 | import { Alert } from 'react-native'; 4 | import Swipeout from 'react-native-swipeout'; 5 | import styled from 'styled-components'; 6 | import { connect } from '../../../Provider'; 7 | import { themes } from '../../../lib/utils'; 8 | import api from '../../../lib/api'; 9 | 10 | type Props = { 11 | alias: Zeit$Alias, 12 | context: Context, 13 | reload: () => void, 14 | }; 15 | 16 | const Wrapper = styled.View` 17 | flex-direction: column; 18 | padding-vertical: 10px; 19 | width: 100%; 20 | border-bottom-width: 1px; 21 | border-bottom-color: ${props => props.theme.border}; 22 | `; 23 | 24 | const Text = styled.Text` 25 | font-size: 16px 26 | font-weight: 300; 27 | color: ${props => props.theme.text}; 28 | `; 29 | 30 | @connect 31 | export default class DeploymentAlias extends Component { 32 | removeAlias = async () => { 33 | const { alias, context, reload } = this.props; 34 | Alert.alert( 35 | 'Remove alias', 36 | `Are you sure you want to remove ${alias.alias}?`, 37 | [ 38 | { text: 'Cancel', onPress: () => console.log('Cancel Pressed'), style: 'cancel' }, 39 | { 40 | text: 'Remove', 41 | onPress: async () => { 42 | const { status } = await api.aliases.removeAlias(alias.uid); 43 | context.reloadAliases(); 44 | if (status === 'SUCCESS') { 45 | reload(); 46 | } else { 47 | Alert.alert('Unable to remove alias'); 48 | } 49 | }, 50 | style: 'destructive', 51 | }, 52 | ], 53 | { cancelable: false }, 54 | ); 55 | }; 56 | 57 | render() { 58 | return ( 59 | 65 | 66 | {this.props.alias.alias} 67 | 68 | 69 | ); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/components/elements/deployment-details/Details.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import React, { Fragment } from 'react'; 3 | import styled from 'styled-components'; 4 | import * as Animatable from 'react-native-animatable'; 5 | import Item from './Item'; 6 | import ScaleTable from './ScaleTable'; 7 | import EventList from './EventList'; 8 | import DeploymentAlias from './DeploymentAlias'; 9 | import AddAliasButton from './AddAliasButton'; 10 | 11 | type Props = { 12 | scale: any, 13 | deployment: Zeit$Deployment, 14 | events: Zeit$Event[], 15 | aliases: Zeit$Alias[], 16 | reload: () => void, 17 | }; 18 | 19 | const View = styled(Animatable.View)` 20 | margin-top: 10px; 21 | `; 22 | 23 | const Heading = styled.Text` 24 | font-size: 22px; 25 | font-weight: 700; 26 | margin-bottom: 20px; 27 | color: ${props => props.theme.text}; 28 | `; 29 | 30 | const MultiWrap = styled.View` 31 | flex-direction: row; 32 | justify-content: space-between; 33 | `; 34 | 35 | export default ({ 36 | scale, deployment, events, aliases, reload, 37 | }: Props) => ( 38 | 39 | Meta 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | Aliases 49 | {aliases && aliases.length > 0 50 | ? aliases.map(alias => ( 51 | // $FlowFixMe 52 | 53 | )) 54 | : null} 55 | 0 ? 20 : 0} 59 | /> 60 | {deployment.type === 'STATIC' ? null : ( 61 | 62 | Scale 63 | 64 | Events 65 | 66 | 67 | )} 68 | 69 | ); 70 | -------------------------------------------------------------------------------- /src/components/elements/deployment-details/EventList.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import React from 'react'; 3 | import styled from 'styled-components'; 4 | 5 | type Props = { 6 | events: Zeit$Event[], 7 | }; 8 | 9 | const View = styled.View` 10 | background-color: ${props => props.theme.monoBackground}; 11 | border-radius: 4px; 12 | padding: 10px; 13 | `; 14 | 15 | const Text = styled.Text` 16 | font-size: 15px; 17 | font-family: 'Menlo'; 18 | color: ${({ green, theme }) => (green ? theme.monoGreenText : theme.lightText)}; 19 | ${({ bold, green }) => (bold || green ? 'font-weight: bold;' : '')}; 20 | `; 21 | 22 | const Event = styled.View` 23 | width: 100%; 24 | flex-direction: column; 25 | margin-bottom: 10px; 26 | ${({ last, theme }) => { 27 | if (last) { 28 | return ''; 29 | } 30 | return ` 31 | padding-bottom: 10px; 32 | border-bottom-width: 1px; 33 | border-bottom-color: ${theme.border};`; 34 | }}; 35 | `; 36 | 37 | function getEventMetadata({ event, payload }: Zeit$Event) { 38 | if (event === 'state') { 39 | return {payload.value}; 40 | } 41 | 42 | if (event === 'instance-start' || event === 'instance-stop') { 43 | if (payload.dc != null) { 44 | return ({payload.dc}); 45 | } 46 | } 47 | 48 | return ''; 49 | } 50 | 51 | export default ({ events }: Props) => ( 52 | 53 | {events.map((event, i) => ( 54 | 55 | {new Date(event.created).toISOString()} 56 | 57 | {event.event} {getEventMetadata(event)} 58 | 59 | 60 | ))} 61 | 62 | ); 63 | -------------------------------------------------------------------------------- /src/components/elements/deployment-details/Item.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import React from 'react'; 3 | import styled from 'styled-components'; 4 | import TimeAgo from '../TimeAgo'; 5 | import { isAndroid, promptOpen } from '../../../lib/utils'; 6 | import GoIcon from '../../../../assets/go.png'; 7 | 8 | type Props = { 9 | name: string, 10 | value: string | Date, 11 | link?: ?string, 12 | small?: boolean, 13 | last?: boolean, 14 | }; 15 | 16 | const View = styled.View` 17 | flex-direction: column; 18 | padding-vertical: 10px; 19 | width: ${({ small }) => (small ? '45%' : '100%')}; 20 | ${({ last, theme }) => { 21 | if (last) { 22 | return 'margin-bottom: 20px'; 23 | } 24 | return ` 25 | border-bottom-width: 1px; 26 | border-bottom-color: ${theme.border};`; 27 | }}; 28 | `; 29 | 30 | const Title = styled.Text` 31 | font-size: 18px; 32 | font-weight: 700; 33 | margin-bottom: 5px; 34 | color: ${props => props.theme.text}; 35 | `; 36 | 37 | const Content = styled.Text` 38 | font-size: 16px 39 | font-weight: 300; 40 | color: ${({ value, theme }) => 41 | (value === 'ERROR' 42 | ? theme.deploymentErrorText 43 | : value === 'INITIALIZING' 44 | ? theme.monoYellowText 45 | : theme.text)}; 46 | `; 47 | 48 | const Button = styled.TouchableOpacity` 49 | flex-direction: row; 50 | align-items: ${isAndroid ? 'flex-start' : 'baseline'}; 51 | `; 52 | 53 | const Go = styled.Image` 54 | width: 15px; 55 | height: 14px; 56 | margin-left: 10px; 57 | margin-top: ${isAndroid ? '6px' : 0}; 58 | `; 59 | 60 | export default ({ 61 | name, value, last, link, small, 62 | }: Props) => ( 63 | 64 | {name} 65 | {link ? ( 66 | 70 | ) : ( 71 | 72 | {value instanceof Date ? ( 73 | 74 | {value.toString()} 75 | 76 | ) : ( 77 | value 78 | )} 79 | 80 | )} 81 | 82 | ); 83 | -------------------------------------------------------------------------------- /src/components/elements/deployment-details/ScaleTable.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import React from 'react'; 3 | import styled from 'styled-components'; 4 | 5 | type Props = { 6 | scale: Zeit$Scale, 7 | deployment: Zeit$Deployment, 8 | }; 9 | 10 | const Table = styled.View` 11 | flex-direction: column; 12 | width: 100%; 13 | margin-bottom: 20px; 14 | `; 15 | 16 | const Row = styled.View` 17 | flex-direction: row; 18 | justify-content: space-between; 19 | align-items: center; 20 | margin-bottom: 7px; 21 | `; 22 | 23 | const Item = styled.View` 24 | width: 25%; 25 | ${({ first }) => (first ? '' : 'align-items: center;')}; 26 | `; 27 | 28 | const Text = styled.Text` 29 | font-size: 16px 30 | font-weight: ${({ heading }) => (heading ? '700' : '300')}; 31 | color: ${props => props.theme.text}; 32 | `; 33 | 34 | export default ({ scale, deployment }: Props) => ( 35 | 36 | 37 | 38 | dc 39 | 40 | 41 | min 42 | 43 | 44 | max 45 | 46 | 47 | current 48 | 49 | 50 | {(() => { 51 | const rows = []; 52 | 53 | Object.keys(scale).forEach((dc) => { 54 | const { instances } = scale[dc]; 55 | const cfg = deployment.scale[dc] || {}; 56 | 57 | const row = ( 58 | 59 | 60 | {dc} 61 | 62 | 63 | {cfg.min || 0} 64 | 65 | 66 | {cfg.max || 0} 67 | 68 | 69 | {instances.length} 70 | 71 | 72 | ); 73 | 74 | rows.push(row); 75 | }); 76 | 77 | return rows; 78 | })()} 79 |
80 | ); 81 | -------------------------------------------------------------------------------- /src/components/elements/deployments/DeploymentGroup.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import styled from 'styled-components'; 4 | import Deployment from './Deployment'; 5 | 6 | type Props = { 7 | deployments: Zeit$Deployment[], 8 | name: string, 9 | last: boolean, 10 | }; 11 | 12 | const View = styled.View` 13 | flex-direction: column; 14 | padding-vertical: 15px; 15 | ${({ last, theme }) => { 16 | if (last) { 17 | return ''; 18 | } 19 | return ` 20 | border-bottom-width: 1px; 21 | border-bottom-color: ${theme.border};`; 22 | }}; 23 | `; 24 | 25 | const Group = styled.View` 26 | flex-direction: column; 27 | padding-left: 20px; 28 | `; 29 | 30 | const Title = styled.Text` 31 | font-size: 18px; 32 | font-weight: 700; 33 | margin-bottom: 5px; 34 | color: ${props => props.theme.text}; 35 | `; 36 | 37 | export default ({ deployments, name, last }: Props) => ( 38 | 39 | {name} 40 | 41 | {deployments.map(deployment => ( 42 | 43 | ))} 44 | 45 | 46 | ); 47 | -------------------------------------------------------------------------------- /src/components/elements/domains/Domain.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import styled from 'styled-components'; 4 | import TimeAgo from '../TimeAgo'; 5 | import ExpireDate from './ExpireDate'; 6 | 7 | type Props = { 8 | domain: Zeit$Domain, 9 | last: boolean, 10 | }; 11 | 12 | const View = styled.View` 13 | flex-direction: row; 14 | padding-vertical: 15px; 15 | ${({ last, theme }) => { 16 | if (last) { 17 | return ''; 18 | } 19 | return ` 20 | border-bottom-width: 1px; 21 | border-bottom-color: ${theme.border};`; 22 | }}; 23 | `; 24 | 25 | const LeftSide = styled.View` 26 | flex-direction: column; 27 | flex: 1; 28 | `; 29 | 30 | const Metadata = styled.View` 31 | flex-direction: row; 32 | align-items: center; 33 | `; 34 | 35 | const MetaText = styled.Text` 36 | color: ${({ enabled, theme }) => (enabled ? theme.text : theme.dimmedText)}; 37 | font-size: 16px; 38 | font-weight: 300; 39 | `; 40 | 41 | const MetaGroup = styled.View` 42 | flex-direction: row; 43 | align-items: center; 44 | border-right-color: ${props => props.theme.border}; 45 | `; 46 | 47 | const Title = styled.Text` 48 | font-size: 18px; 49 | font-weight: 700; 50 | margin-bottom: 5px; 51 | color: ${props => props.theme.text}; 52 | `; 53 | 54 | export default ({ domain, last }: Props) => ( 55 | 56 | 57 | {domain.name} 58 | 59 | 66 | 67 | {domain.cdnEnabled ? 'CDN: On' : 'CDN: Off'} 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | ); 76 | -------------------------------------------------------------------------------- /src/components/elements/domains/ExpireDate.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import styled from 'styled-components'; 4 | import moment from 'moment'; 5 | 6 | type Props = { 7 | date: ?string, 8 | }; 9 | 10 | const Text = styled.Text` 11 | font-size: 16px 12 | font-weight: 300; 13 | color: ${props => props.theme.text}; 14 | `; 15 | 16 | export default ({ date }: Props) => {date ? moment(date).format('DD MMM YYYY') : '-'}; 17 | -------------------------------------------------------------------------------- /src/components/elements/history/ItemComponents.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Text = styled.Text` 4 | font-size: 16px; 5 | font-weight: 300; 6 | color: ${props => props.theme.lightText}; 7 | `; 8 | 9 | // Not really bold but I couldn't think of a proper name 10 | export const Bold = styled.Text` 11 | font-size: 16px; 12 | font-weight: 300; 13 | color: ${props => props.theme.text}; 14 | `; 15 | 16 | export const MonospaceWrap = styled.View` 17 | background-color: ${props => props.theme.monoBackground}; 18 | border-radius: 4px; 19 | margin-top: 15px; 20 | `; 21 | 22 | export const Monospace = styled.Text` 23 | font-size: 15px; 24 | font-family: 'Menlo'; 25 | color: ${props => props.theme.lightText}; 26 | margin: 15px; 27 | `; 28 | -------------------------------------------------------------------------------- /src/components/elements/history/ModeSwitcher.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import styled from 'styled-components'; 4 | 5 | type Props = { 6 | onSystemPress: Function, 7 | onTeamPress: Function, 8 | onMePress: Function, 9 | active: 'system' | 'team' | 'me', 10 | team: any, 11 | }; 12 | 13 | const View = styled.View` 14 | flex-direction: row; 15 | justify-content: space-around; 16 | padding-vertical: 8px; 17 | border-radius: 6px; 18 | border-color: ${props => props.theme.modeSwitcherBorder}; 19 | border-width: 1px; 20 | margin-bottom: 10px; 21 | width: 100%; 22 | `; 23 | 24 | const Switch = styled.TouchableOpacity` 25 | justify-content: center; 26 | align-items: center; 27 | flex: 1; 28 | border-right-color: ${props => props.theme.modeSwitcherBorder}; 29 | border-right-width: ${({ border }) => (border ? '1px' : '0')}; 30 | `; 31 | 32 | const Text = styled.Text` 33 | font-size: 14px; 34 | font-weight: 300; 35 | color: ${({ active, theme }) => (active ? theme.text : theme.lightText)}; 36 | `; 37 | 38 | export default ({ 39 | onSystemPress, onTeamPress, onMePress, team, active, 40 | }: Props) => ( 41 | 42 | 43 | System 44 | 45 | {(() => 46 | (team ? ( 47 | 48 | Team 49 | 50 | ) : null))()} 51 | 52 | {team ? 'Just Me' : 'Me'} 53 | 54 | 55 | ); 56 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/alias-chown.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class AliasChown extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | changed the ownership of alias {event.payload.name} 14 | {event.payload.oldTeam ? ` from ${event.payload.oldTeam.name}` : ''} to{' '} 15 | {event.payload.newTeam.name} 16 | 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/alias-delete.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class AliasDelete extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | removed alias {event.payload.alias} 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/alias.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | // @FIXME API changed by Zeit: event.payload.alias / event.payload.deploymentUrl gone 7 | 8 | export default class Alias extends Message { 9 | render() { 10 | const { event } = this.props; 11 | const { ruleCount } = event.payload; 12 | 13 | // NOTE: no `ruleCount` on old logs 14 | if ((ruleCount !== null && ruleCount > 0) || !event.payload.deploymentUrl) { 15 | return ( 16 | 17 | {this.getDisplayName()} 18 | configured {event.payload.ruleCount} alias rule 19 | {event.payload.ruleCount === null || event.payload.ruleCount > 1 20 | ? 's' 21 | : ''} for {event.payload.alias} 22 | 23 | ); 24 | } 25 | 26 | return ( 27 | 28 | {this.getDisplayName()} 29 | aliased {event.payload.deploymentUrl} to{' '} 30 | {event.payload.alias} 31 | 32 | ); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/avatar.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class Avatar extends Message { 7 | render() { 8 | return ( 9 | 10 | {this.getDisplayName()} 11 | updated your avatar 12 | 13 | ); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/cert-autorenew.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class CertAutoRenew extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | Certificate for {event.payload.cn} was automatically renewed 13 | 14 | ); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/cert-chown.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class CertChown extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | changed the ownership of cert {event.payload.id} 14 | {event.payload.oldTeam ? ` from ${event.payload.oldTeam.name}` : ''} to{' '} 15 | {event.payload.newTeam.name} 16 | 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/cert-clone.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class CertClone extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | cloned a certificate {event.payload.src} to{' '} 14 | {event.payload.dst} 15 | 16 | ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/cert-delete.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class CertDelete extends Message { 7 | render() { 8 | const { event } = this.props; 9 | const { recordId } = event.payload; 10 | 11 | return ( 12 | 13 | {this.getDisplayName()} 14 | deleted certificate {recordId} 15 | 16 | ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/cert-renew.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class CertRenew extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | renewed a certificate for {event.payload.cn} 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/cert-replace.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class CertReplace extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | replaced a certificate for {event.payload.cn} 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/cert.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class Cert extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | created a certificate for {event.payload.cn} 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/deployment-chown.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class DeploymentChown extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | changed the ownership of deployment {event.payload.url} 14 | {event.payload.oldTeam ? ` from ${event.payload.oldTeam.name}` : ''} to{' '} 15 | {event.payload.newTeam.name} 16 | 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/deployment-delete.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class DeploymentDelete extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | deleted {event.payload.url} 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/deployment-freeze.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class DeploymentFreeze extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | The deployment {event.payload.url} was frozen 13 | 14 | ); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/deployment-unfreeze.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class DeploymentUnfreeze extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | The deployment {event.payload.url} was unfrozen 13 | 14 | ); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/deployment.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class Deployment extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | deployed {event.payload.name} to {event.payload.url} 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/dns-add.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import styled from 'styled-components'; 4 | import { Text, Bold, Monospace, MonospaceWrap } from '../ItemComponents'; 5 | import Message from './message'; 6 | 7 | const View = styled.View` 8 | flex-direction: column; 9 | `; 10 | 11 | export default class DnsAdd extends Message { 12 | render() { 13 | const { event } = this.props; 14 | const { value } = event.payload; 15 | const v = value.slice(0, 50); 16 | 17 | return ( 18 | 19 | 20 | {this.getDisplayName()} 21 | added a DNS record for {event.payload.domain}:{' '} 22 | 23 | 24 | 25 | {event.payload.id || ''} 26 | : {event.payload.name} {event.payload.type}{' '} 27 | {v + (v.length < value.length ? '…' : '')} 28 | 29 | 30 | 31 | ); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/dns-delete.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class DnsDelete extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | removed a DNS record {event.payload.id} of {event.payload.domain} 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/dns-update.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import styled from 'styled-components'; 4 | import { Text, Bold, Monospace, MonospaceWrap } from '../ItemComponents'; 5 | import Message from './message'; 6 | 7 | const View = styled.View` 8 | flex-direction: column; 9 | `; 10 | 11 | export default class DnsUpdate extends Message { 12 | render() { 13 | const { event } = this.props; 14 | const { value } = event.payload; 15 | const v = value.slice(0, 50); 16 | 17 | return ( 18 | 19 | 20 | {this.getDisplayName()} 21 | updated a DNS record for {event.payload.domain}: 22 | 23 | 24 | 25 | {event.payload.id ? `${event.payload.id}:` : ''} {event.payload.name}{' '} 26 | {event.payload.type} {v + (v.length < value.length ? '…' : '')} 27 | 28 | 29 | 30 | ); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/domain-buy.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class DomainBuy extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | bought the domain {event.payload.name} for ${event.payload.price} (per 14 | year) 15 | 16 | ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/domain-chown.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class DomainChown extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | changed the ownership of domain {event.payload.name} 14 | {event.payload.oldTeam ? ` from ${event.payload.oldTeam.name}` : ''} to{' '} 15 | {event.payload.newTeam.name} 16 | 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/domain-delete.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class DomainDelete extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | removed domain {event.payload.name} 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/domain.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class Domain extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | added domain {event.payload.name} 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/message.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React, { PureComponent } from 'react'; 3 | import { Bold } from '../ItemComponents'; 4 | 5 | type Props = { 6 | event: any, 7 | user: Zeit$User, 8 | team: { slug: string }, // @TODO Zeit$Team, 9 | }; 10 | 11 | class Message extends PureComponent { 12 | getDisplayName() { 13 | const { event, user } = this.props; 14 | 15 | let isCurrentUser = false; 16 | 17 | if (event.userId && event.userId === user.uid) { 18 | isCurrentUser = true; 19 | } 20 | 21 | if (event.user && event.user.uid && event.user.uid === user.uid) { 22 | isCurrentUser = true; 23 | } 24 | 25 | if (isCurrentUser) { 26 | return [You, ' ']; 27 | } 28 | // @FIXME Probably same issue with alias API being changed by Zeit 29 | if (event.user && event.user.username) { 30 | return [{event.user.username}, ' ']; 31 | } 32 | 33 | return [{event.user.email}, ' ']; 34 | } 35 | } 36 | 37 | export default Message; 38 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/plan.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class Plan extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | changed plan to {event.payload.plan} 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/scale-auto.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class Scale extends Message { 7 | render() { 8 | const { event } = this.props; 9 | const { instances, url } = event.payload; 10 | 11 | return ( 12 | 13 | The deployment {url} was auto-scaled to{' '} 14 | 15 | {instances} instance{instances > 1 ? 's' : ''} 16 | 17 | 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/scale.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class Scale extends Message { 7 | render() { 8 | const { event } = this.props; 9 | const { instances } = event.payload; 10 | 11 | return ( 12 | 13 | {this.getDisplayName()} 14 | scaled deployment {event.payload.url} to{' '} 15 | 16 | {instances} instance{instances > 1 ? 's' : ''} 17 | 18 | 19 | ); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/secret-add.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class SecretAdd extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | added secret{' '} 14 | {event.payload.name ? event.payload.name : event.payload.uid} 15 | 16 | ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/secret-delete.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class SecretDelete extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | removed secret{' '} 14 | {event.payload.name ? event.payload.name : event.payload.uid} 15 | 16 | ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/secret-rename.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class SecretRename extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | renamed secret {event.payload.oldName} to{' '} 14 | {event.payload.newName} 15 | 16 | ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/set-scale.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class Scale extends Message { 7 | render() { 8 | const { event } = this.props; 9 | const { min, max } = event.payload; 10 | 11 | if (min && max) { 12 | return ( 13 | 14 | {this.getDisplayName()} 15 | updated scale rules for {event.payload.url} to min:{' '} 16 | {min}, max: {max} 17 | 18 | ); 19 | } 20 | 21 | return ( 22 | 23 | {this.getDisplayName()} 24 | updated scale rules for {event.payload.url} 25 | 26 | ); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/team-avatar-update.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class TeamAvatarUpdate extends Message { 7 | render() { 8 | return ( 9 | 10 | {this.getDisplayName()} 11 | updated the team{"'"}s avatar 12 | 13 | ); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/team-delete.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class TeamDelete extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | deleted the team {event.payload.slug} 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/team-member-add.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class TeamMemberAdd extends Message { 7 | render() { 8 | const { event } = this.props; 9 | const { invitedUser } = event.payload; 10 | const username = invitedUser.username || invitedUser.email; 11 | 12 | return ( 13 | 14 | {this.getDisplayName()} 15 | invited user{invitedUser.username ? '' : ' with email address'}{' '} 16 | {username} 17 | 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/team-member-delete.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class TeamMemberDelete extends Message { 7 | render() { 8 | const { event } = this.props; 9 | const { deletedUser } = event.payload; 10 | const username = deletedUser.username || deletedUser.email; 11 | 12 | return ( 13 | 14 | {this.getDisplayName()} 15 | removed user{deletedUser.username ? '' : ' with email address'}{' '} 16 | {username} 17 | 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/team-member-role-update.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class TeamMemberRoleUpdate extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | updated {event.payload.updatedUser.username} 14 | {"'"}s role from {event.payload.previousRole} to{' '} 15 | {event.payload.role} 16 | 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/team-name-update.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class TeamNameUpdate extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | updated team name to {event.payload.name} 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/team-slug-update.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class TeamSlugUpdate extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | updated team url to {event.payload.slug} 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/team.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class Team extends Message { 7 | render() { 8 | const { event, team } = this.props; 9 | const teamSlug = event.payload.slug; 10 | 11 | if (teamSlug === team.slug) { 12 | return ( 13 | 14 | {this.getDisplayName()} 15 | created this team 16 | 17 | ); 18 | } 19 | 20 | return ( 21 | 22 | {this.getDisplayName()} 23 | created the team {event.payload.slug} 24 | 25 | ); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/components/elements/history/messages/username.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { Text, Bold } from '../ItemComponents'; 4 | import Message from './message'; 5 | 6 | export default class Username extends Message { 7 | render() { 8 | const { event } = this.props; 9 | 10 | return ( 11 | 12 | {this.getDisplayName()} 13 | set username to {event.payload.username} 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/components/elements/settings/Button.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | const Button = styled.Text` 4 | font-size: 18px; 5 | font-weight: 300; 6 | color: ${props => props.theme.settingsButton}; 7 | `; 8 | 9 | export default Button; 10 | -------------------------------------------------------------------------------- /src/components/elements/settings/Input.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import styled from 'styled-components'; 4 | 5 | type Props = { 6 | onChangeText: (inputValue: string) => void, 7 | value: string, 8 | width?: string, 9 | style?: { [string]: any }, 10 | numeric?: boolean, 11 | }; 12 | 13 | const Input = styled.TextInput` 14 | color: ${({ value, theme }) => (value === '0' ? theme.input : theme.text)}; 15 | font-size: 18px; 16 | font-weight: 300; 17 | width: ${({ width }) => width || '70%'}; 18 | border-bottom-width: 1px; 19 | border-bottom-color: ${({ value, theme }) => 20 | (value && value !== '0' ? theme.text : theme.input)}; 21 | text-align: center; 22 | padding-vertical: 10px; 23 | `; 24 | 25 | export default ({ 26 | onChangeText, value, width, style, numeric, 27 | }: Props) => ( 28 | 36 | ); 37 | -------------------------------------------------------------------------------- /src/components/elements/settings/ProfilePic.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { isIphoneSE } from '../../../lib/utils'; 3 | 4 | const ProfilePic = styled.View` 5 | height: 128px; 6 | width: 128px; 7 | border-radius: 100px; 8 | background: #e0e0e0; 9 | overflow: hidden; 10 | margin-bottom: 30px; 11 | margin-top: ${isIphoneSE() ? '60px' : '120px'}; 12 | `; 13 | 14 | export default ProfilePic; 15 | -------------------------------------------------------------------------------- /src/components/elements/settings/RowText.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | const RowText = styled.Text` 4 | font-size: 18px 5 | font-weight: 400; 6 | color: ${props => props.theme.text}; 7 | `; 8 | 9 | export default RowText; 10 | -------------------------------------------------------------------------------- /src/components/elements/settings/Separator.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | const Separator = styled.View` 4 | height: 1px; 5 | border-bottom-color: ${props => props.theme.border}; 6 | border-bottom-width: 1px; 7 | margin-vertical: 12px; 8 | width: 80%; 9 | `; 10 | 11 | export default Separator; 12 | -------------------------------------------------------------------------------- /src/components/elements/settings/SettingsRow.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | const SettingsRow = styled.View` 4 | width: 80%; 5 | flex-direction: row; 6 | justify-content: space-between; 7 | align-items: center; 8 | margin-vertical: 5px; 9 | `; 10 | 11 | export default SettingsRow; 12 | -------------------------------------------------------------------------------- /src/components/elements/settings/UsageLimitInput.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import React from 'react'; 3 | import styled from 'styled-components'; 4 | import Input from './Input'; 5 | 6 | type Props = { 7 | label?: boolean, 8 | value: string, 9 | onChangeText: (val: string) => void, 10 | }; 11 | 12 | const View = styled.View` 13 | flex-direction: row; 14 | align-items: center; 15 | justify-content: flex-end; 16 | `; 17 | 18 | const Label = styled.Text` 19 | font-size: 18px 20 | font-weight: 400; 21 | color: ${({ active, theme }) => (active ? theme.text : theme.input)}; 22 | `; 23 | 24 | export default ({ label, value, onChangeText }: Props) => ( 25 | 26 | 33 | {label ? : null} 34 | 35 | ); 36 | -------------------------------------------------------------------------------- /src/components/elements/usage/UsageEntry.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import styled from 'styled-components'; 4 | import { isAndroid } from '../../../lib/utils'; 5 | 6 | type Props = { 7 | usage: string | number, 8 | max: string | number, 9 | name: string, 10 | }; 11 | 12 | const View = styled.View` 13 | flex-direction: column; 14 | width: 50%; 15 | justify-content: center; 16 | align-items: center; 17 | border-width: 1px; 18 | border-style: solid; 19 | border-color: ${props => props.theme.border}; 20 | padding-vertical: 25px; 21 | background-color: ${props => props.theme.usageGridBackground}; 22 | `; 23 | 24 | const Numbers = styled.View` 25 | flex-direction: row; 26 | align-items: center; 27 | `; 28 | 29 | const Usage = styled.Text` 30 | font-weight: 100; 31 | font-size: 32px; 32 | letter-spacing: 0.5px; 33 | color: ${props => props.theme.text}; 34 | ${isAndroid ? 'font-family: sans-serif-thin;' : ''}; 35 | `; 36 | 37 | const Max = styled.Text` 38 | font-size: 18px; 39 | color: ${props => props.theme.lightText}; 40 | font-weight: 200; 41 | margin-left: 10px; 42 | `; 43 | 44 | const Title = styled.Text` 45 | font-size: 16px; 46 | font-weight: 300; 47 | margin-top: 5px; 48 | color: ${props => props.theme.text}; 49 | `; 50 | 51 | export default ({ usage, max, name }: Props) => ( 52 | 53 | 54 | {usage} 55 | {name !== 'Domains' && / {max}} 56 | 57 | {name} 58 | 59 | ); 60 | -------------------------------------------------------------------------------- /src/components/views/Aliases.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React, { Component } from 'react'; 3 | import { FlatList } from 'react-native'; 4 | import ErrorBoundary from '../ErrorBoundary'; 5 | import EmptyResults from '../EmptyResults'; 6 | import Alias from '../elements/aliases/Alias'; 7 | import AliasGroup from '../elements/aliases/AliasGroup'; 8 | import { connect } from '../../Provider'; 9 | 10 | type Props = { 11 | context: any | Context, 12 | }; 13 | 14 | type AliasData = { 15 | alias: Zeit$Alias, 16 | last: boolean, 17 | }; 18 | 19 | const containerStyle = { 20 | paddingBottom: 80, 21 | paddingHorizontal: '6%', 22 | }; 23 | 24 | @connect 25 | export default class Aliases extends Component { 26 | renderItem = ({ item }: { item: AliasData }) => 27 | (item.alias.rules ? ( 28 | 29 | ) : ( 30 | 31 | )); 32 | 33 | render() { 34 | const { reloadAliases, refreshing } = this.props.context; 35 | const aliases = this.props.context.aliases.sort((a, b) => new Date(b.created) - new Date(a.created)); 36 | 37 | return ( 38 | 39 | ({ alias, last: i === aliases.length - 1 }))} 42 | ListEmptyComponent={} 43 | renderItem={this.renderItem} 44 | keyExtractor={item => item.alias.uid} 45 | onRefresh={reloadAliases} 46 | refreshing={refreshing === 'aliases' || refreshing === 'all'} 47 | /> 48 | 49 | ); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/components/views/Deployments.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React, { Component } from 'react'; 3 | import { FlatList } from 'react-native'; 4 | import ErrorBoundary from '../ErrorBoundary'; 5 | import EmptyResults from '../EmptyResults'; 6 | import { connect } from '../../Provider'; 7 | import DeploymentGroup from '../elements/deployments/DeploymentGroup'; 8 | 9 | type Props = { 10 | context: Context, 11 | }; 12 | 13 | type DeploymentData = { 14 | deployments: Zeit$Deployment[], 15 | name: string, 16 | last: boolean, 17 | }; 18 | 19 | const containerStyle = { 20 | paddingBottom: 80, 21 | paddingHorizontal: '6%', 22 | }; 23 | 24 | @connect 25 | export default class Deployments extends Component { 26 | renderItem = ({ item }: { item: DeploymentData }) => ( 27 | 28 | ); 29 | 30 | render() { 31 | const { refreshing, reloadDeployments } = this.props.context; 32 | const deployments = this.props.context.deployments.sort((a, b) => { 33 | if (a.name < b.name) return -1; 34 | if (a.name > b.name) return 1; 35 | return 0; 36 | }); 37 | 38 | const sortedDeployments = {}; 39 | deployments.forEach((deployment) => { 40 | if (!sortedDeployments[deployment.name]) sortedDeployments[deployment.name] = []; 41 | const group = sortedDeployments[deployment.name]; 42 | 43 | group.push(deployment); 44 | if (group.length > 1) group.sort((a, b) => new Date(b.created) - new Date(a.created)); 45 | }); 46 | 47 | const data = Object.keys(sortedDeployments).map((key, i) => ({ 48 | deployments: sortedDeployments[key], 49 | name: key, 50 | last: i === sortedDeployments.length - 1, 51 | })); 52 | 53 | return ( 54 | 55 | } 59 | renderItem={this.renderItem} 60 | keyExtractor={item => item.name} 61 | onRefresh={reloadDeployments} 62 | refreshing={refreshing === 'deployments' || refreshing === 'all'} 63 | /> 64 | 65 | ); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/components/views/Domains.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import React from 'react'; 3 | import { FlatList } from 'react-native'; 4 | import ErrorBoundary from '../ErrorBoundary'; 5 | import EmptyResults from '../EmptyResults'; 6 | import Domain from '../elements/domains/Domain'; 7 | import { connect } from '../../Provider'; 8 | 9 | type Props = { 10 | context: any | Context, 11 | }; 12 | 13 | type DomainData = { 14 | domain: Zeit$Domain, 15 | last: boolean, 16 | }; 17 | 18 | const containerStyle = { 19 | paddingBottom: 80, 20 | paddingHorizontal: '6%', 21 | }; 22 | 23 | @connect 24 | export default class Domains extends React.Component { 25 | renderItem = ({ item }: { item: DomainData }) => ( 26 | 27 | ); 28 | 29 | render() { 30 | const { reloadDomains, refreshing } = this.props.context; 31 | const domains = this.props.context.domains.sort((a, b) => new Date(b.created) - new Date(a.created)); 32 | 33 | return ( 34 | 35 | ({ domain, last: i === domains.length - 1 }))} 38 | ListEmptyComponent={} 39 | renderItem={this.renderItem} 40 | keyExtractor={item => item.domain.uid} 41 | onRefresh={reloadDomains} 42 | refreshing={refreshing === 'domains' || refreshing === 'all'} 43 | /> 44 | 45 | ); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/extensions/spotlight/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import SpotlightSearch from 'react-native-search-api'; 3 | 4 | export async function clear() { 5 | return SpotlightSearch.deleteAllSpotlightItems(); 6 | } 7 | 8 | export async function indexDeployments(deployments: Zeit$Deployment[]) { 9 | SpotlightSearch.indexSpotlightItems(deployments.map(deployment => ({ 10 | title: deployment.url, 11 | contentDescription: `${ 12 | deployment.scale 13 | ? `${deployment.scale.current} instance${ 14 | deployment.scale.current !== 1 ? 's' : '' 15 | } | ` 16 | : '' 17 | } ${deployment.state}`, 18 | uniqueIdentifier: deployment.uid, 19 | domain: 'deployment', 20 | keywords: ['zeit', 'now', 'deployment', 'deployments', deployment.name], 21 | thumbnail: {}, 22 | }))); 23 | } 24 | 25 | export async function handleAppOpen() { 26 | const spotlightActivity = await SpotlightSearch.getInitialSpotlightItem(); 27 | return spotlightActivity; 28 | } 29 | 30 | export function addListener(handler: Function) { 31 | SpotlightSearch.addOnSpotlightItemOpenEventListener(handler); 32 | } 33 | 34 | export function removeListener(handler: Function) { 35 | SpotlightSearch.removeOnSpotlightItemOpenEventListener(handler); 36 | } 37 | -------------------------------------------------------------------------------- /src/lib/api/actions/aliases.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import request from '../request'; 3 | 4 | export async function getAll(): Promise { 5 | const result: Zeit$Aliases = await request('/v2/now/aliases', 'GET'); 6 | 7 | return result; 8 | } 9 | 10 | export async function createAlias( 11 | deploymentId: string, 12 | alias: string, 13 | ): Promise { 14 | const result: CreateAliasResponse = await request( 15 | `/v2/now/deployments/${deploymentId}/aliases`, 16 | 'POST', 17 | { body: { alias } }, 18 | ); 19 | 20 | return result; 21 | } 22 | 23 | export async function removeAlias(id: string): Promise { 24 | const result: RemoveAliasResponse = await request(`/v2/now/aliases/${id}`, 'DELETE'); 25 | 26 | return result; 27 | } 28 | -------------------------------------------------------------------------------- /src/lib/api/actions/auth.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import { AsyncStorage } from 'react-native'; 3 | import request from '../request'; 4 | 5 | export async function login(email: string): Promise { 6 | console.log(email); 7 | const result: Zeit$Preauth = await request('/now/registration', 'POST', { 8 | body: { 9 | email, 10 | tokenName: 'Now Mobile', 11 | }, 12 | }); 13 | 14 | console.log('LOGIN', result); 15 | 16 | return result; 17 | } 18 | 19 | export async function verify(email: string): Promise { 20 | const TOKEN = await AsyncStorage.getItem('@now:preauthToken'); 21 | const result: Zeit$Auth = await request( 22 | `/now/registration/verify?email=${email}&token=${TOKEN}&t=${new Date().getTime()}`, 23 | 'GET', 24 | ); 25 | 26 | console.log(result); 27 | 28 | return result; 29 | } 30 | -------------------------------------------------------------------------------- /src/lib/api/actions/deployments.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import qs from 'query-string'; 3 | import request from '../request'; 4 | import { caught } from '../../utils'; 5 | 6 | export async function deployments(): Promise { 7 | const result: Zeit$Deployments = await request('/v2/now/deployments', 'GET'); 8 | 9 | return result; 10 | } 11 | 12 | export async function deploymentDetails(id: string, type: string): Promise { 13 | const query = qs.stringify({ types: 'event' }); 14 | const [deployment, scale, events, aliases] = await Promise.all([ 15 | caught(request(`/v3/now/deployments/${id}`, 'GET')), 16 | caught(request(`/v3/now/deployments/${id}/instances`, 'GET')), 17 | type === 'STATIC' 18 | ? null 19 | : caught(request(`/v1/now/deployments/${id}/events`, 'GET', { query })), 20 | caught(request(`/v2/now/deployments/${id}/aliases`, 'GET')), 21 | ]); 22 | 23 | return { 24 | deployment, 25 | scale, 26 | events, 27 | aliases, 28 | }; 29 | } 30 | -------------------------------------------------------------------------------- /src/lib/api/actions/domains.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import request from '../request'; 3 | 4 | export default async function domains(): Promise { 5 | const result: Zeit$Domains = await request('/domains', 'GET'); 6 | 7 | return result; 8 | } 9 | -------------------------------------------------------------------------------- /src/lib/api/actions/events.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import request from '../request'; 3 | 4 | export default async function events(query: string): Promise { 5 | const result: Zeit$Events = await request('/events', 'GET', { query }); 6 | return result; 7 | } 8 | -------------------------------------------------------------------------------- /src/lib/api/actions/teams.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import request from '../request'; 3 | 4 | export async function getTeams(): Promise { 5 | const result: Zeit$Teams = await request('/teams', 'GET'); 6 | 7 | return result; 8 | } 9 | 10 | export async function getTeam(id: string): Promise { 11 | const result: Zeit$Team = await request(`/teams/${id}`, 'GET'); 12 | 13 | return result; 14 | } 15 | 16 | // @TODO 17 | export async function createTeam(slug: string): Promise<*> { 18 | const result: Zeit$NewTeam = await request('/teams', 'POST', { 19 | body: { slug }, 20 | }); 21 | 22 | return result; 23 | } 24 | 25 | export async function deleteTeam(id: string): Promise<*> { 26 | const result: Zeit$DeleteTeam = await request(`/teams/${id}`, 'DELETE'); 27 | 28 | return result; 29 | } 30 | 31 | export async function changeTeamName(id: string, name: string) { 32 | const result = await request(`/teams/${id}`, 'PATCH', { 33 | body: { name }, 34 | }); 35 | 36 | return result; 37 | } 38 | -------------------------------------------------------------------------------- /src/lib/api/actions/usage.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import request from '../request'; 3 | 4 | export default async function usage(): Promise { 5 | const result: Zeit$Usage = await request('/pricing/state/usage', 'GET'); 6 | 7 | return result; 8 | } 9 | -------------------------------------------------------------------------------- /src/lib/api/actions/user.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import request from '../request'; 3 | 4 | export async function vitals(): Promise { 5 | const result: Zeit$Vitals = await request('/www/user', 'GET'); 6 | 7 | return result; 8 | } 9 | 10 | export async function changeUsername(username: string) { 11 | const result = await request('/www/user', 'PATCH', { 12 | body: { username }, 13 | }); 14 | 15 | return result; 16 | } 17 | 18 | export async function teams() { 19 | // 20 | } 21 | 22 | export function avatarPath(id?: ?string) { 23 | return id ? `https://zeit.co/api/www/avatar/${id}?s=90` : ''; 24 | } 25 | -------------------------------------------------------------------------------- /src/lib/api/index.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import * as auth from './actions/auth'; 3 | import * as user from './actions/user'; 4 | import domains from './actions/domains'; 5 | import * as aliases from './actions/aliases'; 6 | import usage from './actions/usage'; 7 | import { deployments, deploymentDetails } from './actions/deployments'; 8 | import events from './actions/events'; 9 | import * as teams from './actions/teams'; 10 | 11 | export default { 12 | auth, 13 | user, 14 | domains, 15 | aliases, 16 | usage, 17 | deployments, 18 | deploymentDetails, 19 | events, 20 | teams, 21 | }; 22 | -------------------------------------------------------------------------------- /src/lib/api/request.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import { AsyncStorage, Platform } from 'react-native'; 3 | import pkg from '../../../package.json'; 4 | 5 | export default async function request( 6 | path: string, 7 | method: Method, 8 | options?: RequestOptions = {}, 9 | ): Promise<*> { 10 | try { 11 | const TOKEN = await AsyncStorage.getItem('@now:token'); 12 | const TEAM_ID = await AsyncStorage.getItem('@now:teamId'); 13 | const { endpoint = 'api.zeit.co', query } = options; 14 | 15 | const queryString = query 16 | ? `${query}${TEAM_ID ? `&teamId=${TEAM_ID}` : ''}` 17 | : TEAM_ID 18 | ? `teamId=${TEAM_ID}` 19 | : ''; 20 | 21 | const url = `https://${endpoint}${path}?${queryString}`; 22 | console.log('REQUEST', path); 23 | 24 | const res = await fetch(url, { 25 | headers: { 26 | Authorization: TOKEN ? `Bearer ${TOKEN}` : null, 27 | Accept: 'application/json', 28 | 'Content-Type': 'application/json', 29 | 'User-Agent': `now-mobile/${pkg.version}/${Platform.OS}`, 30 | }, 31 | body: options ? JSON.stringify(options.body) : null, 32 | method, 33 | }); 34 | 35 | console.log('REQUEST DONE', path); 36 | 37 | return res.json(); 38 | } catch (e) { 39 | console.log(e); 40 | return Promise.reject(e); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/lib/touch-id-prompt.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | // This is chaos -_- 3 | 4 | // $FlowFixMe 5 | import Prompt from 'react-native-prompt-android'; // eslint-disable-line import/no-unresolved, import/extensions 6 | import { AlertIOS, AsyncStorage } from 'react-native'; 7 | import { isAndroid } from '../lib/utils'; 8 | 9 | type TouchIDOptions = { 10 | biometryType?: string, 11 | text?: string, 12 | cancelLabel?: string, 13 | onCancel?: Function, 14 | onPress?: Function, 15 | }; 16 | 17 | export default function touchIdPrompt({ 18 | biometryType = 'Touch ID', 19 | text, 20 | cancelLabel, 21 | onCancel, 22 | onPress, 23 | }: TouchIDOptions): Promise { 24 | return new Promise((resolve) => { 25 | if (isAndroid) { 26 | Prompt( 27 | 'Enter Password', 28 | typeof text === 'undefined' 29 | ? `This will be used if ${biometryType} doesn't work` 30 | : text, 31 | [ 32 | { 33 | text: cancelLabel || 'Cancel', 34 | onPress: () => { 35 | if (onCancel) onCancel(); 36 | }, 37 | style: 'cancel', 38 | }, 39 | { 40 | text: 'OK', 41 | onPress: async (pin) => { 42 | if (onPress) { 43 | onPress(pin); 44 | resolve(); 45 | } else { 46 | await AsyncStorage.setItem('@now:touchId', pin); 47 | resolve(); 48 | } 49 | }, 50 | }, 51 | ], 52 | { 53 | type: 'secure-text', 54 | }, 55 | ); 56 | } else { 57 | AlertIOS.prompt( 58 | 'Enter PIN', 59 | typeof text === 'undefined' 60 | ? `This will be used if ${biometryType} doesn't work` 61 | : text, 62 | [ 63 | { 64 | text: cancelLabel || 'Cancel', 65 | onPress: () => { 66 | if (onCancel) onCancel(); 67 | }, 68 | style: 'cancel', 69 | }, 70 | { 71 | text: 'OK', 72 | onPress: async (pin) => { 73 | if (onPress) { 74 | onPress(pin); 75 | resolve(); 76 | } else { 77 | await AsyncStorage.setItem('@now:touchId', pin); 78 | resolve(); 79 | } 80 | }, 81 | }, 82 | ], 83 | 'secure-text', 84 | undefined, 85 | 'number-pad', 86 | ); 87 | } 88 | }); 89 | } 90 | -------------------------------------------------------------------------------- /src/lib/useragent.js: -------------------------------------------------------------------------------- 1 | import uaParser from 'ua-parser-js'; 2 | 3 | function isNowCLI(ua) { 4 | return ua.startsWith('now '); 5 | } 6 | 7 | function isNowMobile(ua) { 8 | // Both new and v1.0.x 9 | return ua.startsWith('now-mobile') || ua.includes('CFNetwork') || ua.startsWith('okhttp'); 10 | } 11 | 12 | const regexps = { 13 | program: [[/\b(now)\b/i, 'name'], [/\b(\d+\.\d+\.\d+)\b/, 'version']], 14 | engine: [[/\b(node)-v(\d+\.\d+\.\d+)\b/i, 'name', 'version']], 15 | os: [[/\b(darwin|win32|linux|freebsd|sunos)\b/, 'name']], 16 | cpu: [[/\b(arm|ia32|x64)\b/, 'architecture']], 17 | }; 18 | 19 | const parseNowCLI = (ua) => { 20 | const parsed = { ua }; 21 | 22 | Object.keys(regexps).forEach((p1) => { 23 | regexps[p1].forEach(([re, ...props]) => { 24 | const match = re.exec(ua); 25 | if (!match) return; 26 | 27 | props.forEach((p2, i) => { 28 | parsed[p1] = parsed[p1] || {}; 29 | parsed[p1][p2] = match[i + 1]; 30 | }); 31 | }); 32 | }); 33 | 34 | return parsed; 35 | }; 36 | 37 | const parseNowMobile = (ua) => { 38 | // v1.0.x user agents 39 | const legacy = ua.includes('CFNetwork') || ua.startsWith('okhttp'); 40 | if (legacy) { 41 | return { 42 | ua, 43 | version: '1.0.3', 44 | os: { name: ua.includes('CFNetwork') ? 'ios' : 'android' }, 45 | }; 46 | } 47 | 48 | // New user agents have the 'now-mobile//' format 49 | const [, version, os] = ua.replace(/ /g, '').split('/'); 50 | return { 51 | ua, 52 | version, 53 | os: { name: os }, 54 | }; 55 | }; 56 | 57 | export default function parse(ua) { 58 | const parsed = uaParser(ua); 59 | 60 | if (!parsed.browser.name && isNowCLI(ua)) { 61 | return parseNowCLI(ua); 62 | } else if (!parsed.browser.name && isNowMobile(ua)) { 63 | return parseNowMobile(ua); 64 | } 65 | 66 | return parsed; 67 | } 68 | -------------------------------------------------------------------------------- /src/screens/WhatsNew.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import React from 'react'; 3 | import { ScrollView, TouchableOpacity } from 'react-native'; 4 | import styled from 'styled-components'; 5 | import pkg from '../../package.json'; 6 | 7 | type Props = { 8 | navigation: Navigation, 9 | }; 10 | 11 | const containerStyle = { 12 | paddingBottom: 50, 13 | paddingHorizontal: '10%', 14 | alignItems: 'center', 15 | justifyContent: 'center', 16 | }; 17 | 18 | const View = styled.SafeAreaView` 19 | background-color: ${props => props.theme.background}; 20 | height: 100%; 21 | `; 22 | 23 | const Title = styled.Text` 24 | font-weight: 700; 25 | font-size: 18px; 26 | color: ${props => props.theme.text}; 27 | margin-top: 40%; 28 | margin-bottom: 20px; 29 | `; 30 | 31 | const Version = styled.Text` 32 | color: ${props => props.theme.whatsNewText}; 33 | font-size: 16px; 34 | margin-bottom: 35px; 35 | `; 36 | 37 | const Text = styled.Text` 38 | font-size: 16px; 39 | color: ${props => props.theme.text}; 40 | `; 41 | 42 | const Button = styled.Text` 43 | font-size: 15px; 44 | color: ${props => props.theme.whatsNewText}; 45 | margin-top: 25px; 46 | `; 47 | 48 | export default ({ navigation }: Props) => { 49 | const description = navigation.getParam('description'); 50 | 51 | // Should never happen, but just in case 52 | if (!description) { 53 | navigation.goBack(); 54 | return null; 55 | } 56 | 57 | return ( 58 | 59 | 60 | What’s New 61 | {`v${pkg.version} r${pkg.update}`} 62 | {description} 63 | navigation.goBack()}> 64 | 65 | 66 | 67 | 68 | ); 69 | }; 70 | -------------------------------------------------------------------------------- /storybook/addons.js: -------------------------------------------------------------------------------- 1 | import '@storybook/addon-actions/register'; 2 | import '@storybook/addon-links/register'; 3 | -------------------------------------------------------------------------------- /storybook/index.android.js: -------------------------------------------------------------------------------- 1 | import StorybookUI from './storybook'; 2 | 3 | export default StorybookUI; 4 | -------------------------------------------------------------------------------- /storybook/index.ios.js: -------------------------------------------------------------------------------- 1 | import StorybookUI from './storybook'; 2 | 3 | export default StorybookUI; 4 | -------------------------------------------------------------------------------- /storybook/index.js: -------------------------------------------------------------------------------- 1 | import StorybookUI from './storybook'; 2 | 3 | export default StorybookUI; 4 | -------------------------------------------------------------------------------- /storybook/stories/_center.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { View } from 'react-native'; 3 | 4 | const style = { 5 | flex: 1, 6 | justifyContent: 'center', 7 | alignItems: 'center', 8 | paddingHorizontal: 25, 9 | }; 10 | 11 | export default story => {story()}; 12 | -------------------------------------------------------------------------------- /storybook/stories/aliases.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/no-extraneous-dependencies */ 2 | import React from 'react'; 3 | import { storiesOf } from '@storybook/react-native'; 4 | import Alias from '../../src/components/elements/aliases/Alias'; 5 | import AliasGroup from '../../src/components/elements/aliases/AliasGroup'; 6 | import center from './_center'; 7 | 8 | const AliasStories = storiesOf('Alias', module).addDecorator(center); 9 | 10 | AliasStories.add('Default', () => ( 11 | 17 | )); 18 | AliasStories.add('Borderless', () => ( 19 | 26 | )); 27 | AliasStories.add('Alias Group', () => ( 28 | 41 | )); 42 | -------------------------------------------------------------------------------- /storybook/stories/common.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/no-extraneous-dependencies */ 2 | import React from 'react'; 3 | import { storiesOf } from '@storybook/react-native'; 4 | import TimeAgo from '../../src/components/elements/TimeAgo'; 5 | import AuthInput from '../../src/components/elements/AuthInput'; 6 | import Logo from '../../src/components/Logo'; 7 | import DropdownRow from '../../src/components/elements/DropdownRow'; 8 | import Header from '../../src/components/Header'; 9 | import center from './_center'; 10 | 11 | const LogoStories = storiesOf('Logo', module).addDecorator(center); 12 | 13 | LogoStories.add('Small', () => ); 14 | LogoStories.add('Large', () => ); 15 | 16 | const AuthInputStories = storiesOf('AuthInput', module).addDecorator(center); 17 | 18 | AuthInputStories.add('Default', () => ); 19 | 20 | const TimeAgoStories = storiesOf('TimeAgo', module).addDecorator(center); 21 | 22 | TimeAgoStories.add('Default', () => ); 23 | 24 | const HeaderStories = storiesOf('Header', module).addDecorator(center); 25 | 26 | HeaderStories.add('Default', () =>
); 27 | 28 | const DropdownRowStories = storiesOf('DropdownRow', module).addDecorator(center); 29 | 30 | DropdownRowStories.add('Regular', () => ); 31 | DropdownRowStories.add('Bold', () => ); 32 | DropdownRowStories.add('With Plus', () => ); 33 | DropdownRowStories.add('With Image', () => ( 34 | 35 | )); 36 | DropdownRowStories.add('Border Top', () => ); 37 | DropdownRowStories.add('Border Bottom', () => ); 38 | -------------------------------------------------------------------------------- /storybook/stories/deployments.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/no-extraneous-dependencies */ 2 | import React from 'react'; 3 | import { storiesOf } from '@storybook/react-native'; 4 | import DeploymentGroup from '../../src/components/elements/deployments/DeploymentGroup'; 5 | import Deployment from '../../src/components/elements/deployments/Deployment'; 6 | import center from './_center'; 7 | 8 | const DeploymentStories = storiesOf('Deployment', module).addDecorator(center); 9 | 10 | const deployment = { 11 | url: 'zeit-vbcxbzxcba.now.sh', 12 | scale: { current: 2 }, 13 | state: 'READY', 14 | created: '2018-06-16T17:13:01.908Z', 15 | }; 16 | DeploymentStories.add('Default', () => ); 17 | DeploymentStories.add('Static', () => ); 18 | DeploymentStories.add('Errorred', () => ( 19 | 20 | )); 21 | 22 | const DeploymentGroupStories = storiesOf('DeploymentGroup', module).addDecorator(center); 23 | DeploymentGroupStories.add('Default', () => ( 24 | 37 | )); 38 | 39 | DeploymentGroupStories.add('Borderless', () => ( 40 | 54 | )); 55 | -------------------------------------------------------------------------------- /storybook/stories/domains.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/no-extraneous-dependencies */ 2 | import React from 'react'; 3 | import { storiesOf } from '@storybook/react-native'; 4 | import Domain from '../../src/components/elements/domains/Domain'; 5 | import ExpireDate from '../../src/components/elements/domains/ExpireDate'; 6 | import center from './_center'; 7 | 8 | const DomainStories = storiesOf('Domain', module).addDecorator(center); 9 | 10 | const domain = { 11 | name: 'zeit.co', 12 | expiresAt: '2019-06-11T13:13:01.908Z', 13 | created: '2018-06-11T13:13:01.908Z', 14 | }; 15 | 16 | DomainStories.add('With Expiration', () => ); 17 | DomainStories.add('Without Expiration', () => ( 18 | 19 | )); 20 | 21 | const ExpireDateStories = storiesOf('ExpireDate', module).addDecorator(center); 22 | 23 | ExpireDateStories.add('With Date', () => ); 24 | ExpireDateStories.add('Without Date', () => ); 25 | -------------------------------------------------------------------------------- /storybook/stories/index.js: -------------------------------------------------------------------------------- 1 | import './common'; 2 | import './aliases'; 3 | import './deployments'; 4 | import './domains'; 5 | import './usage'; 6 | import './history'; 7 | import './settings'; 8 | -------------------------------------------------------------------------------- /storybook/stories/settings.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/no-extraneous-dependencies */ 2 | import React from 'react'; 3 | import { Image } from 'react-native'; 4 | import { storiesOf } from '@storybook/react-native'; 5 | import Input from '../../src/components/elements/settings/Input'; 6 | import Button from '../../src/components/elements/settings/Button'; 7 | import ProfilePic from '../../src/components/elements/settings/ProfilePic'; 8 | import NowLogo from '../../assets/now-white.png'; 9 | import center from './_center'; 10 | 11 | const SettingsInputStories = storiesOf('SettingsInput', module).addDecorator(center); 12 | 13 | SettingsInputStories.add('Default', () => ); 14 | 15 | const SettingsButtonStories = storiesOf('SettingsButton', module).addDecorator(center); 16 | 17 | SettingsButtonStories.add('Default', () => ); 18 | 19 | const SettingsProfilePicStories = storiesOf('SettingsUserpic', module).addDecorator(center); 20 | 21 | SettingsProfilePicStories.add('Default', () => ( 22 | 23 | 24 | 25 | )); 26 | -------------------------------------------------------------------------------- /storybook/stories/usage.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/no-extraneous-dependencies */ 2 | import React from 'react'; 3 | import { storiesOf } from '@storybook/react-native'; 4 | import UsageEntry from '../../src/components/elements/usage/UsageEntry'; 5 | import center from './_center'; 6 | 7 | const UsageEntryStories = storiesOf('UsageEntry', module).addDecorator(center); 8 | 9 | UsageEntryStories.add('Numbers', () => ); 10 | UsageEntryStories.add('Strings', () => ); 11 | UsageEntryStories.add('Borderless', () => ); 12 | -------------------------------------------------------------------------------- /storybook/storybook.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { AppRegistry } from 'react-native'; 3 | import { getStorybookUI, configure } from '@storybook/react-native'; 4 | 5 | // import stories 6 | configure(() => { 7 | require('./stories'); 8 | }, module); 9 | 10 | // This assumes that storybook is running on the same host as your RN packager, 11 | // to set manually use, e.g. host: 'localhost' option 12 | const StorybookUIRoot = getStorybookUI({ port: 7007, onDeviceUI: true }); 13 | 14 | // react-native hot module loader must take in a Class - https://github.com/facebook/react-native/issues/10991 15 | // https://github.com/storybooks/storybook/issues/2081 16 | // eslint-disable-next-line react/prefer-stateless-function 17 | class StorybookUIHMRRoot extends Component { 18 | render() { 19 | return ; 20 | } 21 | } 22 | 23 | AppRegistry.registerComponent('now', () => StorybookUIHMRRoot); 24 | export default StorybookUIHMRRoot; 25 | --------------------------------------------------------------------------------