From d878122cf9c0daabd6f390f53e1fa13dcc1eb3a3 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Sun, 5 Jun 2016 18:43:17 -0700 Subject: [PATCH] web: fix list update propagation --- mitmproxy/web/static/app.js | 35 ++++++++-------------------------- web/src/js/ducks/utils/list.js | 3 ++- web/src/js/ducks/utils/view.js | 6 ++++-- 3 files changed, 14 insertions(+), 30 deletions(-) diff --git a/mitmproxy/web/static/app.js b/mitmproxy/web/static/app.js index 7a4deae88..b37365829 100644 --- a/mitmproxy/web/static/app.js +++ b/mitmproxy/web/static/app.js @@ -3802,7 +3802,7 @@ var MainView = _react2.default.createClass({ componentWillReceiveProps: function componentWillReceiveProps(nextProps) { // Update redux store with route changes if (nextProps.routeParams.flowId !== (nextProps.selectedFlow || {}).id) { - // FIXME this.props.selectFlow(nextProps.routeParams.flowId) + this.props.selectFlow(nextProps.routeParams.flowId); } if (nextProps.location.query[_actions.Query.SEARCH] !== nextProps.filter) { this.props.setFilter(nextProps.location.query[_actions.Query.SEARCH], false); @@ -3815,7 +3815,6 @@ var MainView = _react2.default.createClass({ // FIXME: Move to redux. This requires that sortKeyFun is not a function anymore. }, selectFlow: function selectFlow(flow) { - return this.props.selectFlow(flow.id); // TODO: This belongs into redux if (flow) { var tab = this.props.routeParams.detailTab || "request"; @@ -4117,7 +4116,7 @@ exports.default = Prompt; Object.defineProperty(exports, "__esModule", { value: true }); -exports.history = exports.App = undefined; +exports.App = undefined; var _react = require("react"); @@ -4298,7 +4297,6 @@ var App = exports.App = _react2.default.createElement( _react2.default.createElement(_reactRouter.Route, { path: "reports", component: Reports }) ) ); -exports.history = _reactRouter.hashHistory; },{"../store/store.js":31,"../utils.js":32,"./common.js":4,"./eventlog.js":6,"./footer.js":14,"./header.js":15,"./mainview.js":18,"lodash":"lodash","react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router"}],21:[function(require,module,exports){ "use strict"; @@ -4517,8 +4515,6 @@ var _filt2 = _interopRequireDefault(_filt); var _view = require("./utils/view"); -var _proxyapp = require("../components/proxyapp"); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var UPDATE_FLOWS = exports.UPDATE_FLOWS = "UPDATE_FLOWS"; @@ -4589,23 +4585,6 @@ function setHighlight(highlight) { }; } function selectFlow(flowId) { - var detailTab = arguments.length <= 1 || arguments[1] === undefined ? "request" : arguments[1]; - - var pathname = void 0; - if (flowId) { - pathname = "/flows/" + flowId + "/" + detailTab; - } else { - pathname = "/flows"; - } - - /* - let location - history.listen(l => {location = l})() - history.replace({ - ...location, - pathname - }) - */ return { type: SELECT_FLOW, flowId: flowId @@ -4615,7 +4594,7 @@ function selectFlow(flowId) { exports.updateFlows = updateList; exports.fetchFlows = fetchList; -},{"../components/proxyapp":20,"../filt/filt":29,"./utils/list":26,"./utils/view":27}],25:[function(require,module,exports){ +},{"../filt/filt":29,"./utils/list":26,"./utils/view":27}],25:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -4750,7 +4729,8 @@ function makeList(actionType, fetchURL) { itemIndex = state.indexOf[action.item.id]; list[itemIndex] = action.item; return _extends({}, state, { - list: list + list: list, + byId: _extends({}, state.byId, _defineProperty({}, action.item.id, action.item)) }); case REMOVE: @@ -4969,13 +4949,14 @@ function updateViewList(currentView, currentList, nextList, action) { if (!isInView && shouldBeInView) return sortedInsert(currentView, sortFn, action.item); if (isInView && !shouldBeInView) return sortedRemove(currentView, sortFn, action.item); - if (isInView && shouldBeInView && sortFn && sortFn(currentItemState) !== sortFn(nextItemState)) { + if (isInView && shouldBeInView) { var _ret = function () { var s = [].concat(_toConsumableArray(currentView)); - s.sort(makeCompareFn(sortFn)); s.indexOf = function (x) { return sortedIndexOf(s, x, sortFn); }; + s[s.indexOf(currentItemState)] = nextItemState; + if (sortFn && sortFn(currentItemState) !== sortFn(nextItemState)) s.sort(makeCompareFn(sortFn)); return { v: s }; diff --git a/web/src/js/ducks/utils/list.js b/web/src/js/ducks/utils/list.js index 6668e85ed..a830fe99d 100644 --- a/web/src/js/ducks/utils/list.js +++ b/web/src/js/ducks/utils/list.js @@ -63,7 +63,8 @@ export default function makeList(actionType, fetchURL) { list[itemIndex] = action.item return { ...state, - list + list, + byId: {...state.byId, [action.item.id]: action.item}, } case REMOVE: diff --git a/web/src/js/ducks/utils/view.js b/web/src/js/ducks/utils/view.js index 5535ed833..ff6f4c129 100644 --- a/web/src/js/ducks/utils/view.js +++ b/web/src/js/ducks/utils/view.js @@ -96,10 +96,12 @@ export function updateViewList(currentView, currentList, nextList, action, filte return sortedInsert(currentView, sortFn, action.item) if (isInView && !shouldBeInView) return sortedRemove(currentView, sortFn, action.item) - if (isInView && shouldBeInView && sortFn && sortFn(currentItemState) !== sortFn(nextItemState)) { + if (isInView && shouldBeInView) { let s = [...currentView] - s.sort(makeCompareFn(sortFn)) s.indexOf = x => sortedIndexOf(s, x, sortFn) + s[s.indexOf(currentItemState)] = nextItemState + if (sortFn && sortFn(currentItemState) !== sortFn(nextItemState)) + s.sort(makeCompareFn(sortFn)) return s } return currentView