diff --git a/frontend/app/components/Session/Layout/Player/timeTracker.module.css b/frontend/app/components/Session/Layout/Player/timeTracker.module.css
index 2e2137da3..43877fe66 100644
--- a/frontend/app/components/Session/Layout/Player/timeTracker.module.css
+++ b/frontend/app/components/Session/Layout/Player/timeTracker.module.css
@@ -20,4 +20,4 @@
pointer-events: none;
height: 2px;
z-index: 1;
-}
\ No newline at end of file
+}
diff --git a/frontend/app/components/Session_/Player/Controls/ControlButton.js b/frontend/app/components/Session_/Player/Controls/ControlButton.js
index 6f31f982c..21c14082a 100644
--- a/frontend/app/components/Session_/Player/Controls/ControlButton.js
+++ b/frontend/app/components/Session_/Player/Controls/ControlButton.js
@@ -3,22 +3,33 @@ import cn from 'classnames';
import { Icon } from 'UI';
import stl from './controlButton.module.css';
-const ControlButton = ({ label, icon, disabled=false, onClick, count = 0, hasErrors=false, active=false }) => (
+const ControlButton = ({
+ label,
+ icon = '',
+ disabled=false,
+ onClick,
+ count = 0,
+ hasErrors=false,
+ active=false,
+ size = 20,
+ noLabel,
+ labelClassName,
+ containerClassName,
+ noIcon,
+ }) => (
);
ControlButton.displayName = 'ControlButton';
-export default ControlButton;
\ No newline at end of file
+export default ControlButton;
diff --git a/frontend/app/components/Session_/Player/Controls/Controls.js b/frontend/app/components/Session_/Player/Controls/Controls.js
index 4cf145883..06d7e1064 100644
--- a/frontend/app/components/Session_/Player/Controls/Controls.js
+++ b/frontend/app/components/Session_/Player/Controls/Controls.js
@@ -50,15 +50,15 @@ function getStorageIconName(type) {
function getStorageName(type) {
switch(type) {
case STORAGE_TYPES.REDUX:
- return "Redux";
+ return "REDUX";
case STORAGE_TYPES.MOBX:
- return "MobX";
+ return "MOBX";
case STORAGE_TYPES.VUEX:
- return "Vuex";
+ return "VUEX";
case STORAGE_TYPES.NGRX:
- return "NgRx";
+ return "NGRX";
case STORAGE_TYPES.NONE:
- return "State";
+ return "STATE";
}
}
@@ -204,25 +204,32 @@ export default class Controls extends React.Component {
let label;
let icon;
if (completed) {
- label = 'Replay';
icon = 'redo';
} else if (playing) {
- label = 'Pause';
- icon = 'pause';
+ icon = 'play-fill-new';
} else {
- label = 'Play';
- icon = 'play';
+ icon = 'pause-fill';
}
+
return (
-
- );
+
+
+
+ )
}
+ controlIcon = (icon, size, action, isBackwards, additionalClasses) =>
+
+
+
+
render() {
const {
bottomBlock,
@@ -267,21 +274,42 @@ export default class Controls extends React.Component {
{ !live && (
-
+
{ this.renderPlayBtn() }
-
- {/*
*/}
+ { !live && (
+
+
+ /
+
+
+ )}
+
+
+ {this.controlIcon("skip-forward-fill", 18, this.backTenSeconds, true, 'hover:bg-active-blue-border')}
+
10s
+ {this.controlIcon("skip-forward-fill", 18, this.forthTenSeconds, false, 'hover:bg-active-blue-border')}
+
+
+ {!live &&
+
+
+
+
+
+ }
)}
@@ -294,50 +322,59 @@ export default class Controls extends React.Component {
)}
-
- {!live &&
-
-
-
-
-
- }
-
- { !live &&
}
-
+
+ { !live &&
}
+ {!live && (
+
+ )}
+
toggleBottomBlock(CONSOLE) }
+ active={ bottomBlock === CONSOLE }
+ label="CONSOLE"
+ noIcon
+ labelClassName="text-base font-semibold"
+ count={ logCount }
+ hasErrors={ logRedCount > 0 }
+ />
{ !live &&
toggleBottomBlock(NETWORK) }
active={ bottomBlock === NETWORK }
- label="Network"
- // count={ redResourceCount }
+ label="NETWORK"
hasErrors={ resourceRedCount > 0 }
- icon="wifi"
+ noIcon
+ labelClassName="text-base font-semibold"
/>
}
- { showFetch &&
+ {!live &&
+ toggleBottomBlock(PERFORMANCE) }
+ active={ bottomBlock === PERFORMANCE }
+ label="PERFORMANCE"
+ noIcon
+ labelClassName="text-base font-semibold"
+ />
+ }
+ {showFetch &&
toggleBottomBlock(FETCH) }
active={ bottomBlock === FETCH }
hasErrors={ fetchRedCount > 0 }
count={ fetchCount }
- label="Fetch"
- icon="fetch"
+ label="FETCH"
+ noIcon
+ labelClassName="text-base font-semibold"
/>
}
{ !live && showGraphql &&
@@ -346,8 +383,9 @@ export default class Controls extends React.Component {
onClick={ ()=> toggleBottomBlock(GRAPHQL) }
active={ bottomBlock === GRAPHQL }
count={ graphqlCount }
- label="GraphQL"
- icon="vendors/graphql"
+ label="GRAPHQL"
+ noIcon
+ labelClassName="text-base font-semibold"
/>
}
{ !live && showStorage &&
@@ -357,18 +395,8 @@ export default class Controls extends React.Component {
active={ bottomBlock === STORAGE }
count={ storageCount }
label={ getStorageName(storageType) }
- icon={ getStorageIconName(storageType) }
- />
- }
- {
- toggleBottomBlock(CONSOLE) }
- active={ bottomBlock === CONSOLE }
- label="Console"
- icon="console"
- count={ logCount }
- hasErrors={ logRedCount > 0 }
+ noIcon
+ labelClassName="text-base font-semibold"
/>
}
{ showExceptions &&
@@ -376,8 +404,9 @@ export default class Controls extends React.Component {
disabled={ disabled }
onClick={ () => toggleBottomBlock(EXCEPTIONS) }
active={ bottomBlock === EXCEPTIONS }
- label="Exceptions"
- icon="console/error"
+ label="EXCEPTIONS"
+ noIcon
+ labelClassName="text-base font-semibold"
count={ exceptionsCount }
hasErrors={ exceptionsCount > 0 }
/>
@@ -387,8 +416,9 @@ export default class Controls extends React.Component {
disabled={ disabled }
onClick={ () => toggleBottomBlock(STACKEVENTS) }
active={ bottomBlock === STACKEVENTS }
- label="Events"
- icon="puzzle-piece"
+ label="EVENTS"
+ noIcon
+ labelClassName="text-base font-semibold"
count={ stackCount }
hasErrors={ stackRedCount > 0 }
/>
@@ -399,51 +429,15 @@ export default class Controls extends React.Component {
onClick={ () => toggleBottomBlock(PROFILER) }
active={ bottomBlock === PROFILER }
count={ profilesCount }
- label="Profiler"
- icon="code"
+ label="PROFILER"
+ noIcon
+ labelClassName="text-base font-semibold"
/>
}
- {
- !live &&
- toggleBottomBlock(PERFORMANCE) }
- active={ bottomBlock === PERFORMANCE }
- label="Performance"
- icon="tachometer-slow"
- />
- }
- {/* { !live && showLongtasks &&
- toggleBottomBlock(LONGTASKS) }
- active={ bottomBlock === LONGTASKS }
- label="Long Tasks"
- icon="business-time"
- />
- } */}
-
+ { !live && }
{ !live &&
-
-
-
+ this.controlIcon("arrows-angle-extend", 18, this.props.fullscreenOn, false, "rounded hover:bg-gray-light-shade")
}
-
-
- {!live && (
-
- )}
}
diff --git a/frontend/app/components/Session_/Player/Controls/Time.js b/frontend/app/components/Session_/Player/Controls/Time.js
index 73a65c5c0..a46962c2d 100644
--- a/frontend/app/components/Session_/Player/Controls/Time.js
+++ b/frontend/app/components/Session_/Player/Controls/Time.js
@@ -3,8 +3,8 @@ import { Duration } from 'luxon';
import { connectPlayer } from 'Player';
import styles from './time.module.css';
-const Time = ({ time }) => (
-
+const Time = ({ time, isCustom }) => (
+
{ Duration.fromMillis(time).toFormat('m:ss') }
)
@@ -19,4 +19,4 @@ const ReduxTime = connectPlayer((state, { name }) => ({
ReduxTime.displayName = "ReduxTime";
export default Time;
-export { ReduxTime };
\ No newline at end of file
+export { ReduxTime };
diff --git a/frontend/app/components/Session_/Player/Controls/Timeline.js b/frontend/app/components/Session_/Player/Controls/Timeline.js
index a42aab3f1..cb6cc2715 100644
--- a/frontend/app/components/Session_/Player/Controls/Timeline.js
+++ b/frontend/app/components/Session_/Player/Controls/Timeline.js
@@ -2,7 +2,7 @@ import React from 'react';
import { connect } from 'react-redux';
import cn from 'classnames';
import { connectPlayer } from 'Player';
-import { TimelinePointer } from 'UI';
+import { Popup, TimelinePointer, Icon } from 'UI';
import TimeTracker from './TimeTracker';
import { ReduxTime } from './Time';
import stl from './timeline.module.css';
@@ -11,20 +11,21 @@ import { setTimelinePointer } from 'Duck/sessions';
import DraggableCircle from './DraggableCircle';
import CustomDragLayer from './CustomDragLayer';
import { debounce } from 'App/utils';
+import { Tooltip } from 'react-tippy';
const getPointerIcon = (type) => {
- // exception,
+ // exception,
switch(type) {
case 'fetch':
return 'funnel/file-earmark-minus-fill';
case 'exception':
- return 'funnel/exclamation-circle';
+ return 'funnel/exclamation-circle-fill';
case 'log':
- return 'funnel/exclamation-circle';
+ return 'funnel/exclamation-circle-fill';
case 'stack':
return 'funnel/patch-exclamation-fill';
case 'resource':
- return 'funnel/file-medical-alt';
+ return 'funnel/file-earmark-minus-fill';
case 'dead_click':
return 'funnel/dizzy';
@@ -47,10 +48,10 @@ const getPointerIcon = (type) => {
case 'crash':
return 'funnel/file-exclamation';
case 'js_exception':
- return 'funnel/exclamation-circle';
+ return 'funnel/exclamation-circle-fill';
}
- return 'info';
+ return 'info';
}
@@ -72,7 +73,7 @@ let deboucneJump = () => null;
fetchList: state.fetchList,
}))
@connect(state => ({
- issues: state.getIn([ 'sessions', 'current', 'issues' ]),
+ issues: state.getIn([ 'sessions', 'current', 'issues' ]),
clickRageTime: state.getIn([ 'sessions', 'current', 'clickRage' ]) &&
state.getIn([ 'sessions', 'current', 'clickRageTime' ]),
returningLocationTime: state.getIn([ 'sessions', 'current', 'returningLocation' ]) &&
@@ -143,10 +144,10 @@ export default class Timeline extends React.PureComponent {
const scale = 100 / endTime;
return (
-
- { !live &&
}
(
-
-
{ iss.name }
-
- }
- />
+
+ }
+ >
+
+
))
}
{ events.filter(e => e.type === TYPES.CLICKRAGE).map(e => (
-
-
{ "Click Rage" }
-
- }
- />
+
+ }
+ >
+
+
- //
- // }
- // content={
- //
- // { "Click Rage" }
- //
- // }
- // />
))}
- { typeof clickRageTime === 'number' &&
-
-
{ "Click Rage" }
-
- }
- />
+
+ }
+ >
+
+
- //
- // }
- // content={
- //
- // { "Click Rage" }
- //
- // }
- // />
}
- { /* typeof returningLocationTime === 'number' &&
-
- }
- content={
-
- { "Returning Location" }
-
- }
- />
- */ }
{ exceptionsList
.map(e => (
-
{ "Exception" }
{ e.message }
-
- }
- />
+
+ }
+ >
+
+
- //
- // }
- // content={
- //
- // { "Exception:" }
- //
- // { e.message }
- //
- // }
- // />
- ))
- }
- { logList
- .map(l => l.isRed() && (
-
-
- { "Console" }
-
- { l.value }
-
- }
- />
-
- //
- // }
- // content={
- //
- // { "Console:" }
- //
- // { l.value }
- //
- // }
- // />
))
}
{ resourceList
@@ -396,49 +276,27 @@ export default class Timeline extends React.PureComponent {
.map(r => (
-
{ r.success ? "Slow resource: " : "Missing resource:" }
{ r.name }
-
- }
- />
+
+ }
+ >
+
+
- //
-
- //
- // }
- // content={
- //
- // { r.success ? "Slow resource: " : "Missing resource:" }
- //
- // { r.name }
- //
- // }
- // />
))
}
{ fetchList
@@ -447,39 +305,20 @@ export default class Timeline extends React.PureComponent {
{ "Failed Fetch" }
{ e.name }
-
+
}
/>
-
- //
- // }
- // content={
- //
- // { "Failed Fetch:" }
- //
- // { e.name }
- //
- // }
- // />
+
))
}
{ stackList
@@ -488,43 +327,23 @@ export default class Timeline extends React.PureComponent {
{ "Stack Event" }
{ e.name }
-
+
}
/>
- //
- // }
- // content={
- //
- // { "Stack Event:" }
- //
- // { e.name }
- //
- // }
- // />
))
}
- { !live && }
);
}
diff --git a/frontend/app/components/Session_/Player/Controls/controlButton.module.css b/frontend/app/components/Session_/Player/Controls/controlButton.module.css
index 90d85a359..bd394c4d9 100644
--- a/frontend/app/components/Session_/Player/Controls/controlButton.module.css
+++ b/frontend/app/components/Session_/Player/Controls/controlButton.module.css
@@ -19,15 +19,15 @@
height: 6px;
border-radius: 3px;
background-color: red;
- top: 12px;
- left: 23px;
+ bottom: 0px;
+ right: 0px;
position: absolute;
}
& .countLabel {
position: absolute;
top: -6px;
- left: 12px;
+ right: -6px;
background-color: $gray-dark;
color: white;
font-size: 9px;
@@ -52,4 +52,4 @@
pointer-events: none;
opacity: 0.5;
}
-}
\ No newline at end of file
+}
diff --git a/frontend/app/components/Session_/Player/Controls/controls.module.css b/frontend/app/components/Session_/Player/Controls/controls.module.css
index 156c232dd..565905506 100644
--- a/frontend/app/components/Session_/Player/Controls/controls.module.css
+++ b/frontend/app/components/Session_/Player/Controls/controls.module.css
@@ -7,17 +7,15 @@
}
.controls {
- /* margin-top: 10px; */
- border-top: solid thin $gray-light;
- padding-top: 36px;
- padding-bottom: 10px;
+ padding-top: 10px;
+ position: relative;
}
.buttons {
display: flex;
justify-content: space-between;
- margin-top: 7px;
align-items: center;
+ height: 65px;
padding: 0 30px;
&[data-is-live=true] {
padding: 0;
@@ -115,4 +113,4 @@
animation: fade 1s infinite;
}
}
-}
\ No newline at end of file
+}
diff --git a/frontend/app/components/Session_/Player/Controls/timeTracker.module.css b/frontend/app/components/Session_/Player/Controls/timeTracker.module.css
index acf755071..86dd5bd16 100644
--- a/frontend/app/components/Session_/Player/Controls/timeTracker.module.css
+++ b/frontend/app/components/Session_/Player/Controls/timeTracker.module.css
@@ -16,9 +16,8 @@
.playedTimeline {
display: block;
height: 100%;
- border-radius: 4px;
- background-color: $teal;
+ background-color: $active-blue-border;
pointer-events: none;
- height: 2px;
+ height: 10px;
z-index: 1;
-}
\ No newline at end of file
+}
diff --git a/frontend/app/components/Session_/Player/Controls/timeline.module.css b/frontend/app/components/Session_/Player/Controls/timeline.module.css
index da7a99cd8..6b649e6ef 100644
--- a/frontend/app/components/Session_/Player/Controls/timeline.module.css
+++ b/frontend/app/components/Session_/Player/Controls/timeline.module.css
@@ -1,22 +1,22 @@
.positionTracker {
width: 15px;
height: 15px;
- outline: solid 1px $teal;
+ outline: solid 1px $teal-dark;
outline-style: inset;
margin-left: -7px;
border-radius: 50%;
- background-color: $active-blue;
+ background-color: $main;
position: absolute;
left: 0;
z-index: 98;
- top: 0;
+ top: 3px;
transition: all 0.2s ease-out;
&:hover,
&:focus {
transition: all 0.1s ease-in;
width: 20px;
height: 20px;
- top: -2px;
+ top: 1px;
left: -2px;
}
@@ -24,8 +24,7 @@
.progress {
height: 10px;
- border-radius: 1px;
- background: transparent;
+ padding: 8px 0;
cursor: pointer;
width: 100%;
position: relative;
@@ -36,22 +35,20 @@
.skipInterval {
position: absolute;
- top: 0;
+ top: 3px;
+ height: 10px;
bottom: 0;
- border-radius: 4px;
- background-color: rgba(0, 0, 0, 0.15);
+ background-color: $gray-light;
pointer-events: none;
+ z-index: 2;
}
.event {
position: absolute;
- width: 8px;
- height: 8px;
- border: solid 1px white;
- margin-left: -4px;
- border-radius: 50%;
- background: rgba(136, 136, 136, 0.8);
+ width: 2px;
+ height: 10px;
+ background: $main;
pointer-events: none;
/* top: 0; */
/* bottom: 0; */
@@ -74,7 +71,6 @@
position: absolute;
width: 2px;
height: 8px;
- border-radius: 2px;
margin-left: -15px;
&:hover {
z-index: 9999;
@@ -112,13 +108,13 @@
}
.timeline {
- border-radius: 5px;
overflow: hidden;
position: absolute;
left: 0;
right: 0;
- height: 2px;
- background-color: $gray-light;
+ height: 10px;
+ border-top: 1px solid $gray-light;
+ border-bottom: 1px solid $gray-light;
display: flex;
align-items: center;
}
@@ -127,7 +123,6 @@
position: absolute;
width: 2px;
height: 8px;
- border-radius: 2px;
margin-left: -1px;
/* background: $red; */
}
@@ -146,7 +141,6 @@
margin-left: -9px;
background-color: $gray-lightest;
padding: 2px;
- border-radius: 3px;
box-shadow: 0px 0px 0px 1px rgba(0,0,0,0.1);
& .tooltipArrow {
@@ -169,4 +163,4 @@
box-shadow: 0px 0px 0px 1px rgba(0,0,0,0.1);
}
}
-}
\ No newline at end of file
+}
diff --git a/frontend/app/components/Session_/PlayerBlockHeader.js b/frontend/app/components/Session_/PlayerBlockHeader.js
index e03cc9403..e47481809 100644
--- a/frontend/app/components/Session_/PlayerBlockHeader.js
+++ b/frontend/app/components/Session_/PlayerBlockHeader.js
@@ -119,12 +119,12 @@ export default class PlayerBlockHeader extends React.PureComponent {
{ live && !isAssist && (
<>
-
+
This Session is Now Continuing Live
-
+ {_metaList.length > 0 &&
}
>
)}
diff --git a/frontend/app/svg/icons/arrows-angle-extend.svg b/frontend/app/svg/icons/arrows-angle-extend.svg
new file mode 100644
index 000000000..dd29dad45
--- /dev/null
+++ b/frontend/app/svg/icons/arrows-angle-extend.svg
@@ -0,0 +1,3 @@
+
diff --git a/frontend/app/svg/icons/pause-fill.svg b/frontend/app/svg/icons/pause-fill.svg
new file mode 100644
index 000000000..9d6ed7e3c
--- /dev/null
+++ b/frontend/app/svg/icons/pause-fill.svg
@@ -0,0 +1,3 @@
+
diff --git a/frontend/app/svg/icons/play-fill-new.svg b/frontend/app/svg/icons/play-fill-new.svg
new file mode 100644
index 000000000..bef99f910
--- /dev/null
+++ b/frontend/app/svg/icons/play-fill-new.svg
@@ -0,0 +1,3 @@
+