//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)) }
); } }