Skip to content

Commit 11b86cf

Browse files
committed
Moves request-counting to renderer reducer
1 parent 1f5713e commit 11b86cf

File tree

11 files changed

+124
-112
lines changed

11 files changed

+124
-112
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
"redux": "^3.5.2",
4848
"redux-logger": "^3.0.6",
4949
"redux-thunk": "^2.0.1",
50+
"reselect": "^4.0.0",
5051
"source-map-support": "^0.5.3",
5152
"uniqid": "^4.0.0"
5253
},

src/common/service/proxy.js

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -91,22 +91,8 @@ export default class Proxy {
9191
}
9292
}
9393

94-
getRequestById(id) {
95-
if (!id) return null;
96-
return this._requests.find((request) => request.request.id === id);
97-
}
98-
99-
getRequestData(filter) {
100-
const matchesFilter = (request) =>
101-
request.fullUrl().includes(filter) || request.original.fullUrl.includes(filter);
102-
103-
const requests = !filter ? this._requests : this._requests.filter(({request}) => matchesFilter(request));
104-
105-
return {
106-
requests,
107-
totalCount: this._requests.length,
108-
filteredCount: requests.length
109-
};
94+
getRequests() {
95+
return this._requests;
11096
}
11197

11298
clear() {

src/main/index.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,6 @@ app.on('ready', () => {
100100
}
101101
});
102102

103-
ipc.on('proxy-filter', (evt, {filter}) => {
104-
proxy.setFilter(filter);
105-
});
106-
107103
ipc.on('proxy-clear', () => {
108104
proxy.proxy.clear();
109105
});

src/main/proxy.js

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ class ProxyHandler extends EventEmitter {
1111
constructor(config, urlMapper) {
1212
super();
1313
this.config = config;
14-
this.filter = undefined;
1514
this.status = undefined;
1615
this.cachingEnabled = false;
1716

@@ -110,10 +109,7 @@ class ProxyHandler extends EventEmitter {
110109
}
111110

112111
getRequestData() {
113-
const requestData = this.proxy.getRequestData(this.filter);
114-
requestData.requests = requestData.requests
115-
.map(this.sanitizeRequest_());
116-
return requestData;
112+
return this.proxy.getRequests().map(this.sanitizeRequest_());
117113
}
118114

119115
getRequest(id) {
@@ -140,11 +136,6 @@ class ProxyHandler extends EventEmitter {
140136
isCaching() {
141137
return this.isCaching;
142138
}
143-
144-
setFilter(filter) {
145-
this.filter = filter;
146-
this.onUpdate_();
147-
}
148139
}
149140

150141
export default function createProxyHandler(config, urlMapper) {

src/renderer/component/footer/footer.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ import {
2020
} from '../../../common/actions/proxy.js';
2121

2222
import { getUpdateStatus } from '../../reducers/app.js';
23-
import { getRequestData } from '../../reducers/requests.js';
2423
import { getProxyState } from '../../reducers/proxy.js';
24+
import { getFilteredRequestCount, getTotalRequestCount } from '../../reducers/requests';
2525

2626
const Footer = props =>
2727
<div className="footer">
@@ -36,7 +36,8 @@ const Footer = props =>
3636
throttleRate={props.throttleRate}
3737
/>
3838
<RequestCount
39-
requestData={props.requestData}
39+
filteredRequestCount={props.filteredRequestCount}
40+
totalRequestCount={props.totalRequestCount}
4041
clearRequests={props.clearRequests}
4142
/>
4243
<UpdateStatus
@@ -55,7 +56,8 @@ Footer.propTypes = {
5556
proxyStatus: ProxyStatusTypes.isRequired,
5657
proxyReason: PropTypes.string,
5758
proxyMessage: PropTypes.string,
58-
requestData: PropTypes.object.isRequired,
59+
filteredRequestCount: PropTypes.number.isRequired,
60+
totalRequestCount: PropTypes.number.isRequired,
5961
clearRequests: PropTypes.func.isRequired,
6062
toggleThrottle: PropTypes.func.isRequired,
6163
setThrottleRate: PropTypes.func.isRequired,
@@ -73,7 +75,8 @@ const mapStateToProps = (state) => {
7375
cachingEnabled: proxy.cachingEnabled,
7476
throttleEnabled: proxy.throttleEnabled,
7577
throttleRate: proxy.throttleRate,
76-
requestData: getRequestData(state),
78+
filteredRequestCount: getFilteredRequestCount(state),
79+
totalRequestCount: getTotalRequestCount(state),
7780
proxyStatus: proxy.status,
7881
proxyReason: proxy.statusReason,
7982
updateStatus: update.status,

src/renderer/component/footer/request-count.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
import React from 'react';
22
import PropTypes from 'prop-types';
33

4-
const RequestCount = ({requestData, clearRequests}) => {
5-
const {filteredCount, totalCount} = requestData;
4+
const RequestCount = ({filteredRequestCount, totalRequestCount, clearRequests}) => {
65
return <div className="request-count">
76
<button title="Clear all requests" onClick={clearRequests}>
87
<i className="fa fa-ban" />
98
</button>
10-
{`Requests: ${filteredCount} / ${totalCount}`}
9+
{`Requests: ${filteredRequestCount} / ${totalRequestCount}`}
1110
</div>;
1211
};
1312

1413
RequestCount.propTypes = {
15-
requestData: PropTypes.object.isRequired,
14+
filteredRequestCount: PropTypes.number.isRequired,
15+
totalRequestCount: PropTypes.number.isRequired,
1616
clearRequests: PropTypes.func.isRequired
1717
};
1818

src/renderer/component/requests/requests.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import { connect } from 'react-redux';
44

55
import Request from './request.js';
66

7-
const Requests = ({requestData, activeRequest, contextRequest, labels, handleClick, handleContextMenu}) => {
8-
const requestNodes = requestData.requests.map(({request, response}) => {
7+
const Requests = ({requests, activeRequest, contextRequest, labels, handleClick, handleContextMenu}) => {
8+
const requestNodes = requests.map(({request, response}) => {
99
const isActive = activeRequest && activeRequest.id === request.id || false;
1010
const isContextMenu = contextRequest && contextRequest.id === request.id || false;
1111

@@ -28,7 +28,7 @@ const Requests = ({requestData, activeRequest, contextRequest, labels, handleCli
2828
};
2929

3030
Requests.propTypes = {
31-
requestData: PropTypes.object.isRequired,
31+
requests: PropTypes.array.isRequired,
3232
activeRequest: PropTypes.object,
3333
contextRequest: PropTypes.object,
3434
labels: PropTypes.array.isRequired,
@@ -37,11 +37,12 @@ Requests.propTypes = {
3737
};
3838

3939
import { setActiveRequest, setContextRequest } from '../../../common/actions/requests.js';
40-
import { getRequestData, getActiveRequest, getContextRequest } from '../../reducers/requests.js';
40+
import { getActiveRequest, getContextRequest } from '../../reducers/requests.js';
4141
import { getLabels } from '../../reducers/app.js';
42+
import { getVisibleRequests } from '../../reducers/requests';
4243

4344
const mapStateToProps = (state) => ({
44-
requestData: getRequestData(state),
45+
requests: getVisibleRequests(state),
4546
labels: getLabels(state),
4647
activeRequest: getActiveRequest(state),
4748
contextRequest: getContextRequest(state)

src/renderer/reducers/requests.js

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
import { combineReducers } from 'redux';
2+
import { createSelector } from 'reselect';
23

34
import * as actions from '../../common/actions/requests.js';
45

56
const initialState = {
67
filter: null,
78
active: null,
89
context: null,
9-
data: {
10-
requests: [],
11-
totalCount: 0,
12-
filteredCount: 0
13-
}
10+
data: []
1411
};
1512

1613
// reducers
@@ -59,7 +56,7 @@ export default combineReducers({
5956
// selectors
6057

6158
export function hasRequests(state) {
62-
return state.requests.data.totalCount > 0;
59+
return state.requests.data.length > 0;
6360
}
6461

6562
export function getRequestFilter(state) {
@@ -70,20 +67,25 @@ export function getActiveRequest(state) {
7067
return state.requests.active;
7168
}
7269

73-
export function isActiveRequest(state, request) {
74-
const activeRequest = getActiveRequest(state);
75-
return activeRequest && request && activeRequest.id === request.id;
76-
}
77-
7870
export function getContextRequest(state) {
7971
return state.requests.context;
8072
}
8173

82-
export function isContextRequest(state, request) {
83-
const contextRequest = getContextRequest(state);
84-
return contextRequest && request && contextRequest.id === request.id;
74+
export const getVisibleRequests = createSelector(
75+
[getRequestFilter, state => state.requests.data],
76+
(requestFilter, requests) => {
77+
const matchesFilter = (request) =>
78+
request.fullUrl.includes(requestFilter) || request.original.fullUrl.includes(requestFilter);
79+
80+
return !requestFilter
81+
? requests
82+
: requests.filter(({request}) => matchesFilter(request));
83+
});
84+
85+
export function getTotalRequestCount(state) {
86+
return state.requests.data.length;
8587
}
8688

87-
export function getRequestData(state) {
88-
return state.requests.data;
89+
export function getFilteredRequestCount(state) {
90+
return getVisibleRequests(state).length;
8991
}

src/renderer/store/middleware/proxy.js

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const middleware = store => next => action => {
1616

1717
// let the reducers decide the state, then apply it to the proxy
1818
const result = next(action);
19-
const { proxy: state, requests: requestState } = store.getState();
19+
const { proxy: state } = store.getState();
2020

2121
switch (action.type) {
2222
case actions.TOGGLE_CACHING:
@@ -31,12 +31,6 @@ const middleware = store => next => action => {
3131
});
3232
break;
3333

34-
case requestActions.SET_REQUEST_FILTER:
35-
ipc.send('proxy-filter', {
36-
filter: requestState.filter
37-
});
38-
break;
39-
4034
case actions.CLEAR_REQUESTS:
4135
ipc.send('proxy-clear');
4236
break;

test/unit/reducers/requests.js

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import assert from 'assert';
2+
3+
import requests from 'renderer/reducers/requests.js';
4+
import { getFilteredRequestCount, getTotalRequestCount, getVisibleRequests } from 'renderer/reducers/requests';
5+
6+
const initialState = {
7+
filter: null,
8+
active: null,
9+
context: null,
10+
data: []
11+
};
12+
13+
const setupState = (newState) => {
14+
return {
15+
requests: Object.assign({}, initialState, newState)
16+
};
17+
};
18+
19+
describe('requests reducers', () => {
20+
it('should return the initial state', () => {
21+
const nextState = requests(undefined, {});
22+
assert.deepEqual(nextState, initialState);
23+
});
24+
});
25+
26+
describe('requests selectors', () => {
27+
describe('when no filter applied', () => {
28+
const state = setupState({
29+
data: [
30+
{request: {fullUrl: '1', original: {fullUrl: '1'}}},
31+
{request: {fullUrl: '2', original: {fullUrl: '2'}}},
32+
{request: {fullUrl: '3', original: {fullUrl: '3'}}}
33+
]
34+
});
35+
36+
it('all requests are visible', () => {
37+
assert.deepEqual(getVisibleRequests(state), [
38+
{request: {fullUrl: '1', original: {fullUrl: '1'}}},
39+
{request: {fullUrl: '2', original: {fullUrl: '2'}}},
40+
{request: {fullUrl: '3', original: {fullUrl: '3'}}}
41+
]);
42+
});
43+
44+
it('all requests should be included in "filtered count"', () => {
45+
assert(getFilteredRequestCount(state) === 3);
46+
});
47+
});
48+
49+
describe('when filter applied', () => {
50+
const state = setupState({
51+
filter: 'foo',
52+
data: [
53+
{request: {fullUrl: 'foo', original: {fullUrl: 'foo'}}},
54+
{request: {fullUrl: 'foo', original: {fullUrl: 'bar'}}},
55+
{request: {fullUrl: 'baz', original: {fullUrl: 'baz'}}}
56+
]
57+
});
58+
59+
it('filters by url and original url', function() {
60+
assert.deepEqual(getVisibleRequests(state), [
61+
{request: {fullUrl: 'foo', original: {fullUrl: 'foo'}}},
62+
{request: {fullUrl: 'foo', original: {fullUrl: 'bar'}}}
63+
]);
64+
});
65+
66+
it('should show the number of requests that match an applied filter', () => {
67+
assert(getFilteredRequestCount(state) === 2);
68+
});
69+
70+
it('should show correct total request count even when filter applied', () => {
71+
assert(getTotalRequestCount(state) === 3);
72+
});
73+
});
74+
});

0 commit comments

Comments
 (0)