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",