Skip to content
This repository was archived by the owner on Sep 3, 2024. It is now read-only.

Commit 12eed37

Browse files
pulling out stream browser to own component
1 parent e5a1c9f commit 12eed37

File tree

5 files changed

+78
-57
lines changed

5 files changed

+78
-57
lines changed

src/components/StreamBrowser.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import React from 'react';
2+
import { List, ListItem, Typography, withStyles } from '@material-ui/core';
3+
import Hyperlink from './Hyperlink';
4+
5+
const StreamBrowser = ({ streams, onNavigate }) => (
6+
<div>
7+
<Typography variant={'title'}>Stream Browser</Typography>
8+
{streams.length ? (
9+
<List>
10+
{streams.map(({ title, href }) => (
11+
<ListItem button key={href}>
12+
<Hyperlink href={href} onNavigate={onNavigate}>
13+
{title}
14+
</Hyperlink>
15+
</ListItem>
16+
))}
17+
</List>
18+
) : (
19+
<Typography variant={'body2'}>
20+
No matching streams found.
21+
</Typography>
22+
)}
23+
</div>
24+
);
25+
26+
export default withStyles(theme => ({
27+
paper: {
28+
padding: theme.spacing.unit * 2.5,
29+
},
30+
}))(StreamBrowser);

src/components/index.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ export {
22
default as AuthorizationProvider,
33
withAuthorization,
44
} from './AuthorizationProvider';
5+
export { default as Hyperlink } from './Hyperlink';
6+
export { default as HyperMediaControls } from './HyperMediaControls';
7+
export { default as Loading } from './Loading';
58
export { default as NavigationLinks } from './NavigationLinks';
69
export { default as Notifications } from './Notifications';
7-
export { default as HyperMediaControls } from './HyperMediaControls';
10+
export { default as StreamBrowser } from './StreamBrowser';
811
export { default as mount } from './mount';
9-
export { default as Hyperlink } from './Hyperlink';
10-
export { default as Loading } from './Loading';
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import React from 'react';
2+
import { Observable as obs } from 'rxjs';
3+
import StreamBrowser from '../../components/StreamBrowser';
4+
import { createState, connect } from '../../reactive';
5+
import rels from '../rels';
6+
import store from '../store';
7+
8+
const streams$ = store.body$.map(({ _embedded = {} }) => () =>
9+
(_embedded[rels.feed] || [])
10+
.map(({ _links = {} }) => _links[rels.feed])
11+
.filter(link => link),
12+
);
13+
14+
const state$ = createState(
15+
streams$.map(streams => ['streams', streams]),
16+
obs.of({ streams: [] }),
17+
);
18+
19+
export default connect(state$)(StreamBrowser);

src/stream-store/views/StreamMessage.js

Lines changed: 23 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
import React, { PureComponent } from 'react';
22
import { Observable as obs } from 'rxjs';
33
import {
4-
List,
5-
ListItem,
64
Popover,
75
Typography,
86
ExpansionPanel,
97
ExpansionPanelSummary,
108
ExpansionPanelDetails,
11-
withStyles,
129
} from '@material-ui/core';
1310
import Inspector, {
1411
ObjectLabel,
@@ -24,7 +21,7 @@ import {
2421
TableHead,
2522
TableCell,
2623
} from '../../components/StripeyTable';
27-
import { Hyperlink } from '../../components';
24+
import { Hyperlink, StreamBrowser } from '../../components';
2825
import { createState, connect } from '../../reactive';
2926
import rels from '../rels';
3027
import { http } from '../../utils';
@@ -38,14 +35,14 @@ const tryParseJson = payload => {
3835
}
3936
};
4037

41-
const message$ = store.body$.map(({ payload, metadata, ...body }) => () => ({
38+
const message$ = store.body$.map(({ payload, metadata, ...body }) => ({
4239
...body,
4340
payload: tryParseJson(payload),
4441
metadata: tryParseJson(metadata),
4542
}));
4643

4744
const state$ = createState(
48-
message$.map(message => ['message', message]),
45+
message$.map(message => ['message', () => message]),
4946
obs.of({ message: {} }),
5047
);
5148

@@ -102,45 +99,10 @@ const getStreamIds = ({ _embedded = {} }) =>
10299
.map(({ _links = {} }) => _links[rels.feed])
103100
.filter(link => link);
104101

105-
const MatchingStreamIds = withStyles(theme => ({
106-
paper: {
107-
padding: theme.spacing.unit * 2.5,
108-
},
109-
}))(({ matches, onNavigate, ...props }) => (
110-
<Popover
111-
transformOrigin={{
112-
vertical: 'bottom',
113-
horizontal: 'center',
114-
}}
115-
anchorOrigin={{
116-
vertical: 'top',
117-
horizontal: 'center',
118-
}}
119-
{...props}
120-
>
121-
<Typography variant={'subheading'}>Matching Stream Ids</Typography>
122-
{matches.length ? (
123-
<List>
124-
{matches.map(({ title, href }) => (
125-
<ListItem button key={href}>
126-
<Hyperlink href={href} onNavigate={onNavigate}>
127-
{title}
128-
</Hyperlink>
129-
</ListItem>
130-
))}
131-
</List>
132-
) : (
133-
<Typography variant={'body1'}>
134-
No matching streams found.
135-
</Typography>
136-
)}
137-
</Popover>
138-
));
139-
140102
class StreamMessageJson extends PureComponent {
141103
state = {
142104
anchorElement: undefined,
143-
matches: [],
105+
streams: [],
144106
};
145107

146108
_handlePotentialStreamIdClick = async (
@@ -153,23 +115,19 @@ class StreamMessageJson extends PureComponent {
153115
anchorElement,
154116
});
155117

156-
const template = uriTemplate.parse(
157-
decodeURI(links[rels.browse].href),
158-
);
159-
160-
const url = template.expand({ p, t: 'e' });
118+
const template = uriTemplate.parse(decodeURI(links[rels.browse].href));
161119

162120
const responses = await Promise.all(
163121
[...new Set([p, String(p).replace('-', '')])].map(p =>
164122
http.get({
165-
url,
123+
url: template.expand({ p, t: 'e' }),
166124
headers: { authorization },
167125
}),
168126
),
169127
);
170128

171129
this.setState({
172-
matches: Object.values(
130+
streams: Object.values(
173131
responses.flatMap(({ body }) => getStreamIds(body)).reduce(
174132
(akk, { href, title }) => ({
175133
...akk,
@@ -217,7 +175,7 @@ class StreamMessageJson extends PureComponent {
217175

218176
render() {
219177
const { json, title, onNavigate } = this.props;
220-
const { anchorElement, matches } = this.state;
178+
const { anchorElement, streams } = this.state;
221179
return (
222180
<ExpansionPanel expanded>
223181
<ExpansionPanelSummary expandIcon={<Code />}>
@@ -229,13 +187,24 @@ class StreamMessageJson extends PureComponent {
229187
expandLevel={32}
230188
nodeRenderer={this._renderNode}
231189
/>
232-
<MatchingStreamIds
190+
<Popover
233191
open={!!anchorElement}
234192
anchorEl={anchorElement}
235193
onClose={this._handlePotentialStreamIdClose}
236-
matches={matches}
237-
onNavigate={onNavigate}
238-
/>
194+
transformOrigin={{
195+
vertical: 'bottom',
196+
horizontal: 'center',
197+
}}
198+
anchorOrigin={{
199+
vertical: 'top',
200+
horizontal: 'center',
201+
}}
202+
>
203+
<StreamBrowser
204+
streams={streams}
205+
onNavigate={onNavigate}
206+
/>
207+
</Popover>
239208
</ExpansionPanelDetails>
240209
</ExpansionPanel>
241210
);

src/stream-store/views/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import Home from './Home';
22
import Stream from './Stream';
3+
import StreamBrowser from './StreamBrowser';
34
import StreamMessage from './StreamMessage';
45
import StreamMetadata from './StreamMetadata';
56
import Unknown from './Unknown';
@@ -10,5 +11,6 @@ export default {
1011
[rels.message]: StreamMessage,
1112
[rels.index]: Home,
1213
[rels.metadata]: StreamMetadata,
14+
[rels.browse]: StreamBrowser,
1315
_unknown: Unknown,
1416
};

0 commit comments

Comments
 (0)