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 @@ + + +