shlink-web-client/shlink-web-component/short-urls/helpers/DeleteShortUrlModal.tsx

76 lines
2.8 KiB
TypeScript
Raw Normal View History

2023-02-18 13:11:01 +03:00
import { pipe } from 'ramda';
2020-11-14 00:44:26 +03:00
import { useEffect, useState } from 'react';
2018-09-16 10:35:39 +03:00
import { Modal, ModalBody, ModalFooter, ModalHeader } from 'reactstrap';
import { ShlinkApiError } from '../../../src/api/ShlinkApiError';
import { Result } from '../../../src/utils/Result';
import { handleEventPreventingDefault } from '../../../src/utils/utils';
2023-07-24 18:30:58 +03:00
import { isInvalidDeletionError } from '../../api-contract/utils';
2023-02-18 13:11:01 +03:00
import type { ShortUrlIdentifier, ShortUrlModalProps } from '../data';
import type { ShortUrlDeletion } from '../reducers/shortUrlDeletion';
interface DeleteShortUrlModalConnectProps extends ShortUrlModalProps {
shortUrlDeletion: ShortUrlDeletion;
deleteShortUrl: (shortUrl: ShortUrlIdentifier) => Promise<void>;
shortUrlDeleted: (shortUrl: ShortUrlIdentifier) => void;
resetDeleteShortUrl: () => void;
}
const DELETION_PATTERN = 'delete';
export const DeleteShortUrlModal = ({
shortUrl,
toggle,
isOpen,
shortUrlDeletion,
resetDeleteShortUrl,
deleteShortUrl,
shortUrlDeleted,
}: DeleteShortUrlModalConnectProps) => {
2022-03-26 14:17:42 +03:00
const [inputValue, setInputValue] = useState('');
2018-09-16 10:35:39 +03:00
useEffect(() => resetDeleteShortUrl, []);
const { loading, error, deleted, errorData } = shortUrlDeletion;
const close = pipe(resetDeleteShortUrl, toggle);
const handleDeleteUrl = handleEventPreventingDefault(() => deleteShortUrl(shortUrl).then(toggle));
2018-09-16 11:47:17 +03:00
return (
<Modal isOpen={isOpen} toggle={close} centered onClosed={() => deleted && shortUrlDeleted(shortUrl)}>
<form onSubmit={handleDeleteUrl}>
<ModalHeader toggle={close}>
<span className="text-danger">Delete short URL</span>
</ModalHeader>
<ModalBody>
<p><b className="text-danger">Caution!</b> You are about to delete a short URL.</p>
<p>This action cannot be undone. Once you have deleted it, all the visits stats will be lost.</p>
<p>Write <b>{DELETION_PATTERN}</b> to confirm deletion.</p>
2018-09-16 10:35:39 +03:00
<input
type="text"
className="form-control"
placeholder={`Insert ${DELETION_PATTERN}`}
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
/>
2018-09-16 10:35:39 +03:00
{error && (
<Result type={isInvalidDeletionError(errorData) ? 'warning' : 'error'} small className="mt-2">
<ShlinkApiError errorData={errorData} fallbackMessage="Something went wrong while deleting the URL :(" />
</Result>
)}
</ModalBody>
<ModalFooter>
<button type="button" className="btn btn-link" onClick={close}>Cancel</button>
<button
type="submit"
className="btn btn-danger"
disabled={inputValue !== DELETION_PATTERN || loading}
>
{loading ? 'Deleting...' : 'Delete'}
</button>
</ModalFooter>
</form>
</Modal>
);
};