diff --git a/.babelrc b/.babelrc index 5e3147a..e68f1d4 100644 --- a/.babelrc +++ b/.babelrc @@ -1,3 +1,4 @@ { - "presets": ["react-native", "react-native-stage-0/decorator-support"] + "presets": ["react-native", "react-native-stage-0/decorator-support"], + "plugins": ["lodash"] } diff --git a/.eslintignore b/.eslintignore index 455f2b6..40a50e3 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,3 +2,4 @@ **/android **/ios **/vendors +dist diff --git a/.flowconfig b/.flowconfig index 6af0cb1..f4ca920 100644 --- a/.flowconfig +++ b/.flowconfig @@ -12,12 +12,20 @@ ; 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 + +; Ignore polyfills +.*/Libraries/polyfills/.* ; Ignore deps errors -.*/node_modules/react-navigation +.*/node_modules/@yfuks/react-native-action-sheet .*/node_modules/react-native-firebase .*/node_modules/react-native-linear-gradient +.*/node_modules/react-native-tab-view +.*/node_modules/react-navigation +.*/node_modules/redux-saga-test-plan +.*/node_modules/react-native-web-lists +.*/node_modules/babel-plugin-transform-react-remove-prop-types +.*/node_modules/redux-persist ; tests .*/*.tests.js @@ -27,7 +35,7 @@ [libs] node_modules/react-native/Libraries/react-native/react-native-interface.js -node_modules/react-native/flow +node_modules/react-native/flow/ flow/ [options] @@ -41,10 +49,12 @@ module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|we suppress_type=$FlowIssue suppress_type=$FlowFixMe +suppress_type=$FlowFixMeProps +suppress_type=$FlowFixMeState 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\\.\\(5[0-6]\\|[1-4][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) +suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(5[0-6]\\|[1-4][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError @@ -53,4 +63,4 @@ unsafe.enable_getters_and_setters=true esproposal.decorators=ignore [version] -^0.49.1 +^0.56.0 diff --git a/.gitignore b/.gitignore index e7bddc2..f449e4b 100644 --- a/.gitignore +++ b/.gitignore @@ -46,15 +46,13 @@ android/app/libs # 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 +# https://docs.fastlane.tools/best-practices/source-control/ fastlane/report.xml fastlane/Preview.html fastlane/screenshots -# Fastlane dist -fastlane/report.xml fastlane/.env.*.secret *.back diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..9d5ce39 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,5 @@ +{ + "printWidth": 120, + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/Gemfile.lock b/Gemfile.lock index cacd7bb..bb0b115 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -24,7 +24,7 @@ GEM faraday_middleware (0.12.2) faraday (>= 0.7.4, < 1.0) fastimage (2.1.0) - fastlane (2.56.0) + fastlane (2.66.2) CFPropertyList (>= 2.3, < 3.0.0) addressable (>= 2.3, < 3.0.0) babosa (>= 1.0.2, < 2.0.0) @@ -52,9 +52,9 @@ GEM slack-notifier (>= 1.3, < 2.0.0) terminal-notifier (>= 1.6.2, < 2.0.0) terminal-table (>= 1.4.5, < 2.0.0) - tty-screen (~> 0.5.0) + tty-screen (~> 0.6.2) word_wrap (~> 1.0.0) - xcodeproj (>= 1.5.0, < 2.0.0) + xcodeproj (>= 1.5.2, < 2.0.0) xcpretty (>= 0.2.4, < 1.0.0) xcpretty-travis-formatter (>= 0.0.3) gh_inspector (1.0.3) @@ -65,20 +65,20 @@ GEM mime-types (~> 3.0) representable (~> 3.0) retriable (>= 2.0, < 4.0) - googleauth (0.5.3) + googleauth (0.6.2) faraday (~> 0.12) - jwt (~> 1.4) + jwt (>= 1.4, < 3.0) logging (~> 2.0) memoist (~> 0.12) multi_json (~> 1.11) os (~> 0.9) signet (~> 0.7) - highline (1.7.8) + highline (1.7.10) http-cookie (1.0.3) domain_name (~> 0.5) httpclient (2.8.3) json (2.1.0) - jwt (1.5.6) + jwt (2.1.0) little-plugger (1.1.4) logging (2.2.2) little-plugger (~> 1.1) @@ -103,30 +103,30 @@ GEM rouge (2.0.7) rubyzip (1.2.1) security (0.1.3) - signet (0.7.3) + signet (0.8.1) addressable (~> 2.3) faraday (~> 0.9) - jwt (~> 1.5) + jwt (>= 1.5, < 3.0) multi_json (~> 1.10) slack-notifier (1.5.1) terminal-notifier (1.8.0) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) - tty-screen (0.5.0) + tty-screen (0.6.3) uber (0.1.0) unf (0.1.4) unf_ext unf_ext (0.0.7.4) unicode-display_width (1.3.0) word_wrap (1.0.0) - xcodeproj (1.5.1) + xcodeproj (1.5.3) CFPropertyList (~> 2.3.3) claide (>= 1.0.2, < 2.0) colored2 (~> 3.1) nanaimo (~> 0.2.3) xcpretty (0.2.8) rouge (~> 2.0.7) - xcpretty-travis-formatter (0.0.4) + xcpretty-travis-formatter (1.0.0) xcpretty (~> 0.2, >= 0.0.7) PLATFORMS @@ -136,4 +136,4 @@ DEPENDENCIES fastlane BUNDLED WITH - 1.15.2 + 1.16.0 diff --git a/__mocks__/react-native-code-push.js b/__mocks__/react-native-code-push.js new file mode 100644 index 0000000..75432c7 --- /dev/null +++ b/__mocks__/react-native-code-push.js @@ -0,0 +1,5 @@ +jest.mock('react-native-code-push', () => { + const CodePush = () => RootComponent => RootComponent; + CodePush.getUpdateMetadata = () => Promise.resolve(); + return CodePush; +}); diff --git a/__mocks__/react-native-firebase.js b/__mocks__/react-native-firebase.js new file mode 100644 index 0000000..519640c --- /dev/null +++ b/__mocks__/react-native-firebase.js @@ -0,0 +1,3 @@ +jest.mock('react-native-firebase', () => ({ + initializeApp: () => null, +})); diff --git a/__mocks__/react-native-safari-view.js b/__mocks__/react-native-safari-view.js new file mode 100644 index 0000000..e693282 --- /dev/null +++ b/__mocks__/react-native-safari-view.js @@ -0,0 +1,5 @@ +jest.mock('react-native-safari-view', () => ({ + dismiss: () => null, + show: () => null, + isAvailable: Promise.resolve, +})); diff --git a/android/app/build.gradle b/android/app/build.gradle index 210f994..5632f79 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -16,7 +16,7 @@ import com.android.build.OutputFile * bundleAssetName: "index.android.bundle", * * // the entry file for bundle generation - * entryFile: "index.android.js", + * entryFile: "index.js", * * // whether to bundle JS and assets in debug mode * bundleInDebug: false, @@ -72,6 +72,10 @@ import com.android.build.OutputFile * ] */ +project.ext.react = [ + entryFile: "index.js" +] + apply from: "../../node_modules/react-native/react.gradle" apply from: "../../node_modules/react-native-code-push/android/codepush.gradle" diff --git a/android/app/src/main/assets/fonts/Feather.ttf b/android/app/src/main/assets/fonts/Feather.ttf new file mode 100755 index 0000000..244854c Binary files /dev/null and b/android/app/src/main/assets/fonts/Feather.ttf differ diff --git a/android/app/src/main/assets/fonts/Octicons.ttf b/android/app/src/main/assets/fonts/Octicons.ttf index 5b1f7d6..09e2b2d 100644 Binary files a/android/app/src/main/assets/fonts/Octicons.ttf and b/android/app/src/main/assets/fonts/Octicons.ttf differ diff --git a/android/app/src/main/java/com/dailyscrum/MainActivity.java b/android/app/src/main/java/com/dailyscrum/MainActivity.java index 8de5c69..2d52ab0 100644 --- a/android/app/src/main/java/com/dailyscrum/MainActivity.java +++ b/android/app/src/main/java/com/dailyscrum/MainActivity.java @@ -2,7 +2,7 @@ import android.os.Bundle; import com.facebook.react.ReactActivity; -import com.cboy.rn.splashscreen.SplashScreen; +import org.devio.rn.splashscreen.SplashScreen; public class MainActivity extends ReactActivity { diff --git a/android/app/src/main/java/com/dailyscrum/MainApplication.java b/android/app/src/main/java/com/dailyscrum/MainApplication.java index 9d4ec3b..211e2ef 100644 --- a/android/app/src/main/java/com/dailyscrum/MainApplication.java +++ b/android/app/src/main/java/com/dailyscrum/MainApplication.java @@ -9,7 +9,7 @@ import com.oblador.vectoricons.VectorIconsPackage; import com.facebook.react.ReactApplication; import com.BV.LinearGradient.LinearGradientPackage; -import com.cboy.rn.splashscreen.SplashScreenReactPackage; +import org.devio.rn.splashscreen.SplashScreenReactPackage; import com.microsoft.codepush.react.CodePush; import com.airbnb.android.react.lottie.LottiePackage; import com.horcrux.svg.SvgPackage; @@ -52,6 +52,11 @@ protected List getPackages() { new VectorIconsPackage() ); } + + @Override + protected String getJSMainModuleName() { + return "index"; + } }; @Override diff --git a/android/build.gradle b/android/build.gradle index 6ccf214..c687720 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -27,8 +27,8 @@ allprojects { } ext { - compileSdkVersion = 25 - buildToolsVersion = '25.0.2' + compileSdkVersion = 26 + buildToolsVersion = '26.0.2' } subprojects { subproject -> diff --git a/android/settings.gradle b/android/settings.gradle index a6e0f12..27c7d4b 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -8,7 +8,7 @@ project(':react-native-splash-screen').projectDir = new File(rootProject.project include ':react-native-code-push' project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-code-push/android/app') include ':lottie-react-native' -project(':lottie-react-native').projectDir = new File(rootProject.projectDir, '../node_modules/lottie-react-native/lib/android') +project(':lottie-react-native').projectDir = new File(rootProject.projectDir, '../node_modules/lottie-react-native/src/android') include ':react-native-svg' project(':react-native-svg').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-svg/android') include ':@yfuks/react-native-action-sheet' diff --git a/circle.yml b/circle.yml index 55801f9..6f67373 100644 --- a/circle.yml +++ b/circle.yml @@ -4,6 +4,8 @@ jobs: docker: - image: reactcommunity/node-ci:8.4.0-0 working_directory: ~/DailyScrum + environment: + TZ: "/usr/share/zoneinfo/Europe/Paris" steps: - checkout - restore_cache: diff --git a/environment/index.dist.js b/environment/index.dist.js index 26289b8..100042e 100644 --- a/environment/index.dist.js +++ b/environment/index.dist.js @@ -3,5 +3,6 @@ module.exports = { SCRUMBLE_API_URL: 'https://api.scrumble.io/v1', TRELLO_API_URL: 'https://trello.com/1', TRELLO_APP_KEY: '', + GA_ID: '', isManualCodePushEnabled: false, }; diff --git a/fastlane/.env b/fastlane/.env index f8c21a8..5a8f1cf 100644 --- a/fastlane/.env +++ b/fastlane/.env @@ -1,2 +1,2 @@ -APP_VERSION_CODE='11' -APP_VERSION_NAME='1.0.11' +APP_VERSION_CODE='14' +APP_VERSION_NAME='1.0.14' diff --git a/fastlane/.env.prod b/fastlane/.env.prod index 0dc0dad..4b9603c 100644 --- a/fastlane/.env.prod +++ b/fastlane/.env.prod @@ -17,7 +17,7 @@ MATCH_TYPE='appstore' ### IOS GYM ### GYM_SCHEME='DailyScrum' GYM_OUTPUT_DIRECTORY='dist' -GYM_OUTPUT_NAME='app.ipa' +GYM_OUTPUT_NAME='app' ### ANDROID PROJECT ### ANDROID_PROJECT_DIR='android' diff --git a/fastlane/.env.staging b/fastlane/.env.staging index d0965f9..2aa88b4 100644 --- a/fastlane/.env.staging +++ b/fastlane/.env.staging @@ -18,7 +18,7 @@ MATCH_FORCE_ENTERPRISE='1' ### IOS GYM ### GYM_SCHEME='DailyScrum' GYM_OUTPUT_DIRECTORY='dist' -GYM_OUTPUT_NAME='app.ipa' +GYM_OUTPUT_NAME='app' ### IOS HOCKEY APP ### IOS_IPA_PATH='./dist/app.ipa' diff --git a/fastlane/Fastfile b/fastlane/Fastfile index c7adb16..dcbdcea 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -63,9 +63,10 @@ platform :ios do plist_full_path = "#{ENV['IOS_PROJECT_PATH']}/#{ENV['IOS_PLIST_PATH']}" set_js_env xcodeproj = "#{ENV['IOS_PROJECT_PATH']}/#{ENV['IOS_PROJECT_NAME']}.xcodeproj" + pbxproj_full_path = "#{xcodeproj}/project.pbxproj" xcworkspace = "#{ENV['IOS_PROJECT_PATH']}/#{ENV['IOS_PROJECT_NAME']}.xcworkspace" backup_file(path: plist_full_path) - backup_file(path: xcodeproj) + backup_file(path: pbxproj_full_path) update_info_plist( xcodeproj: xcodeproj, plist_path: ENV['IOS_PLIST_PATH'], @@ -93,7 +94,7 @@ platform :ios do ) gym(gymOptions) restore_file(path: plist_full_path) - restore_file(path: xcodeproj) + restore_file(path: pbxproj_full_path) end lane :deploy_hockey do |options| @@ -142,3 +143,19 @@ platform :android do end end end + +# WEB + +platform :web do + lane :build do |options| + set_js_env + sh "yarn init:web" + sh "yarn build:web" + sh "yarn stop:web" + end + + lane :deploy do |options| + build + sh "yarn gh-pages -d dist/web" + end +end diff --git a/fastlane/README.md b/fastlane/README.md index 0728cfe..7826d78 100644 --- a/fastlane/README.md +++ b/fastlane/README.md @@ -12,9 +12,9 @@ xcode-select --install - + + @@ -88,6 +88,20 @@ fastlane android deploy ``` +---- + +## web +### web build +``` +fastlane web build +``` + +### web deploy +``` +fastlane web deploy +``` + + ---- This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run. diff --git a/flow/react-native-action-sheet.js b/flow/react-native-action-sheet.js new file mode 100644 index 0000000..486b629 --- /dev/null +++ b/flow/react-native-action-sheet.js @@ -0,0 +1,3 @@ +declare module '@yfuks/react-native-action-sheet' { + declare module.exports: *; +} diff --git a/flow/react-native-tab-view.js b/flow/react-native-tab-view.js new file mode 100644 index 0000000..74b6db7 --- /dev/null +++ b/flow/react-native-tab-view.js @@ -0,0 +1,3 @@ +declare module 'react-native-tab-view' { + declare module.exports: *; +} diff --git a/flow/redux-persist.js b/flow/redux-persist.js new file mode 100644 index 0000000..0724a10 --- /dev/null +++ b/flow/redux-persist.js @@ -0,0 +1,3 @@ +declare module 'redux-persist' { + declare module.exports: *; +} diff --git a/index.ios.js b/index.ios.js deleted file mode 100644 index 086fb5f..0000000 --- a/index.ios.js +++ /dev/null @@ -1,4 +0,0 @@ -import { AppRegistry } from 'react-native'; -import App from 'DailyScrum/src/App'; - -AppRegistry.registerComponent('DailyScrum', () => App); diff --git a/index.android.js b/index.js similarity index 100% rename from index.android.js rename to index.js diff --git a/index.web.js b/index.web.js new file mode 100644 index 0000000..1f29b09 --- /dev/null +++ b/index.web.js @@ -0,0 +1,46 @@ +import { AppRegistry } from 'react-native'; +import App from './src/App'; + +AppRegistry.registerComponent('App', () => App); +AppRegistry.runApplication('App', { + rootTag: document.getElementById('react-root'), +}); + +// import fonts +const fonts = [ + { + icon: require('react-native-vector-icons/Fonts/FontAwesome.ttf'), + family: 'FontAwesome', + }, + { + icon: require('react-native-vector-icons/Fonts/MaterialIcons.ttf'), + family: 'Material Icons', + }, + { + icon: require('react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf'), + family: 'Material Design Icons', + }, + { + icon: require('react-native-vector-icons/Fonts/Entypo.ttf'), + family: 'Entypo', + }, +]; + +const iconFontStyles = fonts + .map( + font => `@font-face { + src: url(${font.icon}); + font-family: ${font.family}; +}` + ) + .join('\n'); + +const style = document.createElement('style'); +style.type = 'text/css'; +if (style.styleSheet) { + style.styleSheet.cssText = iconFontStyles; +} else { + style.appendChild(document.createTextNode(iconFontStyles)); +} + +document.head.appendChild(style); diff --git a/ios/DailyScrum.xcodeproj/project.pbxproj b/ios/DailyScrum.xcodeproj/project.pbxproj index 519fb4d..a22c812 100644 --- a/ios/DailyScrum.xcodeproj/project.pbxproj +++ b/ios/DailyScrum.xcodeproj/project.pbxproj @@ -35,7 +35,7 @@ 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 */; }; + 2D02E4C91E0B4AEC006451C7 /* libReact-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact-tvOS.a */; }; 2DCD954D1E0B4F2C00145EB5 /* DailyScrumTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* DailyScrumTests.m */; }; 2DDEE2CF7EB54B95BBC6D2DE /* Open Sans-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CA848B1787854B7F86AD800B /* Open Sans-Regular.ttf */; }; 34337B0A258F4BEFBC9F8297 /* libSafariViewManager.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CFA5680DF4A4ADC8A7C0EAF /* libSafariViewManager.a */; }; @@ -50,7 +50,9 @@ 83CB48E123774A3887C7376E /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FDD46036EF8B473299D14694 /* Octicons.ttf */; }; 8579E4A0B98D4924A1CE394A /* Open Sans-ExtraBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 47D85E32816A403CB5AD161E /* Open Sans-ExtraBold.ttf */; }; 9925AFAA9B944601992F6AB4 /* Open Sans-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FFAD041FA3B64983B33A1C8C /* Open Sans-BoldItalic.ttf */; }; + 9BDF5B1C239E484EB1904E85 /* libRNFirebase.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B398B8E406D44E188859058 /* libRNFirebase.a */; }; A05A470348874AF29182E688 /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0710955B6C044847BADD9A18 /* EvilIcons.ttf */; }; + ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; }; B148B74E9DC144D6A962215F /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F4BE5AE48CA74A4ABBE0806A /* FontAwesome.ttf */; }; B92FD61BD51A4B86A6DD5A87 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A4DB1A25471458496C7489A /* libz.tbd */; }; C24EAD5023F24B66B2224D98 /* MaterialCommunityIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B64F8D21AE6A4CC3BE2B2950 /* MaterialCommunityIcons.ttf */; }; @@ -62,8 +64,10 @@ E51FE9BEA30142F2AD1FE9DB /* libSplashScreen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BE053D924F6444B9B939E549 /* libSplashScreen.a */; }; E877395F3281439188789913 /* libRNSVG.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F38D56A695B44FA5B2B52374 /* libRNSVG.a */; }; EBE40CDD9C664CA1B1A4D322 /* libLottieReactNative.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F264BF53C7A14597AFF198D9 /* libLottieReactNative.a */; }; + EC5BCA9FF09D43BB96BD3F6D /* Feather.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6378A110379F4E34BB06B0B5 /* Feather.ttf */; }; F4BBA80CF71B4C1DA0F67C45 /* Open Sans-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7FBA04EC16FC4AB5AD9BB11D /* Open Sans-SemiBold.ttf */; }; FD011C3EFEB9435DBA92D4CD /* SimpleLineIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0F65B39E7DDC45CFA99E63FF /* SimpleLineIcons.ttf */; }; + FF2EAA9D1FCAE35C00CB60FC /* Lottie.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FF9179CF1F520D3C004E8DB2 /* Lottie.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; FF36EA651F6DCC7C00F5E189 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = FF36EA631F6DCC7C00F5E189 /* GoogleService-Info.plist */; }; FFE70B161E870A3100090A28 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; /* End PBXBuildFile section */ @@ -258,6 +262,13 @@ remoteGlobalIDString = 58B5119B1A9E6C1200147676; remoteInfo = RCTText; }; + ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 358F4ED71D1E81A9004DF814; + remoteInfo = RCTBlob; + }; FF1A19CA1F520CD000567905 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = AC8DA3C9EBAF433ABA52EB3F /* RNSVG.xcodeproj */; @@ -265,6 +276,41 @@ remoteGlobalIDString = FF1A19A81F520CC800567905; remoteInfo = "RNSVG-tvOS"; }; + FF5B53A31FC98E9000534EDF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = ADD01A681E09402E00F6D226; + remoteInfo = "RCTBlob-tvOS"; + }; + FF5B53B51FC98E9000534EDF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3DBE0D001F3B181A0099AA32; + remoteInfo = fishhook; + }; + FF5B53B71FC98E9000534EDF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3DBE0D0D1F3B181C0099AA32; + remoteInfo = "fishhook-tvOS"; + }; + FF5B53C71FC98E9000534EDF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 9936F3131F5F2E4B0010BF04; + remoteInfo = privatedata; + }; + FF5B53C91FC98E9000534EDF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 9936F32F1F5F2E5B0010BF04; + remoteInfo = "privatedata-tvOS"; + }; FF610D781F212D86006D76FD /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; @@ -342,6 +388,13 @@ remoteGlobalIDString = 84FE12EF1E4C1485009B157C; remoteInfo = LottieLibraryIOS; }; + FF9D16C91F954A8D0080B7DF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = E5F2C17292C4435CB8E45178 /* RNFirebase.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RNFirebase; + }; FFA3BE3A1F08234200A8FF1D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; @@ -386,6 +439,7 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( + FF2EAA9D1FCAE35C00CB60FC /* Lottie.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -402,7 +456,7 @@ 00E356EE1AD99517003FC87E /* DailyScrumTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DailyScrumTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 00E356F21AD99517003FC87E /* DailyScrumTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DailyScrumTests.m; sourceTree = ""; }; - 04E66571EB76434CB1FD6445 /* Open Sans-SemiBoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-SemiBoldItalic.ttf"; path = "../assets/native/fonts/Open Sans-SemiBoldItalic.ttf"; sourceTree = ""; }; + 04E66571EB76434CB1FD6445 /* Open Sans-SemiBoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-SemiBoldItalic.ttf"; path = "../assets/native/fonts/Open Sans-SemiBoldItalic.ttf"; sourceTree = ""; }; 0710955B6C044847BADD9A18 /* EvilIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = EvilIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf"; sourceTree = ""; }; 0F65B39E7DDC45CFA99E63FF /* SimpleLineIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = SimpleLineIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf"; sourceTree = ""; }; 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; @@ -415,7 +469,7 @@ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = DailyScrum/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = DailyScrum/main.m; sourceTree = ""; }; 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; - 29074FC15BEF4D2C8ABFFAF7 /* Open Sans-Italic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-Italic.ttf"; path = "../assets/native/fonts/Open Sans-Italic.ttf"; sourceTree = ""; }; + 29074FC15BEF4D2C8ABFFAF7 /* Open Sans-Italic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-Italic.ttf"; path = "../assets/native/fonts/Open Sans-Italic.ttf"; sourceTree = ""; }; 29616C0E94A666C43ADA42B4 /* libPods-DailyScrum.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-DailyScrum.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 2D02E47B1E0B4A5D006451C7 /* DailyScrum-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DailyScrum-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 2D02E4901E0B4A5D006451C7 /* DailyScrum-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "DailyScrum-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -423,41 +477,45 @@ 302227C2A4824E038D6E7E7E /* Entypo.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Entypo.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = ""; }; 363C02BBBDFE4C9999E3B587 /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = ""; }; 3B095EB613A841DEB9E82819 /* libLottie.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libLottie.a; sourceTree = ""; }; - 464BD638C1F24A839ACB7EAC /* Open Sans-ExtraBoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-ExtraBoldItalic.ttf"; path = "../assets/native/fonts/Open Sans-ExtraBoldItalic.ttf"; sourceTree = ""; }; + 464BD638C1F24A839ACB7EAC /* Open Sans-ExtraBoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-ExtraBoldItalic.ttf"; path = "../assets/native/fonts/Open Sans-ExtraBoldItalic.ttf"; sourceTree = ""; }; 46AAD3ABC512469784C5E009 /* CodePush.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = CodePush.xcodeproj; path = "../node_modules/react-native-code-push/ios/CodePush.xcodeproj"; sourceTree = ""; }; - 47D85E32816A403CB5AD161E /* Open Sans-ExtraBold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-ExtraBold.ttf"; path = "../assets/native/fonts/Open Sans-ExtraBold.ttf"; sourceTree = ""; }; + 47D85E32816A403CB5AD161E /* Open Sans-ExtraBold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-ExtraBold.ttf"; path = "../assets/native/fonts/Open Sans-ExtraBold.ttf"; sourceTree = ""; }; 4B9A226359564995AC62D0C0 /* BVLinearGradient.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = BVLinearGradient.xcodeproj; path = "../node_modules/react-native-linear-gradient/BVLinearGradient.xcodeproj"; sourceTree = ""; }; - 4DB4985763F24173A42DEEBC /* Open Sans-Light.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-Light.ttf"; path = "../assets/native/fonts/Open Sans-Light.ttf"; sourceTree = ""; }; - 582E8C7B25EC4AF7B4F2B7CD /* LottieReactNative.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = LottieReactNative.xcodeproj; path = "../node_modules/lottie-react-native/lib/ios/LottieReactNative.xcodeproj"; sourceTree = ""; }; + 4DB4985763F24173A42DEEBC /* Open Sans-Light.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-Light.ttf"; path = "../assets/native/fonts/Open Sans-Light.ttf"; sourceTree = ""; }; + 582E8C7B25EC4AF7B4F2B7CD /* LottieReactNative.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = LottieReactNative.xcodeproj; path = "../node_modules/lottie-react-native/src/ios/LottieReactNative.xcodeproj"; sourceTree = ""; }; 5CFA5680DF4A4ADC8A7C0EAF /* libSafariViewManager.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libSafariViewManager.a; sourceTree = ""; }; 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; + 6378A110379F4E34BB06B0B5 /* Feather.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Feather.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Feather.ttf"; sourceTree = ""; }; 66FEF2F5F59E4CEBBDB859DC /* SafariViewManager.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = SafariViewManager.xcodeproj; path = "../node_modules/react-native-safari-view/SafariViewManager.xcodeproj"; sourceTree = ""; }; 682131F67D28484FAA086051 /* Foundation.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Foundation.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = ""; }; 6DCF781A62E0492C99E31012 /* MaterialIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf"; sourceTree = ""; }; 6E73A43EFE7138F6EFF064FF /* Pods-DailyScrum.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DailyScrum.release.xcconfig"; path = "Pods/Target Support Files/Pods-DailyScrum/Pods-DailyScrum.release.xcconfig"; sourceTree = ""; }; 763CEFA4BE8344819D1B405F /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = ""; }; 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; - 7FBA04EC16FC4AB5AD9BB11D /* Open Sans-SemiBold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-SemiBold.ttf"; path = "../assets/native/fonts/Open Sans-SemiBold.ttf"; sourceTree = ""; }; + 7B398B8E406D44E188859058 /* libRNFirebase.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFirebase.a; sourceTree = ""; }; + 7FBA04EC16FC4AB5AD9BB11D /* Open Sans-SemiBold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-SemiBold.ttf"; path = "../assets/native/fonts/Open Sans-SemiBold.ttf"; sourceTree = ""; }; 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; 9A4DB1A25471458496C7489A /* libz.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; - 9C10CDAC69E84FAE99511CF0 /* Open Sans-LightItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-LightItalic.ttf"; path = "../assets/native/fonts/Open Sans-LightItalic.ttf"; sourceTree = ""; }; + 9C10CDAC69E84FAE99511CF0 /* Open Sans-LightItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-LightItalic.ttf"; path = "../assets/native/fonts/Open Sans-LightItalic.ttf"; sourceTree = ""; }; A5A0756709834AEDB951622A /* Lottie.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = Lottie.xcodeproj; path = "../node_modules/lottie-ios/Lottie.xcodeproj"; sourceTree = ""; }; AC8DA3C9EBAF433ABA52EB3F /* RNSVG.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNSVG.xcodeproj; path = "../node_modules/react-native-svg/ios/RNSVG.xcodeproj"; sourceTree = ""; }; + ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTBlob.xcodeproj; path = "../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj"; sourceTree = ""; }; B64F8D21AE6A4CC3BE2B2950 /* MaterialCommunityIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialCommunityIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf"; sourceTree = ""; }; B988E85D3FE94885B5E94A97 /* Zocial.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Zocial.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Zocial.ttf"; sourceTree = ""; }; BE053D924F6444B9B939E549 /* libSplashScreen.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libSplashScreen.a; sourceTree = ""; }; - CA848B1787854B7F86AD800B /* Open Sans-Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-Regular.ttf"; path = "../assets/native/fonts/Open Sans-Regular.ttf"; sourceTree = ""; }; + CA848B1787854B7F86AD800B /* Open Sans-Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-Regular.ttf"; path = "../assets/native/fonts/Open Sans-Regular.ttf"; sourceTree = ""; }; CFD88031A2BC49799F683A67 /* libCodePush.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libCodePush.a; sourceTree = ""; }; - D2E45C37EE604D6DA30096D8 /* Open Sans-Bold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-Bold.ttf"; path = "../assets/native/fonts/Open Sans-Bold.ttf"; sourceTree = ""; }; + D2E45C37EE604D6DA30096D8 /* Open Sans-Bold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-Bold.ttf"; path = "../assets/native/fonts/Open Sans-Bold.ttf"; sourceTree = ""; }; D3BB29DF910F495D96F1AD71 /* Ionicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Ionicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf"; sourceTree = ""; }; E3AFF6074AE14D6687B1BC6E /* libBVLinearGradient.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libBVLinearGradient.a; sourceTree = ""; }; + E5F2C17292C4435CB8E45178 /* RNFirebase.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNFirebase.xcodeproj; path = "../node_modules/react-native-firebase/ios/RNFirebase.xcodeproj"; sourceTree = ""; }; E9AABC739DD942A286B565DF /* SplashScreen.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = SplashScreen.xcodeproj; path = "../node_modules/react-native-splash-screen/ios/SplashScreen.xcodeproj"; sourceTree = ""; }; F264BF53C7A14597AFF198D9 /* libLottieReactNative.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libLottieReactNative.a; sourceTree = ""; }; F38D56A695B44FA5B2B52374 /* libRNSVG.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNSVG.a; sourceTree = ""; }; F4BE5AE48CA74A4ABBE0806A /* FontAwesome.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = ""; }; FDD46036EF8B473299D14694 /* Octicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Octicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Octicons.ttf"; sourceTree = ""; }; FF36EA631F6DCC7C00F5E189 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - FFAD041FA3B64983B33A1C8C /* Open Sans-BoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-BoldItalic.ttf"; path = "../assets/native/fonts/Open Sans-BoldItalic.ttf"; sourceTree = ""; }; + FFAD041FA3B64983B33A1C8C /* Open Sans-BoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Open Sans-BoldItalic.ttf"; path = "../assets/native/fonts/Open Sans-BoldItalic.ttf"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -474,6 +532,7 @@ buildActionMask = 2147483647; files = ( FFE70B161E870A3100090A28 /* libRCTAnimation.a in Frameworks */, + ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */, 146834051AC3E58100842450 /* libReact.a in Frameworks */, 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, @@ -494,6 +553,7 @@ DB8ED6C47794A5A7492C8CF1 /* libPods-DailyScrum.a in Frameworks */, 34337B0A258F4BEFBC9F8297 /* libSafariViewManager.a in Frameworks */, 6E3ACC6B36D64477A696E10A /* libBVLinearGradient.a in Frameworks */, + 9BDF5B1C239E484EB1904E85 /* libRNFirebase.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -501,7 +561,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2D02E4C91E0B4AEC006451C7 /* libReact.a in Frameworks */, + 2D02E4C91E0B4AEC006451C7 /* libReact-tvOS.a in Frameworks */, 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */, 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */, 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */, @@ -595,6 +655,8 @@ children = ( 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */, + FF5B53B61FC98E9000534EDF /* libfishhook.a */, + FF5B53B81FC98E9000534EDF /* libfishhook-tvOS.a */, ); name = Products; sourceTree = ""; @@ -618,7 +680,7 @@ isa = PBXGroup; children = ( 146834041AC3E56700842450 /* libReact.a */, - 3DAD3EA31DF850E9000B6D8A /* libReact.a */, + 3DAD3EA31DF850E9000B6D8A /* libReact-tvOS.a */, 3DAD3EA51DF850E9000B6D8A /* libyoga.a */, 3DAD3EA71DF850E9000B6D8A /* libyoga.a */, 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */, @@ -629,6 +691,8 @@ FF610D791F212D86006D76FD /* libthird-party.a */, FFA3BE3D1F08234200A8FF1D /* libdouble-conversion.a */, FF610D7B1F212D86006D76FD /* libdouble-conversion.a */, + FF5B53C81FC98E9000534EDF /* libprivatedata.a */, + FF5B53CA1FC98E9000534EDF /* libprivatedata-tvOS.a */, ); name = Products; sourceTree = ""; @@ -675,6 +739,7 @@ 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */, 146833FF1AC3E56700842450 /* React.xcodeproj */, 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, + ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */, 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, @@ -691,6 +756,7 @@ 582E8C7B25EC4AF7B4F2B7CD /* LottieReactNative.xcodeproj */, 66FEF2F5F59E4CEBBDB859DC /* SafariViewManager.xcodeproj */, 4B9A226359564995AC62D0C0 /* BVLinearGradient.xcodeproj */, + E5F2C17292C4435CB8E45178 /* RNFirebase.xcodeproj */, ); name = Libraries; sourceTree = ""; @@ -719,6 +785,7 @@ indentWidth = 2; sourceTree = ""; tabWidth = 2; + usesTabs = 0; }; 83CBBA001A601CBA00E9B192 /* Products */ = { isa = PBXGroup; @@ -754,10 +821,20 @@ CA848B1787854B7F86AD800B /* Open Sans-Regular.ttf */, 7FBA04EC16FC4AB5AD9BB11D /* Open Sans-SemiBold.ttf */, 04E66571EB76434CB1FD6445 /* Open Sans-SemiBoldItalic.ttf */, + 6378A110379F4E34BB06B0B5 /* Feather.ttf */, ); name = Resources; sourceTree = ""; }; + ADBDB9201DFEBF0600ED6528 /* Products */ = { + isa = PBXGroup; + children = ( + ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */, + FF5B53A41FC98E9000534EDF /* libRCTBlob-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; FF610D551F212D85006D76FD /* Products */ = { isa = PBXGroup; children = ( @@ -786,6 +863,7 @@ F264BF53C7A14597AFF198D9 /* libLottieReactNative.a */, 5CFA5680DF4A4ADC8A7C0EAF /* libSafariViewManager.a */, E3AFF6074AE14D6687B1BC6E /* libBVLinearGradient.a */, + 7B398B8E406D44E188859058 /* libRNFirebase.a */, ); name = "Recovered References"; sourceTree = ""; @@ -825,6 +903,14 @@ name = Products; sourceTree = ""; }; + FF9D16C61F954A8D0080B7DF /* Products */ = { + isa = PBXGroup; + children = ( + FF9D16CA1F954A8D0080B7DF /* libRNFirebase.a */, + ); + name = Products; + sourceTree = ""; + }; FFA3BE441F08234300A8FF1D /* Products */ = { isa = PBXGroup; children = ( @@ -975,6 +1061,10 @@ ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */; ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; }, + { + ProductGroup = ADBDB9201DFEBF0600ED6528 /* Products */; + ProjectRef = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; + }, { ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; @@ -1011,6 +1101,10 @@ ProductGroup = 146834001AC3E56700842450 /* Products */; ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; }, + { + ProductGroup = FF9D16C61F954A8D0080B7DF /* Products */; + ProjectRef = E5F2C17292C4435CB8E45178 /* RNFirebase.xcodeproj */; + }, { ProductGroup = FFA3BE441F08234300A8FF1D /* Products */; ProjectRef = AC8DA3C9EBAF433ABA52EB3F /* RNSVG.xcodeproj */; @@ -1137,10 +1231,10 @@ remoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - 3DAD3EA31DF850E9000B6D8A /* libReact.a */ = { + 3DAD3EA31DF850E9000B6D8A /* libReact-tvOS.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; - path = libReact.a; + path = "libReact-tvOS.a"; remoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1214,6 +1308,13 @@ remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTBlob.a; + remoteRef = ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; FF1A19CB1F520CD000567905 /* libRNSVG-tvOS.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -1221,6 +1322,41 @@ remoteRef = FF1A19CA1F520CD000567905 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + FF5B53A41FC98E9000534EDF /* libRCTBlob-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTBlob-tvOS.a"; + remoteRef = FF5B53A31FC98E9000534EDF /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + FF5B53B61FC98E9000534EDF /* libfishhook.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libfishhook.a; + remoteRef = FF5B53B51FC98E9000534EDF /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + FF5B53B81FC98E9000534EDF /* libfishhook-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libfishhook-tvOS.a"; + remoteRef = FF5B53B71FC98E9000534EDF /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + FF5B53C81FC98E9000534EDF /* libprivatedata.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libprivatedata.a; + remoteRef = FF5B53C71FC98E9000534EDF /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + FF5B53CA1FC98E9000534EDF /* libprivatedata-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libprivatedata-tvOS.a"; + remoteRef = FF5B53C91FC98E9000534EDF /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; FF610D791F212D86006D76FD /* libthird-party.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -1298,6 +1434,13 @@ remoteRef = FF9179D21F520D3C004E8DB2 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + FF9D16CA1F954A8D0080B7DF /* libRNFirebase.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNFirebase.a; + remoteRef = FF9D16C91F954A8D0080B7DF /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; FFA3BE3B1F08234200A8FF1D /* libthird-party.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -1370,6 +1513,7 @@ 2DDEE2CF7EB54B95BBC6D2DE /* Open Sans-Regular.ttf in Resources */, F4BBA80CF71B4C1DA0F67C45 /* Open Sans-SemiBold.ttf in Resources */, 39F8B694C73742E6BE3722DD /* Open Sans-SemiBoldItalic.ttf in Resources */, + EC5BCA9FF09D43BB96BD3F6D /* Feather.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1560,9 +1704,10 @@ "$(SRCROOT)/../node_modules/react-native-code-push/ios/CodePush/**", "$(SRCROOT)/../node_modules/react-native-splash-screen/ios", "$(SRCROOT)/../node_modules/lottie-ios/lottie-ios/Classes/**", - "$(SRCROOT)/../node_modules/lottie-react-native/lib/ios/LottieReactNative", + "$(SRCROOT)/../node_modules/lottie-react-native/src/ios/LottieReactNative", "$(SRCROOT)/../node_modules/react-native-safari-view", "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", + "$(SRCROOT)/../node_modules/react-native-firebase/ios/RNFirebase/**", ); INFOPLIST_FILE = DailyScrumTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -1570,9 +1715,6 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", @@ -1595,9 +1737,10 @@ "$(SRCROOT)/../node_modules/react-native-code-push/ios/CodePush/**", "$(SRCROOT)/../node_modules/react-native-splash-screen/ios", "$(SRCROOT)/../node_modules/lottie-ios/lottie-ios/Classes/**", - "$(SRCROOT)/../node_modules/lottie-react-native/lib/ios/LottieReactNative", + "$(SRCROOT)/../node_modules/lottie-react-native/src/ios/LottieReactNative", "$(SRCROOT)/../node_modules/react-native-safari-view", "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", + "$(SRCROOT)/../node_modules/react-native-firebase/ios/RNFirebase/**", ); INFOPLIST_FILE = DailyScrumTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -1605,9 +1748,6 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", @@ -1636,9 +1776,10 @@ "$(SRCROOT)/../node_modules/react-native-code-push/ios/CodePush/**", "$(SRCROOT)/../node_modules/react-native-splash-screen/ios", "$(SRCROOT)/../node_modules/lottie-ios/lottie-ios/Classes/**", - "$(SRCROOT)/../node_modules/lottie-react-native/lib/ios/LottieReactNative", + "$(SRCROOT)/../node_modules/lottie-react-native/src/ios/LottieReactNative", "$(SRCROOT)/../node_modules/react-native-safari-view", "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", + "$(SRCROOT)/../node_modules/react-native-firebase/ios/RNFirebase/**", ); INFOPLIST_FILE = DailyScrum/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -1670,9 +1811,10 @@ "$(SRCROOT)/../node_modules/react-native-code-push/ios/CodePush/**", "$(SRCROOT)/../node_modules/react-native-splash-screen/ios", "$(SRCROOT)/../node_modules/lottie-ios/lottie-ios/Classes/**", - "$(SRCROOT)/../node_modules/lottie-react-native/lib/ios/LottieReactNative", + "$(SRCROOT)/../node_modules/lottie-react-native/src/ios/LottieReactNative", "$(SRCROOT)/../node_modules/react-native-safari-view", "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", + "$(SRCROOT)/../node_modules/react-native-firebase/ios/RNFirebase/**", ); INFOPLIST_FILE = DailyScrum/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -1706,18 +1848,16 @@ "$(SRCROOT)/../node_modules/react-native-code-push/ios/CodePush/**", "$(SRCROOT)/../node_modules/react-native-splash-screen/ios", "$(SRCROOT)/../node_modules/lottie-ios/lottie-ios/Classes/**", - "$(SRCROOT)/../node_modules/lottie-react-native/lib/ios/LottieReactNative", + "$(SRCROOT)/../node_modules/lottie-react-native/src/ios/LottieReactNative", "$(SRCROOT)/../node_modules/react-native-safari-view", "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", + "$(SRCROOT)/../node_modules/react-native-firebase/ios/RNFirebase/**", ); INFOPLIST_FILE = "DailyScrum-tvOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", @@ -1749,18 +1889,16 @@ "$(SRCROOT)/../node_modules/react-native-code-push/ios/CodePush/**", "$(SRCROOT)/../node_modules/react-native-splash-screen/ios", "$(SRCROOT)/../node_modules/lottie-ios/lottie-ios/Classes/**", - "$(SRCROOT)/../node_modules/lottie-react-native/lib/ios/LottieReactNative", + "$(SRCROOT)/../node_modules/lottie-react-native/src/ios/LottieReactNative", "$(SRCROOT)/../node_modules/react-native-safari-view", "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", + "$(SRCROOT)/../node_modules/react-native-firebase/ios/RNFirebase/**", ); INFOPLIST_FILE = "DailyScrum-tvOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", @@ -1790,9 +1928,6 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", ); PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.DailyScrum-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1818,9 +1953,6 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", ); PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.DailyScrum-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/ios/DailyScrum/AppDelegate.m b/ios/DailyScrum/AppDelegate.m index 38f8cc7..cf380f8 100644 --- a/ios/DailyScrum/AppDelegate.m +++ b/ios/DailyScrum/AppDelegate.m @@ -21,9 +21,9 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( { NSURL *jsCodeLocation; - + #ifdef DEBUG - jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; + jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil]; #else jsCodeLocation = [CodePush bundleURL]; #endif diff --git a/ios/DailyScrum/Images.xcassets/Contents.json b/ios/DailyScrum/Images.xcassets/Contents.json index da4a164..2d92bd5 100644 --- a/ios/DailyScrum/Images.xcassets/Contents.json +++ b/ios/DailyScrum/Images.xcassets/Contents.json @@ -3,4 +3,4 @@ "version" : 1, "author" : "xcode" } -} \ No newline at end of file +} diff --git a/ios/DailyScrum/Info.plist b/ios/DailyScrum/Info.plist index 0d88bbe..970d9c2 100644 --- a/ios/DailyScrum/Info.plist +++ b/ios/DailyScrum/Info.plist @@ -74,6 +74,7 @@ Open Sans-Regular.ttf Open Sans-SemiBold.ttf Open Sans-SemiBoldItalic.ttf + Feather.ttf UILaunchStoryboardName LaunchScreen diff --git a/ios/Podfile b/ios/Podfile index c93e694..2a3aaf3 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -2,16 +2,8 @@ # platform :ios, '9.0' target 'DailyScrum' do - pod "Yoga", :path => "../node_modules/react-native/ReactCommon/yoga" - pod 'React', :path => '../node_modules/react-native', :subspecs => [ - 'BatchedBridge', # Required For React Native 0.45.0+ - 'Core', - # Add any other subspecs you want to use in your project - ] - # Required by RNFirebase pod 'Firebase/Core' - pod 'RNFirebase', :path => '../node_modules/react-native-firebase' pod 'Firebase/Analytics' pod 'Firebase/Crash' end diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 5d179ca..1f16f2b 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -34,36 +34,11 @@ PODS: - nanopb/decode (0.3.8) - nanopb/encode (0.3.8) - Protobuf (3.4.0) - - React (0.47.2): - - React/Core (= 0.47.2) - - React/BatchedBridge (0.47.2): - - React/Core - - React/cxxreact_legacy - - React/Core (0.47.2): - - Yoga (= 0.47.2.React) - - React/cxxreact_legacy (0.47.2): - - React/jschelpers_legacy - - React/jschelpers_legacy (0.47.2) - - RNFirebase (2.2.0): - - React - - Yoga (0.47.2.React) DEPENDENCIES: - Firebase/Analytics - Firebase/Core - Firebase/Crash - - React/BatchedBridge (from `../node_modules/react-native`) - - React/Core (from `../node_modules/react-native`) - - RNFirebase (from `../node_modules/react-native-firebase`) - - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) - -EXTERNAL SOURCES: - React: - :path: ../node_modules/react-native - RNFirebase: - :path: ../node_modules/react-native-firebase - Yoga: - :path: ../node_modules/react-native/ReactCommon/yoga SPEC CHECKSUMS: Firebase: 052c0de688fc87b414996eea13e223dd9fee3fa2 @@ -74,10 +49,7 @@ SPEC CHECKSUMS: GoogleToolboxForMac: 8e329f1b599f2512c6b10676d45736bcc2cbbeb0 nanopb: 5601e6bca2dbf1ed831b519092ec110f66982ca3 Protobuf: 03eef2ee0b674770735cf79d9c4d3659cf6908e8 - React: fbe1a006550fb55871cb377ba7741f5d1cfff733 - RNFirebase: 67cf507f625e4584b630804fe1254ca34e0e8958 - Yoga: ff8531e8cf9f7ec92a75dd44286a68c4a084c507 -PODFILE CHECKSUM: 0220099dbeae927f19c6898d00d7568971c42c74 +PODFILE CHECKSUM: 74acbd3fc1ad8975ae60ea77d56202c2d96fa0c6 COCOAPODS: 1.3.1 diff --git a/package.json b/package.json index 6581050..2c70713 100644 --- a/package.json +++ b/package.json @@ -8,62 +8,101 @@ "test:lint": "eslint . --quiet", "test:unit": "jest", "test:flow": "flow", - "format": "find ./src -name '*.js' | xargs ./node_modules/.bin/prettier --write --print-width 120 --single-quote --trailing-comma es5", + "format": "find ./src -name '*.js' | xargs ./node_modules/.bin/prettier --write", "deploy": "./bin/code-push.sh --android --ios", "deploy:android": "./bin/code-push.sh --android", "deploy:ios": "./bin/code-push.sh --ios", - "deploy:info": "code-push deployment history DailyScrum-Android Staging && code-push deployment history DailyScrum-iOS Staging", - "deploy:staging": "yarn deploy:staging:android && yarn deploy:staging:ios", + "deploy:info:staging": "code-push deployment history DailyScrum-Android Staging && code-push deployment history DailyScrum-iOS Staging", + "deploy:info:prod": "code-push deployment history DailyScrum-Android Production && code-push deployment history DailyScrum-iOS Production", + "deploy:staging": "yarn deploy:staging:android && yarn deploy:staging:ios && yarn deploy:staging:web", "deploy:staging:android": "bundle exec fastlane android deploy --env=staging", "deploy:staging:ios": "bundle exec fastlane ios deploy --env=staging", - "deploy:prod": "yarn deploy:prod:android && yarn deploy:prod:ios", + "deploy:staging:web": "bundle exec fastlane web deploy --env=staging", + "deploy:prod": "yarn deploy:prod:android && yarn deploy:prod:ios && yarn deploy:prod:web", "deploy:prod:android": "bundle exec fastlane android deploy --env=prod", - "deploy:prod:ios": "bundle exec fastlane ios deploy --env=prod" + "deploy:prod:ios": "bundle exec fastlane ios deploy --env=prod", + "deploy:prod:web": "bundle exec fastlane web deploy --env=prod", + "init:web": "yarn remove react && yarn add react react-dom react-native-web", + "stop:web": "git stash && yarn", + "start:web": "./node_modules/.bin/webpack-dev-server --port 3000 --config web/webpack.config.babel.js --inline --colors", + "build:web": "NODE_ENV=production ./node_modules/.bin/webpack -p --config web/webpack.config.babel.js" }, "dependencies": { "@yfuks/react-native-action-sheet": "^0.0.4", "chroma-js": "^1.3.4", "date-fns": "^1.28.4", - "easy-lottie-react-native": "^1.0.0", + "easy-lottie-react-native": "^2.0.2", "lodash": "^4.17.4", - "lottie-react-native": "^2.2.0", - "react": "16.0.0-alpha.12", - "react-native": "0.47.2", + "lottie-react-native": "^2.3.0", + "react": "16.0.0", + "react-native": "0.50.4", "react-native-animatable": "^1.2.3", - "react-native-code-push": "^5.0.0-beta", - "react-native-firebase": "^2.2.0", + "react-native-code-push": "^5.2.0-beta", + "react-native-firebase": "^3.1.0", "react-native-linear-gradient": "^2.3.0", - "react-native-pathjs-charts": "git+ssh://git@github.com/Minishlink/react-native-pathjs-charts.git#dailyscrum", + "react-native-pathjs-charts": "^0.0.32", "react-native-safari-view": "^2.0.0", "react-native-splash-screen": "^3.0.0", - "react-native-tab-view": "^0.0.69", + "react-native-tab-view": "^0.0.70", "react-native-vector-icons": "^4.3.0", - "react-navigation": "git+ssh://git@github.com/Minishlink/react-navigation.git#c326c9ba43e101d85b8e590ba9fba9ee0652d5c9", + "react-native-web-linear-gradient": "^1.0.2", + "react-native-web-lists": "^0.1.0", + "react-native-web-lottie": "^0.1.0", + "react-navigation": "^1.0.0-beta.21", "react-redux": "^5.0.6", "redux": "^3.7.2", "redux-persist": "^4.9.1", - "redux-saga": "^0.15.6" + "redux-saga": "^0.15.6", + "svgs": "^3.1.1" }, "devDependencies": { - "babel-eslint": "^7.2.2", - "babel-preset-react-native": "1.9.1", + "babel-core": "^6.26.0", + "babel-eslint": "^8.0.1", + "babel-jest": "^21.2.0", + "babel-loader": "^7.1.2", + "babel-plugin-lodash": "^3.2.11", + "babel-plugin-module-resolver": "^2.7.1", + "babel-plugin-transform-react-remove-prop-types": "^0.4.10", + "babel-plugin-transform-runtime": "^6.23.0", + "babel-preset-react-native": "^4.0.0", "babel-preset-react-native-stage-0": "^1.0.1", + "copy-webpack-plugin": "^4.2.0", "eslint": "^4.5.0", "eslint-config-prettier": "^2.3.0", - "eslint-config-react-app": "^2.0.0", + "eslint-config-react-app": "^2.0.1", "eslint-plugin-flowtype": "^2.35.0", "eslint-plugin-import": "^2.7.0", - "eslint-plugin-jsx-a11y": "^5.1.1", + "eslint-plugin-jsx-a11y": "^6.0.2", "eslint-plugin-prettier": "^2.2.0", "eslint-plugin-react": "^7.3.0", - "flow-bin": "^0.49.1", - "jest": "^20.0.4", - "prettier": "^1.5.3" + "file-loader": "^1.1.5", + "flow-bin": "^0.56.0", + "gh-pages": "^1.0.0", + "html-webpack-plugin": "^2.30.1", + "jest": "^21.2.1", + "mockdate": "^2.0.2", + "prettier": "^1.5.3", + "react-test-renderer": "^16.1.1", + "redux-saga-test-plan": "^3.2.0", + "webpack": "^3.8.1", + "webpack-dev-server": "^2.9.3" }, "jest": { - "preset": "react-native" + "preset": "react-native", + "transformIgnorePatterns": [ + "node_modules/(?!react-native|react-navigation|@yfuks|easy-lottie-react-native|lottie-react-native)" + ] + }, + "greenkeeper": { + "ignore": [ + "react", + "react-native", + "flow-bin" + ] }, "rnpm": { - "assets": ["assets/native"] + "assets": [ + "assets/native" + ] } } diff --git a/src/App.js b/src/App.js index b42a207..46a8ba9 100644 --- a/src/App.js +++ b/src/App.js @@ -6,7 +6,7 @@ import codePush from 'react-native-code-push'; import Scenes from './Scenes'; import createStore from './modules/store'; -class App extends Component { +class App extends Component { state = { store: null, }; @@ -16,12 +16,16 @@ class App extends Component { } render() { - return this.state.store - ? - - - : null; + return this.state.store ? ( + + + + ) : null; } } +type State = { + store: any, +}; + export default (!__DEV__ ? codePush()(App) : App); diff --git a/src/Scenes.js b/src/Scenes.js index 2de17a4..61c374e 100644 --- a/src/Scenes.js +++ b/src/Scenes.js @@ -1,6 +1,6 @@ // @flow import React, { Component } from 'react'; -import { Linking, BackHandler } from 'react-native'; +import { Linking, BackHandler, Platform, Dimensions } from 'react-native'; import { connect } from 'react-redux'; import { StackNavigator, @@ -15,6 +15,7 @@ import appStyle from 'DailyScrum/src/appStyle'; import { Header, Drawer, Icon, Gradient } from './components'; import { ProjectHeaderTitle, DrawerHeaderLeft } from './components/Header'; import { getFontStyle } from './components/Text'; +import URIPrefix from './services/URIPrefix'; const TabsNavigator = TabNavigator( { @@ -42,16 +43,24 @@ const TabsNavigator = TabNavigator( }, { initialRouteName: 'daily', - swipeEnabled: true, + swipeEnabled: Platform.OS !== 'web', animationEnabled: true, - tabBarComponent: props => + tabBarComponent: props => ( - , + + ), tabBarPosition: 'bottom', tabBarOptions: { showIcon: true, upperCaseLabel: false, + initialLayout: + Platform.OS === 'android' + ? { + height: Dimensions.get('window').height, + width: Dimensions.get('window').width, + } + : undefined, tabStyle: { height: 56, }, @@ -65,6 +74,8 @@ const TabsNavigator = TabNavigator( height: 4, top: 0, backgroundColor: 'white', + ...appStyle.shadowStyle, + elevation: 0, }, labelStyle: { marginVertical: 0, @@ -118,7 +129,7 @@ const MainNavigator = DrawerNavigator( const appNavigatorPages = { login: { screen: Pages.Login, - path: 'login#token=:token', + path: Platform.OS !== 'web' ? 'login#token=:token' : 'login&token=:token', navigationOptions: { header: null }, }, main: { @@ -129,7 +140,7 @@ const appNavigatorPages = { const appNavigatorConfig = { initialRouteName: 'login', - URIPrefix: 'dailyscrum://', + URIPrefix, cardStyle: { backgroundColor: appStyle.colors.primary, }, @@ -151,7 +162,7 @@ function urlToPathAndParams(url: string) { }; } -class Scenes extends Component { +class Scenes extends Component { backPressListener: ?{ remove: () => void, } = null; diff --git a/src/appStyle.js b/src/appStyle.js index bf5ed31..87af696 100644 --- a/src/appStyle.js +++ b/src/appStyle.js @@ -15,15 +15,24 @@ const appStyle = { family: 'Open Sans', }, colors: { - primaryLight: chroma(primaryColor).brighten().hex(), - primaryMidLight: chroma(primaryColor).brighten(0.5).hex(), + primaryLight: chroma(primaryColor) + .brighten() + .hex(), + primaryMidLight: chroma(primaryColor) + .brighten(0.5) + .hex(), primary: primaryColor, - primaryMidDark: chroma(primaryColor).darken(0.5).hex(), - primaryDark: chroma(primaryColor).darken().hex(), + primaryMidDark: chroma(primaryColor) + .darken(0.5) + .hex(), + primaryDark: chroma(primaryColor) + .darken() + .hex(), secondary: secondaryColor, tertiary: tertiaryColor, green: '#7ed321', red: '#c30016', + overRed: 'white', overPrimaryColor: 'white', text: '#4d4d4d', warmGray: '#9b9b9b', diff --git a/src/components/BigButton.js b/src/components/BigButton.js index 80d55ab..d57c7b3 100644 --- a/src/components/BigButton.js +++ b/src/components/BigButton.js @@ -23,10 +23,11 @@ export default class BigButton extends Component { ]} > {isLoading && } - {!isLoading && + {!isLoading && ( {title} - } + + )} {icon && icon.right && } diff --git a/src/components/Button.js b/src/components/Button.js index 4df0348..0734298 100644 --- a/src/components/Button.js +++ b/src/components/Button.js @@ -8,11 +8,7 @@ const canUseForegroundNativeFeedback = canUseNativeFeedback && TouchableNativeFe export default ({ children, disabled, withRipple, ...props }: PropsType) => { if (disabled) { - return ( - - {children} - - ); + return {children}; } if (withRipple && Platform.OS === 'android' && Platform.Version >= ANDROID_VERSION_LOLLIPOP) { @@ -25,9 +21,7 @@ export default ({ children, disabled, withRipple, ...props }: PropsType) => { useForeground={canUseForegroundNativeFeedback && !borderless} onPress={() => requestAnimationFrame(props.onPress)} > - - {Children.only(children)} - + {Children.only(children)} ); } @@ -44,4 +38,6 @@ type PropsType = { children?: any, borderless?: boolean, withRipple?: boolean, + style?: any, + onPress: Function, }; diff --git a/src/components/Card.js b/src/components/Card.js index 006091e..5710c4d 100644 --- a/src/components/Card.js +++ b/src/components/Card.js @@ -3,10 +3,7 @@ import React from 'react'; import { View, StyleSheet } from 'react-native'; import appStyle from '../appStyle'; -export default (props: PropsType) => - - {props.children} - ; +export default (props: PropsType) => {props.children}; type PropsType = { children: any, diff --git a/src/components/CardLists/CardLists.js b/src/components/CardLists/CardLists.js index 38c7a3b..a1aab47 100644 --- a/src/components/CardLists/CardLists.js +++ b/src/components/CardLists/CardLists.js @@ -1,7 +1,8 @@ // @flow import React, { PureComponent } from 'react'; import { connect } from 'react-redux'; -import { StyleSheet, View, SectionList, Dimensions } from 'react-native'; +import { StyleSheet, View, Dimensions } from 'react-native'; +import SectionList from 'SectionList'; import * as Animatable from 'react-native-animatable'; import LottieAnimation from 'easy-lottie-react-native'; import { TrelloCard, Text } from '../../components'; @@ -13,19 +14,18 @@ import type { TipType } from '../../modules/tips/reducer'; import TipCard from '../TipCard'; import appStyle from '../../appStyle'; -class CardsList extends PureComponent { - props: PropsType; - +class CardsList extends PureComponent { renderCard = ({ item }: { item: CardType }) => ; renderSectionHeader = ({ section }: { section: any }) => section.data.length ? : null; - renderEmpty = () => + renderEmpty = () => ( No cards yet Pull to refresh :) - ; + + ); renderHeader = () => { const { FilterMembersComponent } = this.props; @@ -38,10 +38,11 @@ class CardsList extends PureComponent { }; renderTip = () => - this.props.tip && - - - ; + this.props.tip && ( + + + + ); renderSeperator = () => ; @@ -50,7 +51,7 @@ class CardsList extends PureComponent { render() { const { cardLists } = this.props; // $FlowFixMe https://github.com/facebook/flow/issues/2221 - const sections = Object.entries(cardLists) + const sections = Object.entries(cardLists) // $FlowFixMe https://github.com/facebook/flow/issues/2221 .map(([columnKey, column]: [string, CardListType]) => ({ key: columnKey, points: column.points, @@ -85,6 +86,7 @@ class CardsList extends PureComponent { const styles = StyleSheet.create({ container: { + flex: 1, flexGrow: 1, }, emptyContainer: { @@ -110,7 +112,7 @@ const styles = StyleSheet.create({ }, }); -type PropsType = { +type Props = { style?: any, cardLists: CardListsType, filteredMember: ?string, diff --git a/src/components/CardLists/FilterMembers.js b/src/components/CardLists/FilterMembers.js index 854fea8..c898a68 100644 --- a/src/components/CardLists/FilterMembers.js +++ b/src/components/CardLists/FilterMembers.js @@ -1,6 +1,7 @@ // @flow import React, { Component } from 'react'; -import { StyleSheet, View, FlatList } from 'react-native'; +import { StyleSheet, View } from 'react-native'; +import FlatList from 'FlatList'; import { connect } from 'react-redux'; import { isEqual } from 'lodash'; import type { UserType } from '../../types'; @@ -9,10 +10,8 @@ import { makeFilterByMember, filteredMemberSelector, filterableMembersSelector } import type { CardListsKeyType } from '../../modules/cardLists/reducer'; import { userPointsSelector } from '../../modules/cardLists/selectors'; -export class FilterMembers extends Component { - props: PropsType; - - shouldComponentUpdate(nextProps: PropsType) { +export class FilterMembers extends Component { + shouldComponentUpdate(nextProps: Props) { return ( nextProps.filtered !== this.props.filtered || !isEqual(nextProps.filterable, this.props.filterable) || @@ -20,14 +19,15 @@ export class FilterMembers extends Component { ); } - renderFilterableMember = ({ item: user }: { item: UserType }) => + renderFilterableMember = ({ item: user }: { item: UserType }) => ( this.props.filterByMember(this.props.filtered === memberId ? null : memberId)} - />; + /> + ); render() { if (!this.props.filterable.length) return null; @@ -46,7 +46,7 @@ export class FilterMembers extends Component { } } -type PropsType = { +type Props = { style?: any, contentContainerStyle?: any, filtered: ?string, diff --git a/src/components/CardLists/FilterableMember.js b/src/components/CardLists/FilterableMember.js index 9704e5d..e5a1ac6 100644 --- a/src/components/CardLists/FilterableMember.js +++ b/src/components/CardLists/FilterableMember.js @@ -5,10 +5,8 @@ import { MemberIcon, Text, Button } from '../../components'; import type { UserType } from '../../types'; import { roundToDecimalPlace } from '../../services/MathService'; -export default class FilterableMember extends Component { - props: PropsType; - - shouldComponentUpdate(nextProps: PropsType) { +export default class FilterableMember extends Component { + shouldComponentUpdate(nextProps: Props) { return ( nextProps.isFiltered !== this.props.isFiltered || nextProps.points !== this.props.points || @@ -28,15 +26,13 @@ export default class FilterableMember extends Component { - - {roundToDecimalPlace(points).toLocaleString()} - + {roundToDecimalPlace(points).toLocaleString()} ); } } -type PropsType = { +type Props = { style?: any, isFiltered: boolean, member: UserType, diff --git a/src/components/CardLists/ListHeader.js b/src/components/CardLists/ListHeader.js index e1649fb..e3943a6 100644 --- a/src/components/CardLists/ListHeader.js +++ b/src/components/CardLists/ListHeader.js @@ -4,10 +4,8 @@ import { StyleSheet, View } from 'react-native'; import { Text } from '../../components'; import appStyle from '../../appStyle'; -export default class ListHeader extends Component { - props: PropsType; - - shouldComponentUpdate(nextProps: PropsType) { +export default class ListHeader extends Component { + shouldComponentUpdate(nextProps: Props) { return nextProps.listKey !== this.props.listKey || nextProps.total !== this.props.total; } @@ -31,18 +29,14 @@ export default class ListHeader extends Component { render() { return ( - - {this.getListNameFromKey(this.props.listKey)} - - - total {this.props.total.toLocaleString()} pts - + {this.getListNameFromKey(this.props.listKey)} + total {this.props.total.toLocaleString()} pts ); } } -type PropsType = { +type Props = { style?: any, listKey: string, total: number, diff --git a/src/components/Drawer.js b/src/components/Drawer.js index 56bdd1e..73715f7 100644 --- a/src/components/Drawer.js +++ b/src/components/Drawer.js @@ -18,10 +18,8 @@ import { isDrawerOpenSelector } from '../modules/navigation/reducer'; import { logout } from '../modules/auth'; const ErrorBar = createErrorBar(); -class Drawer extends Component { - props: PropsType; - - shouldComponentUpdate(nextProps: PropsType) { +class Drawer extends Component { + shouldComponentUpdate(nextProps: Props) { return ( this.props.isSyncing !== nextProps.isSyncing || this.props.lastSuccessfulSync !== nextProps.lastSuccessfulSync ); @@ -41,13 +39,12 @@ class Drawer extends Component { return ( {this.props.isDrawerOpen && } - {user && + {user && ( - - {user.fullName} - - } + {user.fullName} + + )} - ; + +); type PropsType = { tip: TipType, diff --git a/src/components/TrelloCard/MemberIcon.js b/src/components/TrelloCard/MemberIcon.js index f74e805..47fc5f1 100644 --- a/src/components/TrelloCard/MemberIcon.js +++ b/src/components/TrelloCard/MemberIcon.js @@ -7,15 +7,14 @@ import appStyle from '../../appStyle'; const colors = ['#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4', '#fed9a6', '#ffffcc', '#e5d8bd', '#fddaec', '#f2f2f2']; -export default class MemberIcon extends Component { +export default class MemberIcon extends Component { static defaultProps = { size: 30, }; - props: PropsType; - state: StateType = { isImageLoaded: false }; + state: State = { isImageLoaded: false }; - shouldComponentUpdate(nextProps: PropsType, nextState: StateType) { + shouldComponentUpdate(nextProps: Props, nextState: State) { return this.state.isImageLoaded !== nextState.isImageLoaded || this.props.member.id !== nextProps.member.id; } @@ -36,17 +35,15 @@ export default class MemberIcon extends Component { return ( - {!this.state.isImageLoaded && - - {member.initials} - } - {avatar && + {!this.state.isImageLoaded && {member.initials}} + {avatar && ( } + /> + )} ); } @@ -74,11 +71,11 @@ const styles = StyleSheet.create({ }, }); -type StateType = { +type State = { isImageLoaded: boolean, }; -type PropsType = { +type Props = { member: ScrumbleTeamMemberType, size: number, }; diff --git a/src/components/TrelloCard/PointsBadge.js b/src/components/TrelloCard/PointsBadge.js index 32a4795..2bdeaaf 100644 --- a/src/components/TrelloCard/PointsBadge.js +++ b/src/components/TrelloCard/PointsBadge.js @@ -5,14 +5,13 @@ import { Text } from '../'; import chroma from 'chroma-js'; import appStyle from '../../appStyle'; -export default (props: PropsType) => +export default (props: Props) => ( - - {props.points} - - ; + {props.points} + +); -type PropsType = { +type Props = { points: number, isPostEstimation?: boolean, }; diff --git a/src/components/TrelloCard/TrelloCard.js b/src/components/TrelloCard/TrelloCard.js index c8f82e0..70c9ab5 100644 --- a/src/components/TrelloCard/TrelloCard.js +++ b/src/components/TrelloCard/TrelloCard.js @@ -9,11 +9,11 @@ import MemberIcon from './MemberIcon'; import PointsBadge from './PointsBadge'; import { Analytics } from '../../services'; import type { CardType } from '../../types'; +import { differenceInBusinessDays } from '../../services/Time'; +import Icon from '../Icon'; -export default class extends Component { - props: PropsType; - - shouldComponentUpdate(nextProps: PropsType) { +export default class extends Component { + shouldComponentUpdate(nextProps: Props) { return !isEqual(nextProps.card, this.props.card); } @@ -38,20 +38,30 @@ export default class extends Component { render() { const { card } = this.props; + const validationLatenessInDays = + card.dateEndDevelopment && differenceInBusinessDays(card.dateDone || Date.now(), card.dateEndDevelopment); + return (
Homebrew -Installer Script -Rubygems +HomebrewInstaller ScriptRubyGems
macOS