Skip to content
This repository was archived by the owner on Jun 5, 2020. It is now read-only.

Commit 2f774fa

Browse files
authored
Merge pull request #60 from zalmoxisus/ttr
Support for time travelling
2 parents 78e58e6 + f5a9ab7 commit 2f774fa

File tree

4 files changed

+36
-11
lines changed

4 files changed

+36
-11
lines changed

src/ActionList.jsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ export default class ActionList extends Component {
3737

3838
render() {
3939
const { styling, actions, actionIds, isWideLayout, onToggleAction, skippedActionIds,
40-
selectedActionId, startActionId, onSelect, onSearch, searchValue,
41-
onCommit, onSweep } = this.props;
40+
selectedActionId, startActionId, onSelect, onSearch, searchValue, currentActionId,
41+
onCommit, onSweep, onJumpToState } = this.props;
4242
const lowerSearchValue = searchValue && searchValue.toLowerCase();
4343
const filteredActionIds = searchValue ? actionIds.filter(
4444
id => actions[id].action.type.toLowerCase().indexOf(lowerSearchValue) !== -1
@@ -63,10 +63,12 @@ export default class ActionList extends Component {
6363
actionId >= startActionId && actionId <= selectedActionId ||
6464
actionId === selectedActionId
6565
}
66+
isInFuture={actionId > currentActionId}
6667
onSelect={(e) => onSelect(e, actionId)}
6768
timestamps={getTimestamps(actions, actionIds, actionId)}
6869
action={actions[actionId].action}
69-
onViewClick={() => onToggleAction(actionId)}
70+
onToggleClick={() => onToggleAction(actionId)}
71+
onJumpClick={() => onJumpToState(actionId)}
7072
onCommitClick={() => onCommit(actionId)}
7173
isSkipped={skippedActionIds.indexOf(actionId) !== -1} />
7274
)}

src/ActionListRow.jsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import debounce from 'lodash.debounce';
55
import RightSlider from './RightSlider';
66

77
const BUTTON_SKIP = 'Skip';
8+
const BUTTON_JUMP = 'Jump';
89

910
export default class ActionListRow extends Component {
1011
state = { hover: false };
@@ -13,6 +14,7 @@ export default class ActionListRow extends Component {
1314
styling: PropTypes.func.isRequired,
1415
isSelected: PropTypes.bool.isRequired,
1516
action: PropTypes.shape({ type: PropTypes.string.isRequired }).isRequired,
17+
isInFuture: PropTypes.bool.isRequired,
1618
isInitAction: PropTypes.bool.isRequired,
1719
onSelect: PropTypes.func.isRequired,
1820
timestamps: PropTypes.shape({
@@ -26,7 +28,7 @@ export default class ActionListRow extends Component {
2628

2729
render() {
2830
const { styling, isSelected, action, isInitAction, onSelect,
29-
timestamps, isSkipped } = this.props;
31+
timestamps, isSkipped, isInFuture } = this.props;
3032
const { hover } = this.state;
3133
const timeDelta = timestamps.current - timestamps.previous;
3234
const showButtons = hover && !isInitAction || isSkipped;
@@ -42,7 +44,8 @@ export default class ActionListRow extends Component {
4244
{...styling([
4345
'actionListItem',
4446
isSelected && 'actionListItemSelected',
45-
isSkipped && 'actionListItemSkipped'
47+
isSkipped && 'actionListItemSkipped',
48+
isInFuture && 'actionListFromFuture'
4649
], isSelected, action)}>
4750
<div {...styling(['actionListItemName', isSkipped && 'actionListItemNameSkipped'])}>
4851
{action.type}
@@ -56,7 +59,7 @@ export default class ActionListRow extends Component {
5659
</RightSlider>
5760
<RightSlider styling={styling} shown={showButtons} rotate>
5861
<div {...styling('actionListItemSelector')}>
59-
{[BUTTON_SKIP].map(btn => (!isInitAction || btn !== BUTTON_SKIP) &&
62+
{[BUTTON_JUMP, BUTTON_SKIP].map(btn => (!isInitAction || btn !== BUTTON_SKIP) &&
6063
<div key={btn}
6164
onClick={this.handleButtonClick.bind(this, btn)}
6265
{...styling([
@@ -78,7 +81,10 @@ export default class ActionListRow extends Component {
7881

7982
switch(btn) {
8083
case BUTTON_SKIP:
81-
this.props.onViewClick();
84+
this.props.onToggleClick();
85+
break;
86+
case BUTTON_JUMP:
87+
this.props.onJumpClick();
8288
break;
8389
}
8490
}

src/DevtoolsInspector.js

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ import { getBase16Theme } from 'react-base16-styling';
99
import { reducer, updateMonitorState } from './redux';
1010
import { ActionCreators } from 'redux-devtools';
1111

12-
const { commit, sweep, toggleAction } = ActionCreators;
12+
const { commit, sweep, toggleAction, jumpToAction, jumpToState } = ActionCreators;
1313

1414
function getLastActionId(props) {
1515
return props.stagedActionIds[props.stagedActionIds.length - 1];
1616
}
1717

1818
function getCurrentActionId(props, monitorState) {
1919
return monitorState.selectedActionId === null ?
20-
getLastActionId(props) : monitorState.selectedActionId;
20+
props.stagedActionIds[props.currentStateIndex] : monitorState.selectedActionId;
2121
}
2222

2323
function getFromState(actionIndex, stagedActionIds, computedStates, monitorState) {
@@ -149,10 +149,12 @@ export default class DevtoolsInspector extends Component {
149149

150150
render() {
151151
const { stagedActionIds: actionIds, actionsById: actions, computedStates,
152-
tabs, invertTheme, skippedActionIds, monitorState } = this.props;
152+
tabs, invertTheme, skippedActionIds, currentStateIndex, monitorState } = this.props;
153153
const { selectedActionId, startActionId, searchValue, tabName } = monitorState;
154154
const inspectedPathType = tabName === 'Action' ? 'inspectedActionPath' : 'inspectedStatePath';
155-
const { themeState, isWideLayout, action, nextState, delta, error } = this.state;
155+
const {
156+
themeState, isWideLayout, action, nextState, delta, error
157+
} = this.state;
156158
const { base16Theme, styling } = themeState;
157159

158160
return (
@@ -166,9 +168,11 @@ export default class DevtoolsInspector extends Component {
166168
onSearch={this.handleSearch}
167169
onSelect={this.handleSelectAction}
168170
onToggleAction={this.handleToggleAction}
171+
onJumpToState={this.handleJumpToState}
169172
onCommit={this.handleCommit}
170173
onSweep={this.handleSweep}
171174
skippedActionIds={skippedActionIds}
175+
currentActionId={actionIds[currentStateIndex]}
172176
lastActionId={getLastActionId(this.props)} />
173177
<ActionPreview {...{
174178
base16Theme, invertTheme, isWideLayout, tabs, tabName, delta, error, nextState,
@@ -186,6 +190,15 @@ export default class DevtoolsInspector extends Component {
186190
this.props.dispatch(toggleAction(actionId));
187191
};
188192

193+
handleJumpToState = actionId => {
194+
if (jumpToAction) {
195+
this.props.dispatch(jumpToAction(actionId));
196+
} else { // Fallback for redux-devtools-instrument < 1.5
197+
const index = this.props.stagedActionIds.indexOf(actionId);
198+
if (index !== -1) this.props.dispatch(jumpToState(index));
199+
}
200+
};
201+
189202
handleCommit = () => {
190203
this.props.dispatch(commit());
191204
};

src/utils/createStylingFromTheme.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,10 @@ const getSheetFromColorMap = map => ({
120120
'background-color': map.SKIPPED_BACKGROUND_COLOR
121121
},
122122

123+
actionListFromFuture: {
124+
opacity: '0.6'
125+
},
126+
123127
actionListItemButtons: {
124128
position: 'relative',
125129
height: '20px',

0 commit comments

Comments
 (0)