Skip to content

Commit c5d96c3

Browse files
committed
feat(WebexDataProvider): implement the component
1 parent 1b74c5b commit c5d96c3

File tree

13 files changed

+98
-30
lines changed

13 files changed

+98
-30
lines changed

src/adapters/WebexJSONAdapter.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import {ActivitiesJSONAdapter, PeopleJSONAdapter, RoomsJSONAdapter} from './';
2+
3+
export default class WebexJSONAdapter {
4+
/**
5+
* Creates a new instance of the WebexAdapter.
6+
* The primary datasource model comes from the following structure:
7+
* WebexJSONAdapter = {
8+
* activitiesJSONAdapter: activitiesData,
9+
* peopleJSONAdapter: peopleData,
10+
* roomsJSONAdapter: roomsData
11+
* }
12+
*
13+
* @param {Object} datasource The primary datasource the json adapter will be using.
14+
*/
15+
constructor(datasource) {
16+
this.activitiesAdapter = new ActivitiesJSONAdapter(datasource.activities);
17+
this.peopleAdapter = new PeopleJSONAdapter(datasource.people);
18+
this.roomsAdapter = new RoomsJSONAdapter(datasource.rooms);
19+
}
20+
}

src/adapters/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export {default as WebexAdapter} from './WebexAdapter';
2+
export {default as WebexJSONAdapter} from './WebexJSONAdapter';
23
export {default as PeopleAdapter} from './PeopleAdapter';
34
export {default as PeopleJSONAdapter} from './PeopleJSONAdapter';
45
export {default as ActivitiesAdapter} from './ActivitiesAdapter';
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Webex Activity Data Provider Component
2+
3+
LALLI HELP ME HERE PLEASE. MY BRAIN IS FRIED RIGHT NOW!
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import React from 'react';
2+
import PropTypes from 'prop-types';
3+
4+
export const AdapterContext = React.createContext();
5+
6+
export default function WebexDataProvider({adapter, children}) {
7+
return <AdapterContext.Provider value={adapter}>{children}</AdapterContext.Provider>;
8+
}
9+
10+
WebexDataProvider.propTypes = {
11+
adapter: PropTypes.exact({
12+
roomsAdapter: PropTypes.object.isRequired,
13+
activitiesAdapter: PropTypes.object.isRequired,
14+
peopleAdapter: PropTypes.object.isRequired,
15+
}).isRequired,
16+
children: PropTypes.node.isRequired,
17+
};
Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
export default function useActivity(activityID, adapter) {
2-
if (!(activityID in adapter.datasource)) {
1+
import {useContext} from 'react';
2+
3+
export default function useActivity(activityID) {
4+
const datasource = useContext();
5+
6+
if (!(activityID in datasource.activitiesAdapter)) {
37
throw new Error(`Could not find activity with ID "${activityID}"`);
48
}
59

6-
return adapter.datasource[activityID];
10+
return datasource.activitiesAdapter[activityID];
711
}
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1-
export default function useActivityStream(ID, adapter) {
2-
return `${ID}-activities` in adapter.datasource ? adapter.datasource[`${ID}-activities`] : [];
1+
import {useContext} from 'react';
2+
3+
export default function useActivityStream(ID) {
4+
const datasource = useContext();
5+
6+
return `${ID}-activities` in datasource.roomsAdapter ? datasource.roomsAdapter[`${ID}-activities`] : [];
37
}
Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
export default function usePerson(personID, adapter) {
2-
if (!(personID in adapter.datasource)) {
1+
import {useContext} from 'react';
2+
3+
export default function usePerson(personID) {
4+
const datasource = useContext();
5+
6+
if (!(personID in datasource.peopleAdapter)) {
37
throw new Error(`Could not find person with ID "${personID}"`);
48
}
59

6-
return adapter.datasource[personID];
10+
return datasource.peopleAdapter[personID];
711
}
Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
export default function useRoom(roomID, adapter) {
2-
if (!(roomID in adapter.datasource)) {
1+
import {useContext} from 'react';
2+
3+
export default function useRoom(roomID) {
4+
const datasource = useContext();
5+
6+
if (!(roomID in datasource.roomsAdapter)) {
37
throw new Error(`Could not find room with ID "${roomID}"`);
48
}
59

6-
return adapter.datasource[roomID];
10+
return datasource.roomsAdapter[roomID];
711
}

src/components/hooks/useActivity.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
1-
import {useState, useEffect} from 'react';
1+
import {useContext, useState, useEffect} from 'react';
2+
3+
import {AdapterContext} from '../../components/';
24

35
/**
46
* Custom hook that returns activity data of the given ID.
57
*
68
* @param {string} activityID ID of the activity for which to return data.
7-
* @param {obj} activitiesAdapter Component data adapter from which to retrieve data.
89
* @returns {Person} Data of the activity
910
*/
10-
export default function useActivity(activityID, activitiesAdapter) {
11+
export default function useActivity(activityID) {
1112
const [activity, setActivity] = useState({});
13+
const adapter = useContext(AdapterContext);
1214

1315
useEffect(() => {
1416
const onError = (error) => {
1517
throw error;
1618
};
17-
const subscription = activitiesAdapter.getActivity(activityID).subscribe(setActivity, onError);
19+
const subscription = adapter.activitiesAdapter.getActivity(activityID).subscribe(setActivity, onError);
1820

1921
return () => {
2022
subscription.unsubscribe();

src/components/hooks/useActivityStream.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import {useEffect, useReducer} from 'react';
1+
import {useContext, useEffect, useReducer} from 'react';
2+
3+
import {AdapterContext} from '../../components/';
24

35
const APPEND_ACTIVITIES = 'append_activities';
46

@@ -30,14 +32,14 @@ function reducer(activityIDs, action) {
3032
* Custom hook that returns activity data associated to the room of the given ID.
3133
*
3234
* @param {string} roomID ID of the room for which to return data.
33-
* @param {RoomsAdapter} roomsAdapter Component data adapter from which to retrieve data.
3435
* @returns {Room} Activity ID associated to the room
3536
*/
36-
export default function useActivityStream(roomID, roomsAdapter) {
37+
export default function useActivityStream(roomID) {
3738
const [activityIDs, dispatch] = useReducer(reducer, []);
39+
const adapter = useContext(AdapterContext);
3840

3941
useEffect(() => {
40-
const subscription = roomsAdapter.getRoomActivities(roomID).subscribe((activities) => {
42+
const subscription = adapter.roomsAdapter.getRoomActivities(roomID).subscribe((activities) => {
4143
dispatch({type: APPEND_ACTIVITIES, payload: activities});
4244
});
4345

0 commit comments

Comments
 (0)