import { FC, useEffect, useMemo } from 'react'; import { Button, Card } from 'reactstrap'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faArrowLeft } from '@fortawesome/free-solid-svg-icons'; import { ExternalLink } from 'react-external-link'; import { useLocation, useParams } from 'react-router-dom'; import { SelectedServer } from '../servers/data'; import { Settings, ShortUrlCreationSettings } from '../settings/reducers/settings'; import { OptionalString } from '../utils/utils'; import { parseQuery } from '../utils/helpers/query'; import Message from '../utils/Message'; import { Result } from '../utils/Result'; import { ShlinkApiError } from '../api/ShlinkApiError'; import { useGoBack, useToggle } from '../utils/helpers/hooks'; import { ShortUrlFormProps } from './ShortUrlForm'; import { ShortUrlDetail } from './reducers/shortUrlDetail'; import { EditShortUrlData, ShortUrl, ShortUrlData } from './data'; import { ShortUrlEdition } from './reducers/shortUrlEdition'; interface EditShortUrlConnectProps { settings: Settings; selectedServer: SelectedServer; shortUrlDetail: ShortUrlDetail; shortUrlEdition: ShortUrlEdition; getShortUrlDetail: (shortCode: string, domain: OptionalString) => void; editShortUrl: (shortUrl: string, domain: OptionalString, data: EditShortUrlData) => Promise; } const getInitialState = (shortUrl?: ShortUrl, settings?: ShortUrlCreationSettings): ShortUrlData => { const validateUrl = settings?.validateUrls ?? false; if (!shortUrl) { return { longUrl: '', validateUrl }; } return { longUrl: shortUrl.longUrl, tags: shortUrl.tags, title: shortUrl.title ?? undefined, domain: shortUrl.domain ?? undefined, validSince: shortUrl.meta.validSince ?? undefined, validUntil: shortUrl.meta.validUntil ?? undefined, maxVisits: shortUrl.meta.maxVisits ?? undefined, crawlable: shortUrl.crawlable, forwardQuery: shortUrl.forwardQuery, validateUrl, }; }; export const EditShortUrl = (ShortUrlForm: FC) => ({ settings: { shortUrlCreation: shortUrlCreationSettings }, selectedServer, shortUrlDetail, getShortUrlDetail, shortUrlEdition, editShortUrl, }: EditShortUrlConnectProps) => { const { search } = useLocation(); const params = useParams<{ shortCode: string }>(); const goBack = useGoBack(); const { loading, error, errorData, shortUrl } = shortUrlDetail; const { saving, error: savingError, errorData: savingErrorData } = shortUrlEdition; const { domain } = parseQuery<{ domain?: string }>(search); const initialState = useMemo( () => getInitialState(shortUrl, shortUrlCreationSettings), [ shortUrl, shortUrlCreationSettings ], ); const [ savingSucceeded,, isSuccessful, isNotSuccessful ] = useToggle(); useEffect(() => { params.shortCode && getShortUrlDetail(params.shortCode, domain); }, []); if (loading) { return ; } if (error) { return ( ); } return ( <>

Edit

{ if (!shortUrl) { return; } isNotSuccessful(); editShortUrl(shortUrl.shortCode, shortUrl.domain, shortUrlData) .then(isSuccessful) .catch(isNotSuccessful); }} /> {savingError && ( )} {savingSucceeded && Short URL properly edited.} ); };