1a5fb1ba8SEvan Bacon"use strict"; 226ad19fcSEvan Bacon/** 326ad19fcSEvan Bacon * Copyright (c) 650 Industries. 426ad19fcSEvan Bacon * Copyright (c) Meta Platforms, Inc. and affiliates. 526ad19fcSEvan Bacon * 626ad19fcSEvan Bacon * This source code is licensed under the MIT license found in the 726ad19fcSEvan Bacon * LICENSE file in the root directory of this source tree. 826ad19fcSEvan Bacon */ 9a5fb1ba8SEvan Baconvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { 10a5fb1ba8SEvan Bacon if (k2 === undefined) k2 = k; 11a5fb1ba8SEvan Bacon var desc = Object.getOwnPropertyDescriptor(m, k); 12a5fb1ba8SEvan Bacon if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { 13a5fb1ba8SEvan Bacon desc = { enumerable: true, get: function() { return m[k]; } }; 14a5fb1ba8SEvan Bacon } 15a5fb1ba8SEvan Bacon Object.defineProperty(o, k2, desc); 16a5fb1ba8SEvan Bacon}) : (function(o, m, k, k2) { 17a5fb1ba8SEvan Bacon if (k2 === undefined) k2 = k; 18a5fb1ba8SEvan Bacon o[k2] = m[k]; 19a5fb1ba8SEvan Bacon})); 20a5fb1ba8SEvan Baconvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { 21a5fb1ba8SEvan Bacon Object.defineProperty(o, "default", { enumerable: true, value: v }); 22a5fb1ba8SEvan Bacon}) : function(o, v) { 23a5fb1ba8SEvan Bacon o["default"] = v; 24a5fb1ba8SEvan Bacon}); 25a5fb1ba8SEvan Baconvar __importStar = (this && this.__importStar) || function (mod) { 26a5fb1ba8SEvan Bacon if (mod && mod.__esModule) return mod; 27a5fb1ba8SEvan Bacon var result = {}; 28a5fb1ba8SEvan Bacon if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); 29a5fb1ba8SEvan Bacon __setModuleDefault(result, mod); 30a5fb1ba8SEvan Bacon return result; 31a5fb1ba8SEvan Bacon}; 32a5fb1ba8SEvan Baconvar __importDefault = (this && this.__importDefault) || function (mod) { 33a5fb1ba8SEvan Bacon return (mod && mod.__esModule) ? mod : { "default": mod }; 34a5fb1ba8SEvan Bacon}; 35a5fb1ba8SEvan BaconObject.defineProperty(exports, "__esModule", { value: true }); 36a5fb1ba8SEvan Baconexports.withSubscription = exports.observe = exports.isDisabled = exports.setDisabled = exports.addIgnorePatterns = exports.getIgnorePatterns = exports.dismiss = exports.clearErrors = exports.clearWarnings = exports.setSelectedLog = exports.clear = exports.symbolicateLogLazy = exports.retrySymbolicateLogNow = exports.symbolicateLogNow = exports.addException = exports.addLog = exports.isMessageIgnored = exports.isLogBoxErrorMessage = exports.reportUnexpectedLogBoxError = exports.reportLogBoxError = void 0; 37a5fb1ba8SEvan Baconconst React = __importStar(require("react")); 38a5fb1ba8SEvan Baconconst LogBoxLog_1 = require("./LogBoxLog"); 39a5fb1ba8SEvan Baconconst LogContext_1 = require("./LogContext"); 40a5fb1ba8SEvan Baconconst parseLogBoxLog_1 = require("./parseLogBoxLog"); 41*8a424bebSJames Ideconst NativeLogBox_1 = __importDefault(require("../modules/NativeLogBox")); 42*8a424bebSJames Ideconst parseErrorStack_1 = __importDefault(require("../modules/parseErrorStack")); 4326ad19fcSEvan Baconconst observers = new Set(); 4426ad19fcSEvan Baconconst ignorePatterns = new Set(); 4526ad19fcSEvan Baconlet logs = new Set(); 4626ad19fcSEvan Baconlet updateTimeout = null; 4726ad19fcSEvan Baconlet _isDisabled = false; 4826ad19fcSEvan Baconlet _selectedIndex = -1; 4926ad19fcSEvan Baconconst LOGBOX_ERROR_MESSAGE = 'An error was thrown when attempting to render log messages via LogBox.'; 5026ad19fcSEvan Baconfunction getNextState() { 5126ad19fcSEvan Bacon return { 5226ad19fcSEvan Bacon logs, 5326ad19fcSEvan Bacon isDisabled: _isDisabled, 5426ad19fcSEvan Bacon selectedLogIndex: _selectedIndex, 5526ad19fcSEvan Bacon }; 5626ad19fcSEvan Bacon} 57a5fb1ba8SEvan Baconfunction reportLogBoxError(error, componentStack) { 5826ad19fcSEvan Bacon const ExceptionsManager = require('../modules/ExceptionsManager').default; 5926ad19fcSEvan Bacon if (componentStack != null) { 6026ad19fcSEvan Bacon error.componentStack = componentStack; 6126ad19fcSEvan Bacon } 6226ad19fcSEvan Bacon ExceptionsManager.handleException(error); 6326ad19fcSEvan Bacon} 64a5fb1ba8SEvan Baconexports.reportLogBoxError = reportLogBoxError; 65a5fb1ba8SEvan Baconfunction reportUnexpectedLogBoxError(error, componentStack) { 6626ad19fcSEvan Bacon error.message = `${LOGBOX_ERROR_MESSAGE}\n\n${error.message}`; 6726ad19fcSEvan Bacon return reportLogBoxError(error, componentStack); 6826ad19fcSEvan Bacon} 69a5fb1ba8SEvan Baconexports.reportUnexpectedLogBoxError = reportUnexpectedLogBoxError; 70a5fb1ba8SEvan Baconfunction isLogBoxErrorMessage(message) { 7126ad19fcSEvan Bacon return typeof message === 'string' && message.includes(LOGBOX_ERROR_MESSAGE); 7226ad19fcSEvan Bacon} 73a5fb1ba8SEvan Baconexports.isLogBoxErrorMessage = isLogBoxErrorMessage; 74a5fb1ba8SEvan Baconfunction isMessageIgnored(message) { 7526ad19fcSEvan Bacon for (const pattern of ignorePatterns) { 7626ad19fcSEvan Bacon if ((pattern instanceof RegExp && pattern.test(message)) || 7726ad19fcSEvan Bacon (typeof pattern === 'string' && message.includes(pattern))) { 7826ad19fcSEvan Bacon return true; 7926ad19fcSEvan Bacon } 8026ad19fcSEvan Bacon } 8126ad19fcSEvan Bacon return false; 8226ad19fcSEvan Bacon} 83a5fb1ba8SEvan Baconexports.isMessageIgnored = isMessageIgnored; 8426ad19fcSEvan Baconfunction setImmediateShim(callback) { 8526ad19fcSEvan Bacon if (!global.setImmediate) { 8626ad19fcSEvan Bacon return setTimeout(callback, 0); 8726ad19fcSEvan Bacon } 8826ad19fcSEvan Bacon return global.setImmediate(callback); 8926ad19fcSEvan Bacon} 9026ad19fcSEvan Baconfunction handleUpdate() { 9126ad19fcSEvan Bacon if (updateTimeout == null) { 9226ad19fcSEvan Bacon updateTimeout = setImmediateShim(() => { 9326ad19fcSEvan Bacon updateTimeout = null; 9426ad19fcSEvan Bacon const nextState = getNextState(); 9526ad19fcSEvan Bacon observers.forEach(({ observer }) => observer(nextState)); 9626ad19fcSEvan Bacon }); 9726ad19fcSEvan Bacon } 9826ad19fcSEvan Bacon} 9926ad19fcSEvan Baconfunction appendNewLog(newLog) { 10026ad19fcSEvan Bacon // Don't want store these logs because they trigger a 10126ad19fcSEvan Bacon // state update when we add them to the store. 10226ad19fcSEvan Bacon if (isMessageIgnored(newLog.message.content)) { 10326ad19fcSEvan Bacon return; 10426ad19fcSEvan Bacon } 10526ad19fcSEvan Bacon // If the next log has the same category as the previous one 10626ad19fcSEvan Bacon // then roll it up into the last log in the list by incrementing 10726ad19fcSEvan Bacon // the count (similar to how Chrome does it). 10826ad19fcSEvan Bacon const lastLog = Array.from(logs).pop(); 10926ad19fcSEvan Bacon if (lastLog && lastLog.category === newLog.category) { 11026ad19fcSEvan Bacon lastLog.incrementCount(); 11126ad19fcSEvan Bacon handleUpdate(); 11226ad19fcSEvan Bacon return; 11326ad19fcSEvan Bacon } 11426ad19fcSEvan Bacon if (newLog.level === 'fatal') { 11526ad19fcSEvan Bacon // If possible, to avoid jank, we don't want to open the error before 11626ad19fcSEvan Bacon // it's symbolicated. To do that, we optimistically wait for 11726ad19fcSEvan Bacon // symbolication for up to a second before adding the log. 11826ad19fcSEvan Bacon const OPTIMISTIC_WAIT_TIME = 1000; 11926ad19fcSEvan Bacon let addPendingLog = () => { 12026ad19fcSEvan Bacon logs.add(newLog); 12126ad19fcSEvan Bacon if (_selectedIndex < 0) { 12226ad19fcSEvan Bacon setSelectedLog(logs.size - 1); 12326ad19fcSEvan Bacon } 12426ad19fcSEvan Bacon else { 12526ad19fcSEvan Bacon handleUpdate(); 12626ad19fcSEvan Bacon } 12726ad19fcSEvan Bacon addPendingLog = null; 12826ad19fcSEvan Bacon }; 12926ad19fcSEvan Bacon const optimisticTimeout = setTimeout(() => { 13026ad19fcSEvan Bacon if (addPendingLog) { 13126ad19fcSEvan Bacon addPendingLog(); 13226ad19fcSEvan Bacon } 13326ad19fcSEvan Bacon }, OPTIMISTIC_WAIT_TIME); 13426ad19fcSEvan Bacon // TODO: HANDLE THIS 13526ad19fcSEvan Bacon newLog.symbolicate('component'); 13626ad19fcSEvan Bacon newLog.symbolicate('stack', (status) => { 13726ad19fcSEvan Bacon if (addPendingLog && status !== 'PENDING') { 13826ad19fcSEvan Bacon addPendingLog(); 13926ad19fcSEvan Bacon clearTimeout(optimisticTimeout); 14026ad19fcSEvan Bacon } 14126ad19fcSEvan Bacon else if (status !== 'PENDING') { 14226ad19fcSEvan Bacon // The log has already been added but we need to trigger a render. 14326ad19fcSEvan Bacon handleUpdate(); 14426ad19fcSEvan Bacon } 14526ad19fcSEvan Bacon }); 14626ad19fcSEvan Bacon } 14726ad19fcSEvan Bacon else if (newLog.level === 'syntax') { 14826ad19fcSEvan Bacon logs.add(newLog); 14926ad19fcSEvan Bacon setSelectedLog(logs.size - 1); 15026ad19fcSEvan Bacon } 15126ad19fcSEvan Bacon else { 15226ad19fcSEvan Bacon logs.add(newLog); 15326ad19fcSEvan Bacon handleUpdate(); 15426ad19fcSEvan Bacon } 15526ad19fcSEvan Bacon} 156a5fb1ba8SEvan Baconfunction addLog(log) { 15726ad19fcSEvan Bacon const errorForStackTrace = new Error(); 15826ad19fcSEvan Bacon // Parsing logs are expensive so we schedule this 15926ad19fcSEvan Bacon // otherwise spammy logs would pause rendering. 16026ad19fcSEvan Bacon setImmediate(() => { 16126ad19fcSEvan Bacon try { 162a5fb1ba8SEvan Bacon const stack = (0, parseErrorStack_1.default)(errorForStackTrace?.stack); 163a5fb1ba8SEvan Bacon appendNewLog(new LogBoxLog_1.LogBoxLog({ 16426ad19fcSEvan Bacon level: log.level, 16526ad19fcSEvan Bacon message: log.message, 16626ad19fcSEvan Bacon isComponentError: false, 16726ad19fcSEvan Bacon stack, 16826ad19fcSEvan Bacon category: log.category, 16926ad19fcSEvan Bacon componentStack: log.componentStack, 17026ad19fcSEvan Bacon })); 17126ad19fcSEvan Bacon } 17226ad19fcSEvan Bacon catch (error) { 17326ad19fcSEvan Bacon reportUnexpectedLogBoxError(error); 17426ad19fcSEvan Bacon } 17526ad19fcSEvan Bacon }); 17626ad19fcSEvan Bacon} 177a5fb1ba8SEvan Baconexports.addLog = addLog; 178a5fb1ba8SEvan Baconfunction addException(error) { 17926ad19fcSEvan Bacon // Parsing logs are expensive so we schedule this 18026ad19fcSEvan Bacon // otherwise spammy logs would pause rendering. 18126ad19fcSEvan Bacon setImmediate(() => { 18226ad19fcSEvan Bacon try { 183a5fb1ba8SEvan Bacon appendNewLog(new LogBoxLog_1.LogBoxLog((0, parseLogBoxLog_1.parseLogBoxException)(error))); 18426ad19fcSEvan Bacon } 18526ad19fcSEvan Bacon catch (loggingError) { 18626ad19fcSEvan Bacon reportUnexpectedLogBoxError(loggingError); 18726ad19fcSEvan Bacon } 18826ad19fcSEvan Bacon }); 18926ad19fcSEvan Bacon} 190a5fb1ba8SEvan Baconexports.addException = addException; 191a5fb1ba8SEvan Baconfunction symbolicateLogNow(type, log) { 19226ad19fcSEvan Bacon log.symbolicate(type, () => { 19326ad19fcSEvan Bacon handleUpdate(); 19426ad19fcSEvan Bacon }); 19526ad19fcSEvan Bacon} 196a5fb1ba8SEvan Baconexports.symbolicateLogNow = symbolicateLogNow; 197a5fb1ba8SEvan Baconfunction retrySymbolicateLogNow(type, log) { 19826ad19fcSEvan Bacon log.retrySymbolicate(type, () => { 19926ad19fcSEvan Bacon handleUpdate(); 20026ad19fcSEvan Bacon }); 20126ad19fcSEvan Bacon} 202a5fb1ba8SEvan Baconexports.retrySymbolicateLogNow = retrySymbolicateLogNow; 203a5fb1ba8SEvan Baconfunction symbolicateLogLazy(type, log) { 20426ad19fcSEvan Bacon log.symbolicate(type); 20526ad19fcSEvan Bacon} 206a5fb1ba8SEvan Baconexports.symbolicateLogLazy = symbolicateLogLazy; 207a5fb1ba8SEvan Baconfunction clear() { 20826ad19fcSEvan Bacon if (logs.size > 0) { 20926ad19fcSEvan Bacon logs = new Set(); 21026ad19fcSEvan Bacon setSelectedLog(-1); 21126ad19fcSEvan Bacon } 21226ad19fcSEvan Bacon} 213a5fb1ba8SEvan Baconexports.clear = clear; 214a5fb1ba8SEvan Baconfunction setSelectedLog(proposedNewIndex) { 21526ad19fcSEvan Bacon const oldIndex = _selectedIndex; 21626ad19fcSEvan Bacon let newIndex = proposedNewIndex; 21726ad19fcSEvan Bacon const logArray = Array.from(logs); 21826ad19fcSEvan Bacon let index = logArray.length - 1; 21926ad19fcSEvan Bacon while (index >= 0) { 22026ad19fcSEvan Bacon // The latest syntax error is selected and displayed before all other logs. 22126ad19fcSEvan Bacon if (logArray[index].level === 'syntax') { 22226ad19fcSEvan Bacon newIndex = index; 22326ad19fcSEvan Bacon break; 22426ad19fcSEvan Bacon } 22526ad19fcSEvan Bacon index -= 1; 22626ad19fcSEvan Bacon } 22726ad19fcSEvan Bacon _selectedIndex = newIndex; 22826ad19fcSEvan Bacon handleUpdate(); 229a5fb1ba8SEvan Bacon if (NativeLogBox_1.default) { 23026ad19fcSEvan Bacon setTimeout(() => { 23126ad19fcSEvan Bacon if (oldIndex < 0 && newIndex >= 0) { 232a5fb1ba8SEvan Bacon NativeLogBox_1.default.show(); 23326ad19fcSEvan Bacon } 23426ad19fcSEvan Bacon else if (oldIndex >= 0 && newIndex < 0) { 235a5fb1ba8SEvan Bacon NativeLogBox_1.default.hide(); 23626ad19fcSEvan Bacon } 23726ad19fcSEvan Bacon }, 0); 23826ad19fcSEvan Bacon } 23926ad19fcSEvan Bacon} 240a5fb1ba8SEvan Baconexports.setSelectedLog = setSelectedLog; 241a5fb1ba8SEvan Baconfunction clearWarnings() { 24226ad19fcSEvan Bacon const newLogs = Array.from(logs).filter((log) => log.level !== 'warn'); 24326ad19fcSEvan Bacon if (newLogs.length !== logs.size) { 24426ad19fcSEvan Bacon logs = new Set(newLogs); 24526ad19fcSEvan Bacon setSelectedLog(-1); 24626ad19fcSEvan Bacon handleUpdate(); 24726ad19fcSEvan Bacon } 24826ad19fcSEvan Bacon} 249a5fb1ba8SEvan Baconexports.clearWarnings = clearWarnings; 250a5fb1ba8SEvan Baconfunction clearErrors() { 25126ad19fcSEvan Bacon const newLogs = Array.from(logs).filter((log) => log.level !== 'error' && log.level !== 'fatal'); 25226ad19fcSEvan Bacon if (newLogs.length !== logs.size) { 25326ad19fcSEvan Bacon logs = new Set(newLogs); 25426ad19fcSEvan Bacon setSelectedLog(-1); 25526ad19fcSEvan Bacon } 25626ad19fcSEvan Bacon} 257a5fb1ba8SEvan Baconexports.clearErrors = clearErrors; 258a5fb1ba8SEvan Baconfunction dismiss(log) { 25926ad19fcSEvan Bacon if (logs.has(log)) { 26026ad19fcSEvan Bacon logs.delete(log); 26126ad19fcSEvan Bacon handleUpdate(); 26226ad19fcSEvan Bacon } 26326ad19fcSEvan Bacon} 264a5fb1ba8SEvan Baconexports.dismiss = dismiss; 265a5fb1ba8SEvan Baconfunction getIgnorePatterns() { 26626ad19fcSEvan Bacon return Array.from(ignorePatterns); 26726ad19fcSEvan Bacon} 268a5fb1ba8SEvan Baconexports.getIgnorePatterns = getIgnorePatterns; 269a5fb1ba8SEvan Baconfunction addIgnorePatterns(patterns) { 27026ad19fcSEvan Bacon const existingSize = ignorePatterns.size; 27126ad19fcSEvan Bacon // The same pattern may be added multiple times, but adding a new pattern 27226ad19fcSEvan Bacon // can be expensive so let's find only the ones that are new. 27326ad19fcSEvan Bacon patterns.forEach((pattern) => { 27426ad19fcSEvan Bacon if (pattern instanceof RegExp) { 27526ad19fcSEvan Bacon for (const existingPattern of ignorePatterns) { 27626ad19fcSEvan Bacon if (existingPattern instanceof RegExp && 27726ad19fcSEvan Bacon existingPattern.toString() === pattern.toString()) { 27826ad19fcSEvan Bacon return; 27926ad19fcSEvan Bacon } 28026ad19fcSEvan Bacon } 28126ad19fcSEvan Bacon ignorePatterns.add(pattern); 28226ad19fcSEvan Bacon } 28326ad19fcSEvan Bacon ignorePatterns.add(pattern); 28426ad19fcSEvan Bacon }); 28526ad19fcSEvan Bacon if (ignorePatterns.size === existingSize) { 28626ad19fcSEvan Bacon return; 28726ad19fcSEvan Bacon } 28826ad19fcSEvan Bacon // We need to recheck all of the existing logs. 28926ad19fcSEvan Bacon // This allows adding an ignore pattern anywhere in the codebase. 29026ad19fcSEvan Bacon // Without this, if you ignore a pattern after the a log is created, 29126ad19fcSEvan Bacon // then we would keep showing the log. 29226ad19fcSEvan Bacon logs = new Set(Array.from(logs).filter((log) => !isMessageIgnored(log.message.content))); 29326ad19fcSEvan Bacon handleUpdate(); 29426ad19fcSEvan Bacon} 295a5fb1ba8SEvan Baconexports.addIgnorePatterns = addIgnorePatterns; 296a5fb1ba8SEvan Baconfunction setDisabled(value) { 29726ad19fcSEvan Bacon if (value === _isDisabled) { 29826ad19fcSEvan Bacon return; 29926ad19fcSEvan Bacon } 30026ad19fcSEvan Bacon _isDisabled = value; 30126ad19fcSEvan Bacon handleUpdate(); 30226ad19fcSEvan Bacon} 303a5fb1ba8SEvan Baconexports.setDisabled = setDisabled; 304a5fb1ba8SEvan Baconfunction isDisabled() { 30526ad19fcSEvan Bacon return _isDisabled; 30626ad19fcSEvan Bacon} 307a5fb1ba8SEvan Baconexports.isDisabled = isDisabled; 308a5fb1ba8SEvan Baconfunction observe(observer) { 30926ad19fcSEvan Bacon const subscription = { observer }; 31026ad19fcSEvan Bacon observers.add(subscription); 31126ad19fcSEvan Bacon observer(getNextState()); 31226ad19fcSEvan Bacon return { 31326ad19fcSEvan Bacon unsubscribe() { 31426ad19fcSEvan Bacon observers.delete(subscription); 31526ad19fcSEvan Bacon }, 31626ad19fcSEvan Bacon }; 31726ad19fcSEvan Bacon} 318a5fb1ba8SEvan Baconexports.observe = observe; 319a5fb1ba8SEvan Baconfunction withSubscription(WrappedComponent) { 32026ad19fcSEvan Bacon class LogBoxStateSubscription extends React.Component { 32126ad19fcSEvan Bacon static getDerivedStateFromError() { 32226ad19fcSEvan Bacon return { hasError: true }; 32326ad19fcSEvan Bacon } 32426ad19fcSEvan Bacon componentDidCatch(err, errorInfo) { 32526ad19fcSEvan Bacon /* $FlowFixMe[class-object-subtyping] added when improving typing for 32626ad19fcSEvan Bacon * this parameters */ 32726ad19fcSEvan Bacon reportLogBoxError(err, errorInfo.componentStack); 32826ad19fcSEvan Bacon } 32926ad19fcSEvan Bacon _subscription; 33026ad19fcSEvan Bacon state = { 33126ad19fcSEvan Bacon logs: new Set(), 33226ad19fcSEvan Bacon isDisabled: false, 33326ad19fcSEvan Bacon hasError: false, 33426ad19fcSEvan Bacon selectedLogIndex: -1, 33526ad19fcSEvan Bacon }; 33626ad19fcSEvan Bacon render() { 33726ad19fcSEvan Bacon if (this.state.hasError) { 33826ad19fcSEvan Bacon // This happens when the component failed to render, in which case we delegate to the native redbox. 33926ad19fcSEvan Bacon // We can't show any fallback UI here, because the error may be with <View> or <Text>. 34026ad19fcSEvan Bacon return null; 34126ad19fcSEvan Bacon } 342a5fb1ba8SEvan Bacon return (React.createElement(LogContext_1.LogContext.Provider, { value: { 34326ad19fcSEvan Bacon selectedLogIndex: this.state.selectedLogIndex, 34426ad19fcSEvan Bacon isDisabled: this.state.isDisabled, 34526ad19fcSEvan Bacon logs: Array.from(this.state.logs), 34626ad19fcSEvan Bacon } }, 34726ad19fcSEvan Bacon this.props.children, 34826ad19fcSEvan Bacon React.createElement(WrappedComponent, null))); 34926ad19fcSEvan Bacon } 35026ad19fcSEvan Bacon componentDidMount() { 35126ad19fcSEvan Bacon this._subscription = observe((data) => { 35226ad19fcSEvan Bacon this.setState(data); 35326ad19fcSEvan Bacon }); 35426ad19fcSEvan Bacon } 35526ad19fcSEvan Bacon componentWillUnmount() { 35626ad19fcSEvan Bacon if (this._subscription != null) { 35726ad19fcSEvan Bacon this._subscription.unsubscribe(); 35826ad19fcSEvan Bacon } 35926ad19fcSEvan Bacon } 36026ad19fcSEvan Bacon _handleDismiss = () => { 36126ad19fcSEvan Bacon // Here we handle the cases when the log is dismissed and it 36226ad19fcSEvan Bacon // was either the last log, or when the current index 36326ad19fcSEvan Bacon // is now outside the bounds of the log array. 36426ad19fcSEvan Bacon const { selectedLogIndex, logs: stateLogs } = this.state; 36526ad19fcSEvan Bacon const logsArray = Array.from(stateLogs); 36626ad19fcSEvan Bacon if (selectedLogIndex != null) { 36726ad19fcSEvan Bacon if (logsArray.length - 1 <= 0) { 36826ad19fcSEvan Bacon setSelectedLog(-1); 36926ad19fcSEvan Bacon } 37026ad19fcSEvan Bacon else if (selectedLogIndex >= logsArray.length - 1) { 37126ad19fcSEvan Bacon setSelectedLog(selectedLogIndex - 1); 37226ad19fcSEvan Bacon } 37326ad19fcSEvan Bacon dismiss(logsArray[selectedLogIndex]); 37426ad19fcSEvan Bacon } 37526ad19fcSEvan Bacon }; 37626ad19fcSEvan Bacon _handleMinimize = () => { 37726ad19fcSEvan Bacon setSelectedLog(-1); 37826ad19fcSEvan Bacon }; 37926ad19fcSEvan Bacon _handleSetSelectedLog = (index) => { 38026ad19fcSEvan Bacon setSelectedLog(index); 38126ad19fcSEvan Bacon }; 38226ad19fcSEvan Bacon } 38326ad19fcSEvan Bacon // @ts-expect-error 38426ad19fcSEvan Bacon return LogBoxStateSubscription; 38526ad19fcSEvan Bacon} 386a5fb1ba8SEvan Baconexports.withSubscription = withSubscription; 38726ad19fcSEvan Bacon//# sourceMappingURL=LogBoxData.js.map