/** * Copyright (c) 2013-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @flow */ 'use strict'; import type {CapturedError} from 'react-reconciler/src/ReactFiberScheduler'; // Module provided by RN: const ExceptionsManager = require('ExceptionsManager'); /** * Intercept lifecycle errors and ensure they are shown with the correct stack * trace within the native redbox component. */ function ReactNativeFiberErrorDialog(capturedError: CapturedError): boolean { const {componentStack, error} = capturedError; let errorToHandle: Error; // Typically Errors are thrown but eg strings or null can be thrown as well. if (error instanceof Error) { const {message, name} = error; const summary = message ? `${name}: ${message}` : name; errorToHandle = error; try { errorToHandle.message = `${summary}\n\nThis error is located at:${componentStack}`; } catch (e) {} } else if (typeof error === 'string') { errorToHandle = new Error( `${error}\n\nThis error is located at:${componentStack}`, ); } else { errorToHandle = new Error(`Unspecified error at:${componentStack}`); } ExceptionsManager.handleException(errorToHandle, false); // Return false here to prevent ReactFiberErrorLogger default behavior of // logging error details to console.error. Calls to console.error are // automatically routed to the native redbox controller, which we've already // done above by calling ExceptionsManager. return false; } module.exports.showDialog = ReactNativeFiberErrorDialog;