//import cn from 'classnames';
//import withEnumToggle from 'HOCs/withEnumToggle';
import { connect } from 'react-redux';
import { hideHint } from 'Duck/components/player';
import {
connectPlayer,
selectStorageType,
STORAGE_TYPES,
selectStorageListNow,
selectStorageList,
} from 'Player/store';
import { JSONTree, IconButton, Icon, Popup, Tabs, NoContent } from 'UI';
import { formatMs } from 'App/date';
import { jump } from 'Player';
import Autoscroll from '../Autoscroll';
import BottomBlock from '../BottomBlock/index';
import stl from './storage.css';
// const STATE = 'STATE';
// const DIFF = 'DIFF';
// const TABS = [ DIFF, STATE ].map(tab => ({ text: tab, key: tab }));
function getActionsName(type) {
switch(type) {
case STORAGE_TYPES.MOBX:
return "MUTATIONS";
case STORAGE_TYPES.VUEX:
return "MUTATIONS";
default:
return "ACTIONS";
}
}
@connectPlayer(state => ({
type: selectStorageType(state),
list: selectStorageList(state),
listNow: selectStorageListNow(state),
}))
@connect(state => ({
hintIsHidden: state.getIn(['components', 'player', 'hiddenHints', 'storage']),
}), {
hideHint
})
//@withEnumToggle('activeTab', 'setActiveTab', DIFF)
export default class Storage extends React.PureComponent {
lastBtnRef = React.createRef()
focusNextButton() {
if (this.lastBtnRef.current) {
this.lastBtnRef.current.focus();
}
}
componentDidMount() {
this.focusNextButton();
}
componentDidUpdate(prevProps) {
if (prevProps.listNow.length !== this.props.listNow.length) {
this.focusNextButton();
}
}
renderDiff() {
// const { listNow, type } = this.props;
// const lastRAction = listNow[ listNow.length - 1 ];
// if (lastRAction.state) {
// const greenPaths = Object.keys(lastRAction.state).map(key => [ key ]);
// return ;
// }
// const df = {};
// const redPaths = [];
// const yellowPaths = [];
// const greenPaths = [];
// lastRAction.diff.forEach(d => {
// try {
// let { path, kind, rhs: value } = d;
// if (kind === 'A') {
// path.slice().push(d.index);
// kind = d.item.kind;
// value = d.item.rhs;
// }
// setIn(df, path, value);
// if (kind === 'N') greenPaths.push(d.path.slice().reverse());
// if (kind === 'D') redPaths.push(d.path.slice().reverse());
// if (kind === 'E') yellowPaths.push(d.path.slice().reverse());
// } catch (e) {
// }
// });
// return (
//
// );
}
ensureString(actionType) {
if (typeof actionType === 'string') return actionType;
return "UNKNOWN";
}
goNext = () => {
const { list, listNow } = this.props;
jump(list[ listNow.length ].time, list[ listNow.length ]._index);
}
renderTab () {
// switch(this.props.activeTab) {
// case DIFF:
// return this.renderDiff();
// case STATE:
const { listNow } = this.props;
if (listNow.length === 0) {
return "Not initialized"; //?
}
return ;
// }
// return null;
}
renderItem(item, i) {
const { type, listNow, list } = this.props;
let src;
let name;
switch(type) {
case STORAGE_TYPES.REDUX:
case STORAGE_TYPES.NGRX:
src = item.action;
name = src && src.type;
break;
case STORAGE_TYPES.VUEX:
src = item.mutation;
name = src && src.type;
break;
case STORAGE_TYPES.MOBX:
src = item.payload;
name = `@${item.type} ${src && src.type}`;
break;
}
return (
{ i + 1 < listNow.length &&
}
{ i + 1 === listNow.length && i + 1 < list.length &&
}
{ typeof item.duration === 'number' &&
{ formatMs(item.duration) }
}
);
}
render() {
const {
type,
listNow,
activeTab,
setActiveTab,
list,
hintIsHidden,
} = this.props;
const showStore = type !== STORAGE_TYPES.MOBX;
return (
{ list.length > 0 &&
{ showStore &&
{"STORE"}
}
{getActionsName(type)}
}
{'Inspect your application state while you’re replaying your users sessions. OpenReplay supports '}
Redux{', '}
VueX{', '}
MobX{' and '}
NgRx.
>
: null
}
size="small"
show={ listNow.length === 0 }
>
{ showStore &&
{ listNow.length === 0
?
{ "Empty state." }
: this.renderTab()
}
}
{ listNow.map((item, i) => this.renderItem(item, i)) }
);
}
}