shlink-web-client/shlink-web-component/domains/helpers/DomainStatusIcon.tsx

61 lines
2.1 KiB
TypeScript
Raw Normal View History

2021-12-28 00:27:13 +03:00
import {
faCheck as checkIcon,
faCircleNotch as loadingStatusIcon,
2023-02-18 13:11:01 +03:00
faTimes as invalidIcon,
2021-12-28 00:27:13 +03:00
} from '@fortawesome/free-solid-svg-icons';
2023-02-18 13:11:01 +03:00
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import type { FC } from 'react';
import { useEffect, useState } from 'react';
import { ExternalLink } from 'react-external-link';
import { UncontrolledTooltip } from 'reactstrap';
import { useElementRef } from '../../utils/helpers/hooks';
import type { MediaMatcher } from '../../utils/types';
2023-02-18 12:40:37 +03:00
import type { DomainStatus } from '../data';
2021-12-28 00:27:13 +03:00
interface DomainStatusIconProps {
status: DomainStatus;
matchMedia?: MediaMatcher;
}
export const DomainStatusIcon: FC<DomainStatusIconProps> = ({ status, matchMedia = window.matchMedia }) => {
const ref = useElementRef<HTMLSpanElement>();
const matchesMobile = () => matchMedia('(max-width: 991px)').matches;
2022-03-26 14:17:42 +03:00
const [isMobile, setIsMobile] = useState<boolean>(matchesMobile());
useEffect(() => {
const listener = () => setIsMobile(matchesMobile());
window.addEventListener('resize', listener);
return () => window.removeEventListener('resize', listener);
}, []);
2021-12-28 00:27:13 +03:00
if (status === 'validating') {
return <FontAwesomeIcon fixedWidth icon={loadingStatusIcon} spin />;
}
return (
<>
<span ref={ref}>
2021-12-28 00:27:13 +03:00
{status === 'valid'
? <FontAwesomeIcon fixedWidth icon={checkIcon} className="text-muted" />
: <FontAwesomeIcon fixedWidth icon={invalidIcon} className="text-danger" />}
2021-12-28 00:27:13 +03:00
</span>
<UncontrolledTooltip
target={ref}
placement={isMobile ? 'top-start' : 'left'}
autohide={status === 'valid'}
>
2021-12-28 00:27:13 +03:00
{status === 'valid' ? 'Congratulations! This domain is properly configured.' : (
2021-12-29 00:48:35 +03:00
<span>
2021-12-28 00:27:13 +03:00
Oops! There is some missing configuration, and short URLs shared with this domain will not work.
<br />
Check the <ExternalLink href="https://slnk.to/multi-domain-docs">documentation</ExternalLink> in order to
2021-12-28 00:27:13 +03:00
find out what is missing.
2021-12-29 00:48:35 +03:00
</span>
2021-12-28 00:27:13 +03:00
)}
</UncontrolledTooltip>
</>
);
};