* 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
139 lines
3.7 KiB
JavaScript
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',
|
|
},
|
|
});
|