mattermost-mobile/app/screens/options_modal/options_modal_list.android.js
Chris Duarte 5c24375dae Reorganize sidebar channel items via pref (#1928)
* Reorganize sidebar channel items via pref
Add onItemPress


Add isModal prop


Add options modal for ungrouped sidebar


Filter zero item unreads from sections


Refactor unread filtering

Add SidebarSectionTypes to constants

Update mm-redux dep

Remove unused variable

* Fix lint errors. Update redux commit

* Add recent activity title

* Review feedback

* Fix issues after rebase

* Review feedback

* Change to use getAllDirectChannels

* Update redux library

* Fix lint error

* Update modal list snapshot
2018-11-09 13:06:21 -03:00

139 lines
3.7 KiB
JavaScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React, {PureComponent} from 'react';
import PropTypes from 'prop-types';
import {
StyleSheet,
Text,
TouchableOpacity,
View,
} from 'react-native';
import IconFont from 'react-native-vector-icons/FontAwesome';
import FormattedText from 'app/components/formatted_text';
import {preventDoubleTap} from 'app/utils/tap';
export default class OptionsModalList extends PureComponent {
static propTypes = {
items: PropTypes.array.isRequired,
onCancelPress: PropTypes.func,
onItemPress: PropTypes.func,
};
handleCancelPress = preventDoubleTap(() => {
if (this.props.onCancelPress) {
this.props.onCancelPress();
}
});
handleItemPress = preventDoubleTap((action) => {
this.props.onItemPress();
setTimeout(() => {
if (typeof action === 'function') {
action();
}
}, 100);
});
renderOptions = () => {
const {items} = this.props;
const options = items.map((item, index) => {
let textComponent;
if (item.text.hasOwnProperty('id')) {
textComponent = (
<FormattedText
style={[style.optionText, item.textStyle]}
{...item.text}
/>
);
} else {
textComponent = <Text style={[style.optionText, item.textStyle]}>{item.text}</Text>;
}
return (
<View
key={index}
style={style.optionBorder}
>
<TouchableOpacity
onPress={() => this.handleItemPress(item.action)}
style={style.option}
>
{textComponent}
{item.icon &&
<IconFont
name={item.icon}
size={18}
style={style.optionIcon}
/>
}
</TouchableOpacity>
</View>
);
});
const cancel = (
<TouchableOpacity
key={items.length}
onPress={this.handleCancelPress}
style={style.option}
>
<FormattedText
id='channel_modal.cancel'
defaultMessage='Cancel'
style={style.optionText}
/>
</TouchableOpacity>
);
return [
...options,
cancel,
];
};
render() {
return (
<View style={style.wrapper}>
<View style={style.optionContainer}>
{this.renderOptions()}
</View>
</View>
);
}
}
const style = StyleSheet.create({
option: {
alignSelf: 'stretch',
alignItems: 'center',
flexDirection: 'row',
justifyContent: 'space-between',
padding: 15,
},
optionBorder: {
borderBottomWidth: 1,
borderBottomColor: 'rgba(0, 0, 0, 0.1)',
},
optionContainer: {
alignSelf: 'stretch',
backgroundColor: 'white',
borderRadius: 2,
marginHorizontal: 30,
},
optionIcon: {
color: '#7f8180',
},
optionText: {
color: '#000',
flex: 1,
fontSize: 16,
},
wrapper: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
});