diff --git a/src/FitButtonBar/ClipboardButton.tsx b/src/FitButtonBar/ClipboardButton.tsx index d744c1f..2718f55 100644 --- a/src/FitButtonBar/ClipboardButton.tsx +++ b/src/FitButtonBar/ClipboardButton.tsx @@ -17,6 +17,7 @@ export const ClipboardButton = () => { const [isPopupOpen, setIsPopupOpen] = React.useState(false); const [isPasteOpen, setIsPasteOpen] = React.useState(false); + const [error, setError] = React.useState(undefined); const textAreaRef = React.useRef(null); const copyToClipboard = React.useCallback(() => { @@ -29,6 +30,8 @@ export const ClipboardButton = () => { }, [copy, toEft]); const importFromClipboard = React.useCallback(() => { + setError(undefined); + if (!shipSnapshot.loaded) return; const textArea = textAreaRef.current; @@ -41,9 +44,18 @@ export const ClipboardButton = () => { if (fitString.startsWith("{")) { fit = JSON.parse(fitString); } else { - fit = eftToEsiFit(fitString); + try { + fit = eftToEsiFit(fitString); + } catch (e: unknown) { + const message = (e as Error).message; + setError(`Importing EFT fit failed: ${message}`); + return; + } + } + if (fit === undefined) { + setError("Unknown fit format"); + return; } - if (fit === undefined) return; shipSnapshot.changeFit(fit); @@ -51,6 +63,10 @@ export const ClipboardButton = () => { setIsPopupOpen(false); }, [eftToEsiFit, shipSnapshot]); + React.useEffect(() => { + if (isPasteOpen) setError(undefined); + }, [isPasteOpen]); + return ( <>
{ importFromClipboard()}> Import + {error &&
{error}
}
diff --git a/src/FitButtonBar/FitButtonBar.module.css b/src/FitButtonBar/FitButtonBar.module.css index abdb3f9..0be6de8 100644 --- a/src/FitButtonBar/FitButtonBar.module.css +++ b/src/FitButtonBar/FitButtonBar.module.css @@ -106,3 +106,8 @@ margin-top: 4px; width: 300px; } + +.importError { + margin: 5px; + color: #864735; +}