Skip to content

Commit 46630fd

Browse files
author
Milan Pavlik
committed
Complete the FE implementation
1 parent c510d91 commit 46630fd

File tree

10 files changed

+96
-295
lines changed

10 files changed

+96
-295
lines changed

Diff for: app/src/App.test.tsx

-8
This file was deleted.

Diff for: app/src/App.tsx

-229
This file was deleted.

Diff for: app/src/Stories.tsx

+31-14
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,53 @@
11
import * as React from 'react';
22
import { connect, Dispatch } from 'react-redux';
33
import { RootState } from './store';
4-
import { Story } from './reducers/stories';
54
import { Container, Grid, Header } from 'semantic-ui-react';
65
import StoryList from './StoryList';
76
import StoryView from './StoryView';
87
import { RootAction } from './actions';
9-
import { listStories } from './actions/stories';
8+
import { listStories, selectStory } from './actions/stories';
9+
import { Item } from './proto/hackernews_pb';
1010

1111
type StoriesProps = {
12-
stories: Story[],
12+
stories: Item.AsObject[],
1313
loading: boolean,
1414
error: Error | null,
15-
dispatch: Dispatch<RootAction>
15+
dispatch: Dispatch<RootAction>,
16+
selected: Item.AsObject | null,
1617
};
1718

1819
class Stories extends React.Component<StoriesProps, {}> {
1920

21+
constructor(props: StoriesProps) {
22+
super(props);
23+
this.state = {
24+
selected: null,
25+
};
26+
}
27+
2028
componentDidMount() {
2129
this.props.dispatch(listStories());
2230
}
2331

2432
render() {
25-
console.log(this.props.stories)
33+
console.log(this.props.stories);
2634
return (
2735
<Container style={{padding: '1em'}} fluid={true}>
2836
<Header as="h1" dividing={true}>Hacker News with gRPC-Web</Header>
2937

3038
<Grid columns={2} stackable={true} divided={'vertically'}>
3139
<Grid.Column width={4}>
32-
<StoryList stories={this.props.stories}/>
40+
<StoryList
41+
stories={this.props.stories}
42+
onStorySelect={(id: number) => this.props.dispatch(selectStory(id))}
43+
/>
3344
</Grid.Column>
3445

3546
<Grid.Column width={12} stretched={true}>
36-
37-
<Header as="h2">Example body text</Header>
38-
<StoryView/>
47+
{ this.props.selected
48+
? <StoryView story={this.props.selected} />
49+
: null
50+
}
3951
</Grid.Column>
4052
</Grid>
4153

@@ -45,8 +57,13 @@ class Stories extends React.Component<StoriesProps, {}> {
4557

4658
}
4759

48-
export default connect((state: RootState) => ({
49-
stories: Object.keys(state.stories.stories).map(key => state.stories.stories[key]),
50-
loading: state.stories.loading,
51-
error: state.stories.error,
52-
}))(Stories);
60+
function mapStateToProps(state: RootState) {
61+
return {
62+
stories: Object.keys(state.stories.stories).map(key => state.stories.stories[key]),
63+
loading: state.stories.loading,
64+
error: state.stories.error,
65+
selected: state.stories.selected,
66+
};
67+
}
68+
69+
export default connect(mapStateToProps)(Stories);

Diff for: app/src/StoryList.tsx

+11-3
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
import * as React from 'react';
22
import { Item } from 'semantic-ui-react';
3-
import { Story } from './reducers/stories';
3+
import {Item as Story } from './proto/hackernews_pb';
44

55
type StoryListProps = {
6-
stories: Story[],
6+
stories: Story.AsObject[],
7+
onStorySelect: (id: number) => void
78
};
89

910
const StoryList: React.SFC<StoryListProps> = (props) => {
1011
return (
1112
<Item.Group>
1213
{props.stories.map((story, i) =>
13-
<Item key={i}>
14+
<Item
15+
key={i}
16+
onClick={() => {
17+
if (story.id && story.id.id) {
18+
props.onStorySelect(story.id.id);
19+
}
20+
}}
21+
>
1422
<Item.Content>
1523
<Item.Header as="a">{story.title}</Item.Header>
1624
<Item.Meta>By: {story.by}</Item.Meta>

Diff for: app/src/StoryView.tsx

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
import * as React from 'react';
2+
import { Item } from './proto/hackernews_pb';
23

3-
const StoryView: React.SFC<{}> = (props) => {
4-
const url = 'http://localhost:8900/article-proxy?q=' +
5-
'https%3A%2F%2Fstackshare.io%2Fstream%2Fstream-and-go-news-feeds-for-over-300-million-end-users';
4+
type StoryViewProps = {
5+
story: Item.AsObject,
6+
};
7+
8+
const StoryView: React.SFC<StoryViewProps> = (props) => {
69
return (
710
<iframe
811
frameBorder="0"
912
style={{
1013
height: '100vh',
1114
width: '100%',
1215
}}
13-
src={url}
16+
src={props.story.url}
1417
/>
1518
);
1619
};

0 commit comments

Comments
 (0)