/** * Copyright (c) Microsoft Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { ErrorMessage } from '@web/components/errorMessage'; import * as React from 'react'; import type * as modelUtil from './modelUtil'; import { PlaceholderPanel } from './placeholderPanel'; import { renderAction } from './actionList'; import type { Language } from '@isomorphic/locatorGenerators'; type ErrorsTabModel = { errors: Map; }; export function useErrorsTabModel(model: modelUtil.MultiTraceModel | undefined): ErrorsTabModel { return React.useMemo(() => { const errors = new Map(); for (const action of model?.actions || []) { // Overwrite errors with the last one. if (action.error?.message) errors.set(action.error.message, action); } return { errors }; }, [model]); } export const ErrorsTab: React.FunctionComponent<{ errorsModel: ErrorsTabModel, sdkLanguage: Language, revealInSource: (action: modelUtil.ActionTraceEventInContext) => void, }> = ({ errorsModel, sdkLanguage, revealInSource }) => { if (!errorsModel.errors.size) return ; return
{[...errorsModel.errors.entries()].map(([message, action]) => { let location: string | undefined; let longLocation: string | undefined; if (action.stack?.[0]) { const file = action.stack[0].file.replace(/.*\/(.*)/, '$1'); location = file + ':' + action.stack[0].line; longLocation = action.stack[0].file + ':' + action.stack[0].line; } return
{renderAction(action, { sdkLanguage })} {location &&
@ revealInSource(action)}>{location}
}
; })}
; };