From 79e201aef7d4a844f18f48c2a393ac563ca1af67 Mon Sep 17 00:00:00 2001 From: Gytis Vinclovas Date: Fri, 11 Aug 2017 09:31:24 +0300 Subject: [PATCH 1/7] Added addon for pairing device with hosted storybook (with qr code). --- addons/rn-pair/README.md | 28 ++++++++++++ addons/rn-pair/docs/screenshot.png | Bin 0 -> 135169 bytes addons/rn-pair/package.json | 37 +++++++++++++++ addons/rn-pair/register.js | 1 + addons/rn-pair/src/components/QRCode/index.js | 32 +++++++++++++ addons/rn-pair/src/components/QRCode/style.js | 8 ++++ .../src/containers/QRCodePanel/index.js | 42 ++++++++++++++++++ addons/rn-pair/src/index.js | 4 ++ addons/rn-pair/src/manager.js | 14 ++++++ app/react-native/src/manager/provider.js | 13 ++---- 10 files changed, 169 insertions(+), 10 deletions(-) create mode 100644 addons/rn-pair/README.md create mode 100644 addons/rn-pair/docs/screenshot.png create mode 100644 addons/rn-pair/package.json create mode 100644 addons/rn-pair/register.js create mode 100644 addons/rn-pair/src/components/QRCode/index.js create mode 100644 addons/rn-pair/src/components/QRCode/style.js create mode 100644 addons/rn-pair/src/containers/QRCodePanel/index.js create mode 100644 addons/rn-pair/src/index.js create mode 100644 addons/rn-pair/src/manager.js diff --git a/addons/rn-pair/README.md b/addons/rn-pair/README.md new file mode 100644 index 000000000000..5206dc733491 --- /dev/null +++ b/addons/rn-pair/README.md @@ -0,0 +1,28 @@ +# Storybook Addon Actions + +[![Greenkeeper badge](https://badges.greenkeeper.io/storybooks/storybook.svg)](https://greenkeeper.io/) +[![Build Status](https://travis-ci.org/storybooks/storybook.svg?branch=master)](https://travis-ci.org/storybooks/storybook) +[![CodeFactor](https://www.codefactor.io/repository/github/storybooks/storybook/badge)](https://www.codefactor.io/repository/github/storybooks/storybook) +[![Known Vulnerabilities](https://snyk.io/test/github/storybooks/storybook/8f36abfd6697e58cd76df3526b52e4b9dc894847/badge.svg)](https://snyk.io/test/github/storybooks/storybook/8f36abfd6697e58cd76df3526b52e4b9dc894847) +[![BCH compliance](https://bettercodehub.com/edge/badge/storybooks/storybook)](https://bettercodehub.com/results/storybooks/storybook) [![codecov](https://codecov.io/gh/storybooks/storybook/branch/master/graph/badge.svg)](https://codecov.io/gh/storybooks/storybook) +[![Storybook Slack](https://storybooks-slackin.herokuapp.com/badge.svg)](https://storybooks-slackin.herokuapp.com/) + +Storybook Addon RN Pair can be used to connect hosted storybook server with app [Storybook](https://storybook.js.org). +It allows you to simply point your phone camera to browser screen and phone will be automatically connected. +![Screenshot](docs/screenshot.png) + +## Getting Started + +Install: + +```sh +npm i -D @storybook/addon-rn-pair +``` + +Then, add following content to `.storybook/addons.js` + + import '@storybook/addon-rn-pair/register'; + +Then you need to use qr code reader in your storybook app. + +TODO write more about reader. diff --git a/addons/rn-pair/docs/screenshot.png b/addons/rn-pair/docs/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..0e49d57b54c04fc50041aae782236c521076cfef GIT binary patch literal 135169 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≤^ekyb|Q^c428>&1(RpmZZx!B+NM^O#&{rt+=c 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€R0aDAd^7axh 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 + {this.props.pairedId && +
+

+ Code: {this.props.pairedId} +

+

Scan the code with your phone to pair

+ +
} + + ); + } +} + +QRCodeComponent.propTypes = { + pairedId: PropTypes.string, +}; + +QRCodeComponent.defaultProps = { + pairedId: null, +}; + +export default QRCodeComponent; diff --git a/addons/rn-pair/src/components/QRCode/style.js b/addons/rn-pair/src/components/QRCode/style.js new file mode 100644 index 000000000000..bc8e7e1b5e79 --- /dev/null +++ b/addons/rn-pair/src/components/QRCode/style.js @@ -0,0 +1,8 @@ +export default { + wrapper: { + flex: 1, + display: 'flex', + position: 'relative', + padding: '0 10px', + }, +}; diff --git a/addons/rn-pair/src/containers/QRCodePanel/index.js b/addons/rn-pair/src/containers/QRCodePanel/index.js new file mode 100644 index 000000000000..963c07f2c32a --- /dev/null +++ b/addons/rn-pair/src/containers/QRCodePanel/index.js @@ -0,0 +1,42 @@ +/* eslint-disable no-underscore-dangle */ + +import React from 'react'; +import PropTypes from 'prop-types'; + +import QRCodeComponent from '../../components/QRCode'; + +export default class QRCodePanel extends React.PureComponent { + constructor(props, ...args) { + super(props, ...args); + this.state = { + pairedId: null, + }; + + this._actionListener = action => this.addAction(action); + } + + componentDidMount() { + this.props.channel.on('channelCreated', this._actionListener); + } + + componentWillUnmount() { + this.props.channel.removeListener('channelCreated', this._actionListener); + } + + addAction(data) { + this.setState({ + pairedId: data.pairedId, + }); + } + + render() { + return ; + } +} + +QRCodePanel.propTypes = { + channel: PropTypes.object, // eslint-disable-line react/forbid-prop-types +}; +QRCodePanel.defaultProps = { + channel: {}, +}; diff --git a/addons/rn-pair/src/index.js b/addons/rn-pair/src/index.js new file mode 100644 index 000000000000..67511cff3a2e --- /dev/null +++ b/addons/rn-pair/src/index.js @@ -0,0 +1,4 @@ +export const ADDON_ID = 'storybook/rn-pair'; +export const PANEL_ID = `${ADDON_ID}/panel`; + +export { register } from './manager'; diff --git a/addons/rn-pair/src/manager.js b/addons/rn-pair/src/manager.js new file mode 100644 index 000000000000..35697cca41c2 --- /dev/null +++ b/addons/rn-pair/src/manager.js @@ -0,0 +1,14 @@ +import React from 'react'; +import addons from '@storybook/addons'; +import QRCodePanel from './containers/QRCodePanel'; +import { ADDON_ID, PANEL_ID } from './'; + +export function register() { + addons.register(ADDON_ID, () => { + const channel = addons.getChannel(); + addons.addPanel(PANEL_ID, { + title: 'RN Pair', + render: () => , + }); + }); +} diff --git a/app/react-native/src/manager/provider.js b/app/react-native/src/manager/provider.js index f1e541c3cf47..b4c89857c9b1 100644 --- a/app/react-native/src/manager/provider.js +++ b/app/react-native/src/manager/provider.js @@ -16,7 +16,7 @@ export default class ReactProvider extends Provider { const websocketType = secured ? 'wss' : 'ws'; let url = `${websocketType}://${domain}`; if (options.manualId) { - const pairedId = uuid().substr(-6); + const pairedId = uuid(); this.pairedId = pairedId; url += `/pairedId=${this.pairedId}`; @@ -25,6 +25,8 @@ export default class ReactProvider extends Provider { if (!this.channel) { this.channel = createChannel({ url }); addons.setChannel(this.channel); + + this.channel.emit('channelCreated', { pairedId: this.pairedId }); } } @@ -39,15 +41,6 @@ export default class ReactProvider extends Provider { const innerPreview = renderPreview ? renderPreview(kind, story) : null; - if (this.options.manualId) { - return ( -
- Your ID: {this.pairedId} - {innerPreview} -
- ); - } - return innerPreview || ; } From a79db2e509b714d54d871862a033039948346a55 Mon Sep 17 00:00:00 2001 From: Gytis Vinclovas Date: Thu, 17 Aug 2017 15:54:41 +0300 Subject: [PATCH 2/7] Adding more info. --- addons/rn-pair/src/components/QRCode/index.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/addons/rn-pair/src/components/QRCode/index.js b/addons/rn-pair/src/components/QRCode/index.js index 8cfc789334e5..a6e67eaea884 100644 --- a/addons/rn-pair/src/components/QRCode/index.js +++ b/addons/rn-pair/src/components/QRCode/index.js @@ -1,3 +1,4 @@ +/* eslint-disable no-undef */ import PropTypes from 'prop-types'; import React, { PureComponent } from 'react'; import QrCode from 'qrcode.react'; @@ -6,6 +7,14 @@ import style from './style'; class QRCodeComponent extends PureComponent { render() { + const secured = window.location.protocol === 'https:'; + const value = [ + window.location.hostname, + window.location.port, + this.props.pairedId, + secured ? '1' : '0', + ].join('|'); + return (
{this.props.pairedId && @@ -14,7 +23,7 @@ class QRCodeComponent extends PureComponent { Code: {this.props.pairedId}

Scan the code with your phone to pair

- +
} ); From fee978f9bcccad2a7e5e92303585a3047d24ff05 Mon Sep 17 00:00:00 2001 From: Gytis Vinclovas Date: Thu, 17 Aug 2017 18:10:59 +0300 Subject: [PATCH 3/7] Added client/server. --- examples/storybook-hosted/client/.babelrc | 3 + examples/storybook-hosted/client/.buckconfig | 6 + examples/storybook-hosted/client/.flowconfig | 45 + .../storybook-hosted/client/.gitattributes | 1 + examples/storybook-hosted/client/.gitignore | 53 + .../storybook-hosted/client/.watchmanconfig | 1 + .../client/__tests__/index.android.js | 10 + .../client/__tests__/index.ios.js | 10 + .../storybook-hosted/client/android/app/BUCK | 65 + .../client/android/app/build.gradle | 147 ++ .../client/android/app/proguard-rules.pro | 70 + .../android/app/src/main/AndroidManifest.xml | 32 + .../main/java/com/client/MainActivity.java | 15 + .../main/java/com/client/MainApplication.java | 42 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/styles.xml | 8 + .../client/android/build.gradle | 24 + .../client/android/gradle.properties | 20 + .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 52266 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + .../storybook-hosted/client/android/gradlew | 164 +++ .../client/android/gradlew.bat | 90 ++ .../client/android/keystores/BUCK | 8 + .../keystores/debug.keystore.properties | 4 + .../client/android/settings.gradle | 5 + examples/storybook-hosted/client/app.json | 4 + .../storybook-hosted/client/index.android.js | 44 + examples/storybook-hosted/client/index.ios.js | 44 + .../client/ios/client-tvOS/Info.plist | 54 + .../client/ios/client-tvOSTests/Info.plist | 24 + .../ios/client.xcodeproj/project.pbxproj | 1303 +++++++++++++++++ .../xcschemes/client-tvOS.xcscheme | 129 ++ .../xcshareddata/xcschemes/client.xcscheme | 129 ++ .../client/ios/client/AppDelegate.h | 16 + .../client/ios/client/AppDelegate.m | 37 + .../ios/client/Base.lproj/LaunchScreen.xib | 42 + .../AppIcon.appiconset/Contents.json | 38 + .../client/ios/client/Info.plist | 56 + .../storybook-hosted/client/ios/client/main.m | 18 + .../client/ios/clientTests/Info.plist | 24 + .../client/ios/clientTests/clientTests.m | 70 + examples/storybook-hosted/client/package.json | 24 + examples/storybook-hosted/server/package.json | 27 + .../server/storybook/addons.js | 9 + 48 files changed, 2923 insertions(+) create mode 100644 examples/storybook-hosted/client/.babelrc create mode 100644 examples/storybook-hosted/client/.buckconfig create mode 100644 examples/storybook-hosted/client/.flowconfig create mode 100644 examples/storybook-hosted/client/.gitattributes create mode 100644 examples/storybook-hosted/client/.gitignore create mode 100644 examples/storybook-hosted/client/.watchmanconfig create mode 100644 examples/storybook-hosted/client/__tests__/index.android.js create mode 100644 examples/storybook-hosted/client/__tests__/index.ios.js create mode 100644 examples/storybook-hosted/client/android/app/BUCK create mode 100644 examples/storybook-hosted/client/android/app/build.gradle create mode 100644 examples/storybook-hosted/client/android/app/proguard-rules.pro create mode 100644 examples/storybook-hosted/client/android/app/src/main/AndroidManifest.xml create mode 100644 examples/storybook-hosted/client/android/app/src/main/java/com/client/MainActivity.java create mode 100644 examples/storybook-hosted/client/android/app/src/main/java/com/client/MainApplication.java create mode 100644 examples/storybook-hosted/client/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 examples/storybook-hosted/client/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 examples/storybook-hosted/client/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 examples/storybook-hosted/client/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 examples/storybook-hosted/client/android/app/src/main/res/values/strings.xml create mode 100644 examples/storybook-hosted/client/android/app/src/main/res/values/styles.xml create mode 100644 examples/storybook-hosted/client/android/build.gradle create mode 100644 examples/storybook-hosted/client/android/gradle.properties create mode 100644 examples/storybook-hosted/client/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 examples/storybook-hosted/client/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 examples/storybook-hosted/client/android/gradlew create mode 100644 examples/storybook-hosted/client/android/gradlew.bat create mode 100644 examples/storybook-hosted/client/android/keystores/BUCK create mode 100644 examples/storybook-hosted/client/android/keystores/debug.keystore.properties create mode 100644 examples/storybook-hosted/client/android/settings.gradle create mode 100644 examples/storybook-hosted/client/app.json create mode 100644 examples/storybook-hosted/client/index.android.js create mode 100644 examples/storybook-hosted/client/index.ios.js create mode 100644 examples/storybook-hosted/client/ios/client-tvOS/Info.plist create mode 100644 examples/storybook-hosted/client/ios/client-tvOSTests/Info.plist create mode 100644 examples/storybook-hosted/client/ios/client.xcodeproj/project.pbxproj create mode 100644 examples/storybook-hosted/client/ios/client.xcodeproj/xcshareddata/xcschemes/client-tvOS.xcscheme create mode 100644 examples/storybook-hosted/client/ios/client.xcodeproj/xcshareddata/xcschemes/client.xcscheme create mode 100644 examples/storybook-hosted/client/ios/client/AppDelegate.h create mode 100644 examples/storybook-hosted/client/ios/client/AppDelegate.m create mode 100644 examples/storybook-hosted/client/ios/client/Base.lproj/LaunchScreen.xib create mode 100644 examples/storybook-hosted/client/ios/client/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 examples/storybook-hosted/client/ios/client/Info.plist create mode 100644 examples/storybook-hosted/client/ios/client/main.m create mode 100644 examples/storybook-hosted/client/ios/clientTests/Info.plist create mode 100644 examples/storybook-hosted/client/ios/clientTests/clientTests.m create mode 100644 examples/storybook-hosted/client/package.json create mode 100644 examples/storybook-hosted/server/package.json create mode 100644 examples/storybook-hosted/server/storybook/addons.js diff --git a/examples/storybook-hosted/client/.babelrc b/examples/storybook-hosted/client/.babelrc new file mode 100644 index 000000000000..a9ce1369e617 --- /dev/null +++ b/examples/storybook-hosted/client/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["react-native"] +} diff --git a/examples/storybook-hosted/client/.buckconfig b/examples/storybook-hosted/client/.buckconfig new file mode 100644 index 000000000000..934256cb29d4 --- /dev/null +++ b/examples/storybook-hosted/client/.buckconfig @@ -0,0 +1,6 @@ + +[android] + target = Google Inc.:Google APIs:23 + +[maven_repositories] + central = https://repo1.maven.org/maven2 diff --git a/examples/storybook-hosted/client/.flowconfig b/examples/storybook-hosted/client/.flowconfig new file mode 100644 index 000000000000..83461209da06 --- /dev/null +++ b/examples/storybook-hosted/client/.flowconfig @@ -0,0 +1,45 @@ +[ignore] +; We fork some components by platform +.*/*[.]android.js + +; Ignore "BUCK" generated dirs +/\.buckd/ + +; Ignore unexpected extra "@providesModule" +.*/node_modules/.*/node_modules/fbjs/.* + +; Ignore duplicate module providers +; For RN Apps installed via npm, "Libraries" folder is inside +; "node_modules/react-native" but in the source repo it is in the root +.*/Libraries/react-native/React.js +.*/Libraries/react-native/ReactNative.js + +[include] + +[libs] +node_modules/react-native/Libraries/react-native/react-native-interface.js +node_modules/react-native/flow +flow/ + +[options] +emoji=true + +module.system=haste + +munge_underscores=true + +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' + +suppress_type=$FlowIssue +suppress_type=$FlowFixMe +suppress_type=$FixMe + +suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(4[0-9]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) +suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(4[0-9]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ +suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy +suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError + +unsafe.enable_getters_and_setters=true + +[version] +^0.49.1 diff --git a/examples/storybook-hosted/client/.gitattributes b/examples/storybook-hosted/client/.gitattributes new file mode 100644 index 000000000000..d42ff18354df --- /dev/null +++ b/examples/storybook-hosted/client/.gitattributes @@ -0,0 +1 @@ +*.pbxproj -text diff --git a/examples/storybook-hosted/client/.gitignore b/examples/storybook-hosted/client/.gitignore new file mode 100644 index 000000000000..10be19751feb --- /dev/null +++ b/examples/storybook-hosted/client/.gitignore @@ -0,0 +1,53 @@ +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +project.xcworkspace + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml + +# node.js +# +node_modules/ +npm-debug.log +yarn-error.log + +# BUCK +buck-out/ +\.buckd/ +*.keystore + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots diff --git a/examples/storybook-hosted/client/.watchmanconfig b/examples/storybook-hosted/client/.watchmanconfig new file mode 100644 index 000000000000..9e26dfeeb6e6 --- /dev/null +++ b/examples/storybook-hosted/client/.watchmanconfig @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/examples/storybook-hosted/client/__tests__/index.android.js b/examples/storybook-hosted/client/__tests__/index.android.js new file mode 100644 index 000000000000..a49559bfc426 --- /dev/null +++ b/examples/storybook-hosted/client/__tests__/index.android.js @@ -0,0 +1,10 @@ +import 'react-native'; +import React from 'react'; +import Index from '../index.android.js'; + +// Note: test renderer must be required after react-native. +import renderer from 'react-test-renderer'; + +it('renders correctly', () => { + const tree = renderer.create(); +}); diff --git a/examples/storybook-hosted/client/__tests__/index.ios.js b/examples/storybook-hosted/client/__tests__/index.ios.js new file mode 100644 index 000000000000..a21e84c1aa79 --- /dev/null +++ b/examples/storybook-hosted/client/__tests__/index.ios.js @@ -0,0 +1,10 @@ +import 'react-native'; +import React from 'react'; +import Index from '../index.ios.js'; + +// Note: test renderer must be required after react-native. +import renderer from 'react-test-renderer'; + +it('renders correctly', () => { + const tree = renderer.create(); +}); diff --git a/examples/storybook-hosted/client/android/app/BUCK b/examples/storybook-hosted/client/android/app/BUCK new file mode 100644 index 000000000000..90ccc8950ea2 --- /dev/null +++ b/examples/storybook-hosted/client/android/app/BUCK @@ -0,0 +1,65 @@ +# To learn about Buck see [Docs](https://buckbuild.com/). +# To run your application with Buck: +# - install Buck +# - `npm start` - to start the packager +# - `cd android` +# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` +# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck +# - `buck install -r android/app` - compile, install and run application +# + +lib_deps = [] + +for jarfile in glob(['libs/*.jar']): + name = 'jars__' + jarfile[jarfile.rindex('/') + 1: jarfile.rindex('.jar')] + lib_deps.append(':' + name) + prebuilt_jar( + name = name, + binary_jar = jarfile, + ) + +for aarfile in glob(['libs/*.aar']): + name = 'aars__' + aarfile[aarfile.rindex('/') + 1: aarfile.rindex('.aar')] + lib_deps.append(':' + name) + android_prebuilt_aar( + name = name, + aar = aarfile, + ) + +android_library( + name = "all-libs", + exported_deps = lib_deps, +) + +android_library( + name = "app-code", + srcs = glob([ + "src/main/java/**/*.java", + ]), + deps = [ + ":all-libs", + ":build_config", + ":res", + ], +) + +android_build_config( + name = "build_config", + package = "com.client", +) + +android_resource( + name = "res", + package = "com.client", + res = "src/main/res", +) + +android_binary( + name = "app", + keystore = "//android/keystores:debug", + manifest = "src/main/AndroidManifest.xml", + package_type = "debug", + deps = [ + ":app-code", + ], +) diff --git a/examples/storybook-hosted/client/android/app/build.gradle b/examples/storybook-hosted/client/android/app/build.gradle new file mode 100644 index 000000000000..3f7da1b69522 --- /dev/null +++ b/examples/storybook-hosted/client/android/app/build.gradle @@ -0,0 +1,147 @@ +apply plugin: "com.android.application" + +import com.android.build.OutputFile + +/** + * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets + * and bundleReleaseJsAndAssets). + * These basically call `react-native bundle` with the correct arguments during the Android build + * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the + * bundle directly from the development server. Below you can see all the possible configurations + * and their defaults. If you decide to add a configuration block, make sure to add it before the + * `apply from: "../../node_modules/react-native/react.gradle"` line. + * + * project.ext.react = [ + * // the name of the generated asset file containing your JS bundle + * bundleAssetName: "index.android.bundle", + * + * // the entry file for bundle generation + * entryFile: "index.android.js", + * + * // whether to bundle JS and assets in debug mode + * bundleInDebug: false, + * + * // whether to bundle JS and assets in release mode + * bundleInRelease: true, + * + * // whether to bundle JS and assets in another build variant (if configured). + * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants + * // The configuration property can be in the following formats + * // 'bundleIn${productFlavor}${buildType}' + * // 'bundleIn${buildType}' + * // bundleInFreeDebug: true, + * // bundleInPaidRelease: true, + * // bundleInBeta: true, + * + * // whether to disable dev mode in custom build variants (by default only disabled in release) + * // for example: to disable dev mode in the staging build type (if configured) + * devDisabledInStaging: true, + * // The configuration property can be in the following formats + * // 'devDisabledIn${productFlavor}${buildType}' + * // 'devDisabledIn${buildType}' + * + * // the root of your project, i.e. where "package.json" lives + * root: "../../", + * + * // where to put the JS bundle asset in debug mode + * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", + * + * // where to put the JS bundle asset in release mode + * jsBundleDirRelease: "$buildDir/intermediates/assets/release", + * + * // where to put drawable resources / React Native assets, e.g. the ones you use via + * // require('./image.png')), in debug mode + * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", + * + * // where to put drawable resources / React Native assets, e.g. the ones you use via + * // require('./image.png')), in release mode + * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", + * + * // by default the gradle tasks are skipped if none of the JS files or assets change; this means + * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to + * // date; if you have any other folders that you want to ignore for performance reasons (gradle + * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ + * // for example, you might want to remove it from here. + * inputExcludes: ["android/**", "ios/**"], + * + * // override which node gets called and with what additional arguments + * nodeExecutableAndArgs: ["node"], + * + * // supply additional arguments to the packager + * extraPackagerArgs: [] + * ] + */ + +apply from: "../../node_modules/react-native/react.gradle" + +/** + * Set this to true to create two separate APKs instead of one: + * - An APK that only works on ARM devices + * - An APK that only works on x86 devices + * The advantage is the size of the APK is reduced by about 4MB. + * Upload all the APKs to the Play Store and people will download + * the correct one based on the CPU architecture of their device. + */ +def enableSeparateBuildPerCPUArchitecture = false + +/** + * Run Proguard to shrink the Java bytecode in release builds. + */ +def enableProguardInReleaseBuilds = false + +android { + compileSdkVersion 23 + buildToolsVersion "23.0.1" + + defaultConfig { + applicationId "com.client" + minSdkVersion 16 + targetSdkVersion 22 + versionCode 1 + versionName "1.0" + ndk { + abiFilters "armeabi-v7a", "x86" + } + } + splits { + abi { + reset() + enable enableSeparateBuildPerCPUArchitecture + universalApk false // If true, also generate a universal APK + include "armeabi-v7a", "x86" + } + } + buildTypes { + release { + minifyEnabled enableProguardInReleaseBuilds + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + } + } + // applicationVariants are e.g. debug, release + applicationVariants.all { variant -> + variant.outputs.each { output -> + // For each separate APK per architecture, set a unique version code as described here: + // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits + def versionCodes = ["armeabi-v7a":1, "x86":2] + def abi = output.getFilter(OutputFile.ABI) + if (abi != null) { // null for the universal-debug, universal-release variants + output.versionCodeOverride = + versionCodes.get(abi) * 1048576 + defaultConfig.versionCode + } + } + } +} + +dependencies { + compile project(':react-native-camera') + compile fileTree(dir: "libs", include: ["*.jar"]) + compile "com.android.support:appcompat-v7:23.0.1" + compile "com.facebook.react:react-native:+" // From node_modules +} + +// Run this once to be able to run the application with BUCK +// puts all compile dependencies into folder libs for BUCK to use +task copyDownloadableDepsToLibs(type: Copy) { + from configurations.compile + into 'libs' +} diff --git a/examples/storybook-hosted/client/android/app/proguard-rules.pro b/examples/storybook-hosted/client/android/app/proguard-rules.pro new file mode 100644 index 000000000000..6e8516c8d6dd --- /dev/null +++ b/examples/storybook-hosted/client/android/app/proguard-rules.pro @@ -0,0 +1,70 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Disabling obfuscation is useful if you collect stack traces from production crashes +# (unless you are using a system that supports de-obfuscate the stack traces). +-dontobfuscate + +# React Native + +# Keep our interfaces so they can be used by other ProGuard rules. +# See http://sourceforge.net/p/proguard/bugs/466/ +-keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip +-keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters +-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip + +# Do not strip any method/class that is annotated with @DoNotStrip +-keep @com.facebook.proguard.annotations.DoNotStrip class * +-keep @com.facebook.common.internal.DoNotStrip class * +-keepclassmembers class * { + @com.facebook.proguard.annotations.DoNotStrip *; + @com.facebook.common.internal.DoNotStrip *; +} + +-keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * { + void set*(***); + *** get*(); +} + +-keep class * extends com.facebook.react.bridge.JavaScriptModule { *; } +-keep class * extends com.facebook.react.bridge.NativeModule { *; } +-keepclassmembers,includedescriptorclasses class * { native ; } +-keepclassmembers class * { @com.facebook.react.uimanager.UIProp ; } +-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp ; } +-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup ; } + +-dontwarn com.facebook.react.** + +# TextLayoutBuilder uses a non-public Android constructor within StaticLayout. +# See libs/proxy/src/main/java/com/facebook/fbui/textlayoutbuilder/proxy for details. +-dontwarn android.text.StaticLayout + +# okhttp + +-keepattributes Signature +-keepattributes *Annotation* +-keep class okhttp3.** { *; } +-keep interface okhttp3.** { *; } +-dontwarn okhttp3.** + +# okio + +-keep class sun.misc.Unsafe { *; } +-dontwarn java.nio.file.* +-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement +-dontwarn okio.** diff --git a/examples/storybook-hosted/client/android/app/src/main/AndroidManifest.xml b/examples/storybook-hosted/client/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..bb2e85cb32fc --- /dev/null +++ b/examples/storybook-hosted/client/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + diff --git a/examples/storybook-hosted/client/android/app/src/main/java/com/client/MainActivity.java b/examples/storybook-hosted/client/android/app/src/main/java/com/client/MainActivity.java new file mode 100644 index 000000000000..1c6aaef7c33d --- /dev/null +++ b/examples/storybook-hosted/client/android/app/src/main/java/com/client/MainActivity.java @@ -0,0 +1,15 @@ +package com.client; + +import com.facebook.react.ReactActivity; + +public class MainActivity extends ReactActivity { + + /** + * Returns the name of the main component registered from JavaScript. + * This is used to schedule rendering of the component. + */ + @Override + protected String getMainComponentName() { + return "client"; + } +} diff --git a/examples/storybook-hosted/client/android/app/src/main/java/com/client/MainApplication.java b/examples/storybook-hosted/client/android/app/src/main/java/com/client/MainApplication.java new file mode 100644 index 000000000000..2c695cde90c8 --- /dev/null +++ b/examples/storybook-hosted/client/android/app/src/main/java/com/client/MainApplication.java @@ -0,0 +1,42 @@ +package com.client; + +import android.app.Application; + +import com.facebook.react.ReactApplication; +import com.lwansbrough.RCTCamera.RCTCameraPackage; +import com.facebook.react.ReactNativeHost; +import com.facebook.react.ReactPackage; +import com.facebook.react.shell.MainReactPackage; +import com.facebook.soloader.SoLoader; + +import java.util.Arrays; +import java.util.List; + +public class MainApplication extends Application implements ReactApplication { + + private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { + @Override + public boolean getUseDeveloperSupport() { + return BuildConfig.DEBUG; + } + + @Override + protected List getPackages() { + return Arrays.asList( + new MainReactPackage(), + new RCTCameraPackage() + ); + } + }; + + @Override + public ReactNativeHost getReactNativeHost() { + return mReactNativeHost; + } + + @Override + public void onCreate() { + super.onCreate(); + SoLoader.init(this, /* native exopackage */ false); + } +} diff --git a/examples/storybook-hosted/client/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/storybook-hosted/client/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..cde69bcccec65160d92116f20ffce4fce0b5245c GIT binary patch literal 3418 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 literal 0 HcmV?d00001 diff --git a/examples/storybook-hosted/client/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/examples/storybook-hosted/client/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..bfa42f0e7b91d006d22352c9ff2f134e504e3c1d GIT binary patch literal 4842 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 literal 0 HcmV?d00001 diff --git a/examples/storybook-hosted/client/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/storybook-hosted/client/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..324e72cdd7480cb983fa1bcc7ce686e51ef87fe7 GIT binary patch literal 7718 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 literal 0 HcmV?d00001 diff --git a/examples/storybook-hosted/client/android/app/src/main/res/values/strings.xml b/examples/storybook-hosted/client/android/app/src/main/res/values/strings.xml new file mode 100644 index 000000000000..011edd302442 --- /dev/null +++ b/examples/storybook-hosted/client/android/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + client + diff --git a/examples/storybook-hosted/client/android/app/src/main/res/values/styles.xml b/examples/storybook-hosted/client/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000000..319eb0ca100b --- /dev/null +++ b/examples/storybook-hosted/client/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/examples/storybook-hosted/client/android/build.gradle b/examples/storybook-hosted/client/android/build.gradle new file mode 100644 index 000000000000..eed9972b5c13 --- /dev/null +++ b/examples/storybook-hosted/client/android/build.gradle @@ -0,0 +1,24 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:2.2.3' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + mavenLocal() + jcenter() + maven { + // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm + url "$rootDir/../node_modules/react-native/android" + } + } +} diff --git a/examples/storybook-hosted/client/android/gradle.properties b/examples/storybook-hosted/client/android/gradle.properties new file mode 100644 index 000000000000..1fd964e90b1c --- /dev/null +++ b/examples/storybook-hosted/client/android/gradle.properties @@ -0,0 +1,20 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx10248m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +android.useDeprecatedNdk=true diff --git a/examples/storybook-hosted/client/android/gradle/wrapper/gradle-wrapper.jar b/examples/storybook-hosted/client/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..b5166dad4d90021f6a0b45268c0755719f1d5cd4 GIT binary patch literal 52266 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 z zJ2`*6)|%|LmYj95+69#(n$PHsL?SYnZh%==u))RR!A@ta?XlahggqyWpk6g0MLAuN zXt-K29kIRsOn!u#_M208#$e3c5Hpm-DM)oG;LY#Fv=A6e{fK6|Kj5u$j=P|JVTZBP z^AMLL_W^1obbLm=#WY=17MfhkqN?m>&vs4G?VK|ZD!+c8&qe;u0j;&Tax!?p2Vwbx zwA&D&n<&ny+-;o|$}H_Cu+-05Uu$ZLT9QT~JZC^vlh~g?9Jueb1cjluU5?u)=Vpxt z?>&8Mr$%it1=5Xr$wku|DBQx42KQp1#w zap2_`D!Xe!O1znE8qXi@tP2B~zeK)AQ8O9F=dUo`Z)Q~swMHWQl%OS#wbm#@Jtu0W zWJ~5c#jk64k@2}w9H{A3QzU;43Z5pi)UgR#-3#!s1#Q>HRvHCJw>aL;ab4Ga%D}b6 zLM0Mc3Q$=gN-UT|N!TQj=8saV)6j5eW_S{*$0DgRiAzXj^2F!&5Kk^00>|&5lU7Iq z1w_U?pHXQP)`Ntuta-Yp?ToqHXx|dfj$buKF0bjFKV6X#+*I4`|HAV%P{Cgobr~_& zfQv>?d=?~`!pMQ-j@ccqgMRkQ@q6lB~Y(#G;U$oY{xCz zpyrn)tPc+%Zi{4CrBk_0t@wQsC(d?2RJ3LonE+?5WW5{wdHGKnheL07l1y`;bfy&4 zI#K|w9?~}!n+)33Ri#mN1z419{EEp_u9SoYiy)(4wlAJ=A8O|9fL48h&a8#($bT`R zdhSO_>Oh`{Iacw6@BuN~jY#M$iyGnqE@8pOl-n!2z6EG8Wiv&_7xmOPpZ53>6G)pyf07jMAP`o65 z9EvnvE)?V894SdsLZujfeOFXlRLKwnlG(R0wJa;F%oV%25PP;zy%Y69ihgojbgdgE zRf=Q8n-k=&&s%emJl}-TX$A`YI&b4DFHD)XIYIYW2=&P_96UbbG#luO;JE26EAdy+ zR0SVDD}mhMT^nlBdwCBg7lsIXI9C2qF6KG$4;yc#Mea=Fu_dRO(*od;O+N_xRQNk% z9eU>bJ98oiqR^HvaUm4uXMYugomU{w{)&06W=~4B68!Auq-Rh4l`0<@rn6wCiiuib zMmXUuk$y<;gKWEt`r**ii43fVPDT6CPvj3oU&r;CkwjSzFAAs1-fE5@M+ycwpFc-e zKNb+No@G^5#pabiHK9JQDJFpo3pC#x;5)xBCHD#`#f-og*J-E-HNeVUisaSeoCikY ziF#nn^P67z_nVCAmVIdmxNLN4!aQ=q&I)uEod1y9N_Zx2Dj0kTS;N`nunRK(A>f{} zhBLsLVC(Y@(db@wcRq;+2loKdR# z*0~xGUf8l7YuvCt+o-kG72|I73`$EroWy6xSTDTa2DJYwuW8$@PTk3^#5m5JFakdu zhmwSH{eb4cAg;aQBi<7%;e`Pv79F?V75m98-R?!`zzud)00+(sZ8jr&oj7=~HZ0M% z4P8uAi3^HmEZMjm9?>2>GEZ~E8Ln2MK7Y7bZaVo|M0uqK>Ebb+h|fqU-Kzr0R7$Xx z95=XCi4mUxaYM`c4Br?gpl;13yyEwVGuFR9mi!9zqr}27^*T7R4C?SMcW4ZBlh~W{7cYo-OW`*u z7Q>k15k*Oci=vr>s!=vj%CdK%>9bc2b+B|E( z&N-1_w}>_O6qi^jG`A0eG18z*ES@2;u(DUg6d*i3j){uM8js|!Tmr*s3o%aKvt?;O zw@!QhdHO97q80{FGV&N8pVG5^l!`x8My?>#0YByInXFiBnRi~lOP}%n-x#c7uc$0>P*;?F_W9?iZU6^TB?{J7r6 zutA*y?Q-NRyz(4@*O=OKtEsDkn-3cNNYf&7r6yIthO4WXw@&3uli`@dD4cT!V7Czvu@$H5ty=H0}DhdHY{8RK!RqmCfo$Fic`f8C;iz}%rJ3au{xRI zPu+FEg>#x}gg$AW#_r$2%GtQzdF!;)Y>oAM(7u-qd99DlV~-uP9rKzV-axm=)V0(Q zhYlWXDL?CEL0t({qqeXJX!-J zwL+c#P+X+J=A@OFmB3qUb>?=m7+FI7Rk#9gkp%$>nV^7plNx-IuNZL;96_U&p1f;p z#1`-Ldqq#CB3+qo&~q~}%j_A=2!&4|qq0D$c=bfXMkH4eVkNtBQnnfmdk~veQ~lF2 z$f#Jym+`mIMQhNUR}EzJz*9 zC7QXk0!0-$Eu}K!H!l>=NjaM>ccI9YN5H$)rTJBP7T?aN=CDQtlcjiV356zMw4#5Q zFDOWoa_Y)=m#oDoE5*bqa4*$>P_od#r^mi6S1nEf=SCNRsRNrYFwhJPM_a4lF%0@R zdk|MQZht|0M9DIN2`2}OZQVS^MHx=ej4H=sUZ?uHf@WH5vnQQJjhz~XUQXIQm(ZGK zE4ArGMQX7zcQk10+_|Ykk7IBV8->_A1j2|p_`ZFVNIZf7Wh;{uqV%}kQD>s`?)}rX z#+kBI$8Ja2#D?|+cVR11^iu?5&XNSjUgxU24ZO3Dg$n~To#mGZ10Ne>R@C5}N!KwI zhxU`)9P)YJ9Br-p=yd6-F}fAo;$K!vjL^SzVbAO`^}+J;TZld7pv0C?m`^x;T44NM zPqW7m=R_1GCP`69v5)?x;yb$B9<@s`QYzs}<2LU->yTT$g$$-1)AItlV| zDG1KUx|(%^Ru@xtZ83F1YdHeJH2Z4ei$RL}nQ34MVmH#R{&a@)mC{_>er^HQ^ljf$ z(Ml`~vwQL>)4Rw@50|W7z*zCAsNAJ1^`7GgDsJp!3M|0xLofHIDCj;L{@Rlni_ZcO;+B>T^ zGHg21mQdcJRUur@7$98F8n9vDVb9&qT7ZDo#(_JAwe6sgM&WllPHLk0vBHi=#VkXs zWHTKBT3n+sukNYbu9ULE?b{LHIfx1LL-fB+pcn;ZRf+_#!ZWTl(maFqTZ5Fq^b%hA zfE_;Wcn)o-Ybn@EKGGum63h>VWEYK)^OLH@-U-$_lg-Y9>^7lz|2b$BG`OCw;2zPi zPe;gAl7Zopm0}^7$oV!AW3Oy6l1!iK!Cz5BBxPLNA6?s@+nj*~U*Kyr%be<1?D)xI zO511jfl6Dik_ES?y`lM>kd3mVmq2fyHsQ&3iMoLRo^|owDo&&5NJFG*OQVZHWNEK| z^7A>ffZgqs;ID=&E~5pb1vobo1LtP?-woGqL79KwZ4s%Y^&e@Gx_X8q(tK@nVQQ=# zhM_R5mggnl%p_(#d5{4%qP!YG-zH@S6d%|Rlx^49p)%28Uce>&4~I|l(WO08GPv(D zPCQq*S=%2xAD-x;(9sw@f3En9#9svImMJTDD<~{Ynm#YuH?xm{p3+Xs`{Zo{UHjE$ zRo;4A7!)k3$9qdVHQ|D);mhRZ&w)j1fd>q9yG5|w2D-y*uz)7-B>(C`deI8^*Od`l zEcxUzU8uSm!fY?+l##V+58@ZqP%wSQ%`F{vFcvsyV$0^(0oE*%0}j{`ZoK~Sn{;)C zyFuOil(QBEV=r0yw=Ptg$MsZoURbg5>uV`LHM6x*!hOz^%$S}eMktRgmd@|zn3~Ry z)zYDvI((STq(lfy{v+LaAS^v`8Xa#QSp+!`Ip9M0_^6FeSf0~ zra*lNutIY+{NN+mLEPJzX1@ zuCF!jxF1;P2Sk);3C&%>WBG8qq}|HLS@_4<+#4xw9yXw@oA2%?jGx6FM@oZu*Frl%7C`!Lv6(xqd;*6Q_aB5iOi zAlGm3>4b}~JPJIiyoWh=SrW|)iFjwB0$1pK*NA}`lH8XlcZY8(#%NbasL3R_$!dT} zl*cs z^EWS2ev@_GUnD|^MlhW;KiyA5cv^Dc82hjudl65+235!#yP%Y>w`0FtccG0&t{wo0HZ+aJHD!_MDMP&YZVA!?u zJB%FfRVV|LCUjW#fkIeRW^#noDYj0Z`Xf!O`sVH9nJCFqm@gYha$=F>0=`Jb=~{`J z6RG0sS)-%xQydChwvX?>TzrM{bt|Qc?mi;cXuay!b_IByApsIdwgu~34z-CKvC4I* z$=yfn=^vhUcNf{ZHh7kIWm`5mnR8Hp@s$;(GFi1W3*N~6&v4~!;7>x5v~l-+8)yeqm(4O;{V&h(bEIFN3w_p6bNuCEpt z&KQT4_wx4@3scTCN6uRgyYO`uL(#Ow8}k_NhZFesK3ZPA&B(Oi!!L{&$9qxeVglZ6 z-|Oe7`IKKg_ql0QkZIM<038ac42RXTlK`AUI#LO5qHzUbhPR2I>5(Ewhp= z4c1&ScA-Qs(L(|jsOK*ERIF2OU-(}@NgYC#U%q=&Bn?>?!lku8!Qku|?q>}?yTHED zAT&d~Meg--ln#Yw7{8q6GhLi$CNfMF#CoeZ=H9inSUovkt2` zH3gR1TP%vkad#N)m2&mK;iJ*CiojzZxULcB^#IJ92)gQz%4tHTdQPbfB4`Y0M;}X# zPdV`M*ehQuFQ&@$t0LN}_gHK~_xE~yek3+2I*z%$4~&TP1bz|xD;YZxV}Omlv4oku zgQJp@!T0|E>+82y)k+DN$;8{b%GR#hR0<)XZcZvdNEceTL!Q4p)7ei>u%1*n2m&e16z)kawA2K~I?=Mbl z7(w#vUiN9c&&UPnN?<$Sgp6a?e0kj@l{pK?)== zhseE7k3g>D`ix(Xb9;1h;qDluPj8}`pxpbyr9`t>ds<1OT2(1>Dc#z%UZtd514o1r zxQT#~xm3Zu`=un;_7aCSz&uTOD76{48%KZ6d`c$ONs>Wj5OpZUxVEWGvniP~GB$e{ zS$F(6EwQdZ%c*&cn%#?q8ZRhE<72UAg#~!p89C0;euz9SHIYzr$fO%)knkk+T(R*E z(Z?n;ThCFZ&DTrnHKuVD8H0;p7f|dfDv>h9dRk42gN~X7Ek!QZl!)Hb#n5{^U&iZM z3HU-c5f>p+w~^$OS|P2u3C-hZS0e1RIU1AUCHd{b?rnRpkfqj`0&sF$ z4-KQ?0Nu1osUi6I#~sh$8ZpwlL;UqyhV6n$+(>bHx0_+>P9ge}V8iD0LtLfbt`fEx zBws~1&bpc=M@2pzbUl7c0fEItsqQt5EXdPQrD8V4)~)OHVkR}~US!fZF9mauc8%0} zRGhN!0BsV!GvLenBtlc;v<+SeS{YJ+2eG21JMwWR&-1kMtuR%Cl%c(E$O z5mU|^On`!S=bo-x;laDm4S#G74_c8{U0Mx>q*`}=9!}AugBM6wZbOmNl^5pwiMLYd zA4DN(jW9+44Ri97Bk^h;3vy8K+YkY#y4Z)d(V2dt`}cEl3H8t2=Pev7QXyZOh+w3@ zs4j@5Khtqt=G84ytwnVCNVop=4AOXRV|Mi`(sg@}TzU^3>3KHnByR*nKyJ(A08-Z5 z%kwMuC;+F~aiMN#ug@z+OohYF2i6fU*R1(TgGe1wA}tYLoqi}IyaM(v!+6hb9K~7+ zyl%;cx$|32$T7**I;0|Og-ZT&t6p!v6P#PL51n4uU|?_)A?H*R4DQ$rJ0-0Q+$*qB}OlrzOlEFD! zwcWNGGlPj4YXY{LS$3b*#Bp$3Hsa}q;f{y4ou_th@Ki;#v&kN}XC}Skem}*jwysdR zZZFL~3cj!FQxg)xZny^V2BwQFX#r2Uubi=8h<>%vaUi@Y-y*BO0Btn)?>1V=&B4*w z>fiVjGGd2ix`oh#KFpO^)z;0JPm3?Ii=c`1yuymc#CpN_e9t?Ta59D*jdD_CSw_tt zj;JFTmC6jcNVrEMo%QU)!$^8#i%(12la42rNyJEzq?YJ88i6CAmKfRM#6ClOlpkP> z=5M2g>W2HJvgb_*m!B=6gn97T$G zR`;N$aj<=+$7%eu5?of59^qP9-E}ZG?4ms$AO@kF4I&PjCz*}k^SoaT-EZTGj8(a* zcU4&*5gWJgk-2MG?RX_Z*`!0aDNuICWGW@s8ky@$KYP)FPWDp?KlG{Cc85wR?u%8$ zVbIXg-1REl6k4*T;3v6;Pq*)CTy{Q#i8Z{_^-E=0mIZE3V1u4fzBe9-*4&Prrqy>)xW)7CMd1g zOgu-wm#0C8bLd!9W<%q|XX4oRWW|;vPfd=tf&n0TGz)b%#cMe%Fx(2>tcOzyTti(0 zzqqVE8U=uxO=J>XrJs22q%W-ac;AECg7iz^E^x5Sjpmwf;5gGyF|a|WsAZn#&IT&C z+KDjnc8*b$I`i)l>PFm^-%{TSc*rd25r09;;j>am2RLrO3S4~mJg3AxCS)$)uuI)@ui3I_cUNf>BDPZZBr{xg z?ONn@x^5mHw>hUgj0R&1tTYV!1ii^RG@W0%NOh$wHRUbBa-l=mdz$8k3>?etXt+&% z;);Q`jM)zp4zQcb1H9ZdW8}WiOBjQAOb@K^va-;MAJF6~Jvv|EHk|OcUPq=RCt6b@ z!D;xb_@HrIYRSQQxE;PR%@Lo|D&RjpUh#c>yK_uT+M@3LIk2pEWQjV_GQa~n+|;&! z(bgEnUt_JE4(zKs(>b&&jLV$8`e%vg<*!dR@aP~d?*TP&Lj&(J6+qR?K`B{q zAHC_oi1fN_Vqaca%I0VEtaJ7(w#;nQLjK5&dfOyp92$Wl{oWexH$ivwMAc#>cUZp; zD~USjD}LbH#t_UO{g1y7tN$!3{g0Q8gBO#}k?-ZTp!1%{K=kk$7-uuoK%i8*(x^Or zL9H%6{xYWrml`Gx@)W}pWChH`@p+2fmz{{Hby2QkX;^gGv@WKNtZEPED^C-b>Spft zd(S&W;vjL9kr1{CRE%-|5UDC*#vohSj!NGJZB|;5j$~h6&^~cjJB7fIJ5WMsDW<73 zn<)|Ep|OmKNNsYHff6^0*pZT$yta2F79}()N|;7(va#)|2-Vo9Tl$%%4=nF1UQy^W zybA|vPP@k57I%$xL7Zvf(S@BV>kh{CWKC4tdrNaDw=u%wht1JtR8 zMZ-@-6wpYpFk->NYD99~Vsjw|ub%^u7^0-*+{oeOni83fyPw&l7MH_FvDD1Bcwx}U zb-8~`(~MggifJj`BE^|}UaQ@rJ+X7>hQo2Qniz?%pp8T5#l2KTRVX7Oi)B3B)@p@@ z^(p!Z{DH~mwT$j?jovkPtS#9H#sGLf%~9qM9IxR4+Bn*ZRs!KY0xk*#BGah326j$EF&YK{Eo&=C?v zGQsAi5dzJu_0QOeQsOvornpG65l3k#MHTjF?2^-xGwJ1_PeNr#j(C_Y3=fNcnS!Ng*bHg?%<6aaLmh1 zF3Tyy1_^Xyz`t@?yO;97nm4oB=BW$exdhiu6owk)k&?XRiVFAb9XBGy>BeXpk@)Hh z=^8@mpS5}ms&GxWuYK)zdvl-l=|or^F{XfIzEe?^Vs2)|){ z$M=w1^CMhMwK4b{-Ec;>*SH@qjJ70aV`n2?Pb2j%HE07&ebk$COr2*+reE^(dfy`& zmhS|A6oF~51$mkswVK=uQTCP_OJr`yy!{okFPs<^HQ31c`ab!fO71Klse4G*tPqs} z_7flTUSz7)q+Oj)lA7>ngjj&k0>1T^zdn@+teb`6KqLR{Bm$n_Qvd+By8nO6|C5RS zLH=Ls7t#MGpy*)06yea&AbP+p_dweJirxc_!}kLjEm8)a=->YH`;q7O?PKx3#pHzLr6t6bl%L8;{2f8(5ixMG`+gvUd=*Xw{{E(h z^iL&#Urm22(e}N>cm1S)DhO08{aeAkUkm<7==2!C)ZYm32KcYjz?1BI@o$$JKYZZp z*WZ+zegOQ)2=zl~{V`zg@~ati;52UwY`NGkfZuM$KLI{|sRO>=xw;8EIhq2cZ_NyU z>N-DW+&NTtCU? z+Upxx8mj=+=cR0{jGx)qSUB1K85)0GXQ3Aeatj=#-`0bF95sGWz&u=kfCftbS~@uZ zx0OklSsDu)8X7w|$mv__oBT+$@VM@V6@E>6z`7#?-Fd&(odEHV1ZwvBw!qzqKu-t2 z%)|+(o()uz|8w0Hy$H;iUY4TegnvVgnoQKrGU92EdN)<^WB)5RDl%- z0rt)}gYo02@w>zLBl;E!8 zkFy*8#3OkAN4#Hd{r}2!__#M7XU_Y{LiOU0EdOkAVjm^U`3dKv`QN$oy8-^={Q39# zeN&rxobl!-Ad=Sq&VTb5*S2%i%`B+ckC#LDE-!cEay24|g z$9w#L^6&-!#`C-J_*XmrA9Ft5sr{34KlK0R{Ij`w98&ueGa>!|#{5Ho?c+*6j$iyq z5SsNb2>x!R{@jAc(PKXeEOUP&_%TcT8^7=4mOPI3_(?=j_#4r0!}XsYx5q2!KauH* ze?$I#F#QGn=k@f*jd;9r`ICyU?4PLqkGb^mg56J8@A7|w{cbS+VfpTH10K8ee=>Dd z{l@h8`{8eW_kT3#v8(wfO+w9YG=GEr-k`rO|6uzb`y7AbAJ+W~{QvENeB57;-6%ha i{G0y!V)(zDD$ivhfM0>%lFKlIAOn@>z?;AQ_5T2l2V_kE literal 0 HcmV?d00001 diff --git a/examples/storybook-hosted/client/android/gradle/wrapper/gradle-wrapper.properties b/examples/storybook-hosted/client/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000000..dbdc05d274d7 --- /dev/null +++ b/examples/storybook-hosted/client/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/examples/storybook-hosted/client/android/gradlew b/examples/storybook-hosted/client/android/gradlew new file mode 100755 index 000000000000..91a7e269e19d --- /dev/null +++ b/examples/storybook-hosted/client/android/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/examples/storybook-hosted/client/android/gradlew.bat b/examples/storybook-hosted/client/android/gradlew.bat new file mode 100644 index 000000000000..8a0b282aa688 --- /dev/null +++ b/examples/storybook-hosted/client/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/examples/storybook-hosted/client/android/keystores/BUCK b/examples/storybook-hosted/client/android/keystores/BUCK new file mode 100644 index 000000000000..88e4c31b28d4 --- /dev/null +++ b/examples/storybook-hosted/client/android/keystores/BUCK @@ -0,0 +1,8 @@ +keystore( + name = "debug", + properties = "debug.keystore.properties", + store = "debug.keystore", + visibility = [ + "PUBLIC", + ], +) diff --git a/examples/storybook-hosted/client/android/keystores/debug.keystore.properties b/examples/storybook-hosted/client/android/keystores/debug.keystore.properties new file mode 100644 index 000000000000..121bfb49f0df --- /dev/null +++ b/examples/storybook-hosted/client/android/keystores/debug.keystore.properties @@ -0,0 +1,4 @@ +key.store=debug.keystore +key.alias=androiddebugkey +key.store.password=android +key.alias.password=android diff --git a/examples/storybook-hosted/client/android/settings.gradle b/examples/storybook-hosted/client/android/settings.gradle new file mode 100644 index 000000000000..17c8f72a3929 --- /dev/null +++ b/examples/storybook-hosted/client/android/settings.gradle @@ -0,0 +1,5 @@ +rootProject.name = 'client' +include ':react-native-camera' +project(':react-native-camera').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-camera/android') + +include ':app' diff --git a/examples/storybook-hosted/client/app.json b/examples/storybook-hosted/client/app.json new file mode 100644 index 000000000000..94cb3bc55812 --- /dev/null +++ b/examples/storybook-hosted/client/app.json @@ -0,0 +1,4 @@ +{ + "name": "client", + "displayName": "client" +} \ No newline at end of file diff --git a/examples/storybook-hosted/client/index.android.js b/examples/storybook-hosted/client/index.android.js new file mode 100644 index 000000000000..4bfbeb8bc0a6 --- /dev/null +++ b/examples/storybook-hosted/client/index.android.js @@ -0,0 +1,44 @@ +/** + * Sample React Native App + * https://github.com/facebook/react-native + * @flow + */ + +import React, { Component } from 'react'; +import { AppRegistry, StyleSheet, Text, View } from 'react-native'; + +export default class client extends Component { + render() { + return ( + + Welcome to React Native! + To get started, edit index.android.js + + Double tap R on your keyboard to reload,{'\n'} + Shake or press menu button for dev menu + + + ); + } +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + backgroundColor: '#F5FCFF', + }, + welcome: { + fontSize: 20, + textAlign: 'center', + margin: 10, + }, + instructions: { + textAlign: 'center', + color: '#333333', + marginBottom: 5, + }, +}); + +AppRegistry.registerComponent('client', () => client); diff --git a/examples/storybook-hosted/client/index.ios.js b/examples/storybook-hosted/client/index.ios.js new file mode 100644 index 000000000000..e340e26bb8b3 --- /dev/null +++ b/examples/storybook-hosted/client/index.ios.js @@ -0,0 +1,44 @@ +/** + * Sample React Native App + * https://github.com/facebook/react-native + * @flow + */ + +import React, { Component } from 'react'; +import { AppRegistry, StyleSheet, Text, View } from 'react-native'; + +export default class client extends Component { + render() { + return ( + + Welcome to React Native! + To get started, edit index.ios.js + + Press Cmd+R to reload,{'\n'} + Cmd+D or shake for dev menu + + + ); + } +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + backgroundColor: '#F5FCFF', + }, + welcome: { + fontSize: 20, + textAlign: 'center', + margin: 10, + }, + instructions: { + textAlign: 'center', + color: '#333333', + marginBottom: 5, + }, +}); + +AppRegistry.registerComponent('client', () => client); diff --git a/examples/storybook-hosted/client/ios/client-tvOS/Info.plist b/examples/storybook-hosted/client/ios/client-tvOS/Info.plist new file mode 100644 index 000000000000..2fb6a11c2c33 --- /dev/null +++ b/examples/storybook-hosted/client/ios/client-tvOS/Info.plist @@ -0,0 +1,54 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + NSLocationWhenInUseUsageDescription + + NSAppTransportSecurity + + + NSExceptionDomains + + localhost + + NSExceptionAllowsInsecureHTTPLoads + + + + + + diff --git a/examples/storybook-hosted/client/ios/client-tvOSTests/Info.plist b/examples/storybook-hosted/client/ios/client-tvOSTests/Info.plist new file mode 100644 index 000000000000..886825ccc9bf --- /dev/null +++ b/examples/storybook-hosted/client/ios/client-tvOSTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/examples/storybook-hosted/client/ios/client.xcodeproj/project.pbxproj b/examples/storybook-hosted/client/ios/client.xcodeproj/project.pbxproj new file mode 100644 index 000000000000..99402eb1ac0f --- /dev/null +++ b/examples/storybook-hosted/client/ios/client.xcodeproj/project.pbxproj @@ -0,0 +1,1303 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { +/* Begin PBXBuildFile section */ + 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; + 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; + 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; + 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; + 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; + 00E356F31AD99517003FC87E /* clientTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* clientTests.m */; }; + 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; + 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; + 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; + 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; + 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; + 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; + 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; + 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */; }; + 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */; }; + 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */; }; + 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */; }; + 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */; }; + 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */; }; + 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; }; + 2D02E4C91E0B4AEC006451C7 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; }; + 2DCD954D1E0B4F2C00145EB5 /* clientTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* clientTests.m */; }; + 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; + 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; + 9D822667FEA74AE0AE703CD6 /* libRCTCamera.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A8FDEC70E88D40F89F0FD815 /* libRCTCamera.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTActionSheet; + }; + 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTGeolocation; + }; + 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B5115D1A9E6B3D00147676; + remoteInfo = RCTImage; + }; + 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B511DB1A9E6C8500147676; + remoteInfo = RCTNetwork; + }; + 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; + remoteInfo = RCTVibration; + }; + 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 13B07F861A680F5B00A75B9A; + remoteInfo = client; + }; + 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTSettings; + }; + 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3C86DF461ADF2C930047B81A; + remoteInfo = RCTWebSocket; + }; + 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; + remoteInfo = React; + }; + 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7; + remoteInfo = "client-tvOS"; + }; + 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; + remoteInfo = "RCTImage-tvOS"; + }; + 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28471D9B043800D4039D; + remoteInfo = "RCTLinking-tvOS"; + }; + 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28541D9B044C00D4039D; + remoteInfo = "RCTNetwork-tvOS"; + }; + 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28611D9B046600D4039D; + remoteInfo = "RCTSettings-tvOS"; + }; + 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A287B1D9B048500D4039D; + remoteInfo = "RCTText-tvOS"; + }; + 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28881D9B049200D4039D; + remoteInfo = "RCTWebSocket-tvOS"; + }; + 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28131D9B038B00D4039D; + remoteInfo = "React-tvOS"; + }; + 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3C059A1DE3340900C268FA; + remoteInfo = yoga; + }; + 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3C06751DE3340C00C268FA; + remoteInfo = "yoga-tvOS"; + }; + 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4; + remoteInfo = cxxreact; + }; + 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4; + remoteInfo = "cxxreact-tvOS"; + }; + 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3CD90B1DE5FBD600167DC4; + remoteInfo = jschelpers; + }; + 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3CD9181DE5FBD800167DC4; + remoteInfo = "jschelpers-tvOS"; + }; + 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTAnimation; + }; + 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28201D9B03D100D4039D; + remoteInfo = "RCTAnimation-tvOS"; + }; + 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTLinking; + }; + 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B5119B1A9E6C1200147676; + remoteInfo = RCTText; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; + 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; + 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; + 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; + 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; + 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; + 00E356EE1AD99517003FC87E /* clientTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = clientTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 00E356F21AD99517003FC87E /* clientTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = clientTests.m; sourceTree = ""; }; + 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; + 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; + 13B07F961A680F5B00A75B9A /* client.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = client.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = client/AppDelegate.h; sourceTree = ""; }; + 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = client/AppDelegate.m; sourceTree = ""; }; + 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = client/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = client/Info.plist; sourceTree = ""; }; + 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = client/main.m; sourceTree = ""; }; + 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; + 2D02E47B1E0B4A5D006451C7 /* client-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "client-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 2D02E4901E0B4A5D006451C7 /* client-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "client-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; + 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; + 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; + 42977A23FFC24713836C27B7 /* RCTCamera.xcodeproj */ = {isa = PBXFileReference; name = "RCTCamera.xcodeproj"; path = "../node_modules/react-native-camera/ios/RCTCamera.xcodeproj"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; }; + A8FDEC70E88D40F89F0FD815 /* libRCTCamera.a */ = {isa = PBXFileReference; name = "libRCTCamera.a"; path = "libRCTCamera.a"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 00E356EB1AD99517003FC87E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 146834051AC3E58100842450 /* libReact.a in Frameworks */, + 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */, + 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, + 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, + 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, + 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, + 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, + 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, + 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, + 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, + 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, + 9D822667FEA74AE0AE703CD6 /* libRCTCamera.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D02E4781E0B4A5D006451C7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 2D02E4C91E0B4AEC006451C7 /* libReact.a in Frameworks */, + 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation-tvOS.a in Frameworks */, + 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */, + 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */, + 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */, + 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */, + 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */, + 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D02E48D1E0B4A5D006451C7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 00C302A81ABCB8CE00DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302B61ABCB90400DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302BC1ABCB91800DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, + 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302D41ABCB9D200DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, + 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302E01ABCB9EE00DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, + ); + name = Products; + sourceTree = ""; + }; + 00E356EF1AD99517003FC87E /* clientTests */ = { + isa = PBXGroup; + children = ( + 00E356F21AD99517003FC87E /* clientTests.m */, + 00E356F01AD99517003FC87E /* Supporting Files */, + ); + path = clientTests; + sourceTree = ""; + }; + 00E356F01AD99517003FC87E /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 00E356F11AD99517003FC87E /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 139105B71AF99BAD00B5F7CC /* Products */ = { + isa = PBXGroup; + children = ( + 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, + 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 139FDEE71B06529A00C62182 /* Products */ = { + isa = PBXGroup; + children = ( + 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, + 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 13B07FAE1A68108700A75B9A /* client */ = { + isa = PBXGroup; + children = ( + 008F07F21AC5B25A0029DE68 /* main.jsbundle */, + 13B07FAF1A68108700A75B9A /* AppDelegate.h */, + 13B07FB01A68108700A75B9A /* AppDelegate.m */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, + 13B07FB71A68108700A75B9A /* main.m */, + ); + name = client; + sourceTree = ""; + }; + 146834001AC3E56700842450 /* Products */ = { + isa = PBXGroup; + children = ( + 146834041AC3E56700842450 /* libReact.a */, + 3DAD3EA31DF850E9000B6D8A /* libReact.a */, + 3DAD3EA51DF850E9000B6D8A /* libyoga.a */, + 3DAD3EA71DF850E9000B6D8A /* libyoga.a */, + 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */, + 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */, + 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */, + 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */, + ); + name = Products; + sourceTree = ""; + }; + 5E91572E1DD0AC6500FF2AA8 /* Products */ = { + isa = PBXGroup; + children = ( + 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */, + 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 78C398B11ACF4ADC00677621 /* Products */ = { + isa = PBXGroup; + children = ( + 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, + 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */, + 146833FF1AC3E56700842450 /* React.xcodeproj */, + 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, + 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, + 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, + 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, + 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, + 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, + 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, + 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, + 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, + 42977A23FFC24713836C27B7 /* RCTCamera.xcodeproj */, + ); + name = Libraries; + sourceTree = ""; + }; + 832341B11AAA6A8300B99B32 /* Products */ = { + isa = PBXGroup; + children = ( + 832341B51AAA6A8300B99B32 /* libRCTText.a */, + 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 13B07FAE1A68108700A75B9A /* client */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 00E356EF1AD99517003FC87E /* clientTests */, + 83CBBA001A601CBA00E9B192 /* Products */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* client.app */, + 00E356EE1AD99517003FC87E /* clientTests.xctest */, + 2D02E47B1E0B4A5D006451C7 /* client-tvOS.app */, + 2D02E4901E0B4A5D006451C7 /* client-tvOSTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 00E356ED1AD99517003FC87E /* clientTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "clientTests" */; + buildPhases = ( + 00E356EA1AD99517003FC87E /* Sources */, + 00E356EB1AD99517003FC87E /* Frameworks */, + 00E356EC1AD99517003FC87E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 00E356F51AD99517003FC87E /* PBXTargetDependency */, + ); + name = clientTests; + productName = clientTests; + productReference = 00E356EE1AD99517003FC87E /* clientTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 13B07F861A680F5B00A75B9A /* client */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "client" */; + buildPhases = ( + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = client; + productName = "Hello World"; + productReference = 13B07F961A680F5B00A75B9A /* client.app */; + productType = "com.apple.product-type.application"; + }; + 2D02E47A1E0B4A5D006451C7 /* client-tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "client-tvOS" */; + buildPhases = ( + 2D02E4771E0B4A5D006451C7 /* Sources */, + 2D02E4781E0B4A5D006451C7 /* Frameworks */, + 2D02E4791E0B4A5D006451C7 /* Resources */, + 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "client-tvOS"; + productName = "client-tvOS"; + productReference = 2D02E47B1E0B4A5D006451C7 /* client-tvOS.app */; + productType = "com.apple.product-type.application"; + }; + 2D02E48F1E0B4A5D006451C7 /* client-tvOSTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "client-tvOSTests" */; + buildPhases = ( + 2D02E48C1E0B4A5D006451C7 /* Sources */, + 2D02E48D1E0B4A5D006451C7 /* Frameworks */, + 2D02E48E1E0B4A5D006451C7 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */, + ); + name = "client-tvOSTests"; + productName = "client-tvOSTests"; + productReference = 2D02E4901E0B4A5D006451C7 /* client-tvOSTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 610; + ORGANIZATIONNAME = Facebook; + TargetAttributes = { + 00E356ED1AD99517003FC87E = { + CreatedOnToolsVersion = 6.2; + TestTargetID = 13B07F861A680F5B00A75B9A; + }; + 2D02E47A1E0B4A5D006451C7 = { + CreatedOnToolsVersion = 8.2.1; + ProvisioningStyle = Automatic; + }; + 2D02E48F1E0B4A5D006451C7 = { + CreatedOnToolsVersion = 8.2.1; + ProvisioningStyle = Automatic; + TestTargetID = 2D02E47A1E0B4A5D006451C7; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "client" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; + ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; + }, + { + ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */; + ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; + }, + { + ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; + ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; + }, + { + ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; + ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + }, + { + ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; + ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + }, + { + ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; + ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + }, + { + ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; + ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + }, + { + ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; + ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + }, + { + ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; + ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; + }, + { + ProductGroup = 139FDEE71B06529A00C62182 /* Products */; + ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + }, + { + ProductGroup = 146834001AC3E56700842450 /* Products */; + ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* client */, + 00E356ED1AD99517003FC87E /* clientTests */, + 2D02E47A1E0B4A5D006451C7 /* client-tvOS */, + 2D02E48F1E0B4A5D006451C7 /* client-tvOSTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTActionSheet.a; + remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTGeolocation.a; + remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTImage.a; + remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTNetwork.a; + remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTVibration.a; + remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTSettings.a; + remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTWebSocket.a; + remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 146834041AC3E56700842450 /* libReact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libReact.a; + remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTImage-tvOS.a"; + remoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTLinking-tvOS.a"; + remoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTNetwork-tvOS.a"; + remoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTSettings-tvOS.a"; + remoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTText-tvOS.a"; + remoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTWebSocket-tvOS.a"; + remoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EA31DF850E9000B6D8A /* libReact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libReact.a; + remoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libyoga.a; + remoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libyoga.a; + remoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libcxxreact.a; + remoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libcxxreact.a; + remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libjschelpers.a; + remoteRef = 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libjschelpers.a; + remoteRef = 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTAnimation.a; + remoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTAnimation-tvOS.a"; + remoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTLinking.a; + remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTText.a; + remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 00E356EC1AD99517003FC87E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D02E4791E0B4A5D006451C7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D02E48E1E0B4A5D006451C7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; + }; + 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Bundle React Native Code And Images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 00E356EA1AD99517003FC87E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 00E356F31AD99517003FC87E /* clientTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, + 13B07FC11A68108700A75B9A /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D02E4771E0B4A5D006451C7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */, + 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D02E48C1E0B4A5D006451C7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2DCD954D1E0B4F2C00145EB5 /* clientTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 13B07F861A680F5B00A75B9A /* client */; + targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; + }; + 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 2D02E47A1E0B4A5D006451C7 /* client-tvOS */; + targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 13B07FB21A68108700A75B9A /* Base */, + ); + name = LaunchScreen.xib; + path = client; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 00E356F61AD99517003FC87E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = clientTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/client.app/client"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-camera/ios", + ); + }; + name = Debug; + }; + 00E356F71AD99517003FC87E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COPY_PHASE_STRIP = NO; + INFOPLIST_FILE = clientTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/client.app/client"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-camera/ios", + ); + }; + name = Release; + }; + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = NO; + INFOPLIST_FILE = client/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_NAME = client; + VERSIONING_SYSTEM = "apple-generic"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-camera/ios", + ); + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = 1; + INFOPLIST_FILE = client/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_NAME = client; + VERSIONING_SYSTEM = "apple-generic"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-camera/ios", + ); + }; + name = Release; + }; + 2D02E4971E0B4A5E006451C7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "client-tvOS/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.client-tvOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.2; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-camera/ios", + ); + }; + name = Debug; + }; + 2D02E4981E0B4A5E006451C7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "client-tvOS/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.client-tvOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.2; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-camera/ios", + ); + }; + name = Release; + }; + 2D02E4991E0B4A5E006451C7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "client-tvOSTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.client-tvOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/client-tvOS.app/client-tvOS"; + TVOS_DEPLOYMENT_TARGET = 10.1; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + }; + name = Debug; + }; + 2D02E49A1E0B4A5E006451C7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "client-tvOSTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.client-tvOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/client-tvOS.app/client-tvOS"; + TVOS_DEPLOYMENT_TARGET = 10.1; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "clientTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 00E356F61AD99517003FC87E /* Debug */, + 00E356F71AD99517003FC87E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "client" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "client-tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2D02E4971E0B4A5E006451C7 /* Debug */, + 2D02E4981E0B4A5E006451C7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "client-tvOSTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2D02E4991E0B4A5E006451C7 /* Debug */, + 2D02E49A1E0B4A5E006451C7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "client" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/examples/storybook-hosted/client/ios/client.xcodeproj/xcshareddata/xcschemes/client-tvOS.xcscheme b/examples/storybook-hosted/client/ios/client.xcodeproj/xcshareddata/xcschemes/client-tvOS.xcscheme new file mode 100644 index 000000000000..86239d1dfcc1 --- /dev/null +++ b/examples/storybook-hosted/client/ios/client.xcodeproj/xcshareddata/xcschemes/client-tvOS.xcscheme @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/storybook-hosted/client/ios/client.xcodeproj/xcshareddata/xcschemes/client.xcscheme b/examples/storybook-hosted/client/ios/client.xcodeproj/xcshareddata/xcschemes/client.xcscheme new file mode 100644 index 000000000000..816396949220 --- /dev/null +++ b/examples/storybook-hosted/client/ios/client.xcodeproj/xcshareddata/xcschemes/client.xcscheme @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/storybook-hosted/client/ios/client/AppDelegate.h b/examples/storybook-hosted/client/ios/client/AppDelegate.h new file mode 100644 index 000000000000..a9654d5e01b1 --- /dev/null +++ b/examples/storybook-hosted/client/ios/client/AppDelegate.h @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +@interface AppDelegate : UIResponder + +@property (nonatomic, strong) UIWindow *window; + +@end diff --git a/examples/storybook-hosted/client/ios/client/AppDelegate.m b/examples/storybook-hosted/client/ios/client/AppDelegate.m new file mode 100644 index 000000000000..590ef2018ee5 --- /dev/null +++ b/examples/storybook-hosted/client/ios/client/AppDelegate.m @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "AppDelegate.h" + +#import +#import + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + NSURL *jsCodeLocation; + + jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; + + RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation + moduleName:@"client" + initialProperties:nil + launchOptions:launchOptions]; + rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; + + self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; + UIViewController *rootViewController = [UIViewController new]; + rootViewController.view = rootView; + self.window.rootViewController = rootViewController; + [self.window makeKeyAndVisible]; + return YES; +} + +@end diff --git a/examples/storybook-hosted/client/ios/client/Base.lproj/LaunchScreen.xib b/examples/storybook-hosted/client/ios/client/Base.lproj/LaunchScreen.xib new file mode 100644 index 000000000000..ed0b3663fea2 --- /dev/null +++ b/examples/storybook-hosted/client/ios/client/Base.lproj/LaunchScreen.xib @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/storybook-hosted/client/ios/client/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/storybook-hosted/client/ios/client/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000000..118c98f7461b --- /dev/null +++ b/examples/storybook-hosted/client/ios/client/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,38 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/storybook-hosted/client/ios/client/Info.plist b/examples/storybook-hosted/client/ios/client/Info.plist new file mode 100644 index 000000000000..a0aebc638640 --- /dev/null +++ b/examples/storybook-hosted/client/ios/client/Info.plist @@ -0,0 +1,56 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + client + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + NSLocationWhenInUseUsageDescription + + NSAppTransportSecurity + + + NSExceptionDomains + + localhost + + NSExceptionAllowsInsecureHTTPLoads + + + + + + diff --git a/examples/storybook-hosted/client/ios/client/main.m b/examples/storybook-hosted/client/ios/client/main.m new file mode 100644 index 000000000000..3d767fcbb9fc --- /dev/null +++ b/examples/storybook-hosted/client/ios/client/main.m @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/examples/storybook-hosted/client/ios/clientTests/Info.plist b/examples/storybook-hosted/client/ios/clientTests/Info.plist new file mode 100644 index 000000000000..886825ccc9bf --- /dev/null +++ b/examples/storybook-hosted/client/ios/clientTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/examples/storybook-hosted/client/ios/clientTests/clientTests.m b/examples/storybook-hosted/client/ios/clientTests/clientTests.m new file mode 100644 index 000000000000..025683279c16 --- /dev/null +++ b/examples/storybook-hosted/client/ios/clientTests/clientTests.m @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import +#import + +#import +#import + +#define TIMEOUT_SECONDS 600 +#define TEXT_TO_LOOK_FOR @"Welcome to React Native!" + +@interface clientTests : XCTestCase + +@end + +@implementation clientTests + +- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test +{ + if (test(view)) { + return YES; + } + for (UIView *subview in [view subviews]) { + if ([self findSubviewInView:subview matching:test]) { + return YES; + } + } + return NO; +} + +- (void)testRendersWelcomeScreen +{ + UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; + NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; + BOOL foundElement = NO; + + __block NSString *redboxError = nil; + RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { + if (level >= RCTLogLevelError) { + redboxError = message; + } + }); + + while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { + [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + + foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { + if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { + return YES; + } + return NO; + }]; + } + + RCTSetLogFunction(RCTDefaultLogFunction); + + XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); + XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); +} + + +@end diff --git a/examples/storybook-hosted/client/package.json b/examples/storybook-hosted/client/package.json new file mode 100644 index 000000000000..f250cdc6178d --- /dev/null +++ b/examples/storybook-hosted/client/package.json @@ -0,0 +1,24 @@ +{ + "name": "client", + "version": "0.0.1", + "private": true, + "scripts": { + "start": "node node_modules/react-native/local-cli/cli.js start", + "test": "jest" + }, + "dependencies": { + "react": "16.0.0-alpha.12", + "react-native": "0.47.1", + "react-native-camera": "^0.10.0", + "react-native-qrcode-scanner": "^0.0.14" + }, + "devDependencies": { + "babel-jest": "20.0.3", + "babel-preset-react-native": "3.0.0", + "jest": "20.0.4", + "react-test-renderer": "16.0.0-alpha.12" + }, + "jest": { + "preset": "react-native" + } +} diff --git a/examples/storybook-hosted/server/package.json b/examples/storybook-hosted/server/package.json new file mode 100644 index 000000000000..f12bb304e4c0 --- /dev/null +++ b/examples/storybook-hosted/server/package.json @@ -0,0 +1,27 @@ +{ + "name": "wix-react-native-storybook-server", + "version": "1.0.10", + "description": "Server to host storybook for react native apps", + "main": "index.js", + "bin": { + "storybook": "./node_modules/.bin/storybook" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "storybook start -p 7007 -i -r --skip-packager -e PRODUCTION -c ./server" + }, + "author": "Gytis Vinclovas", + "license": "MIT", + "dependencies": { + "@storybook/addon-knobs": "file:../../addons/knobs", + "@storybook/addon-rn-pair": "file:../../addons/rn-pair", + "@storybook/react-native": "file:../../app/react-native", + "babel-plugin-react-docgen": "^1.5.0", + "babel-preset-react-native": "^2.0.0", + "es6-symbol": "^3.1.1", + "react": "16.0.0-alpha.6", + "react-dom": "^15.6.1", + "storybook-addon-smart-knobs": "^3.0.1", + "storybook-usage": "^3.0.0" + } +} diff --git a/examples/storybook-hosted/server/storybook/addons.js b/examples/storybook-hosted/server/storybook/addons.js new file mode 100644 index 000000000000..8dcba4b18db9 --- /dev/null +++ b/examples/storybook-hosted/server/storybook/addons.js @@ -0,0 +1,9 @@ +const React = require('react'); +const addons = require('@storybook/addons').default; + +addons.setPreview(() => React.createElement('div')); + +require('@storybook/addon-knobs/register'); +require('storybook-usage/register'); +require('@storybook/addon-rn-pair/register'); +// import 'react-storybook-addon-docgen/dist/register'; From fa1354d89c32116fd16a6dc56a2ab6c15e2040f1 Mon Sep 17 00:00:00 2001 From: Gytis Vinclovas Date: Thu, 17 Aug 2017 18:28:23 +0300 Subject: [PATCH 4/7] using older version of rn. --- examples/storybook-hosted/client/.flowconfig | 8 +- .../client/__tests__/index.android.js | 4 +- .../client/__tests__/index.ios.js | 4 +- .../client/android/app/build.gradle | 7 -- examples/storybook-hosted/client/app.js | 80 +++++++++++++++++++ .../storybook-hosted/client/index.android.js | 45 +---------- examples/storybook-hosted/client/index.ios.js | 45 +---------- .../ios/client.xcodeproj/project.pbxproj | 14 ++-- examples/storybook-hosted/client/package.json | 9 ++- .../client/storybook/add-decorators.js | 15 ++++ .../client/storybook/index.js | 18 +++++ .../storybook/stories/Button/index.android.js | 22 +++++ .../storybook/stories/Button/index.ios.js | 22 +++++ .../storybook/stories/CenterView/index.js | 21 +++++ .../storybook/stories/CenterView/style.js | 8 ++ .../client/storybook/stories/Welcome/index.js | 54 +++++++++++++ .../client/storybook/stories/index.js | 29 +++++++ 17 files changed, 295 insertions(+), 110 deletions(-) create mode 100644 examples/storybook-hosted/client/app.js create mode 100644 examples/storybook-hosted/client/storybook/add-decorators.js create mode 100644 examples/storybook-hosted/client/storybook/index.js create mode 100644 examples/storybook-hosted/client/storybook/stories/Button/index.android.js create mode 100644 examples/storybook-hosted/client/storybook/stories/Button/index.ios.js create mode 100644 examples/storybook-hosted/client/storybook/stories/CenterView/index.js create mode 100644 examples/storybook-hosted/client/storybook/stories/CenterView/style.js create mode 100644 examples/storybook-hosted/client/storybook/stories/Welcome/index.js create mode 100644 examples/storybook-hosted/client/storybook/stories/index.js diff --git a/examples/storybook-hosted/client/.flowconfig b/examples/storybook-hosted/client/.flowconfig index 83461209da06..a76425eb4881 100644 --- a/examples/storybook-hosted/client/.flowconfig +++ b/examples/storybook-hosted/client/.flowconfig @@ -26,6 +26,8 @@ emoji=true module.system=haste +experimental.strict_type_args=true + munge_underscores=true 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' @@ -34,12 +36,12 @@ suppress_type=$FlowIssue suppress_type=$FlowFixMe suppress_type=$FixMe -suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(4[0-9]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) -suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(4[0-9]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ +suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(4[0-2]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) +suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(4[0-2]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError unsafe.enable_getters_and_setters=true [version] -^0.49.1 +^0.42.0 diff --git a/examples/storybook-hosted/client/__tests__/index.android.js b/examples/storybook-hosted/client/__tests__/index.android.js index a49559bfc426..b49b9087f416 100644 --- a/examples/storybook-hosted/client/__tests__/index.android.js +++ b/examples/storybook-hosted/client/__tests__/index.android.js @@ -6,5 +6,7 @@ import Index from '../index.android.js'; import renderer from 'react-test-renderer'; it('renders correctly', () => { - const tree = renderer.create(); + const tree = renderer.create( + + ); }); diff --git a/examples/storybook-hosted/client/__tests__/index.ios.js b/examples/storybook-hosted/client/__tests__/index.ios.js index a21e84c1aa79..ba7c5b5e1679 100644 --- a/examples/storybook-hosted/client/__tests__/index.ios.js +++ b/examples/storybook-hosted/client/__tests__/index.ios.js @@ -6,5 +6,7 @@ import Index from '../index.ios.js'; import renderer from 'react-test-renderer'; it('renders correctly', () => { - const tree = renderer.create(); + const tree = renderer.create( + + ); }); diff --git a/examples/storybook-hosted/client/android/app/build.gradle b/examples/storybook-hosted/client/android/app/build.gradle index 3f7da1b69522..26536b32cef5 100644 --- a/examples/storybook-hosted/client/android/app/build.gradle +++ b/examples/storybook-hosted/client/android/app/build.gradle @@ -33,13 +33,6 @@ import com.android.build.OutputFile * // bundleInPaidRelease: true, * // bundleInBeta: true, * - * // whether to disable dev mode in custom build variants (by default only disabled in release) - * // for example: to disable dev mode in the staging build type (if configured) - * devDisabledInStaging: true, - * // The configuration property can be in the following formats - * // 'devDisabledIn${productFlavor}${buildType}' - * // 'devDisabledIn${buildType}' - * * // the root of your project, i.e. where "package.json" lives * root: "../../", * diff --git a/examples/storybook-hosted/client/app.js b/examples/storybook-hosted/client/app.js new file mode 100644 index 000000000000..0ed3bf741a5f --- /dev/null +++ b/examples/storybook-hosted/client/app.js @@ -0,0 +1,80 @@ +import React, { Component } from 'react'; +import { AppRegistry, StyleSheet, Text, NavigatorIOS, TouchableOpacity } from 'react-native'; + +import { getStorybook } from './storybook'; +import QRCodeScanner from 'react-native-qrcode-scanner'; + +class App extends Component { + render() { + return ( + + ); + } +} + +class ScanScreen extends Component { + startStorybook(e) { + const [host, port, pairedId, secured] = e.data.split('|'); + + alert(`Host: ${host}, Port: ${port}, PairedId: ${pairedId}, Secured: ${secured}`); + + const StorybookUI = getStorybook( + () => { + require('./storybook/stories'); + }, + module, + { + port, + host, + query: `pairedId=${pairedId}`, + secured, + manualId: true, + resetStorybook: true, + } + ); + + this.props.navigator.push({ + title: 'Storybook', + component: StorybookUI, + }); + } + + render() { + return ( + Scan qr code displayed in web browser} + /> + ); + } +} + +const styles = StyleSheet.create({ + centerText: { + flex: 1, + fontSize: 18, + padding: 32, + color: '#777', + }, + textBold: { + fontWeight: '500', + color: '#000', + }, + + buttonText: { + fontSize: 21, + color: 'rgb(0,122,255)', + }, + + buttonTouchable: { + padding: 16, + }, +}); + +AppRegistry.registerComponent('RNStorybookHostedClient', () => ScanScreen); diff --git a/examples/storybook-hosted/client/index.android.js b/examples/storybook-hosted/client/index.android.js index 4bfbeb8bc0a6..4cd59214a286 100644 --- a/examples/storybook-hosted/client/index.android.js +++ b/examples/storybook-hosted/client/index.android.js @@ -1,44 +1 @@ -/** - * Sample React Native App - * https://github.com/facebook/react-native - * @flow - */ - -import React, { Component } from 'react'; -import { AppRegistry, StyleSheet, Text, View } from 'react-native'; - -export default class client extends Component { - render() { - return ( - - Welcome to React Native! - To get started, edit index.android.js - - Double tap R on your keyboard to reload,{'\n'} - Shake or press menu button for dev menu - - - ); - } -} - -const styles = StyleSheet.create({ - container: { - flex: 1, - justifyContent: 'center', - alignItems: 'center', - backgroundColor: '#F5FCFF', - }, - welcome: { - fontSize: 20, - textAlign: 'center', - margin: 10, - }, - instructions: { - textAlign: 'center', - color: '#333333', - marginBottom: 5, - }, -}); - -AppRegistry.registerComponent('client', () => client); +require('./app'); diff --git a/examples/storybook-hosted/client/index.ios.js b/examples/storybook-hosted/client/index.ios.js index e340e26bb8b3..4cd59214a286 100644 --- a/examples/storybook-hosted/client/index.ios.js +++ b/examples/storybook-hosted/client/index.ios.js @@ -1,44 +1 @@ -/** - * Sample React Native App - * https://github.com/facebook/react-native - * @flow - */ - -import React, { Component } from 'react'; -import { AppRegistry, StyleSheet, Text, View } from 'react-native'; - -export default class client extends Component { - render() { - return ( - - Welcome to React Native! - To get started, edit index.ios.js - - Press Cmd+R to reload,{'\n'} - Cmd+D or shake for dev menu - - - ); - } -} - -const styles = StyleSheet.create({ - container: { - flex: 1, - justifyContent: 'center', - alignItems: 'center', - backgroundColor: '#F5FCFF', - }, - welcome: { - fontSize: 20, - textAlign: 'center', - margin: 10, - }, - instructions: { - textAlign: 'center', - color: '#333333', - marginBottom: 5, - }, -}); - -AppRegistry.registerComponent('client', () => client); +require('./app'); diff --git a/examples/storybook-hosted/client/ios/client.xcodeproj/project.pbxproj b/examples/storybook-hosted/client/ios/client.xcodeproj/project.pbxproj index 99402eb1ac0f..1be301686ad6 100644 --- a/examples/storybook-hosted/client/ios/client.xcodeproj/project.pbxproj +++ b/examples/storybook-hosted/client/ios/client.xcodeproj/project.pbxproj @@ -35,7 +35,7 @@ 2DCD954D1E0B4F2C00145EB5 /* clientTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* clientTests.m */; }; 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; - 9D822667FEA74AE0AE703CD6 /* libRCTCamera.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A8FDEC70E88D40F89F0FD815 /* libRCTCamera.a */; }; + 3079363D5C48431792A9DEB9 /* libRCTCamera.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64A850998BE940439702C12F /* libRCTCamera.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -255,8 +255,8 @@ 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; - 42977A23FFC24713836C27B7 /* RCTCamera.xcodeproj */ = {isa = PBXFileReference; name = "RCTCamera.xcodeproj"; path = "../node_modules/react-native-camera/ios/RCTCamera.xcodeproj"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; }; - A8FDEC70E88D40F89F0FD815 /* libRCTCamera.a */ = {isa = PBXFileReference; name = "libRCTCamera.a"; path = "libRCTCamera.a"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; }; + 659FE8BEE28F4DFBAF86FA86 /* RCTCamera.xcodeproj */ = {isa = PBXFileReference; name = "RCTCamera.xcodeproj"; path = "../node_modules/react-native-camera/ios/RCTCamera.xcodeproj"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; }; + 64A850998BE940439702C12F /* libRCTCamera.a */ = {isa = PBXFileReference; name = "libRCTCamera.a"; path = "libRCTCamera.a"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -283,7 +283,7 @@ 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, - 9D822667FEA74AE0AE703CD6 /* libRCTCamera.a in Frameworks */, + 3079363D5C48431792A9DEB9 /* libRCTCamera.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -450,7 +450,7 @@ 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, - 42977A23FFC24713836C27B7 /* RCTCamera.xcodeproj */, + 659FE8BEE28F4DFBAF86FA86 /* RCTCamera.xcodeproj */, ); name = Libraries; sourceTree = ""; @@ -878,7 +878,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; + shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; }; 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = { isa = PBXShellScriptBuildPhase; @@ -892,7 +892,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; + shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; }; /* End PBXShellScriptBuildPhase section */ diff --git a/examples/storybook-hosted/client/package.json b/examples/storybook-hosted/client/package.json index f250cdc6178d..4722ceefc1a5 100644 --- a/examples/storybook-hosted/client/package.json +++ b/examples/storybook-hosted/client/package.json @@ -7,8 +7,11 @@ "test": "jest" }, "dependencies": { - "react": "16.0.0-alpha.12", - "react-native": "0.47.1", + "@storybook/addon-knobs": "file:../../addons/knobs", + "@storybook/addon-rn-pair": "file:../../addons/rn-pair", + "@storybook/react-native": "file:../../app/react-native", + "react": "16.0.0-alpha.6", + "react-native": "0.44.2", "react-native-camera": "^0.10.0", "react-native-qrcode-scanner": "^0.0.14" }, @@ -16,7 +19,7 @@ "babel-jest": "20.0.3", "babel-preset-react-native": "3.0.0", "jest": "20.0.4", - "react-test-renderer": "16.0.0-alpha.12" + "react-test-renderer": "16.0.0-alpha.6" }, "jest": { "preset": "react-native" diff --git a/examples/storybook-hosted/client/storybook/add-decorators.js b/examples/storybook-hosted/client/storybook/add-decorators.js new file mode 100644 index 000000000000..3f69cf2c2824 --- /dev/null +++ b/examples/storybook-hosted/client/storybook/add-decorators.js @@ -0,0 +1,15 @@ +import { Usage } from 'storybook-usage'; +// import docs from 'react-storybook-addon-docgen'; +import { withKnobsOptions } from '@storybook/addon-knobs'; +import { addDecorator } from '@storybook/react-native'; +import { withSmartKnobs } from 'storybook-addon-smart-knobs'; +// The order is IMPORTANT, docs must be first!!! +// addDecorator(docs); +addDecorator(withSmartKnobs); +addDecorator(Usage); +addDecorator( + withKnobsOptions({ + debounce: { wait: 200, leading: true }, + timestamps: true, + }) +); diff --git a/examples/storybook-hosted/client/storybook/index.js b/examples/storybook-hosted/client/storybook/index.js new file mode 100644 index 000000000000..92fe1fb41033 --- /dev/null +++ b/examples/storybook-hosted/client/storybook/index.js @@ -0,0 +1,18 @@ +global.STORYBOOK_REACT_CLASSES = {}; +import { configure } from '@storybook/react-native'; +import { getStorybookUI } from '@storybook/react-native'; + +import './add-decorators'; + +export function configureStoriesWithDecorators(resolveFunction, moduleName) { + configure(resolveFunction, moduleName); +} + +export function getStorybook( + resolveFunction, + moduleName, + options = { port: 7007, host: 'localhost' } +) { + configureStoriesWithDecorators(resolveFunction, moduleName); + return getStorybookUI(options); +} diff --git a/examples/storybook-hosted/client/storybook/stories/Button/index.android.js b/examples/storybook-hosted/client/storybook/stories/Button/index.android.js new file mode 100644 index 000000000000..7a285bc65e46 --- /dev/null +++ b/examples/storybook-hosted/client/storybook/stories/Button/index.android.js @@ -0,0 +1,22 @@ +/* eslint-disable import/no-extraneous-dependencies, import/no-unresolved, import/extensions */ + +import React, { PropTypes } from 'react'; +import { TouchableNativeFeedback } from 'react-native'; + +export default function Button(props) { + return ( + + {props.children} + + ); +} + +Button.defaultProps = { + children: null, + onPress: () => {}, +}; + +Button.propTypes = { + children: PropTypes.node, + onPress: PropTypes.func, +}; diff --git a/examples/storybook-hosted/client/storybook/stories/Button/index.ios.js b/examples/storybook-hosted/client/storybook/stories/Button/index.ios.js new file mode 100644 index 000000000000..035cacc61e99 --- /dev/null +++ b/examples/storybook-hosted/client/storybook/stories/Button/index.ios.js @@ -0,0 +1,22 @@ +/* eslint-disable import/no-extraneous-dependencies, import/no-unresolved, import/extensions */ + +import React, { PropTypes } from 'react'; +import { TouchableHighlight } from 'react-native'; + +export default function Button(props) { + return ( + + {props.children} + + ); +} + +Button.defaultProps = { + children: null, + onPress: () => {}, +}; + +Button.propTypes = { + children: PropTypes.node, + onPress: PropTypes.func, +}; diff --git a/examples/storybook-hosted/client/storybook/stories/CenterView/index.js b/examples/storybook-hosted/client/storybook/stories/CenterView/index.js new file mode 100644 index 000000000000..e6c8fc60ee19 --- /dev/null +++ b/examples/storybook-hosted/client/storybook/stories/CenterView/index.js @@ -0,0 +1,21 @@ +/* eslint-disable import/no-extraneous-dependencies, import/no-unresolved, import/extensions */ + +import React, { PropTypes } from 'react'; +import { View } from 'react-native'; +import style from './style'; + +export default function CenterView(props) { + return ( + + {props.children} + + ); +} + +CenterView.defaultProps = { + children: null, +}; + +CenterView.propTypes = { + children: PropTypes.node, +}; diff --git a/examples/storybook-hosted/client/storybook/stories/CenterView/style.js b/examples/storybook-hosted/client/storybook/stories/CenterView/style.js new file mode 100644 index 000000000000..ff347fd9841f --- /dev/null +++ b/examples/storybook-hosted/client/storybook/stories/CenterView/style.js @@ -0,0 +1,8 @@ +export default { + main: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + backgroundColor: '#F5FCFF', + }, +}; diff --git a/examples/storybook-hosted/client/storybook/stories/Welcome/index.js b/examples/storybook-hosted/client/storybook/stories/Welcome/index.js new file mode 100644 index 000000000000..1106a2ba934d --- /dev/null +++ b/examples/storybook-hosted/client/storybook/stories/Welcome/index.js @@ -0,0 +1,54 @@ +/* eslint-disable import/no-extraneous-dependencies, import/no-unresolved, import/extensions */ + +import React, { PropTypes } from 'react'; +import { View, Text } from 'react-native'; + +export default class Welcome extends React.Component { + styles = { + wrapper: { + flex: 1, + padding: 24, + justifyContent: 'center', + }, + header: { + fontSize: 18, + marginBottom: 18, + }, + content: { + fontSize: 12, + marginBottom: 10, + lineHeight: 18, + }, + }; + + showApp(event) { + event.preventDefault(); + if (this.props.showApp) this.props.showApp(); + } + + render() { + return ( + + Welcome to React Native Storybook + + This is a UI Component development environment for your React Native app. Here you can + display and interact with your UI components as stories. A story is a single state of one + or more UI components. You can have as many stories as you want. In other words a story is + like a visual test case. + + + We have added some stories inside the "storybook/stories" directory for examples. Try + editing the "storybook/stories/Welcome.js" file to edit this message. + + + ); + } +} + +Welcome.defaultProps = { + showApp: null, +}; + +Welcome.propTypes = { + showApp: PropTypes.func, +}; diff --git a/examples/storybook-hosted/client/storybook/stories/index.js b/examples/storybook-hosted/client/storybook/stories/index.js new file mode 100644 index 000000000000..99ab2205a9d0 --- /dev/null +++ b/examples/storybook-hosted/client/storybook/stories/index.js @@ -0,0 +1,29 @@ +import React from 'react'; +import { Text } from 'react-native'; + +import { storiesOf } from '@storybook/react-native'; +import { action } from '@storybook/addon-actions'; +import { linkTo } from '@storybook/addon-links'; + +import Button from './Button'; +import CenterView from './CenterView'; +import Welcome from './Welcome'; + +storiesOf('Welcome', module).add('to Storybook', () => ); + +storiesOf('Button', module) + .addDecorator(getStory => + + {getStory()} + + ) + .add('with text', () => + + ) + .add('with some emoji', () => + + ); From 2743f29a1addd037f2b670b754406fbbc1289a13 Mon Sep 17 00:00:00 2001 From: Gytis Vinclovas Date: Thu, 24 Aug 2017 11:12:27 +0300 Subject: [PATCH 5/7] working version. --- examples/storybook-hosted/client/app.js | 99 ++++++------ .../client/ios/client-tvOS/Info.plist | 29 ++-- .../ios/client.xcodeproj/project.pbxproj | 146 +++++++++++------- .../AppIcon.appiconset/Contents.json | 10 ++ .../client/ios/client/Info.plist | 31 ++-- examples/storybook-hosted/client/package.json | 8 +- .../client/storybook/add-decorators.js | 8 +- examples/storybook-hosted/server/package.json | 2 +- .../server/storybook/addons.js | 2 - 9 files changed, 184 insertions(+), 151 deletions(-) diff --git a/examples/storybook-hosted/client/app.js b/examples/storybook-hosted/client/app.js index 0ed3bf741a5f..aa0b1bb7004a 100644 --- a/examples/storybook-hosted/client/app.js +++ b/examples/storybook-hosted/client/app.js @@ -1,31 +1,49 @@ import React, { Component } from 'react'; -import { AppRegistry, StyleSheet, Text, NavigatorIOS, TouchableOpacity } from 'react-native'; +import QRCodeScanner from 'react-native-qrcode-scanner'; +import { AppRegistry, StyleSheet, Text } from 'react-native'; import { getStorybook } from './storybook'; -import QRCodeScanner from 'react-native-qrcode-scanner'; + +const styles = StyleSheet.create({ + centerText: { + flex: 1, + fontSize: 18, + padding: 32, + color: '#777', + }, + textBold: { + fontWeight: '500', + color: '#000', + }, + + buttonText: { + fontSize: 21, + color: 'rgb(0,122,255)', + }, + + buttonTouchable: { + padding: 16, + }, +}); + class App extends Component { - render() { - return ( - - ); + + constructor() { + super(); + this.storybookComponent = null; + + this.state = { + init: false, + }; } -} -class ScanScreen extends Component { startStorybook(e) { const [host, port, pairedId, secured] = e.data.split('|'); - alert(`Host: ${host}, Port: ${port}, PairedId: ${pairedId}, Secured: ${secured}`); - - const StorybookUI = getStorybook( + this.storybookComponent = getStorybook( () => { + // eslint-disable-next-line global-require require('./storybook/stories'); }, module, @@ -33,48 +51,31 @@ class ScanScreen extends Component { port, host, query: `pairedId=${pairedId}`, - secured, + secured: secured === '1', manualId: true, resetStorybook: true, } ); - this.props.navigator.push({ - title: 'Storybook', - component: StorybookUI, + this.setState({ + init: true, }); } render() { - return ( - Scan qr code displayed in web browser} - /> - ); - } -} -const styles = StyleSheet.create({ - centerText: { - flex: 1, - fontSize: 18, - padding: 32, - color: '#777', - }, - textBold: { - fontWeight: '500', - color: '#000', - }, + if (!this.state.init) { + return ( + this.startStorybook()} + topContent={Scan qr code displayed in web browser} + /> + ); + } - buttonText: { - fontSize: 21, - color: 'rgb(0,122,255)', - }, + return (); + } +} - buttonTouchable: { - padding: 16, - }, -}); -AppRegistry.registerComponent('RNStorybookHostedClient', () => ScanScreen); +AppRegistry.registerComponent('client', () => App); diff --git a/examples/storybook-hosted/client/ios/client-tvOS/Info.plist b/examples/storybook-hosted/client/ios/client-tvOS/Info.plist index 2fb6a11c2c33..ecbd496be7df 100644 --- a/examples/storybook-hosted/client/ios/client-tvOS/Info.plist +++ b/examples/storybook-hosted/client/ios/client-tvOS/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -22,6 +22,19 @@ 1 LSRequiresIPhoneOS + NSAppTransportSecurity + + NSExceptionDomains + + localhost + + NSExceptionAllowsInsecureHTTPLoads + + + + + NSLocationWhenInUseUsageDescription + UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities @@ -36,19 +49,5 @@ UIViewControllerBasedStatusBarAppearance - NSLocationWhenInUseUsageDescription - - NSAppTransportSecurity - - - NSExceptionDomains - - localhost - - NSExceptionAllowsInsecureHTTPLoads - - - - diff --git a/examples/storybook-hosted/client/ios/client.xcodeproj/project.pbxproj b/examples/storybook-hosted/client/ios/client.xcodeproj/project.pbxproj index 1be301686ad6..e025589c740f 100644 --- a/examples/storybook-hosted/client/ios/client.xcodeproj/project.pbxproj +++ b/examples/storybook-hosted/client/ios/client.xcodeproj/project.pbxproj @@ -5,6 +5,7 @@ }; objectVersion = 46; objects = { + /* Begin PBXBuildFile section */ 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; @@ -24,7 +25,7 @@ 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */; }; + 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */; }; 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */; }; 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */; }; @@ -33,9 +34,9 @@ 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; }; 2D02E4C91E0B4AEC006451C7 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; }; 2DCD954D1E0B4F2C00145EB5 /* clientTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* clientTests.m */; }; + 3079363D5C48431792A9DEB9 /* libRCTCamera.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64A850998BE940439702C12F /* libRCTCamera.a */; }; 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; - 3079363D5C48431792A9DEB9 /* libRCTCamera.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64A850998BE940439702C12F /* libRCTCamera.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -200,6 +201,13 @@ remoteGlobalIDString = 3D3CD9181DE5FBD800167DC4; remoteInfo = "jschelpers-tvOS"; }; + 46E13E0E1F45EDC50074D8B7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 659FE8BEE28F4DFBAF86FA86 /* RCTCamera.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 4107012F1ACB723B00C6AA39; + remoteInfo = RCTCamera; + }; 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; @@ -253,10 +261,10 @@ 2D02E47B1E0B4A5D006451C7 /* client-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "client-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 2D02E4901E0B4A5D006451C7 /* client-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "client-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; + 64A850998BE940439702C12F /* libRCTCamera.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTCamera.a; sourceTree = ""; }; + 659FE8BEE28F4DFBAF86FA86 /* RCTCamera.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RCTCamera.xcodeproj; path = "../node_modules/react-native-camera/ios/RCTCamera.xcodeproj"; sourceTree = ""; }; 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; - 659FE8BEE28F4DFBAF86FA86 /* RCTCamera.xcodeproj */ = {isa = PBXFileReference; name = "RCTCamera.xcodeproj"; path = "../node_modules/react-native-camera/ios/RCTCamera.xcodeproj"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; }; - 64A850998BE940439702C12F /* libRCTCamera.a */ = {isa = PBXFileReference; name = "libRCTCamera.a"; path = "libRCTCamera.a"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -292,7 +300,7 @@ buildActionMask = 2147483647; files = ( 2D02E4C91E0B4AEC006451C7 /* libReact.a in Frameworks */, - 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation-tvOS.a in Frameworks */, + 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */, 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */, 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */, 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */, @@ -418,11 +426,19 @@ name = Products; sourceTree = ""; }; + 46E13E081F45EDC50074D8B7 /* Products */ = { + isa = PBXGroup; + children = ( + 46E13E0F1F45EDC50074D8B7 /* libRCTCamera.a */, + ); + name = Products; + sourceTree = ""; + }; 5E91572E1DD0AC6500FF2AA8 /* Products */ = { isa = PBXGroup; children = ( 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */, - 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */, + 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */, ); name = Products; sourceTree = ""; @@ -606,6 +622,10 @@ ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */; ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; }, + { + ProductGroup = 46E13E081F45EDC50074D8B7 /* Products */; + ProjectRef = 659FE8BEE28F4DFBAF86FA86 /* RCTCamera.xcodeproj */; + }, { ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; @@ -801,6 +821,13 @@ remoteRef = 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 46E13E0F1F45EDC50074D8B7 /* libRCTCamera.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTCamera.a; + remoteRef = 46E13E0E1F45EDC50074D8B7 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -808,10 +835,10 @@ remoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */ = { + 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; - path = "libRCTAnimation-tvOS.a"; + path = libRCTAnimation.a; remoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -967,23 +994,23 @@ "DEBUG=1", "$(inherited)", ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-camera/ios", + ); INFOPLIST_FILE = clientTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); OTHER_LDFLAGS = ( "-ObjC", "-lc++", ); PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/client.app/client"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - ); - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-camera/ios", - ); }; name = Debug; }; @@ -992,23 +1019,24 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; COPY_PHASE_STRIP = NO; + DEVELOPMENT_TEAM = XPHGA2FMQQ; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-camera/ios", + ); INFOPLIST_FILE = clientTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); OTHER_LDFLAGS = ( "-ObjC", "-lc++", ); PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/client.app/client"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - ); - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-camera/ios", - ); }; name = Release; }; @@ -1018,6 +1046,10 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = 1; DEAD_CODE_STRIPPING = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-camera/ios", + ); INFOPLIST_FILE = client/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( @@ -1025,12 +1057,9 @@ "-ObjC", "-lc++", ); + PRODUCT_BUNDLE_IDENTIFIER = org.reactjs.native.example.rnstorybookclient; PRODUCT_NAME = client; VERSIONING_SYSTEM = "apple-generic"; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-camera/ios", - ); }; name = Debug; }; @@ -1039,6 +1068,10 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = 1; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-camera/ios", + ); INFOPLIST_FILE = client/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( @@ -1046,12 +1079,9 @@ "-ObjC", "-lc++", ); + PRODUCT_BUNDLE_IDENTIFIER = org.reactjs.native.example.rnstorybookclient; PRODUCT_NAME = client; VERSIONING_SYSTEM = "apple-generic"; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-camera/ios", - ); }; name = Release; }; @@ -1067,25 +1097,25 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_TESTABILITY = YES; GCC_NO_COMMON_BLOCKS = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-camera/ios", + ); INFOPLIST_FILE = "client-tvOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); OTHER_LDFLAGS = ( "-ObjC", "-lc++", ); - PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.client-tvOS"; + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.rnstorybookclient-tvOS"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.2; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - ); - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-camera/ios", - ); }; name = Debug; }; @@ -1101,25 +1131,25 @@ COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_NO_COMMON_BLOCKS = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-camera/ios", + ); INFOPLIST_FILE = "client-tvOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); OTHER_LDFLAGS = ( "-ObjC", "-lc++", ); - PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.client-tvOS"; + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.rnstorybookclient-tvOS"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.2; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - ); - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-camera/ios", - ); }; name = Release; }; @@ -1136,15 +1166,15 @@ GCC_NO_COMMON_BLOCKS = YES; INFOPLIST_FILE = "client-tvOSTests/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.client-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/client-tvOS.app/client-tvOS"; TVOS_DEPLOYMENT_TARGET = 10.1; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - ); }; name = Debug; }; @@ -1161,15 +1191,15 @@ GCC_NO_COMMON_BLOCKS = YES; INFOPLIST_FILE = "client-tvOSTests/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.client-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/client-tvOS.app/client-tvOS"; TVOS_DEPLOYMENT_TARGET = 10.1; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - ); }; name = Release; }; diff --git a/examples/storybook-hosted/client/ios/client/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/storybook-hosted/client/ios/client/Images.xcassets/AppIcon.appiconset/Contents.json index 118c98f7461b..b8236c653481 100644 --- a/examples/storybook-hosted/client/ios/client/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/examples/storybook-hosted/client/ios/client/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "29x29", diff --git a/examples/storybook-hosted/client/ios/client/Info.plist b/examples/storybook-hosted/client/ios/client/Info.plist index a0aebc638640..44a53c381e9e 100644 --- a/examples/storybook-hosted/client/ios/client/Info.plist +++ b/examples/storybook-hosted/client/ios/client/Info.plist @@ -9,7 +9,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -24,6 +24,19 @@ 1 LSRequiresIPhoneOS + NSAppTransportSecurity + + NSExceptionDomains + + localhost + + NSExceptionAllowsInsecureHTTPLoads + + + + + NSLocationWhenInUseUsageDescription + UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities @@ -38,19 +51,7 @@ UIViewControllerBasedStatusBarAppearance - NSLocationWhenInUseUsageDescription - - NSAppTransportSecurity - - - NSExceptionDomains - - localhost - - NSExceptionAllowsInsecureHTTPLoads - - - - + NSCameraUsageDescription + Allow to scan qr code diff --git a/examples/storybook-hosted/client/package.json b/examples/storybook-hosted/client/package.json index 4722ceefc1a5..2c7e8f08c87e 100644 --- a/examples/storybook-hosted/client/package.json +++ b/examples/storybook-hosted/client/package.json @@ -7,11 +7,11 @@ "test": "jest" }, "dependencies": { - "@storybook/addon-knobs": "file:../../addons/knobs", - "@storybook/addon-rn-pair": "file:../../addons/rn-pair", - "@storybook/react-native": "file:../../app/react-native", + "@storybook/addon-knobs": "file:../../../addons/knobs", + "@storybook/addon-rn-pair": "file:../../../addons/rn-pair", + "@storybook/react-native": "file:../../../app/react-native", "react": "16.0.0-alpha.6", - "react-native": "0.44.2", + "react-native": "0.44.1", "react-native-camera": "^0.10.0", "react-native-qrcode-scanner": "^0.0.14" }, diff --git a/examples/storybook-hosted/client/storybook/add-decorators.js b/examples/storybook-hosted/client/storybook/add-decorators.js index 3f69cf2c2824..da979e68ac1f 100644 --- a/examples/storybook-hosted/client/storybook/add-decorators.js +++ b/examples/storybook-hosted/client/storybook/add-decorators.js @@ -1,12 +1,6 @@ -import { Usage } from 'storybook-usage'; -// import docs from 'react-storybook-addon-docgen'; import { withKnobsOptions } from '@storybook/addon-knobs'; import { addDecorator } from '@storybook/react-native'; -import { withSmartKnobs } from 'storybook-addon-smart-knobs'; -// The order is IMPORTANT, docs must be first!!! -// addDecorator(docs); -addDecorator(withSmartKnobs); -addDecorator(Usage); + addDecorator( withKnobsOptions({ debounce: { wait: 200, leading: true }, diff --git a/examples/storybook-hosted/server/package.json b/examples/storybook-hosted/server/package.json index f12bb304e4c0..fbf7d83cd08d 100644 --- a/examples/storybook-hosted/server/package.json +++ b/examples/storybook-hosted/server/package.json @@ -8,7 +8,7 @@ }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "start": "storybook start -p 7007 -i -r --skip-packager -e PRODUCTION -c ./server" + "start": "storybook start -p 7007 -i -r --skip-packager -e PRODUCTION -c ./storybook" }, "author": "Gytis Vinclovas", "license": "MIT", diff --git a/examples/storybook-hosted/server/storybook/addons.js b/examples/storybook-hosted/server/storybook/addons.js index 8dcba4b18db9..0f4f2cf2d90c 100644 --- a/examples/storybook-hosted/server/storybook/addons.js +++ b/examples/storybook-hosted/server/storybook/addons.js @@ -4,6 +4,4 @@ const addons = require('@storybook/addons').default; addons.setPreview(() => React.createElement('div')); require('@storybook/addon-knobs/register'); -require('storybook-usage/register'); require('@storybook/addon-rn-pair/register'); -// import 'react-storybook-addon-docgen/dist/register'; From 5411108c70362e01db86fea726a7a6b61684ff92 Mon Sep 17 00:00:00 2001 From: Gytis Vinclovas Date: Thu, 24 Aug 2017 11:30:10 +0300 Subject: [PATCH 6/7] Clearing up --- examples/storybook-hosted/client/app.js | 3 +- .../client/storybook/index.js | 5 +- .../client/storybook/stories/Knobs/index.js | 59 +++++++++++++++++++ .../client/storybook/stories/index.js | 4 ++ 4 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 examples/storybook-hosted/client/storybook/stories/Knobs/index.js diff --git a/examples/storybook-hosted/client/app.js b/examples/storybook-hosted/client/app.js index aa0b1bb7004a..235938a387d0 100644 --- a/examples/storybook-hosted/client/app.js +++ b/examples/storybook-hosted/client/app.js @@ -26,7 +26,6 @@ const styles = StyleSheet.create({ }, }); - class App extends Component { constructor() { @@ -67,7 +66,7 @@ class App extends Component { if (!this.state.init) { return ( this.startStorybook()} + onRead={(...args) => this.startStorybook(...args)} topContent={Scan qr code displayed in web browser} /> ); diff --git a/examples/storybook-hosted/client/storybook/index.js b/examples/storybook-hosted/client/storybook/index.js index 92fe1fb41033..0561b9e12ca9 100644 --- a/examples/storybook-hosted/client/storybook/index.js +++ b/examples/storybook-hosted/client/storybook/index.js @@ -1,6 +1,7 @@ +/* eslint-disable import/first */ global.STORYBOOK_REACT_CLASSES = {}; -import { configure } from '@storybook/react-native'; -import { getStorybookUI } from '@storybook/react-native'; + +import { getStorybookUI, configure } from '@storybook/react-native'; import './add-decorators'; diff --git a/examples/storybook-hosted/client/storybook/stories/Knobs/index.js b/examples/storybook-hosted/client/storybook/stories/Knobs/index.js new file mode 100644 index 000000000000..19cec307ac4f --- /dev/null +++ b/examples/storybook-hosted/client/storybook/stories/Knobs/index.js @@ -0,0 +1,59 @@ +import React from 'react'; +import { View, Text } from 'react-native'; + +import { text, number, boolean, color, select, array, date, object } from '@storybook/addon-knobs'; + +export default () => { + const name = text('Name', 'Storyteller'); + const age = number('Age', 70, { range: true, min: 0, max: 90, step: 5 }); + const fruits = { + apple: 'Apple', + banana: 'Banana', + cherry: 'Cherry', + }; + const fruit = select('Fruit', fruits, 'apple'); + const dollars = number('Dollars', 12.5); + + // NOTE: color picker is currently broken + const backgroundColor = color('background', '#ffff00'); + const items = array('Items', ['Laptop', 'Book', 'Whiskey']); + const otherStyles = object('Styles', { + borderWidth: 3, + borderColor: '#ff00ff', + padding: 10, + }); + const nice = boolean('Nice', true); + + // NOTE: put this last because it currently breaks everything after it :D + const birthday = date('Birthday', new Date('Jan 20 2017')); + + const intro = `My name is ${name}, I'm ${age} years old, and my favorite fruit is ${fruit}.`; + const style = { backgroundColor, ...otherStyles }; + const salutation = nice ? 'Nice to meet you!' : 'Leave me alone!'; + const dateOptions = { year: 'numeric', month: 'long', day: 'numeric' }; + + return ( + + + {intro} + + + My birthday is: {new Date(birthday).toLocaleDateString('en-US', dateOptions)} + + + My wallet contains: ${dollars.toFixed(2)} + + In my backpack, I have: + + {items.map(item => + + {item} + + )} + + + {salutation} + + + ); +}; diff --git a/examples/storybook-hosted/client/storybook/stories/index.js b/examples/storybook-hosted/client/storybook/stories/index.js index 99ab2205a9d0..597005a811de 100644 --- a/examples/storybook-hosted/client/storybook/stories/index.js +++ b/examples/storybook-hosted/client/storybook/stories/index.js @@ -4,7 +4,9 @@ import { Text } from 'react-native'; import { storiesOf } from '@storybook/react-native'; import { action } from '@storybook/addon-actions'; import { linkTo } from '@storybook/addon-links'; +import { withKnobs } from '@storybook/addon-knobs'; +import knobsWrapper from './Knobs'; import Button from './Button'; import CenterView from './CenterView'; import Welcome from './Welcome'; @@ -27,3 +29,5 @@ storiesOf('Button', module) 😀 😎 👍 💯 ); + +storiesOf('Knobs', module).addDecorator(withKnobs).add('with knobs', knobsWrapper); From 15b824ee64416595e3cf29e5db148802fe9362f2 Mon Sep 17 00:00:00 2001 From: Gytis Vinclovas Date: Thu, 24 Aug 2017 14:28:23 +0300 Subject: [PATCH 7/7] Fixed dependencies. --- examples/storybook-hosted/client/package.json | 1 + examples/storybook-hosted/server/package.json | 13 +++---------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/examples/storybook-hosted/client/package.json b/examples/storybook-hosted/client/package.json index 2c7e8f08c87e..c0253107c465 100644 --- a/examples/storybook-hosted/client/package.json +++ b/examples/storybook-hosted/client/package.json @@ -12,6 +12,7 @@ "@storybook/react-native": "file:../../../app/react-native", "react": "16.0.0-alpha.6", "react-native": "0.44.1", + "react-dom": "16.0.0-alpha.6", "react-native-camera": "^0.10.0", "react-native-qrcode-scanner": "^0.0.14" }, diff --git a/examples/storybook-hosted/server/package.json b/examples/storybook-hosted/server/package.json index fbf7d83cd08d..0584b6153e41 100644 --- a/examples/storybook-hosted/server/package.json +++ b/examples/storybook-hosted/server/package.json @@ -13,15 +13,8 @@ "author": "Gytis Vinclovas", "license": "MIT", "dependencies": { - "@storybook/addon-knobs": "file:../../addons/knobs", - "@storybook/addon-rn-pair": "file:../../addons/rn-pair", - "@storybook/react-native": "file:../../app/react-native", - "babel-plugin-react-docgen": "^1.5.0", - "babel-preset-react-native": "^2.0.0", - "es6-symbol": "^3.1.1", - "react": "16.0.0-alpha.6", - "react-dom": "^15.6.1", - "storybook-addon-smart-knobs": "^3.0.1", - "storybook-usage": "^3.0.0" + "@storybook/addon-knobs": "file:../../../addons/knobs", + "@storybook/addon-rn-pair": "file:../../../addons/rn-pair", + "@storybook/react-native": "file:../../../app/react-native" } }