GlobalErrorBoundaryState.tsx 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { isError } from 'lodash'
  2. import Link from 'next/link'
  3. import { useRouter } from 'next/router'
  4. import { ClientSideExceptionHandler } from './ClientSideExceptionHandler'
  5. import { InsertBeforeRemoveChildErrorHandler } from './InsertBeforeRemoveChildErrorHandler'
  6. import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled'
  7. export type FallbackProps = {
  8. error: unknown
  9. resetErrorBoundary: (...args: unknown[]) => void
  10. }
  11. export const GlobalErrorBoundaryState = ({ error, resetErrorBoundary }: FallbackProps) => {
  12. const router = useRouter()
  13. const checkIsError = isError(error)
  14. const largeLogo = useIsFeatureEnabled('branding:large_logo')
  15. const errorMessage = checkIsError ? error.message : ''
  16. const urlMessage = checkIsError ? `Path name: ${router.pathname}\n\n${error?.stack}` : ''
  17. const isRemoveChildError = checkIsError
  18. ? errorMessage.includes("Failed to execute 'removeChild' on 'Node'")
  19. : false
  20. const isInsertBeforeError = checkIsError
  21. ? errorMessage.includes("Failed to execute 'insertBefore' on 'Node'")
  22. : false
  23. // Get Sentry issue ID from error if available
  24. const sentryIssueId = (!!error && typeof error === 'object' && (error as any).sentryId) ?? ''
  25. return (
  26. <div className="w-screen mx-auto h-screen flex items-center justify-center">
  27. <header className="h-12 absolute top-0 w-full border-b px-4 flex items-center">
  28. <Link href="/" className="items-center justify-center">
  29. <img
  30. alt="Briven"
  31. src={`${router.basePath}/img/briven-logo.svg`}
  32. className={largeLogo ? 'h-[20px]' : 'h-[18px]'}
  33. />
  34. </Link>
  35. </header>
  36. <div className="flex flex-col gap-y-4 max-w-full sm:max-w-[660px] px-4 sm:px-0">
  37. {isRemoveChildError || isInsertBeforeError ? (
  38. <InsertBeforeRemoveChildErrorHandler
  39. message={errorMessage}
  40. sentryIssueId={sentryIssueId}
  41. urlMessage={urlMessage}
  42. isRemoveChildError={isRemoveChildError}
  43. isInsertBeforeError={isInsertBeforeError}
  44. />
  45. ) : (
  46. <ClientSideExceptionHandler
  47. message={errorMessage}
  48. sentryIssueId={sentryIssueId}
  49. urlMessage={urlMessage}
  50. resetErrorBoundary={resetErrorBoundary}
  51. />
  52. )}
  53. </div>
  54. </div>
  55. )
  56. }