import React from 'react'; import PropTypes from 'prop-types'; import copy from 'copy-to-clipboard'; import { gettext, serviceURL } from '../../utils/constants'; import SeahubModalHeader from '@/components/common/seahub-modal-header'; import { Button, Modal, ModalBody, ModalFooter, Alert, InputGroup, InputGroupText } from 'reactstrap'; import toaster from '../toast'; import wikiAPI from '../../utils/wiki-api'; import '../../css/publish-wiki-dialog.css'; const propTypes = { wiki: PropTypes.object, onPublish: PropTypes.func.isRequired, toggleCancel: PropTypes.func.isRequired, }; const DEFAULT_URL = serviceURL + '/wiki/publish/'; class PublishWikiDialog extends React.Component { constructor(props) { super(props); this.state = { url: this.props.customUrl, errMessage: '', isSubmitBtnActive: false, }; this.newInput = React.createRef(); this.preTextRef = React.createRef(); } componentDidMount() { setTimeout(() => { const preTextWidth = this.preTextRef.current.offsetWidth; this.newInput.current.style.paddingLeft = (preTextWidth + 12) + 'px'; this.newInput.current.focus(); }, 1); } handleChange = (e) => { this.setState({ isSubmitBtnActive: !!e.target.value.trim(), url: e.target.value }); }; handleSubmit = () => { let { isValid, errMessage } = this.validateInput(); if (!isValid) { this.setState({ errMessage: errMessage, url: '', }); } else { this.props.onPublish(DEFAULT_URL + this.state.url.trim()); this.toggle(); } }; deleteCustomUrl = () => { let wiki_id = this.props.wiki.id; wikiAPI.deletePublishWikiLink(wiki_id).then((res) => { this.setState({ url: '' }); toaster.success(gettext('Wiki custom URL deleted')); }).catch((error) => { if (error.response) { let errorMsg = error.response.data.error_msg; toaster.danger(errorMsg); } }); }; handleKeyDown = (e) => { if (e.key === 'Enter') { this.handleSubmit(); } }; toggle = () => { this.props.toggleCancel(); }; validateInput = () => { let url = this.state.url.trim(); let isValid = true; let errMessage = ''; if (!url) { isValid = false; errMessage = gettext('URL is required'); return { isValid, errMessage }; } return { isValid, errMessage }; }; copyLink = () => { copy(DEFAULT_URL + this.state.url.trim()); toaster.success(gettext('URL is copied to the clipboard')); }; onClickPreText = () => { this.newInput.current.focus(); }; render() { return ( {gettext('Publish Wiki')}

{gettext('Customize URL')}

{DEFAULT_URL}

{gettext('The custom part of the URL must be between 5 and 30 characters long and may only contain letters (a-z), numbers, and hyphens.')}

{this.state.errMessage && {this.state.errMessage}}
{this.props.customUrl !== '' && }
); } } PublishWikiDialog.propTypes = propTypes; export default PublishWikiDialog;