|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import {getErrorTitle} from '@/common/error/ErrorUtils'; |
|
|
import errorReportAtom from '@/common/error/errorReportAtom'; |
|
|
import emptyFunction from '@/common/utils/emptyFunction'; |
|
|
import {BugAntIcon} from '@heroicons/react/24/outline'; |
|
|
import {Editor} from '@monaco-editor/react'; |
|
|
import {useAtom} from 'jotai'; |
|
|
import {useEffect, useRef} from 'react'; |
|
|
import {Button, Modal} from 'react-daisyui'; |
|
|
|
|
|
type Props = { |
|
|
onReport?: (error: Error) => void; |
|
|
}; |
|
|
|
|
|
export default function ErrorReport({onReport = emptyFunction}: Props) { |
|
|
const [error, setError] = useAtom(errorReportAtom); |
|
|
const errorModalRef = useRef<HTMLDialogElement>(null); |
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
function onCloseDialog() { |
|
|
setError(null); |
|
|
} |
|
|
const errorModal = errorModalRef.current; |
|
|
errorModal?.addEventListener('close', onCloseDialog); |
|
|
return () => { |
|
|
errorModal?.removeEventListener('close', onCloseDialog); |
|
|
}; |
|
|
}, [setError]); |
|
|
|
|
|
useEffect(() => { |
|
|
if (error != null) { |
|
|
errorModalRef.current?.showModal(); |
|
|
} else { |
|
|
errorModalRef.current?.close(); |
|
|
} |
|
|
}, [error, setError]); |
|
|
|
|
|
function handleCloseModal() { |
|
|
errorModalRef.current?.close(); |
|
|
} |
|
|
|
|
|
function handleReport() { |
|
|
if (error != null) { |
|
|
onReport(error); |
|
|
} |
|
|
} |
|
|
|
|
|
return ( |
|
|
<Modal ref={errorModalRef} className="max-w-[800px]"> |
|
|
<Modal.Header> |
|
|
{error != null ? getErrorTitle(error) : 'Unknown error'} |
|
|
</Modal.Header> |
|
|
<Modal.Body> |
|
|
<Editor |
|
|
className="h-[400px]" |
|
|
language="javascript" |
|
|
value={error?.stack ?? ''} |
|
|
options={{ |
|
|
wordWrap: 'wordWrapColumn', |
|
|
scrollBeyondLastLine: false, |
|
|
readOnly: true, |
|
|
minimap: { |
|
|
enabled: false, |
|
|
}, |
|
|
}} |
|
|
/> |
|
|
</Modal.Body> |
|
|
<Modal.Actions> |
|
|
<Button |
|
|
color="error" |
|
|
startIcon={<BugAntIcon className="w-4 h-4" />} |
|
|
onClick={handleReport}> |
|
|
Report |
|
|
</Button> |
|
|
<Button onClick={handleCloseModal}>Close</Button> |
|
|
</Modal.Actions> |
|
|
</Modal> |
|
|
); |
|
|
} |
|
|
|