// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const Utils = require('../utils/utils.jsx'); const Client = require('../utils/client.jsx'); const AsyncClient = require('../utils/async_client.jsx'); const ChannelStore = require('../stores/channel_store.jsx'); export default class RenameChannelModal extends React.Component { constructor(props) { super(props); this.handleSubmit = this.handleSubmit.bind(this); this.onNameChange = this.onNameChange.bind(this); this.onDisplayNameChange = this.onDisplayNameChange.bind(this); this.displayNameKeyUp = this.displayNameKeyUp.bind(this); this.handleClose = this.handleClose.bind(this); this.handleShow = this.handleShow.bind(this); this.handleSubmit = this.handleSubmit.bind(this); this.state = { displayName: '', channelName: '', channelId: '', serverError: '', nameError: '', displayNameError: '', invalid: false }; } handleSubmit(e) { e.preventDefault(); if (this.state.channelId.length !== 26) { return; } let channel = ChannelStore.get(this.state.channelId); const oldName = channel.name; const oldDisplayName = channel.displayName; let state = {serverError: ''}; channel.display_name = this.state.displayName.trim(); if (!channel.display_name) { state.displayNameError = 'This field is required'; state.invalid = true; } else if (channel.display_name.length > 22) { state.displayNameError = 'This field must be less than 22 characters'; state.invalid = true; } else { state.displayNameError = ''; } channel.name = this.state.channelName.trim(); if (!channel.name) { state.nameError = 'This field is required'; state.invalid = true; } else if (channel.name.length > 22) { state.nameError = 'This field must be less than 22 characters'; state.invalid = true; } else { let cleanedName = Utils.cleanUpUrlable(channel.name); if (cleanedName === channel.name) { state.nameError = ''; } else { state.nameError = 'Must be lowercase alphanumeric characters'; state.invalid = true; } } this.setState(state); if (state.invalid || (oldName === channel.name && oldDisplayName === channel.display_name)) { return; } Client.updateChannel(channel, function handleUpdateSuccess() { $(ReactDOM.findDOMNode(this.refs.modal)).modal('hide'); AsyncClient.getChannel(channel.id); Utils.updateAddressBar(channel.name); ReactDOM.findDOMNode(this.refs.displayName).value = ''; ReactDOM.findDOMNode(this.refs.channelName).value = ''; }.bind(this), function handleUpdateError(err) { state.serverError = err.message; state.invalid = true; this.setState(state); }.bind(this) ); } onNameChange() { this.setState({channelName: ReactDOM.findDOMNode(this.refs.channelName).value}); } onDisplayNameChange() { this.setState({displayName: ReactDOM.findDOMNode(this.refs.displayName).value}); } displayNameKeyUp() { const displayName = ReactDOM.findDOMNode(this.refs.displayName).value.trim(); const channelName = Utils.cleanUpUrlable(displayName); ReactDOM.findDOMNode(this.refs.channelName).value = channelName; this.setState({channelName: channelName}); } handleClose() { this.setState({ displayName: '', channelName: '', channelId: '', serverError: '', nameError: '', displayNameError: '', invalid: false }); } handleShow(e) { const button = $(e.relatedTarget); this.setState({displayName: button.attr('data-display'), channelName: button.attr('data-name'), channelId: button.attr('data-channelid')}); } componentDidMount() { $(ReactDOM.findDOMNode(this.refs.modal)).on('show.bs.modal', this.handleShow); $(ReactDOM.findDOMNode(this.refs.modal)).on('hidden.bs.modal', this.handleClose); } componentWillUnmount() { $(ReactDOM.findDOMNode(this.refs.modal)).off('hidden.bs.modal', this.handleClose); } render() { let displayNameError = null; let displayNameClass = 'form-group'; if (this.state.displayNameError) { displayNameError = ; displayNameClass += ' has-error'; } let nameError = null; let nameClass = 'form-group'; if (this.state.nameError) { nameError = ; nameClass += ' has-error'; } let serverError = null; if (this.state.serverError) { serverError =
; } return ( ); } }