diff --git a/frontend/app/components/Errors/Error/ErrorInfo.js b/frontend/app/components/Errors/Error/ErrorInfo.js
index b1d18ab45..8407826de 100644
--- a/frontend/app/components/Errors/Error/ErrorInfo.js
+++ b/frontend/app/components/Errors/Error/ErrorInfo.js
@@ -2,82 +2,77 @@ import React from 'react';
import { connect } from 'react-redux';
import withSiteIdRouter from 'HOCs/withSiteIdRouter';
import { errors as errorsRoute, error as errorRoute } from 'App/routes';
-import { NoContent , Loader, IconButton, Icon, Popup, BackLink, } from 'UI';
+import { NoContent, Loader, IconButton, Icon, Popup, BackLink } from 'UI';
import { fetch, fetchTrace } from 'Duck/errors';
import MainSection from './MainSection';
import SideSection from './SideSection';
import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG';
-@connect(state =>({
- errorIdInStore: state.getIn(["errors", "instance"]).errorId,
- loading: state.getIn([ "errors", "fetch", "loading" ]) || state.getIn([ "errors", "fetchTrace", "loading" ]),
- errorOnFetch: state.getIn(["errors", "fetch", "errors"]) || state.getIn([ "errors", "fetchTrace", "errors" ]),
-}), {
- fetch,
- fetchTrace,
-})
+@connect(
+ (state) => ({
+ errorIdInStore: state.getIn(['errors', 'instance']).errorId,
+ loading: state.getIn(['errors', 'fetch', 'loading']) || state.getIn(['errors', 'fetchTrace', 'loading']),
+ errorOnFetch: state.getIn(['errors', 'fetch', 'errors']) || state.getIn(['errors', 'fetchTrace', 'errors']),
+ }),
+ {
+ fetch,
+ fetchTrace,
+ }
+)
@withSiteIdRouter
export default class ErrorInfo extends React.PureComponent {
- ensureInstance() {
- const { errorId, loading, errorOnFetch } = this.props;
- if (!loading &&
- this.props.errorIdInStore !== errorId &&
- errorId != null) {
- this.props.fetch(errorId);
- this.props.fetchTrace(errorId)
- }
- }
- componentDidMount() {
- this.ensureInstance();
- }
- componentDidUpdate() {
- this.ensureInstance();
- }
- next = () => {
- const { list, errorId } = this.props;
- const curIndex = list.findIndex(e => e.errorId === errorId);
- const next = list.get(curIndex + 1);
- if (next != null) {
- this.props.history.push(errorRoute(next.errorId))
- }
- }
- prev = () => {
- const { list, errorId } = this.props;
- const curIndex = list.findIndex(e => e.errorId === errorId);
- const prev = list.get(curIndex - 1);
- if (prev != null) {
- this.props.history.push(errorRoute(prev.errorId))
- }
-
- }
- render() {
- const {
- loading,
- errorIdInStore,
- list,
- errorId,
- } = this.props;
+ ensureInstance() {
+ const { errorId, loading, errorOnFetch } = this.props;
+ if (!loading && this.props.errorIdInStore !== errorId && errorId != null) {
+ this.props.fetch(errorId);
+ this.props.fetchTrace(errorId);
+ }
+ }
+ componentDidMount() {
+ this.ensureInstance();
+ }
+ componentDidUpdate() {
+ this.ensureInstance();
+ }
+ next = () => {
+ const { list, errorId } = this.props;
+ const curIndex = list.findIndex((e) => e.errorId === errorId);
+ const next = list.get(curIndex + 1);
+ if (next != null) {
+ this.props.history.push(errorRoute(next.errorId));
+ }
+ };
+ prev = () => {
+ const { list, errorId } = this.props;
+ const curIndex = list.findIndex((e) => e.errorId === errorId);
+ const prev = list.get(curIndex - 1);
+ if (prev != null) {
+ this.props.history.push(errorRoute(prev.errorId));
+ }
+ };
+ render() {
+ const { loading, errorIdInStore, list, errorId } = this.props;
- let nextDisabled = true,
- prevDisabled = true;
- if (list.size > 0) {
- nextDisabled = loading || list.last().errorId === errorId;
- prevDisabled = loading || list.first().errorId === errorId;
- }
+ let nextDisabled = true,
+ prevDisabled = true;
+ if (list.size > 0) {
+ nextDisabled = loading || list.last().errorId === errorId;
+ prevDisabled = loading || list.first().errorId === errorId;
+ }
- return (
-
-
- No Error Found!
-
- }
- subtext="Please try to find existing one."
- // animatedIcon="no-results"
- show={ !loading && errorIdInStore == null }
- >
- {/*
+ return (
+
+
+ No Error Found!
+
+ }
+ subtext="Please try to find existing one."
+ // animatedIcon="no-results"
+ show={!loading && errorIdInStore == null}
+ >
+ {/*
@@ -111,13 +106,13 @@ export default class ErrorInfo extends React.PureComponent {
*/}
-
-
-
-
-
-
-
- );
- }
-}
\ No newline at end of file
+
+
+
+
+
+
+
+ );
+ }
+}
diff --git a/frontend/app/components/Errors/Error/MainSection.js b/frontend/app/components/Errors/Error/MainSection.js
index 4a81ca062..534f417f8 100644
--- a/frontend/app/components/Errors/Error/MainSection.js
+++ b/frontend/app/components/Errors/Error/MainSection.js
@@ -5,105 +5,89 @@ import withSiteIdRouter from 'HOCs/withSiteIdRouter';
import { ErrorDetails, IconButton, Icon, Loader, Button } from 'UI';
import { sessions as sessionsRoute } from 'App/routes';
import { TYPES as EV_FILER_TYPES } from 'Types/filter/event';
-import { UNRESOLVED, RESOLVED, IGNORED } from "Types/errorInfo";
+import { UNRESOLVED, RESOLVED, IGNORED } from 'Types/errorInfo';
import { addFilterByKeyAndValue } from 'Duck/search';
-import { resolve,unresolve,ignore, toggleFavorite } from "Duck/errors";
+import { resolve, unresolve, ignore, toggleFavorite } from 'Duck/errors';
import { resentOrDate } from 'App/date';
import Divider from 'Components/Errors/ui/Divider';
import ErrorName from 'Components/Errors/ui/ErrorName';
import Label from 'Components/Errors/ui/Label';
-import SharePopup from 'Shared/SharePopup'
+import SharePopup from 'Shared/SharePopup';
import { FilterKey } from 'Types/filter/filterType';
import SessionBar from './SessionBar';
@withSiteIdRouter
-@connect(state => ({
- error: state.getIn([ "errors", "instance" ]),
- trace: state.getIn([ "errors", "instanceTrace" ]),
- sourcemapUploaded: state.getIn([ "errors", "sourcemapUploaded" ]),
- resolveToggleLoading: state.getIn(["errors", "resolve", "loading"]) ||
- state.getIn(["errors", "unresolve", "loading"]),
- ignoreLoading: state.getIn([ "errors", "ignore", "loading" ]),
- toggleFavoriteLoading: state.getIn([ "errors", "toggleFavorite", "loading" ]),
- traceLoading: state.getIn([ "errors", "fetchTrace", "loading"]),
-}),{
- resolve,
- unresolve,
- ignore,
- toggleFavorite,
- addFilterByKeyAndValue,
-})
+@connect(
+ (state) => ({
+ error: state.getIn(['errors', 'instance']),
+ trace: state.getIn(['errors', 'instanceTrace']),
+ sourcemapUploaded: state.getIn(['errors', 'sourcemapUploaded']),
+ resolveToggleLoading: state.getIn(['errors', 'resolve', 'loading']) || state.getIn(['errors', 'unresolve', 'loading']),
+ ignoreLoading: state.getIn(['errors', 'ignore', 'loading']),
+ toggleFavoriteLoading: state.getIn(['errors', 'toggleFavorite', 'loading']),
+ traceLoading: state.getIn(['errors', 'fetchTrace', 'loading']),
+ }),
+ {
+ resolve,
+ unresolve,
+ ignore,
+ toggleFavorite,
+ addFilterByKeyAndValue,
+ }
+)
export default class MainSection extends React.PureComponent {
- resolve = () => {
- const { error } = this.props;
- this.props.resolve(error.errorId)
- }
+ resolve = () => {
+ const { error } = this.props;
+ this.props.resolve(error.errorId);
+ };
- unresolve = () => {
- const { error } = this.props;
- this.props.unresolve(error.errorId)
- }
+ unresolve = () => {
+ const { error } = this.props;
+ this.props.unresolve(error.errorId);
+ };
- ignore = () => {
- const { error } = this.props;
- this.props.ignore(error.errorId)
- }
- bookmark = () => {
- const { error } = this.props;
- this.props.toggleFavorite(error.errorId);
- }
+ ignore = () => {
+ const { error } = this.props;
+ this.props.ignore(error.errorId);
+ };
+ bookmark = () => {
+ const { error } = this.props;
+ this.props.toggleFavorite(error.errorId);
+ };
- findSessions = () => {
- this.props.addFilterByKeyAndValue(FilterKey.ERROR, this.props.error.message);
- this.props.history.push(sessionsRoute());
- }
+ findSessions = () => {
+ this.props.addFilterByKeyAndValue(FilterKey.ERROR, this.props.error.message);
+ this.props.history.push(sessionsRoute());
+ };
- render() {
- const {
- error,
- trace,
- sourcemapUploaded,
- ignoreLoading,
- resolveToggleLoading,
- toggleFavoriteLoading,
- className,
- traceLoading,
- } = this.props;
+ render() {
+ const { error, trace, sourcemapUploaded, ignoreLoading, resolveToggleLoading, toggleFavoriteLoading, className, traceLoading } = this.props;
- return (
-
-
-
-
-
- { error.message }
-
-
-
-
-
-
-
Over the past 30 days
-
-
-
-
+ return (
+
+
+
+
+
+ {error.message}
+
+
+
+
+
+
+
Over the past 30 days
+
+
+
- {/*
+ {/*
{ error.status === UNRESOLVED
?
*/}
-
-
-
Last session with this error
- { resentOrDate(error.lastOccurrence) }
-
-
-
-
-
-
-
-
-
-
-
- );
- }
-}
\ No newline at end of file
+
+
+
Last session with this error
+ {resentOrDate(error.lastOccurrence)}
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
diff --git a/frontend/app/components/Session_/Exceptions/Exceptions.js b/frontend/app/components/Session_/Exceptions/Exceptions.js
index 0cdd9d01e..2f3b83483 100644
--- a/frontend/app/components/Session_/Exceptions/Exceptions.js
+++ b/frontend/app/components/Session_/Exceptions/Exceptions.js
@@ -64,7 +64,7 @@ export default class Exceptions extends React.PureComponent {
show={ !loading && errorStack.size === 0 }
title="Nothing found!"
>
-
+
diff --git a/frontend/app/components/Session_/OverviewPanel/OverviewPanel.tsx b/frontend/app/components/Session_/OverviewPanel/OverviewPanel.tsx
index 53ba3ddf5..b5b9b91cd 100644
--- a/frontend/app/components/Session_/OverviewPanel/OverviewPanel.tsx
+++ b/frontend/app/components/Session_/OverviewPanel/OverviewPanel.tsx
@@ -36,10 +36,10 @@ function OverviewPanel(props: Props) {
};
return (
-
+
Overview
-
+
diff --git a/frontend/app/components/Session_/OverviewPanel/components/EventRow/EventRow.tsx b/frontend/app/components/Session_/OverviewPanel/components/EventRow/EventRow.tsx
index 0447fcaa9..cff0c6182 100644
--- a/frontend/app/components/Session_/OverviewPanel/components/EventRow/EventRow.tsx
+++ b/frontend/app/components/Session_/OverviewPanel/components/EventRow/EventRow.tsx
@@ -10,7 +10,7 @@ interface Props {
endTime?: number;
renderElement?: (item: any) => React.ReactNode;
}
-function EventRow(props: Props) {
+const EventRow = React.memo((props: Props) => {
const { title, className, list = [], endTime = 0 } = props;
const scale = 100 / endTime;
const _list = React.useMemo(() => {
@@ -22,8 +22,8 @@ function EventRow(props: Props) {
})
}, [list]);
return (
-
-
{title}
+
+
{title}
{_list.map((item: any, index: number) => {
return (
@@ -36,7 +36,7 @@ function EventRow(props: Props) {
);
-}
+});
export default connectPlayer((state: any) => ({
endTime: state.endTime,
diff --git a/frontend/app/components/Session_/OverviewPanel/components/TimelinePointer/TimelinePointer.tsx b/frontend/app/components/Session_/OverviewPanel/components/TimelinePointer/TimelinePointer.tsx
index a9d58f4a2..c3cf175dd 100644
--- a/frontend/app/components/Session_/OverviewPanel/components/TimelinePointer/TimelinePointer.tsx
+++ b/frontend/app/components/Session_/OverviewPanel/components/TimelinePointer/TimelinePointer.tsx
@@ -2,16 +2,17 @@ import React from 'react';
import { connectPlayer, Controls } from 'App/player';
import { toggleBottomBlock, NETWORK, EXCEPTIONS, PERFORMANCE } from 'Duck/components/player';
import { useModal } from 'App/components/Modal';
-import { Icon, ErrorDetails } from 'UI';
+import { Icon, ErrorDetails, Popup } from 'UI';
import { Tooltip } from 'react-tippy';
import { TYPES as EVENT_TYPES } from 'Types/session/event';
import StackEventModal from '../StackEventModal';
+import ErrorDetailsModal from 'App/components/Dashboard/components/Errors/ErrorDetailsModal';
interface Props {
pointer: any;
type: any;
}
-function TimelinePointer(props: Props) {
+const TimelinePointer = React.memo((props: Props) => {
const { showModal, hideModal } = useModal();
const createEventClickHandler = (pointer: any, type: any) => (e: any) => {
e.stopPropagation();
@@ -20,8 +21,8 @@ function TimelinePointer(props: Props) {
return;
}
- if (type === 'EXCEPTIONS') {
- showModal(
, { right: true });
+ if (type === 'ERRORS') {
+ showModal(
, { right: true });
}
if (type === 'EVENT') {
@@ -32,8 +33,8 @@ function TimelinePointer(props: Props) {
const renderNetworkElement = (item: any) => {
return (
-
{item.success ? 'Slow resource: ' : 'Missing resource:'}
@@ -46,14 +47,14 @@ function TimelinePointer(props: Props) {
-
+
);
};
const renderClickRageElement = (item: any) => {
return (
-
{'Click Rage'}
@@ -64,14 +65,14 @@ function TimelinePointer(props: Props) {
-
+
);
};
const renderStackEventElement = (item: any) => {
return (
-
{'Stack Event'}
@@ -82,15 +83,14 @@ function TimelinePointer(props: Props) {
{/* */}
-
+
);
};
const renderPerformanceElement = (item: any) => {
- console.log('item', item)
return (
-
{item.name}
@@ -101,14 +101,14 @@ function TimelinePointer(props: Props) {
{/* */}
-
+
);
};
const renderExceptionElement = (item: any) => {
return (
-
{'Exception'}
@@ -118,10 +118,10 @@ function TimelinePointer(props: Props) {
delay={0}
position="top"
>
-
+
-
+
);
};
@@ -145,6 +145,6 @@ function TimelinePointer(props: Props) {
}
};
return
{render()}
;
-}
+});
export default TimelinePointer;
diff --git a/frontend/app/components/Session_/Player/Controls/Timeline.js b/frontend/app/components/Session_/Player/Controls/Timeline.js
index 91603fbf5..0899f1d2a 100644
--- a/frontend/app/components/Session_/Player/Controls/Timeline.js
+++ b/frontend/app/components/Session_/Player/Controls/Timeline.js
@@ -12,7 +12,7 @@ import CustomDragLayer from './CustomDragLayer';
import { debounce } from 'App/utils';
import { Tooltip } from 'react-tippy';
-const BOUNDRY = 15;
+const BOUNDRY = 0;
function getTimelinePosition(value, scale) {
const pos = value * scale;
diff --git a/frontend/app/components/ui/ErrorDetails/ErrorDetails.tsx b/frontend/app/components/ui/ErrorDetails/ErrorDetails.tsx
index 331535461..047c29f0a 100644
--- a/frontend/app/components/ui/ErrorDetails/ErrorDetails.tsx
+++ b/frontend/app/components/ui/ErrorDetails/ErrorDetails.tsx
@@ -1,7 +1,7 @@
import React, { useEffect, useState } from 'react';
import ErrorFrame from '../ErrorFrame/ErrorFrame';
import { fetchErrorStackList } from 'Duck/sessions';
-import { IconButton, Icon } from 'UI';
+import { Button, Icon } from 'UI';
import { connect } from 'react-redux';
const docLink = 'https://docs.openreplay.com/installation/upload-sourcemaps';
@@ -46,8 +46,12 @@ function ErrorDetails(props: Props) {
Stacktrace
- setShowRaw(false)} label="FULL" plain={!showRaw} primaryText={!showRaw} />
- setShowRaw(true)} plain={showRaw} label="RAW" />
+
+
@@ -59,7 +63,6 @@ function ErrorDetails(props: Props) {
{error.name} : {firstFunc ? firstFunc : '?'}
)}
- ;
{errorStack.map((frame: any, i: any) => (