import * as React from 'react'; import { CheckCircle, ExclaimTriangle, ExclaimCircle } from '@teachable/icons' import debounce from 'lodash/debounce' import { Truncate } from './truncate' const { useState, useEffect, useMemo, useCallback, useRef } = React // TODO: make usePromise a util in the monorepo interface LinkCheckProps { url: string onConfirm: (url: string) => void } enum PromiseState { PENDING, ERROR, COMPLETE } enum UrlStatus { OK = 'OK', ERROR = 'ERROR', REDIRECT = 'REDIRECT' } const parentStyle = { marginTop: '10px', display: 'flex', } const textStyle = { alignSelf: 'center' } export const LinkCheck = ({ url, onConfirm }: LinkCheckProps) => { const isMounted = useRef(true) const [promiseState, setPromiseState] = useState(PromiseState.PENDING) const [urlStatus, setUrlStatus] = useState(UrlStatus.OK) const [redirectUrl, setRedirectUrl] = useState('') const debouncedPromise = useMemo(() => debounce((params: URLSearchParams) => fetch(`/admin/api/tracking_links/test?${params.toString()}`) .then(res => res.ok ? res.json() : Promise.reject(res)) .then(({ status, redirect_url }) => { if (isMounted.current) { setPromiseState(PromiseState.COMPLETE) setUrlStatus(status) setRedirectUrl(redirect_url) } }) .catch((e) => { if (isMounted.current) { setPromiseState(PromiseState.ERROR) } }), 500), []) const handleConfirmClick = useCallback(() => onConfirm(redirectUrl), [redirectUrl]) useEffect(() => { isMounted.current = true if (url) { // ensure url is valid try { new URL(url) } catch { return undefined } setPromiseState(PromiseState.PENDING) const params = new URLSearchParams({ url }) debouncedPromise(params) } return () => isMounted.current = false }, [url]) switch (promiseState) { case PromiseState.PENDING: { return (
Preparing to check your link, please wait
) } case PromiseState.COMPLETE: { switch (urlStatus) { case UrlStatus.OK: { return (
 Your link doesn't redirect!
) } case UrlStatus.REDIRECT: { return (
 Your link redirects to {redirectUrl}. Click the icon to change it to the destination
) } } } } return (
 We're getting an error when trying to check your link
) }