// @flow import React, { useState, useEffect } from 'react'; import Button from 'component/button'; import { Form, FormField } from 'component/common/form'; import { VALID_IPADDRESS_REGEX, VALID_HOSTNAME_REGEX, VALID_ENDPOINT_REGEX } from 'constants/protocol_regex'; type Props = { update: (CommentServerDetails) => void, onCancel: (boolean) => void, }; const isValidServerString = (serverString) => { const si = serverString.indexOf('/'); const pi = serverString.indexOf(':'); const path = si === -1 ? '' : serverString.slice(si); const hostMaybePort = si === -1 ? serverString : serverString.slice(0, si); const host = pi === -1 ? hostMaybePort : hostMaybePort.slice(0, pi); const port = pi === -1 ? '' : hostMaybePort.slice(pi + 1); const portInt = parseInt(port); return ( (host === 'localhost' || VALID_IPADDRESS_REGEX.test(host) || VALID_HOSTNAME_REGEX.test(host)) && (!path || VALID_ENDPOINT_REGEX.test(path)) && // eslint-disable-next-line (pi === -1 || (port && typeof portInt === 'number' && portInt === portInt)) ); // NaN !== NaN }; function ServerInputRow(props: Props) { const { update, onCancel } = props; const [nameString, setNameString] = useState(''); const [hostString, setHostString] = useState(''); const [useHttps, setUseHttps] = useState(true); const getHostString = () => { return `${useHttps ? 'https://' : 'http://'}${hostString}`; }; const [validServerString, setValidServerString] = useState(false); useEffect(() => { setValidServerString(isValidServerString(hostString)); }, [hostString, validServerString, setValidServerString]); function onSubmit() { const updateValue = { url: getHostString(), name: nameString }; update(updateValue); setHostString(''); setNameString(''); } return ( <Form onSubmit={onSubmit}> <div className="setting-item-input"> <FormField type="text" label={__('Name')} placeholder={'My Server'} value={nameString} onChange={(e) => setNameString(e.target.value)} /> <div className="fieldset-group fieldset-group--smushed fieldset-group--disabled-prefix fieldset-group--row"> <div className={'fieldset-section'}> <label htmlFor="serverUrl">{__('URL')}</label> <div className="form-field__prefix">{`${useHttps ? 'https://' : 'http://'}`}</div> </div> <FormField type="text" placeholder={'code.freezepeach.fun'} value={hostString} onChange={(e) => setHostString(e.target.value)} name={'serverUrl'} /> </div> </div> <div className="setting-item-input"> <FormField label={'Use https'} name="use_https" type="checkbox" checked={useHttps} onChange={() => setUseHttps(!useHttps)} /> </div> <div className="section__actions setting-item-input"> <Button type="submit" button="primary" label={__('Add')} disabled={!validServerString || !nameString} /> <Button type="button" button="inverse" onClick={() => onCancel(false)} label={__('Cancel')} /> </div> </Form> ); } export default ServerInputRow;