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