Skip to content

Commit 92e720b

Browse files
committed
feat(ActivityStream): implement component default state
1 parent 621e2df commit 92e720b

File tree

4 files changed

+965
-19
lines changed

4 files changed

+965
-19
lines changed

src/components/WebexActivityStream/WebexActivityStream.js

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
import React from 'react';
1+
import React, {Fragment} from 'react';
22
import PropTypes from 'prop-types';
33

44
import {RoomType} from '../../adapters/RoomsAdapter';
5+
import {useActivityStream, useRoom} from '../hooks';
6+
import WebexActivity from '../WebexActivity/WebexActivity';
7+
58
import './WebexActivityStream.scss';
6-
import {useRoom, useActivityStream} from '../hooks';
79

810
export function GreetingDirectSVG() {
911
return (
@@ -137,15 +139,27 @@ Greeting.propTypes = {
137139
};
138140

139141
export default function WebexActivityStream(props) {
140-
const {roomID, adapter} = props;
141-
const {title, roomType} = useRoom(roomID, adapter);
142-
const activityIDs = useActivityStream(roomID, adapter);
142+
const {roomID, adapters} = props;
143+
const {roomsAdapter, activitiesAdapter, peopleAdapter} = adapters;
144+
const {title, roomType} = useRoom(roomID, roomsAdapter);
145+
const activityIDs = useActivityStream(roomID, roomsAdapter);
143146
const personName = roomType === RoomType.DIRECT ? title : '';
147+
const activities = activityIDs.map((activityID) => (
148+
<WebexActivity key={activityID} activityID={activityID} adapters={{activitiesAdapter, peopleAdapter}} />
149+
));
144150

145-
return <div className="activity-stream">{!activityIDs.length && <Greeting personName={personName} />}</div>;
151+
return (
152+
<div className="activity-stream">
153+
{activityIDs.length ? <Fragment>{activities}</Fragment> : <Greeting personName={personName} />}
154+
</div>
155+
);
146156
}
147157

148158
WebexActivityStream.propTypes = {
149159
roomID: PropTypes.string.isRequired,
150-
adapter: PropTypes.object.isRequired,
160+
adapters: PropTypes.exact({
161+
roomsAdapter: PropTypes.object.isRequired,
162+
activitiesAdapter: PropTypes.object.isRequired,
163+
peopleAdapter: PropTypes.object.isRequired,
164+
}).isRequired,
151165
};
Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
11
import React from 'react';
22
import {storiesOf} from '@storybook/react';
33

4-
import RoomsJSONAdapter from '../../adapters/RoomsJSONAdapter';
5-
import rooms from '../../data/rooms';
4+
import {ActivitiesJSONAdapter, PeopleJSONAdapter, RoomsJSONAdapter} from '../../adapters';
5+
import {activities, people, rooms} from '../../data';
66

77
import WebexActivityStream from './WebexActivityStream';
88

99
// Setup for the stories
1010
const stories = storiesOf('Webex Activity Stream', module);
11-
const adapter = new RoomsJSONAdapter(rooms);
11+
const adapters = {
12+
roomsAdapter: new RoomsJSONAdapter(rooms),
13+
activitiesAdapter: new ActivitiesJSONAdapter(activities),
14+
peopleAdapter: new PeopleJSONAdapter(people),
15+
};
1216

1317
// Stories
14-
stories.add('empty group stream', () => <WebexActivityStream roomID="default" adapter={adapter} />);
18+
stories.add('default', () => <WebexActivityStream roomID="default" adapters={adapters} />);
1519

16-
stories.add('empty 1:1 stream', () => <WebexActivityStream roomID="direct" adapter={adapter} />);
20+
stories.add('empty group stream', () => <WebexActivityStream roomID="empty-space" adapters={adapters} />);
21+
22+
stories.add('empty 1:1 stream', () => <WebexActivityStream roomID="empty-direct" adapters={adapters} />);

src/components/WebexActivityStream/WebexActivityStream.test.js

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
import React from 'react';
22

3-
import RoomsJSONAdapter from '../../adapters/RoomsJSONAdapter';
4-
import rooms from '../../data/rooms';
3+
import {ActivitiesJSONAdapter, PeopleJSONAdapter, RoomsJSONAdapter} from '../../adapters';
4+
import {activities, people, rooms} from '../../data';
55

66
import WebexActivityStream, {Greeting, GreetingSpaceSVG, GreetingDirectSVG} from './WebexActivityStream';
77

88
jest.mock('../hooks/useRoom');
99
jest.mock('../hooks/useActivityStream');
1010

1111
describe('Webex Activity Stream component', () => {
12-
let roomsAdapter;
12+
let adapters;
1313

1414
beforeEach(() => {
15-
roomsAdapter = new RoomsJSONAdapter(rooms);
15+
adapters = {
16+
roomsAdapter: new RoomsJSONAdapter(rooms),
17+
activitiesAdapter: new ActivitiesJSONAdapter(activities),
18+
peopleAdapter: new PeopleJSONAdapter(people),
19+
};
1620
});
1721

1822
describe('Greeting Space SVG snapshot', () => {
@@ -38,16 +42,19 @@ describe('Webex Activity Stream component', () => {
3842
});
3943

4044
describe('Webex Activity Stream snapshots', () => {
45+
test('matches with default stream', () => {
46+
expect(shallow(<WebexActivityStream roomID="default" adapters={adapters} />)).toMatchSnapshot();
47+
});
4148
test('matches with empty group stream', () => {
42-
expect(shallow(<WebexActivityStream roomID="default" adapter={roomsAdapter} />)).toMatchSnapshot();
49+
expect(shallow(<WebexActivityStream roomID="empty-space" adapters={adapters} />)).toMatchSnapshot();
4350
});
4451

4552
test('matches with empty direct stream', () => {
46-
expect(shallow(<WebexActivityStream roomID="direct" adapter={roomsAdapter} />)).toMatchSnapshot();
53+
expect(shallow(<WebexActivityStream roomID="empty-direct" adapters={adapters} />)).toMatchSnapshot();
4754
});
4855
});
4956

5057
afterEach(() => {
51-
roomsAdapter = null;
58+
adapters = null;
5259
});
5360
});

0 commit comments

Comments
 (0)