diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..d42ff1835 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.pbxproj -text diff --git a/.gitignore b/.gitignore index 1e9932e64..e96f86641 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ xcuserdata DerivedData *.hmap *.ipa +*.apk *.xcuserstate project.xcworkspace @@ -52,3 +53,8 @@ Session.vim .netrwhist *~ tags + +fastlane/report.xml +*.zip +server.PID +mattermost.keystore diff --git a/Makefile b/Makefile index 2ea7e74fb..b2fac3070 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,9 @@ .PHONY: run run-ios run-android check-style test clean post-install +.PHONY: check-ios-target prepare-ios-build build-ios after-ios-build +.PHONY: check-android-target prepare-android-build build-android after-android-build + +ios_target := $(filter-out build-ios,$(MAKECMDGOALS)) +android_target := $(filter-out build-android,$(MAKECMDGOALS)) .npminstall: package.json @if ! [ $(shell command -v npm) ]; then \ @@ -24,7 +29,6 @@ dist/assets: $(BASE_ASSETS) $(OVERRIDE_ASSETS) node scripts/make-dist-assets.js -.PHONY: prepare pre-run: .npminstall dist/assets run: run-ios @@ -91,3 +95,55 @@ post-install: sed -i'' -e 's|"./lib/locales": false|"./lib/locales": "./lib/locales"|g' node_modules/intl-messageformat/package.json sed -i'' -e 's|"./lib/locales": false|"./lib/locales": "./lib/locales"|g' node_modules/intl-relativeformat/package.json sed -i'' -e 's|"./locale-data/complete.js": false|"./locale-data/complete.js": "./locale-data/complete.js"|g' node_modules/intl/package.json + +check-ios-target: +ifneq ($(ios_target), $(filter $(ios_target), dev beta release)) + @echo "Try running make build-ios TARGET\nWhere TARGET is one of dev, beta or release" + @exit 1 +endif + +prepare-ios-build: + # We need to do this as the react-native packager minifies the output and that is causing issues + @sed -i'' -e 's|--dev $$DEV|--dev true|g' ./node_modules/react-native/packager/react-native-xcode.sh + + @node ./node_modules/react-native/local-cli/cli.js start --reset-cache & echo $$! > server.PID + +do-build-ios: + @echo "Building ios $(ios_target) app" + @cd fastlane && fastlane ios $(ios_target) + +after-ios-build: + @echo Cleaning up + @sed -i'' -e 's|--dev true|--dev $$DEV|g' ./node_modules/react-native/packager/react-native-xcode.sh + @kill -9 `cat server.PID` && rm server.PID + +build-ios: | check-ios-target pre-run check-style prepare-ios-build do-build-ios after-ios-build + +check-android-target: +ifneq ($(android_target), $(filter $(android_target), dev beta release)) + @echo "Try running make build-android TARGET\nWhere TARGET is one of dev, beta or release" + @exit 1 +endif + +prepare-android-build: + @rm -rf ./node_modules/react-native/local-cli/templates/HelloWorld + @sed -i'' -e 's|def devEnabled = !targetName.toLowerCase().contains("release")|def devEnabled = true|g' ./node_modules/react-native/react.gradle + +do-build-android: + @echo "Building android $(android_target) app" + @cd fastlane && fastlane android $(android_target) + +after-android-build: + @echo Cleaning up + @sed -i'' -e 's|def devEnabled = true|def devEnabled = !targetName.toLowerCase().contains("release")|g' ./node_modules/react-native/react.gradle + +build-android: | check-android-target pre-run check-style prepare-android-build do-build-android after-android-build + +dev: + @: + +beta: + @: + +release: + @: diff --git a/android/app/build.gradle b/android/app/build.gradle index a4ac2aad8..18d629191 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -88,15 +88,24 @@ android { buildToolsVersion "23.0.1" defaultConfig { - applicationId "com.mattermost" + applicationId "com.mattermost.react.native" minSdkVersion 16 - targetSdkVersion 22 - versionCode 1 + targetSdkVersion 23 + versionCode 2 versionName "1.0" + multiDexEnabled true ndk { abiFilters "armeabi-v7a", "x86" } } + signingConfigs { + release { + storeFile file(MATTERMOST_RELEASE_STORE_FILE) + storePassword MATTERMOST_RELEASE_PASSWORD + keyAlias MATTERMOST_RELEASE_KEY_ALIAS + keyPassword MATTERMOST_RELEASE_PASSWORD + } + } splits { abi { reset() @@ -109,6 +118,7 @@ android { release { minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + signingConfig signingConfigs.release } } // applicationVariants are e.g. debug, release @@ -127,6 +137,7 @@ android { } dependencies { + compile project(':react-native-vector-icons') compile project(':react-native-svg') compile fileTree(dir: "libs", include: ["*.jar"]) compile "com.android.support:appcompat-v7:23.0.1" @@ -136,6 +147,6 @@ dependencies { // 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' + from configurations.compile + into 'libs' } diff --git a/android/app/src/main/assets/fonts/Entypo.ttf b/android/app/src/main/assets/fonts/Entypo.ttf new file mode 100644 index 000000000..1c8f5e910 Binary files /dev/null and b/android/app/src/main/assets/fonts/Entypo.ttf differ diff --git a/android/app/src/main/assets/fonts/EvilIcons.ttf b/android/app/src/main/assets/fonts/EvilIcons.ttf new file mode 100644 index 000000000..b270f9851 Binary files /dev/null and b/android/app/src/main/assets/fonts/EvilIcons.ttf differ diff --git a/android/app/src/main/assets/fonts/FontAwesome.ttf b/android/app/src/main/assets/fonts/FontAwesome.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/android/app/src/main/assets/fonts/FontAwesome.ttf differ diff --git a/android/app/src/main/assets/fonts/Foundation.ttf b/android/app/src/main/assets/fonts/Foundation.ttf new file mode 100644 index 000000000..6cce217dd Binary files /dev/null and b/android/app/src/main/assets/fonts/Foundation.ttf differ diff --git a/android/app/src/main/assets/fonts/Ionicons.ttf b/android/app/src/main/assets/fonts/Ionicons.ttf new file mode 100644 index 000000000..307ad889a Binary files /dev/null and b/android/app/src/main/assets/fonts/Ionicons.ttf differ diff --git a/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf b/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf new file mode 100644 index 000000000..fb7969510 Binary files /dev/null and b/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf differ diff --git a/android/app/src/main/assets/fonts/MaterialIcons.ttf b/android/app/src/main/assets/fonts/MaterialIcons.ttf new file mode 100644 index 000000000..7015564ad Binary files /dev/null and b/android/app/src/main/assets/fonts/MaterialIcons.ttf differ diff --git a/android/app/src/main/assets/fonts/Octicons.ttf b/android/app/src/main/assets/fonts/Octicons.ttf new file mode 100644 index 000000000..5b1f7d6ea Binary files /dev/null and b/android/app/src/main/assets/fonts/Octicons.ttf differ diff --git a/android/app/src/main/assets/fonts/SimpleLineIcons.ttf b/android/app/src/main/assets/fonts/SimpleLineIcons.ttf new file mode 100644 index 000000000..6ecb68683 Binary files /dev/null and b/android/app/src/main/assets/fonts/SimpleLineIcons.ttf differ diff --git a/android/app/src/main/assets/fonts/Zocial.ttf b/android/app/src/main/assets/fonts/Zocial.ttf new file mode 100644 index 000000000..e4ae46c62 Binary files /dev/null and b/android/app/src/main/assets/fonts/Zocial.ttf differ diff --git a/android/app/src/main/java/com/mattermost/MainApplication.java b/android/app/src/main/java/com/mattermost/MainApplication.java index de4835f51..dcabea6ee 100644 --- a/android/app/src/main/java/com/mattermost/MainApplication.java +++ b/android/app/src/main/java/com/mattermost/MainApplication.java @@ -4,11 +4,13 @@ import android.app.Application; import android.util.Log; import com.facebook.react.ReactApplication; +import com.oblador.vectoricons.VectorIconsPackage; import com.horcrux.svg.RNSvgPackage; import com.facebook.react.ReactInstanceManager; 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; @@ -25,6 +27,7 @@ public class MainApplication extends Application implements ReactApplication { protected List getPackages() { return Arrays.asList( new MainReactPackage(), + new VectorIconsPackage(), new RNSvgPackage() ); } @@ -32,6 +35,12 @@ public class MainApplication extends Application implements ReactApplication { @Override public ReactNativeHost getReactNativeHost() { - return mReactNativeHost; + return mReactNativeHost; + } + + @Override + public void onCreate() { + super.onCreate(); + SoLoader.init(this, /* native exopackage */ false); } } diff --git a/android/settings.gradle b/android/settings.gradle index e9d118a2d..66adc1efc 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,4 +1,6 @@ rootProject.name = 'Mattermost' +include ':react-native-vector-icons' +project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android') include ':app' include ':react-native-svg' diff --git a/app/mattermost.js b/app/mattermost.js index 0e15d6a15..62ea36b56 100644 --- a/app/mattermost.js +++ b/app/mattermost.js @@ -5,10 +5,11 @@ import React from 'react'; import {Provider} from 'react-redux'; import configureStore from 'app/store'; +import initialState from 'app/initial_state'; import Router from 'app/navigation/router'; import RootLayout from 'app/layouts/root_layout/root_layout_container'; -const store = configureStore(); +const store = configureStore(initialState); export default class Mattermost extends React.Component { render() { diff --git a/fastlane/Fastfile b/fastlane/Fastfile new file mode 100644 index 000000000..814f2183b --- /dev/null +++ b/fastlane/Fastfile @@ -0,0 +1,395 @@ +update_fastlane +fastlane_version '2.9.0' +skip_docs + +platform :ios do + before_all do |lane| + if lane == :beta or lane == :release + ensure_git_branch( + branch: 'master' + ) + sh "git checkout -b ios-#{lane}" + end + end + + after_all do |lane| + if lane == :beta or lane == :release + reset_git_repo( + force: true, + skip_clean: true + ) + + sh 'git checkout master' + sh "git branch -D ios-#{lane}" + end + end + + desc 'Build Release file' + desc 'This will also make sure the profile is up to date' + lane :dev do + match(type: 'adhoc') + + build_ios({ + release: false, + increment_build: false, + ensure_git_status_clean: false + }) + end + + desc 'Submit a new Beta Build to Apple TestFlight' + desc 'This will also make sure the profile is up to date' + lane :beta do + match(type: 'appstore') + + build_ios({ + release: true, + increment_build: true, + ensure_git_status_clean: true, + branch_name: 'ios-beta' + }) + + # pilot + + if ENV['MATTERMOST_WEBHOOK_URL'] + testflight_url = ENV['TESTFLIGHT_URL'] + send_message_for_ios( + '#### New iOS beta published on TestFlight', + '', + "#ios-beta in #{testflight_url.nil? ? 'TestFlight' : "[TestFlight](#{testflight_url})"} on [#{Time.new.utc.to_s}]", + [], + true + ) + end + end + + desc 'Deploy a new version to the App Store' + lane :release do + match(type: 'appstore') + + # snapshot + + build_ios({ + release: true, + increment_build: true, + ensure_git_status_clean: true, + branch_name: 'ios-release' + }) + + deliver(force: true) + + # frameit + + if ENV['MATTERMOST_WEBHOOK_URL'] + appstore_url = ENV['APPSTORE_URL'] + send_message_for_ios( + '#### New iOS release published on the App Store', + '', + "#ios-release in #{appstore_url.nil? ? 'App Store' : "[App Store](#{appstore_url})"} on [#{Time.new.utc.to_s}]", + [], + true + ) + end + end + + error do |lane, exception| + if ENV['MATTERMOST_WEBHOOK_URL'] + send_message_for_ios('', 'Unsuccessful Build', exception.message, [:lane], false) + end + end + + def build_ios(options) + if options[:ensure_git_status_clean] + ensure_git_status_clean + end + + if options[:increment_build] + increment_build_number( + xcodeproj: './ios/Mattermost.xcodeproj', + build_number: latest_testflight_build_number + 1 + ) + commit_version_bump(xcodeproj: './ios/Mattermost.xcodeproj') + commit = last_git_commit + + push_to_git_remote( + remote: 'origin', + local_branch: options[:branch_name], + force: false, + tags: false + ) + + unless ENV['GITHUB_TOKEN'].nil? + create_pull_request( + api_token: ENV['GITHUB_TOKEN'], + repo: 'mattermost/mattermost-mobile', + head: "mattermost:#{options[:branch_name]}", + base: 'master', + title: "IOS #{commit[:message]}" + ) + end + end + + update_project_team( + path: './ios/Mattermost.xcodeproj', + teamid: ENV['FASTLANE_TEAM_ID'] + ) + + gym( + clean: true, + scheme: 'Mattermost', + configuration: (options[:release] ? 'Release' : 'Debug'), + project: './ios/Mattermost.xcodeproj' + ) + end + + def send_message_for_ios(pretext, title, msg, default_payloads, success) + version = get_version_number(xcodeproj: './ios/Mattermost.xcodeproj') + build_number = get_build_number(xcodeproj: './ios/Mattermost.xcodeproj') + mattermost( + pretext: pretext, + message: msg, + default_payloads: default_payloads, + username: 'Fastlane', + icon_url: 'https://s3-eu-west-1.amazonaws.com/fastlane.tools/fastlane.png', + payload: {}, + attachment_properties: { + title: title, + thumb_url: 'https://lh3.googleusercontent.com/Nkbo3QohCOU8bGqSYtwB88o03XxUwRAxRHNdXPB9zFvYFzTwD7naYa-GYJaelBp-OIc=w300', + fields: [{ + title: 'Version', + value: version, + short: true + }, + { + title: 'Build Number', + value: build_number, + short: true + }, + { + title: 'Built by', + value: 'Jenkins', + short: true + }] + }, + success: success + ) + end +end + +platform :android do + before_all do |lane| + if lane == :beta or lane == :release + ensure_git_branch( + branch: 'master' + ) + sh "git checkout -b android-#{lane}" + end + end + + after_all do |lane| + if lane == :beta or lane == :release + reset_git_repo( + force: true, + skip_clean: true + ) + sh 'git checkout master' + sh "git branch -D android-#{lane}" + end + end + + desc 'Build Release file' + lane :dev do + build_android({release: true}) + end + + desc 'Submit a new Beta Build to Google Play' + lane :beta do + build_android({ + release: true, + increment_build: true, + ensure_git_status_clean: true, + branch_name: 'android-beta' + }) + + supply( + track: 'beta', + apk: "#{lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]}", + ) + + if ENV['MATTERMOST_WEBHOOK_URL'] + beta_url = ENV['GOOGLE_PLAY_BETA_URL'] + send_message_for_android( + '#### New Android beta published for Beta Testing', + '', + "#android-beta in #{beta_url.nil? ? 'Google Play Beta Program' : "[Google Play Beta Program](#{beta_url})"} on [#{Time.new.utc.to_s}]", + [], + true + ) + end + end + + desc 'Deploy a new version to Google Play' + lane :release do + build_android({ + release: true, + increment_build: true, + ensure_git_status_clean: true, + branch_name: 'android-release' + }) + + supply( + track: "production", + apk: "#{lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]}", + ) + + if ENV['MATTERMOST_WEBHOOK_URL'] + google_play_url = ENV['GOOGLE_PLAY_URL'] + send_message_for_android( + '#### New Android beta published for Production', + '', + "#android-beta in #{google_play_url.nil? ? 'Google Play' : "[Google Play](#{google_play_url})"} on [#{Time.new.utc.to_s}]", + [], + true + ) + end + end + + error do |lane, exception| + if ENV['MATTERMOST_WEBHOOK_URL'] + send_message_for_android('', 'Unsuccessful Build', exception.message, [:lane], false) + end + end + + def build_android(options) + if options[:ensure_git_status_clean] + ensure_git_status_clean + end + + if options[:increment_build] + increment_version_code(app_folder_name: 'android/app') + commit_android_version_bump( + app_folder_name: 'android/app', + force: true + ) + commit = last_git_commit + + push_to_git_remote( + remote: 'origin', + local_branch: options[:branch_name], + force: false, + tags: false + ) + + unless ENV['GITHUB_TOKEN'].nil? + create_pull_request( + api_token: ENV['GITHUB_TOKEN'], + repo: 'mattermost/mattermost-mobile', + head: "mattermost:#{options[:branch_name]}", + base: 'master', + title: "IOS #{commit[:message]}" + ) + end + end + + gradle( + task: 'assemble', + build_type: (options[:release] ? 'Release' : 'Debug'), + project_dir: 'android/' + ) + end + + def get_version_code(app_folder_name) + version_code = '0' + + Dir.glob("../#{app_folder_name}/build.gradle") do |path| + begin + UI.message(" -> Found a build.gradle file at path: (#{path})!") + file = File.new(path, 'r') + while (line = file.gets) + if line.include? 'versionCode' + versionComponents = line.strip.split(' ') + version_code = versionComponents[1].tr("\"",'') + break + end + end + file.close + rescue => err + UI.error("An exception occured while reading gradle file: #{err}") + err + end + end + + if version_code == '0' + UI.user_error!("Impossible to find the version code in the current project folder #{app_folder_name} 😭") + else + # Store the version name in the shared hash + Actions.lane_context['VERSION_CODE']=version_code + UI.success("👍 Version name found: #{version_code}") + end + + return version_code + end + + def get_version_name(app_folder_name) + version_name = '0' + + Dir.glob("../#{app_folder_name}/build.gradle") do |path| + begin + file = File.new(path, 'r') + while (line = file.gets) + if line.include? 'versionName' + versionComponents = line.strip.split(' ') + version_name = versionComponents[1].tr("\"",'') + break + end + end + file.close + rescue => err + UI.error("An exception occured while readinf gradle file: #{err}") + err + end + end + + if version_name == '0' + UI.user_error!("Impossible to find the version name in the current project folder #{app_folder_name} 😭") + else + # Store the version name in the shared hash + Actions.lane_context['VERSION_NAME']=version_name + UI.success("👍 Version name found: #{version_name}") + end + + return version_name + end + + def send_message_for_android(pretext, title, msg, default_payloads, success) + build_number = get_version_code('android/app') + version_name = get_version_name('android/app') + mattermost( + pretext: pretext, + message: msg, + default_payloads: default_payloads, + username: 'Fastlane', + icon_url: 'https://s3-eu-west-1.amazonaws.com/fastlane.tools/fastlane.png', + payload: {}, + attachment_properties: { + title: title, + thumb_url: 'http://www.concretesolutions.com.br/blog/wp-content/uploads/2015/04/Android1.png', + fields: [{ + title: 'Version', + value: version_name, + short: true + }, + { + title: 'Build Number', + value: build_number, + short: true + }, + { + title: 'Built by', + value: 'Jenkins', + short: true + }] + }, + success: success + ) + end +end diff --git a/fastlane/Gemfile b/fastlane/Gemfile new file mode 100644 index 000000000..c44c6eea1 --- /dev/null +++ b/fastlane/Gemfile @@ -0,0 +1,6 @@ +source "https://rubygems.org" + +gem "fastlane" + +plugins_path = File.join(File.dirname(__FILE__), '.', 'Pluginfile') +eval(File.read(plugins_path), binding) if File.exist?(plugins_path) diff --git a/fastlane/Gemfile.lock b/fastlane/Gemfile.lock new file mode 100644 index 000000000..dad2e436f --- /dev/null +++ b/fastlane/Gemfile.lock @@ -0,0 +1,151 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (2.3.4) + activesupport (4.2.7.1) + i18n (~> 0.7) + json (~> 1.7, >= 1.7.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + addressable (2.5.0) + public_suffix (~> 2.0, >= 2.0.2) + babosa (1.0.2) + claide (1.0.1) + colored (1.2) + commander (4.4.3) + highline (~> 1.7.2) + domain_name (0.5.20161129) + unf (>= 0.0.5, < 1.0.0) + dotenv (2.1.2) + excon (0.54.0) + faraday (0.11.0) + multipart-post (>= 1.2, < 3) + faraday-cookie_jar (0.0.6) + faraday (>= 0.7.4) + http-cookie (~> 1.0.0) + faraday_middleware (0.11.0) + faraday (>= 0.7.4, < 1.0) + fastimage (2.0.1) + addressable (~> 2) + fastlane (2.9.0) + activesupport (< 5) + addressable (>= 2.3, < 3.0.0) + babosa (>= 1.0.2, < 2.0.0) + bundler (~> 1.12) + colored + commander (>= 4.4.0, < 5.0.0) + dotenv (>= 2.1.1, < 3.0.0) + excon (>= 0.45.0, < 1.0.0) + faraday (~> 0.9) + faraday-cookie_jar (~> 0.0.6) + faraday_middleware (~> 0.9) + fastimage (>= 1.6) + gh_inspector (>= 1.0.1, < 2.0.0) + google-api-client (~> 0.9.2) + highline (>= 1.7.2, < 2.0.0) + json (< 3.0.0) + mini_magick (~> 4.5.1) + multi_json + multi_xml (~> 0.5) + multipart-post (~> 2.0.0) + plist (>= 3.1.0, < 4.0.0) + rubyzip (>= 1.1.0, < 2.0.0) + security (= 0.1.3) + slack-notifier (>= 1.3, < 2.0.0) + terminal-notifier (>= 1.6.2, < 2.0.0) + terminal-table (>= 1.4.5, < 2.0.0) + word_wrap (~> 1.0.0) + xcodeproj (>= 0.20, < 2.0.0) + xcpretty (>= 0.2.4, < 1.0.0) + xcpretty-travis-formatter (>= 0.0.3) + fastlane-plugin-commit_android_version_bump (0.1.3) + fastlane-plugin-increment_version_code (0.3.1) + gh_inspector (1.0.3) + google-api-client (0.9.20) + addressable (~> 2.3) + googleauth (~> 0.5) + httpclient (~> 2.7) + hurley (~> 0.1) + memoist (~> 0.11) + mime-types (>= 1.6) + representable (~> 2.3.0) + retriable (~> 2.0) + googleauth (0.5.1) + faraday (~> 0.9) + jwt (~> 1.4) + logging (~> 2.0) + memoist (~> 0.12) + multi_json (~> 1.11) + os (~> 0.9) + signet (~> 0.7) + highline (1.7.8) + http-cookie (1.0.3) + domain_name (~> 0.5) + httpclient (2.8.3) + hurley (0.2) + i18n (0.7.0) + json (1.8.6) + jwt (1.5.6) + little-plugger (1.1.4) + logging (2.1.0) + little-plugger (~> 1.1) + multi_json (~> 1.10) + memoist (0.15.0) + mime-types (3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2016.0521) + mini_magick (4.5.1) + minitest (5.10.1) + multi_json (1.12.1) + multi_xml (0.6.0) + multipart-post (2.0.0) + nanaimo (0.2.3) + os (0.9.6) + plist (3.2.0) + public_suffix (2.0.5) + representable (2.3.0) + uber (~> 0.0.7) + retriable (2.1.0) + rouge (1.11.1) + rubyzip (1.2.0) + security (0.1.3) + signet (0.7.3) + addressable (~> 2.3) + faraday (~> 0.9) + jwt (~> 1.5) + multi_json (~> 1.10) + slack-notifier (1.5.1) + terminal-notifier (1.7.1) + terminal-table (1.7.3) + unicode-display_width (~> 1.1.1) + thread_safe (0.3.5) + tzinfo (1.2.2) + thread_safe (~> 0.1) + uber (0.0.15) + unf (0.1.4) + unf_ext + unf_ext (0.0.7.2) + unicode-display_width (1.1.3) + word_wrap (1.0.0) + xcodeproj (1.4.2) + CFPropertyList (~> 2.3.3) + activesupport (>= 3) + claide (>= 1.0.1, < 2.0) + colored (~> 1.2) + nanaimo (~> 0.2.3) + xcpretty (0.2.4) + rouge (~> 1.8) + xcpretty-travis-formatter (0.0.4) + xcpretty (~> 0.2, >= 0.0.7) + +PLATFORMS + ruby + +DEPENDENCIES + fastlane + fastlane-plugin-commit_android_version_bump + fastlane-plugin-increment_version_code + +BUNDLED WITH + 1.13.7 diff --git a/fastlane/Pluginfile b/fastlane/Pluginfile new file mode 100644 index 000000000..1f0ca1039 --- /dev/null +++ b/fastlane/Pluginfile @@ -0,0 +1,6 @@ +# Autogenerated by fastlane +# +# Ensure this file is checked in to source control! + +gem 'fastlane-plugin-increment_version_code' +gem 'fastlane-plugin-commit_android_version_bump' diff --git a/fastlane/README.md b/fastlane/README.md new file mode 100644 index 000000000..56833d235 --- /dev/null +++ b/fastlane/README.md @@ -0,0 +1,57 @@ +fastlane documentation +================ +# Installation +``` +sudo gem install fastlane +``` +# Available Actions +## iOS +### ios dev +``` +fastlane ios dev +``` +Build Release file + +This will also make sure the profile is up to date +### ios beta +``` +fastlane ios beta +``` +Submit a new Beta Build to Apple TestFlight + +This will also make sure the profile is up to date +### ios release +``` +fastlane ios release +``` +Deploy a new version to the App Store +### ios build +``` +fastlane ios build +``` + + +---- + +## Android +### android dev +``` +fastlane android dev +``` + +### android beta +``` +fastlane android beta +``` + +### android release +``` +fastlane android release +``` + + +---- + +This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run. +More information about fastlane can be found on [https://fastlane.tools](https://fastlane.tools). +The documentation of fastlane can be found on [GitHub](https://github.com/fastlane/fastlane/tree/master/fastlane). diff --git a/fastlane/actions/mattermost.rb b/fastlane/actions/mattermost.rb new file mode 100644 index 000000000..626a4617c --- /dev/null +++ b/fastlane/actions/mattermost.rb @@ -0,0 +1,251 @@ +# rubocop:disable Style/CaseEquality +# rubocop:disable Style/MultilineTernaryOperator +# rubocop:disable Style/NestedTernaryOperator +module Fastlane + module Actions + class MattermostAction < Action + def self.is_supported?(platform) + true + end + + # As there is a text limit in the notifications, we are + # usually interested in the last part of the message + # e.g. for tests + def self.trim_message(message) + # We want the last 7000 characters, instead of the first 7000, as the error is at the bottom + start_index = [message.length - 7000, 0].max + message = message[start_index..-1] + message + end + + def self.run(options) + require 'slack-notifier' + + options[:message] = self.trim_message(options[:message].to_s || '') + options[:message] = Slack::Notifier::LinkFormatter.format(options[:message]) + + notifier = Slack::Notifier.new(options[:mattermost_url]) + + notifier.username = options[:overwrite_webhook_username_and_icon] ? nil : options[:username] + icon_url = options[:overwrite_webhook_username_and_icon] ? nil : options[:icon_url] + + if options[:channel].to_s.length > 0 + notifier.channel = options[:channel] + notifier.channel = ('#' + notifier.channel) unless ['#', '@'].include?(notifier.channel[0]) # send message to channel by default + end + + mattermost_attachment = generate_mattermost_attachments(options) + + return [notifier, mattermost_attachment] if Helper.is_test? # tests will verify the mattermost attachments and other properties + + result = notifier.ping '', + icon_url: icon_url, + attachments: [mattermost_attachment] + + if result.code.to_i == 200 + UI.success('Successfully sent Mattermost notification') + else + UI.verbose(result) + UI.user_error!("Error pushing Mattermost message, maybe the integration has no permission to post on this channel? Try removing the channel parameter in your Fastfile.") + end + end + + def self.description + "Send a success/error message to your Mattermost channel" + end + + def self.available_options + [ + FastlaneCore::ConfigItem.new(key: :pretext, + env_name: "MATTERMOST_PRETEXT", + description: "An optional line of text that will be shown above the attachment. This supports the standard Mattermost markup language", + optional: true), + FastlaneCore::ConfigItem.new(key: :message, + env_name: "MATTERMOST_MESSAGE", + description: "The message that should be displayed on Mattermost. This supports the standard Mattermost markup language", + optional: true), + FastlaneCore::ConfigItem.new(key: :channel, + env_name: "MATTERMOST_CHANNEL", + description: "channel or @username", + optional: true), + FastlaneCore::ConfigItem.new(key: :overwrite_webhook_username_and_icon, + env_name: "MATTERMOST_USE_WEBHOOK_CONFIGURED_USERNAME_AND_ICON", + description: "Use webook's default username and icon settings? (true/false)", + default_value: false, + is_string: false, + optional: true), + FastlaneCore::ConfigItem.new(key: :mattermost_url, + env_name: "MATTERMOST_URL", + sensitive: true, + description: "Create an Incoming WebHook for your Mattermost channel", + verify_block: proc do |value| + UI.user_error!("Invalid URL, must start with https:// or http://") unless value.start_with? "https://" or value.start_with? "http://" + end), + FastlaneCore::ConfigItem.new(key: :username, + env_name: "MATTERMOST_USERNAME", + description: "Overrides the webook's username property if overwrite_webhook_username_and_icon is false", + default_value: "fastlane", + is_string: true, + optional: true), + FastlaneCore::ConfigItem.new(key: :icon_url, + env_name: "MATTERMOST_ICON_URL", + description: "Overrides the webook's image property if overwrite_webhook_username_and_icon is false", + default_value: "https://s3-eu-west-1.amazonaws.com/fastlane.tools/fastlane.png", + is_string: true, + optional: true), + FastlaneCore::ConfigItem.new(key: :payload, + env_name: "MATTERMOST_PAYLOAD", + description: "Add additional information to this post. payload must be a hash containg any key with any value", + default_value: {}, + is_string: false), + FastlaneCore::ConfigItem.new(key: :default_payloads, + env_name: "MATTERMOST_DEFAULT_PAYLOADS", + description: "Remove some of the default payloads. More information about the available payloads on GitHub", + optional: true, + is_string: false), + FastlaneCore::ConfigItem.new(key: :attachment_properties, + env_name: "MATTERMOST_ATTACHMENT_PROPERTIES", + description: "Merge additional properties in the Mattermost attachment, see https://docs.mattermost.com/developer/message-attachments.html", + default_value: {}, + is_string: false), + FastlaneCore::ConfigItem.new(key: :success, + env_name: "MATTERMOST_SUCCESS", + description: "Was this build successful? (true/false)", + optional: true, + default_value: true, + is_string: false) + ] + end + + def self.author + "Mattermost base on the Slack action by KrauseFx" + end + + def self.example_code + [ + 'mattermost(message: "App successfully released!")', + 'mattermost( + message: "App successfully released!", + channel: "channel", # Optional, by default will post to the default channel configured for the POST URL. + success: true, # Optional, defaults to true. + payload: { # Optional, lets you specify any number of your own Mattermost attachments. + "Build Date" => Time.new.to_s, + "Built by" => "Jenkins", + }, + default_payloads: [:git_branch, :git_author], # Optional, lets you specify a whitelist of default payloads to include. Pass an empty array to suppress all the default payloads. + # Don\'t add this key, or pass nil, if you want all the default payloads. The available default payloads are: `lane`, `test_result`, `git_branch`, `git_author`, `last_git_commit_message`. + attachment_properties: { # Optional, lets you specify any other properties available for attachments in the Mattermost API (see https://docs.mattermost.com/developer/message-attachments.html). + # This hash is deep merged with the existing properties set using the other properties above. This allows your own fields properties to be appended to the existing fields that were created using the `payload` property for instance. + thumb_url: "http://example.com/path/to/thumb.png", + fields: [{ + title: "My Field", + value: "My Value", + short: true + }] + } + )' + ] + end + + def self.category + :notifications + end + + def self.details + "Create an Incoming WebHook and export this as `MATTERMOST_URL`. Can send a message to **channel** (by default), a direct message to **@username** or a message to a private group **group** with success (green) or failure (red) status." + end + + ##################################################### + # @!group Helper + ##################################################### + + def self.generate_mattermost_attachments(options) + color = (options[:success] ? 'good' : 'danger') + should_add_payload = ->(payload_name) { options[:default_payloads].nil? || options[:default_payloads].join(" ").include?(payload_name.to_s) } + + mattermost_attachment = { + fallback: options[:message], + pretext: options[:pretext], + text: options[:message], + color: color, + fields: [] + } + + # custom user payloads + mattermost_attachment[:fields] += options[:payload].map do |k, v| + { + title: k.to_s, + value: Slack::Notifier::LinkFormatter.format(v.to_s), + short: false + } + end + + # Add the lane to the Mattermost message + # This might be nil, if mattermost is called as "one-off" action + if should_add_payload[:lane] && Actions.lane_context[Actions::SharedValues::LANE_NAME] + mattermost_attachment[:fields] << { + title: 'Lane', + value: Actions.lane_context[Actions::SharedValues::LANE_NAME], + short: true + } + end + + # test_result + if should_add_payload[:test_result] + mattermost_attachment[:fields] << { + title: 'Result', + value: (options[:success] ? 'Success' : 'Error'), + short: true + } + end + + # git branch + if Actions.git_branch && should_add_payload[:git_branch] + mattermost_attachment[:fields] << { + title: 'Git Branch', + value: Actions.git_branch, + short: true + } + end + + # git_author + if Actions.git_author_email && should_add_payload[:git_author] + if FastlaneCore::Env.truthy?('FASTLANE_MATTERMOST_HIDE_AUTHOR_ON_SUCCESS') && options[:success] + # We only show the git author if the build failed + else + mattermost_attachment[:fields] << { + title: 'Git Author', + value: Actions.git_author_email, + short: true + } + end + end + + # last_git_commit + if Actions.last_git_commit_message && should_add_payload[:last_git_commit] + mattermost_attachment[:fields] << { + title: 'Git Commit', + value: Actions.last_git_commit_message, + short: false + } + end + + # merge additional properties + deep_merge(mattermost_attachment, options[:attachment_properties]) + end + + # Adapted from https://stackoverflow.com/a/30225093/158525 + def self.deep_merge(a, b) + merger = proc do |key, v1, v2| + Hash === v1 && Hash === v2 ? + v1.merge(v2, &merger) : Array === v1 && Array === v2 ? + v1 | v2 : [:undefined, nil, :nil].include?(v2) ? v1 : v2 + end + a.merge(b, &merger) + end + end + end +end +# rubocop:enable Style/CaseEquality +# rubocop:enable Style/MultilineTernaryOperator +# rubocop:enable Style/NestedTernaryOperator diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt new file mode 100644 index 000000000..7186ef071 --- /dev/null +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -0,0 +1,13 @@ +Mattermost is secure, workplace messaging from behind your firewall. + +- Discuss topics in private groups, one-to-one or team-wide +- Find what you're looking for with full text search, filters and #hashtags +- Easily share images, video, audio and files +- Personalize your experience with custom colors, formatting and fonts +- Connect in-house systems with webhooks and Slack-compatible integrations + +To use this app, you need a "Team URL" from a Mattermost server. To host your own server go to http://www.mattermost.org/download/ + +Find the Terms of Service for this app here: https://about.mattermost.com/terms + +This is a reference implementation of an open source Mattermost Android app available at: https://github.com/mattermost/android \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png new file mode 100644 index 000000000..2c60a2287 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/icon.png differ diff --git a/fastlane/metadata/android/en-US/images/promoGraphic.png b/fastlane/metadata/android/en-US/images/promoGraphic.png new file mode 100644 index 000000000..b1e7c97eb Binary files /dev/null and b/fastlane/metadata/android/en-US/images/promoGraphic.png differ diff --git a/fastlane/metadata/android/en-US/images/tvBanner.png b/fastlane/metadata/android/en-US/images/tvBanner.png new file mode 100644 index 000000000..1542740fc Binary files /dev/null and b/fastlane/metadata/android/en-US/images/tvBanner.png differ diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt new file mode 100644 index 000000000..e4ad44b77 --- /dev/null +++ b/fastlane/metadata/android/en-US/short_description.txt @@ -0,0 +1 @@ +Secure, self-hosted workplace messaging \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/title.txt b/fastlane/metadata/android/en-US/title.txt new file mode 100644 index 000000000..bc3119a67 --- /dev/null +++ b/fastlane/metadata/android/en-US/title.txt @@ -0,0 +1 @@ +Mattermost RN \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/video.txt b/fastlane/metadata/android/en-US/video.txt new file mode 100644 index 000000000..e69de29bb diff --git a/fastlane/metadata/copyright.txt b/fastlane/metadata/copyright.txt new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/fastlane/metadata/copyright.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/en-US/description.txt b/fastlane/metadata/en-US/description.txt new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/fastlane/metadata/en-US/description.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/en-US/keywords.txt b/fastlane/metadata/en-US/keywords.txt new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/fastlane/metadata/en-US/keywords.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/en-US/marketing_url.txt b/fastlane/metadata/en-US/marketing_url.txt new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/fastlane/metadata/en-US/marketing_url.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/en-US/name.txt b/fastlane/metadata/en-US/name.txt new file mode 100644 index 000000000..d9dac7276 --- /dev/null +++ b/fastlane/metadata/en-US/name.txt @@ -0,0 +1 @@ +Mattermost RN diff --git a/fastlane/metadata/en-US/privacy_url.txt b/fastlane/metadata/en-US/privacy_url.txt new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/fastlane/metadata/en-US/privacy_url.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/en-US/release_notes.txt b/fastlane/metadata/en-US/release_notes.txt new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/fastlane/metadata/en-US/release_notes.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/en-US/support_url.txt b/fastlane/metadata/en-US/support_url.txt new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/fastlane/metadata/en-US/support_url.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/primary_category.txt b/fastlane/metadata/primary_category.txt new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/fastlane/metadata/primary_category.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/primary_first_sub_category.txt b/fastlane/metadata/primary_first_sub_category.txt new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/fastlane/metadata/primary_first_sub_category.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/primary_second_sub_category.txt b/fastlane/metadata/primary_second_sub_category.txt new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/fastlane/metadata/primary_second_sub_category.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/secondary_category.txt b/fastlane/metadata/secondary_category.txt new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/fastlane/metadata/secondary_category.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/secondary_first_sub_category.txt b/fastlane/metadata/secondary_first_sub_category.txt new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/fastlane/metadata/secondary_first_sub_category.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/secondary_second_sub_category.txt b/fastlane/metadata/secondary_second_sub_category.txt new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/fastlane/metadata/secondary_second_sub_category.txt @@ -0,0 +1 @@ + diff --git a/fastlane/screenshots/README.txt b/fastlane/screenshots/README.txt new file mode 100644 index 000000000..8b015ec56 --- /dev/null +++ b/fastlane/screenshots/README.txt @@ -0,0 +1,7 @@ +Put all screenshots you want to use inside the folder of its language (e.g. en-US). +The device type will automatically be recognized using the image resolution. Apple TV screenshots +should be stored in a subdirectory named appleTV with language folders inside of it. iMessage +screenshots, like Apple TV screenshots, should also be stored in a subdirectory named iMessage +with language folders inside of it. + +The screenshots can be named whatever you want, but keep in mind they are sorted alphabetically. diff --git a/ios/Mattermost.xcodeproj/project.pbxproj b/ios/Mattermost.xcodeproj/project.pbxproj index 8c7b185cf..7dc834084 100644 --- a/ios/Mattermost.xcodeproj/project.pbxproj +++ b/ios/Mattermost.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 */; }; @@ -17,20 +18,24 @@ 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 */; }; - 1EA2B0031DB7E9620013B2DB /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1EA2AFFB1DB7E9620013B2DB /* Entypo.ttf */; }; - 1EA2B0041DB7E9620013B2DB /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1EA2AFFC1DB7E9620013B2DB /* EvilIcons.ttf */; }; - 1EA2B0051DB7E9620013B2DB /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1EA2AFFD1DB7E9620013B2DB /* FontAwesome.ttf */; }; - 1EA2B0061DB7E9620013B2DB /* Foundation.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1EA2AFFE1DB7E9620013B2DB /* Foundation.ttf */; }; - 1EA2B0071DB7E9620013B2DB /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1EA2AFFF1DB7E9620013B2DB /* Ionicons.ttf */; }; - 1EA2B0081DB7E9620013B2DB /* MaterialIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1EA2B0001DB7E9620013B2DB /* MaterialIcons.ttf */; }; - 1EA2B0091DB7E9620013B2DB /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1EA2B0011DB7E9620013B2DB /* Octicons.ttf */; }; - 1EA2B00A1DB7E9620013B2DB /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1EA2B0021DB7E9620013B2DB /* Zocial.ttf */; }; - 7F55909D1DE33E62008E7FC5 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 1BCA51319AC6442991C6A208 /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0A091BF1A3D04650AD306A0D /* Zocial.ttf */; }; + 2B4C9B708010475DA575B81D /* SimpleLineIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F1F071EE85494E269A50AE88 /* SimpleLineIcons.ttf */; }; + 382D94CF15EE4FC292C3F341 /* Foundation.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 51F5A483EA9F4A9A87ACFB59 /* Foundation.ttf */; }; + 3D38ABA732A34A9BB3294F90 /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 349FBA7338E74D9BBD709528 /* EvilIcons.ttf */; }; + 420A7328E12C4B72AEF420CE /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EDC04CBCF81642219D199CBB /* Octicons.ttf */; }; + 5E1AF7B72B8D4A4E9E53FF9D /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 005346E5C0E542BFABAE1411 /* FontAwesome.ttf */; }; + 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; + 7FBB5E9A1E1F5A4B000DE18A /* libRNSVG.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7FDF28E11E1F4B1F00DBBE56 /* libRNSVG.a */; }; + 7FBB5E9B1E1F5A4B000DE18A /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7FDF290C1E1F4B4E00DBBE56 /* libRNVectorIcons.a */; }; 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; - 6D451C9F2CCA47089433C8C5 /* libRNSVG.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 054B6299E0894F978806187D /* libRNSVG.a */; }; + 895C9A56B94A45C1BAF568FE /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AC6EB561E1F64C17A69D2FAD /* Entypo.ttf */; }; + C035DB50ED2045F09923FFAE /* MaterialCommunityIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 04AA5E8EF3B54735A11E3B95 /* MaterialCommunityIcons.ttf */; }; + C337E8708D2845C6A8DBB47E /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2DCFD31D3F4A4154822AB532 /* Ionicons.ttf */; }; + F006936FC2884C24A1321FC0 /* MaterialIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 356C9186FA374641A00EB2EA /* MaterialIcons.ttf */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -97,6 +102,111 @@ remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; remoteInfo = React; }; + 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 */; @@ -104,6 +214,20 @@ remoteGlobalIDString = 134814201AA4EA6300B7C361; remoteInfo = RCTLinking; }; + 7FDF28E01E1F4B1F00DBBE56 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 2CBE9C0FB56E4FDA96C30792 /* RNSVG.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 0CF68AC11AF0540F00FF9E5C; + remoteInfo = RNSVG; + }; + 7FDF290B1E1F4B4E00DBBE56 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 2B25899FDAC149EB96ED3305 /* RNVectorIcons.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 5DBEB1501B18CEA900B34395; + remoteInfo = RNVectorIcons; + }; 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; @@ -114,7 +238,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; + 005346E5C0E542BFABAE1411 /* 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 = ""; }; 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 = ""; }; @@ -123,6 +247,8 @@ 00E356EE1AD99517003FC87E /* MattermostTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MattermostTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 00E356F21AD99517003FC87E /* MattermostTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MattermostTests.m; sourceTree = ""; }; + 04AA5E8EF3B54735A11E3B95 /* 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 = ""; }; + 0A091BF1A3D04650AD306A0D /* 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 = ""; }; 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 /* Mattermost.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Mattermost.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -133,18 +259,18 @@ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Mattermost/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Mattermost/main.m; sourceTree = ""; }; 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; - 1EA2AFFB1DB7E9620013B2DB /* Entypo.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Entypo.ttf; sourceTree = ""; }; - 1EA2AFFC1DB7E9620013B2DB /* EvilIcons.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = EvilIcons.ttf; sourceTree = ""; }; - 1EA2AFFD1DB7E9620013B2DB /* FontAwesome.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = FontAwesome.ttf; sourceTree = ""; }; - 1EA2AFFE1DB7E9620013B2DB /* Foundation.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Foundation.ttf; sourceTree = ""; }; - 1EA2AFFF1DB7E9620013B2DB /* Ionicons.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Ionicons.ttf; sourceTree = ""; }; - 1EA2B0001DB7E9620013B2DB /* MaterialIcons.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = MaterialIcons.ttf; sourceTree = ""; }; - 1EA2B0011DB7E9620013B2DB /* Octicons.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Octicons.ttf; sourceTree = ""; }; - 1EA2B0021DB7E9620013B2DB /* Zocial.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Zocial.ttf; sourceTree = ""; }; + 2B25899FDAC149EB96ED3305 /* 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 = ""; }; + 2CBE9C0FB56E4FDA96C30792 /* 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 = ""; }; + 2DCFD31D3F4A4154822AB532 /* 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 = ""; }; + 349FBA7338E74D9BBD709528 /* 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 = ""; }; + 356C9186FA374641A00EB2EA /* 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 = ""; }; + 51F5A483EA9F4A9A87ACFB59 /* 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 = ""; }; + 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 = ""; }; - EFA9957A8DD4430C85C9D4D5 /* RNSVG.xcodeproj */ = {isa = PBXFileReference; name = "RNSVG.xcodeproj"; path = "../node_modules/react-native-svg/ios/RNSVG.xcodeproj"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; }; - 054B6299E0894F978806187D /* libRNSVG.a */ = {isa = PBXFileReference; name = "libRNSVG.a"; path = "libRNSVG.a"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; }; + AC6EB561E1F64C17A69D2FAD /* 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 = ""; }; + EDC04CBCF81642219D199CBB /* 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 = ""; }; + F1F071EE85494E269A50AE88 /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -160,6 +286,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 7FBB5E9A1E1F5A4B000DE18A /* libRNSVG.a in Frameworks */, + 7FBB5E9B1E1F5A4B000DE18A /* libRNVectorIcons.a in Frameworks */, + 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */, 146834051AC3E58100842450 /* libReact.a in Frameworks */, 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, @@ -170,7 +299,6 @@ 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, - 6D451C9F2CCA47089433C8C5 /* libRNSVG.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -197,6 +325,7 @@ isa = PBXGroup; children = ( 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, + 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */, ); name = Products; sourceTree = ""; @@ -205,6 +334,7 @@ isa = PBXGroup; children = ( 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, + 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */, ); name = Products; sourceTree = ""; @@ -234,10 +364,28 @@ name = "Supporting Files"; sourceTree = ""; }; + 0156F464626F49C2977D7982 /* Resources */ = { + isa = PBXGroup; + children = ( + AC6EB561E1F64C17A69D2FAD /* Entypo.ttf */, + 349FBA7338E74D9BBD709528 /* EvilIcons.ttf */, + 005346E5C0E542BFABAE1411 /* FontAwesome.ttf */, + 51F5A483EA9F4A9A87ACFB59 /* Foundation.ttf */, + 2DCFD31D3F4A4154822AB532 /* Ionicons.ttf */, + 04AA5E8EF3B54735A11E3B95 /* MaterialCommunityIcons.ttf */, + 356C9186FA374641A00EB2EA /* MaterialIcons.ttf */, + EDC04CBCF81642219D199CBB /* Octicons.ttf */, + F1F071EE85494E269A50AE88 /* SimpleLineIcons.ttf */, + 0A091BF1A3D04650AD306A0D /* Zocial.ttf */, + ); + name = Resources; + sourceTree = ""; + }; 139105B71AF99BAD00B5F7CC /* Products */ = { isa = PBXGroup; children = ( 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, + 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */, ); name = Products; sourceTree = ""; @@ -246,6 +394,7 @@ isa = PBXGroup; children = ( 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, + 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */, ); name = Products; sourceTree = ""; @@ -253,7 +402,6 @@ 13B07FAE1A68108700A75B9A /* Mattermost */ = { isa = PBXGroup; children = ( - 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 13B07FB01A68108700A75B9A /* AppDelegate.m */, 13B07FB51A68108700A75B9A /* Images.xcassets */, @@ -268,29 +416,47 @@ 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 = ""; }; - 1EA2AFFA1DB7E9620013B2DB /* Fonts */ = { + 5E91572E1DD0AC6500FF2AA8 /* Products */ = { isa = PBXGroup; children = ( - 1EA2AFFB1DB7E9620013B2DB /* Entypo.ttf */, - 1EA2AFFC1DB7E9620013B2DB /* EvilIcons.ttf */, - 1EA2AFFD1DB7E9620013B2DB /* FontAwesome.ttf */, - 1EA2AFFE1DB7E9620013B2DB /* Foundation.ttf */, - 1EA2AFFF1DB7E9620013B2DB /* Ionicons.ttf */, - 1EA2B0001DB7E9620013B2DB /* MaterialIcons.ttf */, - 1EA2B0011DB7E9620013B2DB /* Octicons.ttf */, - 1EA2B0021DB7E9620013B2DB /* Zocial.ttf */, + 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */, + 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */, ); - path = Fonts; + name = Products; sourceTree = ""; }; 78C398B11ACF4ADC00677621 /* Products */ = { isa = PBXGroup; children = ( 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, + 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 7FDF28C41E1F4B1F00DBBE56 /* Products */ = { + isa = PBXGroup; + children = ( + 7FDF28E11E1F4B1F00DBBE56 /* libRNSVG.a */, + ); + name = Products; + sourceTree = ""; + }; + 7FDF28EE1E1F4B4E00DBBE56 /* Products */ = { + isa = PBXGroup; + children = ( + 7FDF290C1E1F4B4E00DBBE56 /* libRNVectorIcons.a */, ); name = Products; sourceTree = ""; @@ -298,6 +464,7 @@ 832341AE1AAA6A7D00B99B32 /* Libraries */ = { isa = PBXGroup; children = ( + 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */, 146833FF1AC3E56700842450 /* React.xcodeproj */, 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, @@ -308,7 +475,8 @@ 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, - EFA9957A8DD4430C85C9D4D5 /* RNSVG.xcodeproj */, + 2CBE9C0FB56E4FDA96C30792 /* RNSVG.xcodeproj */, + 2B25899FDAC149EB96ED3305 /* RNVectorIcons.xcodeproj */, ); name = Libraries; sourceTree = ""; @@ -317,6 +485,7 @@ isa = PBXGroup; children = ( 832341B51AAA6A8300B99B32 /* libRCTText.a */, + 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */, ); name = Products; sourceTree = ""; @@ -324,11 +493,11 @@ 83CBB9F61A601CBA00E9B192 = { isa = PBXGroup; children = ( - 1EA2AFFA1DB7E9620013B2DB /* Fonts */, 13B07FAE1A68108700A75B9A /* Mattermost */, 832341AE1AAA6A7D00B99B32 /* Libraries */, 00E356EF1AD99517003FC87E /* MattermostTests */, 83CBBA001A601CBA00E9B192 /* Products */, + 0156F464626F49C2977D7982 /* Resources */, ); indentWidth = 2; sourceTree = ""; @@ -388,13 +557,16 @@ 83CBB9F71A601CBA00E9B192 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 810; + LastUpgradeCheck = 820; ORGANIZATIONNAME = Facebook; TargetAttributes = { 00E356ED1AD99517003FC87E = { CreatedOnToolsVersion = 6.2; TestTargetID = 13B07F861A680F5B00A75B9A; }; + 13B07F861A680F5B00A75B9A = { + ProvisioningStyle = Automatic; + }; }; }; buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Mattermost" */; @@ -413,6 +585,10 @@ ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; }, + { + ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */; + ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; + }, { ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; @@ -449,6 +625,14 @@ ProductGroup = 146834001AC3E56700842450 /* Products */; ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; }, + { + ProductGroup = 7FDF28C41E1F4B1F00DBBE56 /* Products */; + ProjectRef = 2CBE9C0FB56E4FDA96C30792 /* RNSVG.xcodeproj */; + }, + { + ProductGroup = 7FDF28EE1E1F4B4E00DBBE56 /* Products */; + ProjectRef = 2B25899FDAC149EB96ED3305 /* RNVectorIcons.xcodeproj */; + }, ); projectRoot = ""; targets = ( @@ -515,6 +699,111 @@ 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; @@ -522,6 +811,20 @@ remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 7FDF28E11E1F4B1F00DBBE56 /* libRNSVG.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNSVG.a; + remoteRef = 7FDF28E01E1F4B1F00DBBE56 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 7FDF290C1E1F4B4E00DBBE56 /* libRNVectorIcons.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNVectorIcons.a; + remoteRef = 7FDF290B1E1F4B4E00DBBE56 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -543,16 +846,18 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1EA2B0081DB7E9620013B2DB /* MaterialIcons.ttf in Resources */, - 7F55909D1DE33E62008E7FC5 /* Images.xcassets in Resources */, - 1EA2B0091DB7E9620013B2DB /* Octicons.ttf in Resources */, - 1EA2B00A1DB7E9620013B2DB /* Zocial.ttf in Resources */, - 1EA2B0051DB7E9620013B2DB /* FontAwesome.ttf in Resources */, - 1EA2B0041DB7E9620013B2DB /* EvilIcons.ttf in Resources */, - 1EA2B0071DB7E9620013B2DB /* Ionicons.ttf in Resources */, - 1EA2B0061DB7E9620013B2DB /* Foundation.ttf in Resources */, - 1EA2B0031DB7E9620013B2DB /* Entypo.ttf in Resources */, + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, + 895C9A56B94A45C1BAF568FE /* Entypo.ttf in Resources */, + 3D38ABA732A34A9BB3294F90 /* EvilIcons.ttf in Resources */, + 5E1AF7B72B8D4A4E9E53FF9D /* FontAwesome.ttf in Resources */, + 382D94CF15EE4FC292C3F341 /* Foundation.ttf in Resources */, + C337E8708D2845C6A8DBB47E /* Ionicons.ttf in Resources */, + C035DB50ED2045F09923FFAE /* MaterialCommunityIcons.ttf in Resources */, + F006936FC2884C24A1321FC0 /* MaterialIcons.ttf in Resources */, + 420A7328E12C4B72AEF420CE /* Octicons.ttf in Resources */, + 2B4C9B708010475DA575B81D /* SimpleLineIcons.ttf in Resources */, + 1BCA51319AC6442991C6A208 /* Zocial.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -620,6 +925,7 @@ isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; + DEVELOPMENT_TEAM = ""; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", @@ -627,13 +933,14 @@ INFOPLIST_FILE = MattermostTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Mattermost.app/Mattermost"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Mattermost.app/Mattermost"; }; name = Debug; }; @@ -642,16 +949,18 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; COPY_PHASE_STRIP = NO; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = MattermostTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Mattermost.app/Mattermost"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Mattermost.app/Mattermost"; }; name = Release; }; @@ -659,14 +968,10 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 5; DEAD_CODE_STRIPPING = NO; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../node_modules/react-native/React/**", - "$(SRCROOT)/../node_modules/react-native-svg/ios/**", - ); + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = Mattermost/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( @@ -674,8 +979,10 @@ "-ObjC", "-lc++", ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_BUNDLE_IDENTIFIER = com.mattermost.react.native; PRODUCT_NAME = Mattermost; + PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -684,13 +991,10 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../node_modules/react-native/React/**", - "$(SRCROOT)/../node_modules/react-native-svg/ios/**", - ); + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 5; + DEAD_CODE_STRIPPING = NO; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = Mattermost/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( @@ -698,8 +1002,10 @@ "-ObjC", "-lc++", ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_BUNDLE_IDENTIFIER = com.mattermost.react.native; PRODUCT_NAME = Mattermost; + PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; @@ -742,12 +1048,6 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../node_modules/react-native/React/**", - "$(SRCROOT)/../node_modules/react-native-svg/ios/**", - ); IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; @@ -786,12 +1086,6 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../node_modules/react-native/React/**", - "$(SRCROOT)/../node_modules/react-native-svg/ios/**", - ); IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; diff --git a/ios/Mattermost.xcodeproj/xcshareddata/xcschemes/Mattermost.xcscheme b/ios/Mattermost.xcodeproj/xcshareddata/xcschemes/Mattermost.xcscheme index d45899dd1..d389d9b75 100644 --- a/ios/Mattermost.xcodeproj/xcshareddata/xcschemes/Mattermost.xcscheme +++ b/ios/Mattermost.xcodeproj/xcshareddata/xcschemes/Mattermost.xcscheme @@ -1,11 +1,25 @@ + + + + +#import @implementation AppDelegate diff --git a/ios/Mattermost/Info.plist b/ios/Mattermost/Info.plist index e20309672..b1e0579e3 100644 --- a/ios/Mattermost/Info.plist +++ b/ios/Mattermost/Info.plist @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 1 + 5 LSRequiresIPhoneOS NSAppTransportSecurity @@ -28,7 +28,7 @@ localhost - NSTemporaryExceptionAllowsInsecureHTTPLoads + NSExceptionAllowsInsecureHTTPLoads @@ -45,6 +45,16 @@ MaterialIcons.ttf Octicons.ttf Zocial.ttf + Entypo.ttf + EvilIcons.ttf + FontAwesome.ttf + Foundation.ttf + Ionicons.ttf + MaterialCommunityIcons.ttf + MaterialIcons.ttf + Octicons.ttf + SimpleLineIcons.ttf + Zocial.ttf UILaunchStoryboardName LaunchScreen @@ -60,5 +70,7 @@ UIViewControllerBasedStatusBarAppearance + ITSAppUsesNonExemptEncryption + diff --git a/ios/MattermostTests/Info.plist b/ios/MattermostTests/Info.plist index ba72822e8..11a3c5782 100644 --- a/ios/MattermostTests/Info.plist +++ b/ios/MattermostTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1 + 5 diff --git a/ios/MattermostTests/MattermostTests.m b/ios/MattermostTests/MattermostTests.m index 18a1993c3..32b40bbb4 100644 --- a/ios/MattermostTests/MattermostTests.m +++ b/ios/MattermostTests/MattermostTests.m @@ -10,8 +10,8 @@ #import #import -#import "RCTLog.h" -#import "RCTRootView.h" +#import +#import #define TIMEOUT_SECONDS 600 #define TEXT_TO_LOOK_FOR @"Welcome to React Native!" diff --git a/package.json b/package.json index 43166e1c0..1b31e5449 100644 --- a/package.json +++ b/package.json @@ -5,38 +5,38 @@ "dependencies": { "intl": "1.2.5", "isomorphic-fetch": "2.2.1", - "react": "15.3.2", - "react-addons-pure-render-mixin": "15.3.2", - "react-intl": "2.1.5", - "react-native": "0.34.1", + "react": "15.4.1", + "react-addons-pure-render-mixin": "15.4.1", + "react-intl": "2.2.2", + "react-native": "0.40.0", "react-native-button": "1.7.1", "react-native-drawer": "2.3.0", - "react-native-keyboard-spacer": "0.3.0", - "react-native-svg": "4.3.3", - "react-native-vector-icons": "2.1.0", - "react-redux": "4.4.5", + "react-native-keyboard-spacer": "0.3.1", + "react-native-svg": "4.5.0", + "react-native-vector-icons": "4.0.0", + "react-redux": "5.0.1", "redux": "3.6.0", - "redux-batched-actions": "0.1.3", + "redux-batched-actions": "0.1.5", "redux-thunk": "2.1.0", "reselect": "2.5.4" }, "devDependencies": { - "babel-eslint": "7.0.0", + "babel-eslint": "7.1.1", "babel-plugin-module-resolver": "2.4.0", "babel-preset-es2015": "6.18.0", - "babel-preset-react-native": "1.9.0", - "babel-register": "6.16.3", + "babel-preset-react-native": "1.9.1", + "babel-register": "6.18.0", "deep-freeze": "0.0.1", - "eslint": "3.7.1", - "eslint-plugin-mocha": "4.7.0", - "eslint-plugin-react": "6.3.0", - "fetch-mock": "5.5.0", - "mocha": "3.1.0", - "react-native-mock": "0.2.7", - "react-test-renderer": "15.3.2", - "redux-logger": "2.7.0", - "remote-redux-devtools": "0.5.0", - "remote-redux-devtools-on-debugger": "0.6.2", + "eslint": "3.12.2", + "eslint-plugin-mocha": "4.8.0", + "eslint-plugin-react": "6.8.0", + "fetch-mock": "5.8.1", + "mocha": "3.2.0", + "react-native-mock": "0.2.9", + "react-test-renderer": "15.4.1", + "redux-logger": "2.7.4", + "remote-redux-devtools": "0.5.7", + "remote-redux-devtools-on-debugger": "0.7.0", "ws": "1.1.1" }, "scripts": {