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

Commit 7766b4e

Browse files
refactor of the store, hyperlink. normalizing all _link and _embedded to arrays
1 parent 5a6ffd5 commit 7766b4e

File tree

19 files changed

+244
-160
lines changed

19 files changed

+244
-160
lines changed

src/SqlStreamStoreBrowser.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const getSelfAlias = links =>
2626
)
2727
.map(({ rel }) => rel);
2828

29-
const self$ = store.links$
29+
const self$ = store.hal$.links$
3030
.filter(links => links.self)
3131
.map(getSelfAlias)
3232
.filter(rel => !!rel)
@@ -35,10 +35,10 @@ const self$ = store.links$
3535
const state$ = createState(
3636
obs.merge(
3737
self$.map(self => ['self', () => self]),
38-
store.links$.map(links => ['links', () => links]),
39-
store.forms$.map(forms => ['forms', () => forms]),
40-
store.loading$.map(loading => ['loading', () => loading]),
41-
store.mediaType$.map(mediaType => ['mediaType', () => mediaType]),
38+
store.hal$.links$.map(links => ['links', () => links]),
39+
store.hal$.forms$.map(forms => ['forms', () => forms]),
40+
store.hal$.loading$.map(loading => ['loading', () => loading]),
41+
store.hal$.mediaType$.map(mediaType => ['mediaType', () => mediaType]),
4242
),
4343
obs.of({ links: {}, forms: {}, loading: false }),
4444
);

src/components/HyperMediaControls/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ interface HyperMediaControlsState {
1616
}
1717

1818
const state$ = createState<HyperMediaControlsState>(
19-
store.url$.map(href => ['href', () => href]),
19+
store.hal$.url$.map(href => ['href', () => href]),
2020
Observable.of<HyperMediaControlsState>({ href: '' }),
2121
);
2222

src/components/Hyperlink.tsx

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { WithStyles, withStyles } from '@material-ui/core';
22
import React, { ReactNode, StatelessComponent } from 'react';
33
import theme from '../theme';
4-
import { HalLink, NavigatableProps } from '../types';
4+
import { HalLink, HalLinks, HalResource, NavigatableProps } from '../types';
55
import { preventDefault } from '../utils';
66
import { withNavigation } from './NavigationProvider';
77

@@ -23,29 +23,44 @@ const styles = {
2323
};
2424

2525
interface HyperlinkProps {
26-
link: HalLink;
26+
rel: string;
27+
multi?: boolean;
28+
_links: HalLinks;
2729
}
2830

31+
const getLink = (links: HalLinks, rel: string): HalLink | null =>
32+
!links[rel] ? null : links[rel][0];
33+
2934
const Hyperlink: StatelessComponent<
3035
HyperlinkProps & { children?: ReactNode }
3136
> = withNavigation()(
3237
withStyles(styles)(
3338
({
3439
classes,
35-
link,
36-
children,
40+
_links,
3741
authorization,
3842
onNavigate,
43+
rel,
3944
}: HyperlinkProps & { children?: ReactNode } & NavigatableProps &
40-
WithStyles<typeof styles>) => (
41-
<a
42-
href={link.href}
43-
className={classes.hyperlink}
44-
onClick={preventDefault(() => onNavigate(link, authorization))}
45-
>
46-
{children}
47-
</a>
48-
),
45+
WithStyles<typeof styles>) => {
46+
const link = getLink(_links, rel);
47+
if (!link) {
48+
// tslint:disable-next-line:no-console
49+
console.warn(`Could not find link for rel ${rel}`, _links);
50+
return null;
51+
}
52+
return (
53+
<a
54+
href={link.href}
55+
className={classes.hyperlink}
56+
onClick={preventDefault(() =>
57+
onNavigate(link, authorization),
58+
)}
59+
>
60+
{link.title}
61+
</a>
62+
);
63+
},
4964
),
5065
);
5166

src/components/StreamBrowser.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import {
88
withStyles,
99
} from '@material-ui/core';
1010
import React, { ComponentType } from 'react';
11-
import { HalLink } from '../types';
11+
import rels from '../stream-store/rels';
12+
import { HalResource } from '../types';
1213
import Hyperlink from './Hyperlink';
1314

1415
const styles = theme => ({
@@ -19,7 +20,7 @@ const styles = theme => ({
1920

2021
interface StreamBrowserProps {
2122
loading: boolean;
22-
streams: HalLink[];
23+
streams: HalResource[];
2324
}
2425

2526
const StreamBrowser: ComponentType<StreamBrowserProps> = withStyles(styles)(
@@ -34,10 +35,10 @@ const StreamBrowser: ComponentType<StreamBrowserProps> = withStyles(styles)(
3435
<LinearProgress />
3536
) : streams.length ? (
3637
<List>
37-
{streams.map(link => (
38-
<ListItem key={link.href}>
38+
{streams.map(({ _links }) => (
39+
<ListItem>
3940
<ListItemText>
40-
<Hyperlink link={link}>{link.title}</Hyperlink>
41+
<Hyperlink _links={_links} rel={rels.feed} />
4142
</ListItemText>
4243
</ListItem>
4344
))}

src/reactive/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export const createState = <TState extends object>(
2323
.refCount();
2424

2525
const createLogger = <TState>() => (state: TState) =>
26-
// tslint:disable-next-line:no-console
26+
// tslint:disable-next-line:no-console
2727
console.debug(state, typeof state);
2828

2929
export const connect = <TProps extends object, TState extends object>(

src/stream-store/Viewer/HalViewer/Home.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ import rels from '../../rels';
1414
import store from '../../store';
1515
import { HalViewerProps } from './types';
1616

17-
const provider$ = store.body$.map(({ provider }) => provider);
17+
const provider$ = store.hal$.body$.map(({ provider }) => provider);
1818

19-
const versions$ = store.body$.map(({ versions }) => versions);
19+
const versions$ = store.hal$.body$.map(({ versions }) => versions);
2020

2121
interface RecentState {
2222
recent: HalResource[];
@@ -29,7 +29,7 @@ interface InfoState {
2929

3030
interface IndexState extends RecentState, InfoState {}
3131

32-
const recent$ = store.body$.map(
32+
const recent$ = store.hal$.body$.map(
3333
({ _embedded = {} }) => _embedded[rels.feed] as HalResource[],
3434
);
3535

src/stream-store/Viewer/HalViewer/Stream.tsx

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
TableRow,
1010
} from '../../../components/StripeyTable';
1111
import { connect, createState } from '../../../reactive';
12-
import { HalLinks, HalResource } from '../../../types';
12+
import { HalResource } from '../../../types';
1313
import { resolveLinks } from '../../../utils';
1414
import rels from '../../rels';
1515
import store from '../../store';
@@ -25,14 +25,14 @@ interface Message {
2525
type: string;
2626
}
2727

28-
const messages$ = store.body$.zip(store.url$).map(([{ _embedded }, url]) =>
29-
((_embedded || {})[rels.message] as HalResource & Message).map(
30-
({ _links, ...message }) => ({
28+
const messages$ = store.hal$.body$
29+
.zip(store.hal$.url$)
30+
.map(([{ _embedded }, url]) =>
31+
_embedded[rels.message].map(({ _links, ...message }) => ({
3132
...message,
3233
_links: resolveLinks(url, _links),
33-
}),
34-
),
35-
);
34+
})),
35+
);
3636

3737
const state$ = createState<StreamState>(
3838
messages$.map(messages => ['messages', () => messages]),
@@ -55,16 +55,10 @@ const Message = ({
5555
<TableCell style={nowrap}>{createdUtc}</TableCell>
5656
<TableCell style={nowrap}>{type}</TableCell>
5757
<TableCell style={nowrap}>
58-
<Hyperlink link={(_links as HalLinks)[rels.feed][0]}>
59-
{streamId}
60-
</Hyperlink>
58+
<Hyperlink _links={_links} rel={rels.feed} />
6159
</TableCell>
6260
<TableCell>
63-
<Hyperlink link={(_links as HalLinks).self[0]}>
64-
{streamId}
65-
{'@'}
66-
{streamVersion}
67-
</Hyperlink>
61+
<Hyperlink _links={_links} rel={rels.self} />
6862
</TableCell>
6963
<TableCell>{position}</TableCell>
7064
</TableRow>

src/stream-store/Viewer/HalViewer/StreamBrowser.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,18 @@ import { ComponentType } from 'react';
22
import { Observable as obs } from 'rxjs';
33
import StreamBrowser from '../../../components/StreamBrowser';
44
import { connect, createState } from '../../../reactive';
5-
import { HalLink } from '../../../types';
5+
import { HalLink, HalResource } from '../../../types';
66
import rels from '../../rels';
77
import store from '../../store';
88
import { HalViewerProps } from './types';
99

10-
const streams$ = store.body$.map(({ _embedded = {} }) =>
11-
(_embedded[rels.feed] || [])
12-
.map(({ _links = {} }) => _links[rels.feed])
13-
.filter(link => link),
10+
const streams$ = store.hal$.body$.map(
11+
({ _embedded = {} }) => _embedded[rels.feed] || [],
1412
);
1513

1614
interface StreamBrowserState {
1715
loading: boolean;
18-
streams: HalLink[];
16+
streams: HalResource[];
1917
}
2018

2119
const state$ = createState<StreamBrowserState>(

src/stream-store/Viewer/HalViewer/StreamMessage.tsx

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import {
3131
TableRow,
3232
} from '../../../components/StripeyTable';
3333
import { connect, createState } from '../../../reactive';
34-
import { HalLink, HalResource, NavigatableProps } from '../../../types';
34+
import { HalResource, NavigatableProps } from '../../../types';
3535
import { http } from '../../../utils';
3636
import rels from '../../rels';
3737
import store from '../../store';
@@ -45,7 +45,7 @@ const tryParseJson = (payload: string): object => {
4545
}
4646
};
4747

48-
const message$ = store.body$.map(({ payload, metadata, ...body }) => ({
48+
const message$ = store.hal$.body$.map(({ payload, metadata, ...body }) => ({
4949
...body,
5050
metadata: tryParseJson(metadata),
5151
payload: tryParseJson(payload),
@@ -115,17 +115,13 @@ const StreamMessageDetails: StatelessComponent<
115115
}) => (
116116
<TableRow>
117117
<TableCell style={nowrap}>
118-
<Hyperlink link={_links[rels.feed][0]}>{streamId}</Hyperlink>
118+
<Hyperlink _links={_links} rel={rels.feed} />
119119
</TableCell>
120120
<TableCell style={nowrap}>{messageId}</TableCell>
121121
<TableCell style={nowrap}>{createdUtc}</TableCell>
122122
<TableCell style={nowrap}>{type}</TableCell>
123123
<TableCell style={{ width: '100%' }}>
124-
<Hyperlink link={_links[rels.self][0]}>
125-
{streamId}
126-
{'@'}
127-
{streamVersion}
128-
</Hyperlink>
124+
<Hyperlink _links={_links} rel={rels.self} />
129125
</TableCell>
130126
<TableCell numeric>{position}</TableCell>
131127
</TableRow>
@@ -134,13 +130,11 @@ const StreamMessageDetails: StatelessComponent<
134130
const isPotentialStreamId = data =>
135131
typeof data === 'number' || typeof data === 'string';
136132

137-
const getStreamLinks = ({ _embedded = {} }: HalResource): HalLink[] =>
138-
(_embedded[rels.feed] || [])
139-
.map(({ _links = {} }: HalResource) => _links[rels.feed][0])
140-
.filter(link => link);
133+
const getStreamLinks = ({ _embedded }): HalResource[] =>
134+
_embedded[rels.feed] || [];
141135

142136
interface StreamMessageJsonState {
143-
streams: HalLink[];
137+
streams: HalResource[];
144138
loading: boolean;
145139
open: boolean;
146140
}
@@ -184,7 +178,7 @@ const StreamMessageJson = withStyles(style)(class extends PureComponent<
184178
open: true,
185179
});
186180

187-
if (!_links[rels.browse]) {
181+
if (!_links || !_links[rels.browse]) {
188182
return;
189183
}
190184

src/stream-store/Viewer/HalViewer/StreamMetadata.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import rels from '../../rels';
2626
import store from '../../store';
2727
import { HalViewerProps } from './types';
2828

29-
const metadata$ = store.body$.map(metadata => metadata);
29+
const metadata$ = store.hal$.body$.map(metadata => metadata);
3030

3131
interface MetadataState {
3232
streamId: string;
@@ -75,7 +75,7 @@ const StreamMetadataDetails: StatelessComponent<StreamMetadataDetailsProps> = ({
7575
}) => (
7676
<TableRow>
7777
<TableCell style={nowrap}>
78-
<Hyperlink link={_links[rels.feed][0]}>{streamId}</Hyperlink>
78+
<Hyperlink _links={_links} rel={rels.feed} />
7979
</TableCell>
8080
<TableCell style={nowrap} numeric>
8181
{maxAge}
@@ -125,7 +125,7 @@ class StreamMetadataJson extends PureComponent<
125125
}
126126

127127
const StreamMetadata: StatelessComponent<StreamMetadataState> = ({
128-
metadata
128+
metadata,
129129
}) => (
130130
<section>
131131
<Table style={{ tableLayout: 'auto' }}>

0 commit comments

Comments
 (0)