diff --git a/NOTICE.txt b/NOTICE.txt index d7636f2d7..96d68a2d2 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -8,6 +8,8 @@ This document includes a list of open source components used in Mattermost Mobil -------- +## fbjs + This product contains a modified portion of 'fbjs', a collection of JavaScript utilities by Facebook, Inc. * HOMEPAGE: @@ -49,6 +51,39 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --- +## react-native-search-bar + +This product contains a modified portion of 'react-native-search-bar', a high-quality iOS native search bar for react native by Zhao Han. + +* HOMEPAGE: + * https://github.com/umhan35/react-native-search-bar + +* LICENSE: + +The MIT License (MIT) + +Copyright (c) 2015-2016 Zhao Han + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +--- + ## harmony-reflect [Note: the software referenced below is made available under two licenses. Mattermost, Inc. has elected to license the software pursuant to the Apache License, Version 2.0.] diff --git a/app/components/channel_list/channel_list.js b/app/components/channel_list/channel_list.js index 4f74b8664..5a4c31310 100644 --- a/app/components/channel_list/channel_list.js +++ b/app/components/channel_list/channel_list.js @@ -3,7 +3,7 @@ import React from 'react'; -import {Alert, StyleSheet, Text, View, ListView} from 'react-native'; +import {Alert, ListView, Platform, StyleSheet, Text, View} from 'react-native'; import {injectIntl, intlShape} from 'react-intl'; import {buildDisplayNameAndTypeComparable} from 'service/utils/channel_utils'; import {Constants} from 'service/constants'; @@ -16,7 +16,11 @@ import deepEqual from 'deep-equal'; const Styles = StyleSheet.create({ container: { flex: 1, - marginTop: 20 + ...Platform.select({ + ios: { + marginTop: 20 + } + }) }, scrollContainer: { flex: 1 diff --git a/app/components/search_bar/index.js b/app/components/search_bar/index.js new file mode 100644 index 000000000..c71f19405 --- /dev/null +++ b/app/components/search_bar/index.js @@ -0,0 +1,6 @@ +// Copyright (c) 2017 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +// Used to leverage the platform specific components +import SearchBar from './search_bar'; +export default SearchBar; diff --git a/app/components/search_bar/search_bar.android.js b/app/components/search_bar/search_bar.android.js new file mode 100644 index 000000000..3c5142548 --- /dev/null +++ b/app/components/search_bar/search_bar.android.js @@ -0,0 +1,173 @@ +// Copyright (c) 2017 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. +import React, {PropTypes, PureComponent} from 'react'; +import { + Keyboard, + TextInput, + StyleSheet, + View, + TouchableOpacity +} from 'react-native'; +import Icon from 'react-native-vector-icons/MaterialIcons'; + +const styles = StyleSheet.create({ + searchBar: { + flexDirection: 'row', + alignItems: 'center', + backgroundColor: 'transparent', + margin: 8 + }, + searchBarInput: { + flex: 1, + fontWeight: 'normal', + backgroundColor: 'transparent' + } +}); + +export default class SearchBarAndroid extends PureComponent { + static propTypes = { + height: PropTypes.number.isRequired, + fontSize: PropTypes.number.isRequired, + text: PropTypes.string, + placeholder: PropTypes.string, + showCancelButton: PropTypes.bool, + textFieldBackgroundColor: PropTypes.string, + placeholderTextColor: PropTypes.string, + textColor: PropTypes.string, + onChange: PropTypes.func, + onChangeText: PropTypes.func, + onFocus: PropTypes.func, + onBlur: PropTypes.func, + onSearchButtonPress: PropTypes.func, + onCancelButtonPress: PropTypes.func + }; + + static defaultProps = { + placeholder: 'Search', + showCancelButton: true, + placeholderTextColor: '#bdbdbd', + textColor: '#212121', + onSearchButtonPress: () => true, + onCancelButtonPress: () => true, + onChangeText: () => true, + onFocus: () => true, + onBlur: () => true + }; + + constructor(props) { + super(props); + this.state = { + isOnFocus: false, + value: this.props.text + }; + this.onFocus = this.onFocus.bind(this); + this.onBlur = this.onBlur.bind(this); + this.onCancelButtonPress = this.onCancelButtonPress.bind(this); + this.onSearchButtonPress = this.onSearchButtonPress.bind(this); + this.onChangeText = this.onChangeText.bind(this); + } + + onSearchButtonPress() { + const onSearchButtonPress = this.props.onSearchButtonPress; + if (this.state.value) { + onSearchButtonPress(this.state.value); + } + } + + onCancelButtonPress() { + const onCancelButtonPress = this.props.onCancelButtonPress; + this.setState({ + isOnFocus: false, + value: '' + }); + + onCancelButtonPress(); + Keyboard.dismiss(); + } + + onChangeText(value) { + const onChangeText = this.props.onChangeText; + this.setState({value}); + onChangeText(value); + } + + onFocus() { + const onFocus = this.props.onFocus; + this.setState({isOnFocus: true}); + onFocus(); + } + + onBlur() { + const onBlur = this.props.onBlur; + this.setState({isOnFocus: false}); + onBlur(); + Keyboard.dismiss(); + } + + render() { + const { + height, + placeholder, + fontSize, + placeholderTextColor, + textColor, + textFieldBackgroundColor + } = this.props; + + const searchBarStyle = { + height: height + 10, + paddingLeft: height * 0.25, + backgroundColor: textFieldBackgroundColor + }; + + const inputStyle = { + paddingLeft: height * 0.5, + fontSize, + color: textColor + }; + + return ( + + {this.state.isOnFocus && this.props.showCancelButton ? + + + : + + } + + {this.state.isOnFocus && this.state.value ? + this.setState({value: ''})}> + + : null + } + + ); + } +} diff --git a/app/components/search_bar/search_bar.ios.js b/app/components/search_bar/search_bar.ios.js new file mode 100644 index 000000000..f55c0c66a --- /dev/null +++ b/app/components/search_bar/search_bar.ios.js @@ -0,0 +1,86 @@ +// Copyright (c) 2017 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. +import React, {PropTypes, PureComponent} from 'react'; +import SearchBar from 'react-native-search-bar'; + +export default class SearchBarIos extends PureComponent { + static propTypes = { + barStyle: PropTypes.oneOf(['default', 'black']), + searchBarStyle: PropTypes.oneOf(['default', 'prominent', 'minimal']), + text: PropTypes.string, + placeholder: PropTypes.string, + showCancelButton: PropTypes.bool, + hideBackground: PropTypes.bool, + textFieldBackgroundColor: PropTypes.string, + placeholderTextColor: PropTypes.string, + textColor: PropTypes.string, + barTintColor: PropTypes.string, //color of the background container + tintColor: PropTypes.string, // color of the carret and the cancel button + onChange: PropTypes.func, + onChangeText: PropTypes.func, + onFocus: PropTypes.func, + onBlur: PropTypes.func, + onSearchButtonPress: PropTypes.func, + onCancelButtonPress: PropTypes.func + }; + + static defaultProps = { + barStyle: 'default', + searchBarStyle: 'default', + placeholder: 'Search', + showCancelButton: true, + hideBackground: true, + onFocus: () => true, + onBlur: () => true + }; + + constructor(props) { + super(props); + + this.state = { + displayCancelButton: false + }; + } + + onFocus = (event) => { + const onFocus = this.props.onFocus; + if (this.props.showCancelButton) { + this.setState({displayCancelButton: true}); + } + + onFocus(event); + }; + + onBlur = (event) => { + const onBlur = this.props.onBlur; + if (this.props.showCancelButton) { + this.setState({displayCancelButton: false}); + } + + onBlur(event); + }; + + render() { + return ( + + ); + } +} diff --git a/app/components/text_input_with_localized_placeholder.js b/app/components/text_input_with_localized_placeholder.js index a0688d9e7..f19c939eb 100644 --- a/app/components/text_input_with_localized_placeholder.js +++ b/app/components/text_input_with_localized_placeholder.js @@ -14,16 +14,24 @@ class TextInputWithLocalizedPlaceholder extends React.PureComponent { blur = () => { this.refs.input.blur(); - } + }; + + focus = () => { + this.refs.input.focus(); + }; render() { const {intl, placeholder, ...otherProps} = this.props; + let placeholderString = ''; + if (placeholder.id) { + placeholderString = intl.formatMessage(placeholder); + } return ( ); } diff --git a/app/scenes/channel/channel_header/channel_header.js b/app/scenes/channel/channel_header/channel_header.js index 8175bf949..25ae5d827 100644 --- a/app/scenes/channel/channel_header/channel_header.js +++ b/app/scenes/channel/channel_header/channel_header.js @@ -4,6 +4,7 @@ import React from 'react'; import { Text, + Platform, TouchableHighlight, View } from 'react-native'; @@ -24,8 +25,19 @@ export default class ChannelHeader extends React.PureComponent { theme } = this.props; + const containerStyle = { + backgroundColor: theme.sidebarHeaderBg, + flexDirection: 'row', + justifyContent: 'flex-start', + ...Platform.select({ + ios: { + marginTop: 20 + } + }) + }; + return ( - + { + this.loginId.blur(); + this.passwd.blur(); + }; + preSignIn = () => { this.setState({error: null}); if (!this.props.loginId) { @@ -152,52 +164,67 @@ class Login extends Component { return ( - - - {this.props.config.SiteName} - - - - - - + + + + + {this.props.config.SiteName} + + + + { + this.loginId = ref; + }} + value={this.props.loginId} + onChangeText={this.props.actions.handleLoginIdChanged} + style={GlobalStyles.inputBox} + placeholder={this.createLoginPlaceholder()} + autoCorrect={false} + autoCapitalize='none' + keyboardType='email-address' + returnKeyType='next' + underlineColorAndroid='transparent' + onSubmitEditing={() => { + this.passwd.focus(); + }} + /> + { + this.passwd = ref; + }} + value={this.props.password} + onChangeText={this.props.actions.handlePasswordChanged} + style={GlobalStyles.inputBox} + placeholder={this.props.intl.formatMessage({id: 'login.password', defaultMessage: 'Password'})} + secureTextEntry={true} + autoCorrect={false} + autoCapitalize='none' + underlineColorAndroid='transparent' + returnKeyType='go' + onSubmitEditing={this.preSignIn} + /> + + + ); } diff --git a/app/scenes/mfa/mfa.js b/app/scenes/mfa/mfa.js index 880dac555..63ec5d143 100644 --- a/app/scenes/mfa/mfa.js +++ b/app/scenes/mfa/mfa.js @@ -2,7 +2,12 @@ // See License.txt for license information. import React, {Component} from 'react'; -import {Image, KeyboardAvoidingView} from 'react-native'; +import { + Image, + KeyboardAvoidingView, + TouchableWithoutFeedback, + View +} from 'react-native'; import Button from 'react-native-button'; import ErrorText from 'app/components/error_text'; @@ -49,6 +54,10 @@ export default class Mfa extends Component { }); }; + blur = () => { + this.textInput.refs.wrappedInstance.blur(); + }; + submit = () => { if (!this.state.token) { this.setState({ @@ -67,40 +76,48 @@ export default class Mfa extends Component { return ( - - - - - + + + + + + { + this.textInput = ref; + }} + value={this.state.token} + onChangeText={this.handleInput} + onSubmitEditing={this.submit} + style={GlobalStyles.inputBox} + autoCapitalize='none' + autoCorrect={false} + keyboardType='numeric' + placeholder={{id: 'login_mfa.token', defaultMessage: 'MFA Token'}} + returnKeyType='go' + underlineColorAndroid='transparent' + /> + + + ); } diff --git a/app/scenes/right_menu_drawer/right_menu_drawer.js b/app/scenes/right_menu_drawer/right_menu_drawer.js index fad51b302..448101eca 100644 --- a/app/scenes/right_menu_drawer/right_menu_drawer.js +++ b/app/scenes/right_menu_drawer/right_menu_drawer.js @@ -6,6 +6,7 @@ import { ScrollView, StyleSheet, Text, + Platform, View } from 'react-native'; import Icon from 'react-native-vector-icons/FontAwesome'; @@ -18,7 +19,11 @@ const Styles = StyleSheet.create({ container: { backgroundColor: '#2071a7', flex: 1, - paddingTop: 20 + ...Platform.select({ + ios: { + marginTop: 20 + } + }) }, itemText: { color: 'white' diff --git a/app/scenes/select_server/select_server.js b/app/scenes/select_server/select_server.js index c6662de30..853248f68 100644 --- a/app/scenes/select_server/select_server.js +++ b/app/scenes/select_server/select_server.js @@ -2,12 +2,17 @@ // See License.txt for license information. import React, {Component} from 'react'; -import {injectIntl, intlShape} from 'react-intl'; -import {TextInput, Image, KeyboardAvoidingView} from 'react-native'; +import { + Image, + KeyboardAvoidingView, + TouchableWithoutFeedback, + View +} from 'react-native'; import Button from 'react-native-button'; import ErrorText from 'app/components/error_text'; import FormattedText from 'app/components/formatted_text'; +import TextInputWithLocalizedPlaceholder from 'app/components/text_input_with_localized_placeholder'; import {GlobalStyles} from 'app/styles'; import logo from 'assets/images/logo.png'; @@ -15,9 +20,8 @@ import logo from 'assets/images/logo.png'; import Client from 'service/client'; import RequestStatus from 'service/constants/request_status'; -class SelectServer extends Component { +export default class SelectServer extends Component { static propTypes = { - intl: intlShape.isRequired, serverUrl: React.PropTypes.string.isRequired, server: React.PropTypes.object.isRequired, actions: React.PropTypes.object.isRequired @@ -33,49 +37,57 @@ class SelectServer extends Component { }); }; - render() { - const {formatMessage} = this.props.intl; + blur = () => { + this.textInput.refs.wrappedInstance.blur(); + }; + render() { return ( - - - - - + + + + + { + this.textInput = ref; + }} + value={this.props.serverUrl} + onChangeText={this.props.actions.handleServerUrlChanged} + onSubmitEditing={this.onClick} + style={GlobalStyles.inputBox} + autoCapitalize='none' + autoCorrect={false} + keyboardType='url' + placeholder={{id: 'mobile.components.select_server_view.siteUrlPlaceholder', defaultMessage: 'https://mattermost.example.com'}} + returnKeyType='go' + underlineColorAndroid='transparent' + /> + + + + ); } } - -export default injectIntl(SelectServer); diff --git a/ios/Mattermost.xcodeproj/project.pbxproj b/ios/Mattermost.xcodeproj/project.pbxproj index 37b4d2f2e..6f9d30ec6 100644 --- a/ios/Mattermost.xcodeproj/project.pbxproj +++ b/ios/Mattermost.xcodeproj/project.pbxproj @@ -33,6 +33,7 @@ 7FBB5E9B1E1F5A4B000DE18A /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7FDF290C1E1F4B4E00DBBE56 /* libRNVectorIcons.a */; }; 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; 895C9A56B94A45C1BAF568FE /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AC6EB561E1F64C17A69D2FAD /* Entypo.ttf */; }; + B50561A109B4442299F82327 /* libRNSearchBar.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F81F6DC42D394831B4549928 /* libRNSearchBar.a */; }; 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 */; }; @@ -214,6 +215,13 @@ remoteGlobalIDString = 134814201AA4EA6300B7C361; remoteInfo = RCTLinking; }; + 7F4890681E3B7D3B008EDBEA /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 59954D479A89488091EB588F /* RNSearchBar.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RNSearchBar; + }; 7FDF28E01E1F4B1F00DBBE56 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 2CBE9C0FB56E4FDA96C30792 /* RNSVG.xcodeproj */; @@ -265,12 +273,14 @@ 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 = ""; }; + 59954D479A89488091EB588F /* RNSearchBar.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNSearchBar.xcodeproj; path = "../node_modules/react-native-search-bar/RNSearchBar.xcodeproj"; 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 = ""; }; 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 = ""; }; + F81F6DC42D394831B4549928 /* libRNSearchBar.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNSearchBar.a; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -299,6 +309,7 @@ 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, + B50561A109B4442299F82327 /* libRNSearchBar.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -445,6 +456,14 @@ name = Products; sourceTree = ""; }; + 7F48904C1E3B7D3B008EDBEA /* Products */ = { + isa = PBXGroup; + children = ( + 7F4890691E3B7D3B008EDBEA /* libRNSearchBar.a */, + ); + name = Products; + sourceTree = ""; + }; 7FDF28C41E1F4B1F00DBBE56 /* Products */ = { isa = PBXGroup; children = ( @@ -477,6 +496,7 @@ 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, 2CBE9C0FB56E4FDA96C30792 /* RNSVG.xcodeproj */, 2B25899FDAC149EB96ED3305 /* RNVectorIcons.xcodeproj */, + 59954D479A89488091EB588F /* RNSearchBar.xcodeproj */, ); name = Libraries; sourceTree = ""; @@ -625,6 +645,10 @@ ProductGroup = 146834001AC3E56700842450 /* Products */; ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; }, + { + ProductGroup = 7F48904C1E3B7D3B008EDBEA /* Products */; + ProjectRef = 59954D479A89488091EB588F /* RNSearchBar.xcodeproj */; + }, { ProductGroup = 7FDF28C41E1F4B1F00DBBE56 /* Products */; ProjectRef = 2CBE9C0FB56E4FDA96C30792 /* RNSVG.xcodeproj */; @@ -811,6 +835,13 @@ remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 7F4890691E3B7D3B008EDBEA /* libRNSearchBar.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNSearchBar.a; + remoteRef = 7F4890681E3B7D3B008EDBEA /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 7FDF28E11E1F4B1F00DBBE56 /* libRNSVG.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -925,7 +956,7 @@ isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = UQ8HT4Q2XM; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", @@ -937,6 +968,7 @@ "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", ); PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -949,7 +981,7 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = UQ8HT4Q2XM; INFOPLIST_FILE = MattermostTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -957,6 +989,7 @@ "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", ); PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -971,7 +1004,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 7; DEAD_CODE_STRIPPING = NO; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = UQ8HT4Q2XM; INFOPLIST_FILE = Mattermost/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( @@ -994,7 +1027,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 7; DEAD_CODE_STRIPPING = NO; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = UQ8HT4Q2XM; INFOPLIST_FILE = Mattermost/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( diff --git a/package.json b/package.json index 3499a8bc4..72d824dbc 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "react-native-button": "1.7.1", "react-native-drawer": "2.3.0", "react-native-keyboard-spacer": "0.3.1", + "react-native-search-bar": "enahum/react-native-search-bar.git", "react-native-svg": "4.5.0", "react-native-vector-icons": "4.0.0", "react-redux": "5.0.1",