Skip to content
This repository was archived by the owner on Nov 28, 2022. It is now read-only.

Commit 44ca0f1

Browse files
committed
Bug fixes, add group in "View More', add class emitter for Logs
1 parent 13948a0 commit 44ca0f1

File tree

5 files changed

+180
-41
lines changed

5 files changed

+180
-41
lines changed

packages/api-logs/__tests__/index.test.jsx

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ require('isomorphic-fetch');
33
const React = require('react');
44
const { shallow } = require('enzyme');
55

6-
const { Logs } = require('../index.jsx');
6+
const { Logs, LogsEmitter } = require('../index.jsx');
77
const requestmodel = require('./fixtures/requestmodel.json');
88
const oas = require('./fixtures/oas.json');
99
const operation = require('./fixtures/operation.json');
@@ -39,6 +39,20 @@ describe('Logs', () => {
3939
expect(comp.html()).toBe(null);
4040
});
4141

42+
test('should render a log with no user-agent', () => {
43+
const comp = shallow(<LogTest {...props} />);
44+
const clonedLog = JSON.parse(JSON.stringify(requestmodel));
45+
clonedLog.request.log.entries[0].request.headers[0].name = '';
46+
comp.setState({ logs: [clonedLog] });
47+
48+
expect(
49+
comp
50+
.find('tbody tr')
51+
.childAt(4)
52+
.text(),
53+
).toBe('-');
54+
});
55+
4256
test('should be in a loading state', () => {
4357
const comp = shallow(<LogTest {...props} />);
4458
comp.setState({ loading: true });
@@ -113,6 +127,23 @@ describe('Logs', () => {
113127
expect(global.open).toBeCalled();
114128
});
115129

130+
test('on stale call refresh', () => {
131+
const comp = shallow(<Logs {...props} />);
132+
comp.setState({ stale: true });
133+
const instance = comp.instance();
134+
jest.spyOn(instance, 'refresh');
135+
instance.onVisible();
136+
expect(instance.refresh).toHaveBeenCalledWith('1230');
137+
});
138+
139+
test('remove listener on component unmount', () => {
140+
const comp = shallow(<Logs {...props} />);
141+
comp.setState({ stale: true });
142+
const instance = comp.instance();
143+
instance.componentWillUnmount();
144+
expect(LogsEmitter.listeners().length).toBe(0);
145+
});
146+
116147
test('when parsed agent is not Other', () => {
117148
const comp = shallow(<LogTest {...props} />);
118149
requestmodel.request.log.entries[0].request.headers[0].value = 'IE4.0';

packages/api-logs/dist/index.js

Lines changed: 28 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/api-logs/index.jsx

Lines changed: 55 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
const React = require('react');
22
const PropTypes = require('prop-types');
33
const querystring = require('querystring');
4+
const VisibilitySensor = require('react-visibility-sensor');
5+
const EventsEmitter = require('events');
46

57
const LoadingSvg = props => (
68
<svg
@@ -47,34 +49,53 @@ function getGroup(userData) {
4749
return undefined;
4850
}
4951

52+
const emitter = new EventsEmitter();
53+
let selectedGroup;
54+
5055
class Logs extends React.Component {
5156
constructor(props) {
5257
super(props);
5358
this.state = {
5459
loading: false,
60+
stale: false,
5561
logs: [],
56-
group: getGroup(props.user),
62+
group: selectedGroup || getGroup(props.user),
5763
groups: props.user.keys && props.user.keys.map(key => ({ id: key.id, name: key.name })),
5864
};
5965

6066
this.renderSelect = this.renderSelect.bind(this);
6167
this.onSelect = this.onSelect.bind(this);
6268
this.renderTable = this.renderTable.bind(this);
6369
this.visitLogItem = this.visitLogItem.bind(this);
70+
this.changeGroup = this.changeGroup.bind(this);
71+
this.onVisible = this.onVisible.bind(this);
6472
}
6573

6674
componentDidMount() {
67-
this.refresh();
75+
const { group } = this.state;
76+
emitter.on('changeGroup', this.changeGroup);
77+
this.refresh(group);
78+
}
79+
80+
componentWillUnmount() {
81+
emitter.removeListener('changeGroup', this.changeGroup);
6882
}
6983

7084
onSelect(event) {
71-
this.setState({ group: event.target.value });
72-
this.refresh();
85+
emitter.emit('changeGroup', event.target.value);
86+
// this.changeGroup(event.target.value);
87+
this.refresh(event.target.value);
88+
}
89+
90+
onVisible() {
91+
const { stale, group } = this.state;
92+
if (stale) {
93+
this.refresh(group);
94+
}
7395
}
7496

75-
getData() {
97+
getData(group) {
7698
const { oas, operation, baseUrl } = this.props;
77-
const { group } = this.state;
7899
this.setState({ loading: true });
79100

80101
const limit = 5;
@@ -106,8 +127,19 @@ class Logs extends React.Component {
106127
throw new Error(`Failed to fetch logs`);
107128
}
108129

109-
refresh() {
110-
this.getData()
130+
changeGroup(group) {
131+
selectedGroup = group;
132+
this.setState({
133+
group,
134+
stale: true,
135+
});
136+
}
137+
138+
refresh(group) {
139+
this.setState({
140+
stale: false,
141+
});
142+
this.getData(group)
111143
.then(logs => {
112144
this.setState({ logs });
113145
})
@@ -198,24 +230,27 @@ class Logs extends React.Component {
198230

199231
const find = {
200232
url: `${oas.servers[0].url}${operation.path}`,
233+
group,
201234
};
202235
const url = `${baseUrl}logs?${querystring.stringify(find)}`;
203236

204237
return (
205-
<div className="logs">
206-
<div className="log-header">
207-
<h3>Logs</h3>
208-
<div className="select-container">
209-
<div>
210-
<a href={url} target="_blank" rel="noopener noreferrer">
211-
View More
212-
</a>
213-
{this.renderSelect()}
238+
<VisibilitySensor onChange={this.onVisible}>
239+
<div className="logs">
240+
<div className="log-header">
241+
<h3>Logs</h3>
242+
<div className="select-container">
243+
<div>
244+
<a href={url} target="_blank" rel="noopener noreferrer">
245+
View More
246+
</a>
247+
{this.renderSelect()}
248+
</div>
214249
</div>
215250
</div>
251+
<div className="logs-list">{this.renderTable()}</div>
216252
</div>
217-
<div className="logs-list">{this.renderTable()}</div>
218-
</div>
253+
</VisibilitySensor>
219254
);
220255
}
221256
}
@@ -236,3 +271,4 @@ Logs.defaultProps = {
236271

237272
module.exports = Logs;
238273
module.exports.Logs = Logs;
274+
module.exports.LogsEmitter = emitter;

packages/api-logs/package-lock.json

Lines changed: 63 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/api-logs/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
"main": "dist/index.js",
66
"dependencies": {
77
"prop-types": "^15.6.2",
8-
"react": "^16.4.2"
8+
"react": "^16.4.2",
9+
"react-visibility-sensor": "^4.1.3"
910
},
1011
"scripts": {
1112
"lint": "eslint -f unix . --ext .jsx --ext .js",

0 commit comments

Comments
 (0)