import { faAngleDoubleDown as downIcon, faAngleDoubleUp as upIcon } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { isEmpty, pipe, replace, trim } from 'ramda'; import { FC, useState } from 'react'; import { Collapse, FormGroup, Input } from 'reactstrap'; import { InputType } from 'reactstrap/lib/Input'; import * as m from 'moment'; import DateInput, { DateInputProps } from '../utils/DateInput'; import Checkbox from '../utils/Checkbox'; import { versionMatch, Versions } from '../utils/helpers/version'; import { handleEventPreventingDefault, hasValue } from '../utils/utils'; import { useToggle } from '../utils/helpers/hooks'; import { isReachableServer, SelectedServer } from '../servers/data'; import { formatIsoDate } from '../utils/helpers/date'; import { TagsSelectorProps } from '../tags/helpers/TagsSelector'; import { ShortUrlData } from './data'; import { ShortUrlCreation } from './reducers/shortUrlCreation'; import UseExistingIfFoundInfoIcon from './UseExistingIfFoundInfoIcon'; import { CreateShortUrlResultProps } from './helpers/CreateShortUrlResult'; const normalizeTag = pipe(trim, replace(/ /g, '-')); interface CreateShortUrlProps { shortUrlCreationResult: ShortUrlCreation; selectedServer: SelectedServer; createShortUrl: Function; resetCreateShortUrl: () => void; } const initialState: ShortUrlData = { longUrl: '', tags: [], customSlug: '', shortCodeLength: undefined, domain: '', validSince: undefined, validUntil: undefined, maxVisits: undefined, findIfExists: false, }; type NonDateFields = 'longUrl' | 'customSlug' | 'shortCodeLength' | 'domain' | 'maxVisits'; type DateFields = 'validSince' | 'validUntil'; const CreateShortUrl = ( TagsSelector: FC, CreateShortUrlResult: FC, ForServerVersion: FC, ) => ({ createShortUrl, shortUrlCreationResult, resetCreateShortUrl, selectedServer }: CreateShortUrlProps) => { const [ shortUrlCreation, setShortUrlCreation ] = useState(initialState); const [ moreOptionsVisible, toggleMoreOptionsVisible ] = useToggle(); const changeTags = (tags: string[]) => setShortUrlCreation({ ...shortUrlCreation, tags: tags.map(normalizeTag) }); const reset = () => setShortUrlCreation(initialState); const save = handleEventPreventingDefault(() => { const shortUrlData = { ...shortUrlCreation, validSince: formatIsoDate(shortUrlCreation.validSince), validUntil: formatIsoDate(shortUrlCreation.validUntil), }; createShortUrl(shortUrlData).then(reset).catch(() => {}); }); const renderOptionalInput = (id: NonDateFields, placeholder: string, type: InputType = 'text', props = {}) => ( setShortUrlCreation({ ...shortUrlCreation, [id]: e.target.value })} {...props} /> ); const renderDateInput = (id: DateFields, placeholder: string, props: Partial = {}) => (
setShortUrlCreation({ ...shortUrlCreation, [id]: date })} {...props} />
); const currentServerVersion = isReachableServer(selectedServer) ? selectedServer.version : ''; const disableDomain = !versionMatch(currentServerVersion, { minVersion: '1.19.0-beta.1' }); const disableShortCodeLength = !versionMatch(currentServerVersion, { minVersion: '2.1.0' }); return (
setShortUrlCreation({ ...shortUrlCreation, longUrl: e.target.value })} />
{renderOptionalInput('customSlug', 'Custom slug', 'text', { disabled: hasValue(shortUrlCreation.shortCodeLength), })}
{renderOptionalInput('shortCodeLength', 'Short code length', 'number', { min: 4, disabled: disableShortCodeLength || hasValue(shortUrlCreation.customSlug), ...disableShortCodeLength && { title: 'Shlink 2.1.0 or higher is required to be able to provide the short code length', }, })}
{renderOptionalInput('domain', 'Domain', 'text', { disabled: disableDomain, ...disableDomain && { title: 'Shlink 1.19.0 or higher is required to be able to provide the domain' }, })}
{renderOptionalInput('maxVisits', 'Maximum number of visits allowed', 'number', { min: 1 })}
{renderDateInput('validSince', 'Enabled since...', { maxDate: shortUrlCreation.validUntil as m.Moment | undefined })}
{renderDateInput('validUntil', 'Enabled until...', { minDate: shortUrlCreation.validSince as m.Moment | undefined })}
setShortUrlCreation({ ...shortUrlCreation, findIfExists })} > Use existing URL if found
); }; export default CreateShortUrl;