import React, { Component } from 'react';
import {
View, Text, Animated, Easing, TouchableWithoutFeedback, TouchableOpacity, FlatList, Image, AsyncStorage
} from 'react-native';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import equal from 'deep-equal';
import Navigation from '../../lib/Navigation';
import { toggleServerDropdown as toggleServerDropdownAction } from '../../actions/rooms';
import { selectServerRequest as selectServerRequestAction } from '../../actions/server';
import { appStart as appStartAction } from '../../actions';
import styles from './styles';
import database from '../../lib/realm';
import Touch from '../../utils/touch';
import RocketChat from '../../lib/rocketchat';
import I18n from '../../i18n';
import EventEmitter from '../../utils/events';
import Check from './Check';
const ROW_HEIGHT = 68;
const ANIMATION_DURATION = 200;
@connect(state => ({
closeServerDropdown: state.rooms.closeServerDropdown,
server: state.server.server
}), dispatch => ({
toggleServerDropdown: () => dispatch(toggleServerDropdownAction()),
selectServerRequest: server => dispatch(selectServerRequestAction(server)),
appStart: () => dispatch(appStartAction('outside'))
}))
export default class ServerDropdown extends Component {
static propTypes = {
closeServerDropdown: PropTypes.bool,
server: PropTypes.string,
toggleServerDropdown: PropTypes.func,
selectServerRequest: PropTypes.func,
appStart: PropTypes.func
}
constructor(props) {
super(props);
this.servers = database.databases.serversDB.objects('servers');
this.state = {
servers: this.servers
};
this.animatedValue = new Animated.Value(0);
this.servers.addListener(this.updateState);
}
componentDidMount() {
Animated.timing(
this.animatedValue,
{
toValue: 1,
duration: ANIMATION_DURATION,
easing: Easing.inOut(Easing.quad),
useNativeDriver: true
},
).start();
}
shouldComponentUpdate(nextProps, nextState) {
const { servers } = this.state;
const { closeServerDropdown, server } = this.props;
if (nextProps.closeServerDropdown !== closeServerDropdown) {
return true;
}
if (nextProps.server !== server) {
return true;
}
if (!equal(nextState.servers, servers)) {
return true;
}
return false;
}
componentDidUpdate(prevProps) {
const { closeServerDropdown } = this.props;
if (prevProps.closeServerDropdown !== closeServerDropdown) {
this.close();
}
}
componentWillUnmount() {
if (this.newServerTimeout) {
clearTimeout(this.newServerTimeout);
this.newServerTimeout = false;
}
}
updateState = () => {
const { servers } = this;
this.setState({ servers });
}
close = () => {
const { toggleServerDropdown } = this.props;
Animated.timing(
this.animatedValue,
{
toValue: 0,
duration: ANIMATION_DURATION,
easing: Easing.inOut(Easing.quad),
useNativeDriver: true
}
).start(() => toggleServerDropdown());
}
addServer = () => {
const { server } = this.props;
this.close();
setTimeout(() => {
Navigation.showModal({
stack: {
children: [{
component: {
name: 'OnboardingView',
passProps: {
previousServer: server
},
options: {
topBar: {
visible: false
},
layout: {
orientation: 'portrait'
}
}
}
}]
}
});
}, ANIMATION_DURATION);
}
select = async(server) => {
const {
server: currentServer, selectServerRequest, appStart
} = this.props;
this.close();
if (currentServer !== server) {
const token = await AsyncStorage.getItem(`${ RocketChat.TOKEN_KEY }-${ server }`);
if (!token) {
appStart();
this.newServerTimeout = setTimeout(() => {
EventEmitter.emit('NewServer', { server });
}, 1000);
} else {
selectServerRequest(server);
}
}
}
renderSeparator = () => ;
renderServer = ({ item }) => {
const { server } = this.props;
return (
this.select(item.id)} style={styles.serverItem} testID={`rooms-list-header-server-${ item.id }`}>
{item.iconURL
? (
console.warn('error loading serverIcon')}
/>
)
: (
)
}
{item.name || item.id}
{item.id}
{item.id === server ? : null}
);
}
render() {
const { servers } = this.state;
const maxRows = 4;
const initialTop = 41 + (Math.min(servers.length, maxRows) * ROW_HEIGHT);
const translateY = this.animatedValue.interpolate({
inputRange: [0, 1],
outputRange: [-initialTop, 0]
});
const backdropOpacity = this.animatedValue.interpolate({
inputRange: [0, 1],
outputRange: [0, 0.3]
});
return (
[
,
{I18n.t('Server')}
{I18n.t('Add_Server')}
item.id}
renderItem={this.renderServer}
ItemSeparatorComponent={this.renderSeparator}
/>
]
);
}
}