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

Commit 3e4e3fa

Browse files
author
Jeff
committed
Releasing v0.5.0.
1 parent b315041 commit 3e4e3fa

File tree

18 files changed

+159
-71
lines changed

18 files changed

+159
-71
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"polished": "^3.4.1",
1616
"pubnub": "^4.27.0",
1717
"pubnub-react": "^2.0.0-beta.4",
18-
"pubnub-redux": "^0.1.26-alpha",
18+
"pubnub-redux": "^0.1.31-alpha",
1919
"react": "^16.9.0",
2020
"react-dom": "^16.9.0",
2121
"react-pose": "^4.0.8",

src/features/authentication/loginCommand.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ export const login = (userId: string): ThunkAction<Promise<void>> => {
1919
.then(() => {
2020
// Subscribe to the user's channel to receive events involving this user
2121
context.pubnub.api.subscribe({
22-
channels: [userId]
22+
channels: [userId],
23+
withPresence: true
2324
});
2425
})
2526
.then(() => {
@@ -43,7 +44,8 @@ export const login = (userId: string): ThunkAction<Promise<void>> => {
4344
].map(membership => membership.id);
4445

4546
context.pubnub.api.subscribe({
46-
channels: conversationChannels
47+
channels: conversationChannels,
48+
withPresence: true
4749
});
4850
});
4951

src/features/conversationMembers/ConversationMembers/ConversationMembers.tsx

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ import {
88
getUsersByConversationId,
99
MembershipHash
1010
} from "../conversationMemberStore";
11+
import {
12+
getPresenceByConversationId,
13+
ConversationPresence
14+
} from "features/memberPresence/memberPresenceStore";
1115
import { MemberDescription, UserFragment } from "../MemberDescription";
1216
import { getCurrentConversationId } from "features/currentConversation/currentConversationStore";
1317
import { setLayoutDefault } from "features/layout/actions";
@@ -22,21 +26,31 @@ import {
2226
BackIconWrapper,
2327
Title
2428
} from "./ConversationMembers.style";
25-
import { fetchMembers } from "pubnub-redux";
29+
import { fetchMembers, fetchHereNow } from "pubnub-redux";
2630
import { usePubNub } from "pubnub-react";
2731

2832
export const getCurrentConversationMembers = createSelector(
29-
[getUsersById, getCurrentConversationId, getUsersByConversationId],
33+
[
34+
getUsersById,
35+
getCurrentConversationId,
36+
getUsersByConversationId,
37+
getPresenceByConversationId
38+
],
3039
(
3140
users: UsersIndexedById,
3241
conversationId: string,
33-
conversationMemberships: MembershipHash
42+
conversationMemberships: MembershipHash,
43+
conversationPresence: ConversationPresence
3444
): UserFragment[] => {
45+
let presence = conversationPresence[conversationId];
3546
return conversationMemberships[conversationId]
3647
? conversationMemberships[conversationId].map(user => {
3748
return {
3849
...users[user.id],
39-
presence: true
50+
presence:
51+
presence.occupants.filter(occupant => {
52+
return occupant.uuid === user.id;
53+
}).length > 0
4054
};
4155
})
4256
: [];
@@ -69,6 +83,12 @@ const ConversationMembers = () => {
6983
}
7084
})
7185
);
86+
87+
dispatch(
88+
fetchHereNow({
89+
channels: [currentConversationId]
90+
})
91+
);
7292
}
7393
}, [members, currentConversationId, pubnub, dispatch]);
7494

src/features/currentConversation/ConversationOccupancy/ConversationOccupancy.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ import {
66
getUsersByConversationId,
77
MembershipHash
88
} from "features/conversationMembers/conversationMemberStore";
9+
import {
10+
getPresenceByConversationId,
11+
ConversationPresence
12+
} from "features/memberPresence/memberPresenceStore";
913
import { getPanelStates } from "features/layout/selectors";
1014
import { setLayoutRight } from "features/layout/actions";
1115
import { PeopleGroup as PeopleGroupIcon } from "foundations/components/icons/PeopleGroup";
@@ -21,15 +25,21 @@ export interface ConversationOccupancyFragment {
2125
}
2226

2327
export const getCurrentConversationOccupancy = createSelector(
24-
[getCurrentConversationId, getUsersByConversationId],
28+
[
29+
getCurrentConversationId,
30+
getUsersByConversationId,
31+
getPresenceByConversationId
32+
],
2533
(
2634
currentConversationId: string,
27-
conversationMemberships: MembershipHash
35+
conversationMemberships: MembershipHash,
36+
conversationPresence: ConversationPresence
2837
): ConversationOccupancyFragment => {
2938
const members = conversationMemberships[currentConversationId];
39+
const presence = conversationPresence[currentConversationId];
3040
return {
3141
joinedCount: members ? members.length : 0,
32-
presentCount: 5
42+
presentCount: presence ? presence.occupancy : 0
3343
};
3444
}
3545
);

src/features/currentConversation/Message/Message.tsx

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from "react";
1+
import React, { ReactNode } from "react";
22
import { UserInitialsAvatar } from "foundations/components/UserInitialsAvatar";
33
import convertTimestampToTime from "foundations/utilities/convertTimestampToTime";
44
import {
@@ -26,9 +26,10 @@ export interface MessageFragment {
2626

2727
interface MessageProps {
2828
message: MessageFragment;
29+
avatar?: ReactNode;
2930
}
3031

31-
const Message = ({ message }: MessageProps) => {
32+
const Message = ({ message, avatar }: MessageProps) => {
3233
/*
3334
TODO: THere is a bug here. The message sender may not be loaded here due to errors in timing.
3435
But, usually, it does get loaded when the members in the conversation get loaded.
@@ -40,11 +41,15 @@ const Message = ({ message }: MessageProps) => {
4041
return (
4142
<Wrapper>
4243
<Avatar>
43-
<UserInitialsAvatar
44-
size={36}
45-
name={message.sender.name}
46-
uuid={message.sender.id}
47-
/>
44+
{avatar ? (
45+
avatar
46+
) : (
47+
<UserInitialsAvatar
48+
size={36}
49+
name={message.sender.name}
50+
uuid={message.sender.id}
51+
/>
52+
)}
4853
</Avatar>
4954
<Body>
5055
<Header>

src/features/currentConversation/MessageList/MessageList.style.tsx

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,4 @@ export const Wrapper = styled.div`
55
flex-direction: column;
66
overflow-y: scroll;
77
height: 100%;
8-
9-
> div {
10-
&:first-child {
11-
margin-top: 16px;
12-
}
13-
&:last-child {
14-
margin-bottom: 16px;
15-
}
16-
}
178
`;

src/features/currentConversation/MessageList/MessageList.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { getCurrentConversationId } from "../currentConversationStore";
66
import { getUsersById } from "features/users/userStore";
77
import { getMessagesById } from "features/messages/messageStore";
88
import { Wrapper } from "./MessageList.style";
9+
import WelcomeMessage from "./WelcomeMessage";
910

1011
/**
1112
* Create a selector that that returns the list of messages in the currentConversation joined
@@ -44,7 +45,6 @@ export const getCurrentConversationMessages = createSelector(
4445
: [];
4546
}
4647
);
47-
4848
const MessageList = () => {
4949
type ConversationScrollPositionsType = { [conversationId: string]: number };
5050
const conversationId: string = useSelector(getCurrentConversationId);
@@ -104,6 +104,7 @@ const MessageList = () => {
104104

105105
return (
106106
<Wrapper ref={wrapper} onScroll={handleScroll}>
107+
<WelcomeMessage />
107108
{messages.map(message => (
108109
<Message message={message} key={message.timetoken} />
109110
))}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import React from "react";
2+
import { UserInitialsAvatar } from "foundations/components/UserInitialsAvatar";
3+
import { Message } from "../Message";
4+
5+
const welcomeMessage = {
6+
sender: {
7+
id: "PUBNUB-BOT",
8+
name: "PubNub Bot"
9+
},
10+
timetoken: "15735897955841496",
11+
message: {
12+
content: {
13+
body:
14+
"Welcome to Team Chat. 👋👋 Send a message now to start interacting with other users in the app. ⬇️"
15+
}
16+
}
17+
};
18+
19+
const WelcomeMessage = () => (
20+
<Message
21+
message={welcomeMessage}
22+
key={welcomeMessage.timetoken}
23+
avatar={
24+
<UserInitialsAvatar
25+
size={36}
26+
name="P N"
27+
uuid={welcomeMessage.sender.id}
28+
color="#E5585E"
29+
/>
30+
}
31+
/>
32+
);
33+
34+
export default WelcomeMessage;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { createNetworkStatusReducer } from "pubnub-redux";
2+
3+
/**
4+
* Create a reducer to hold the current online status of the user
5+
*/
6+
7+
const NetworkStatusReducer = createNetworkStatusReducer(false);
8+
export { NetworkStatusReducer };

src/features/joinedConversations/joinConversationCommand.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,17 @@ export const joinConversation = (
77
conversationId: string
88
): ThunkAction<Promise<void>> => {
99
return (dispatch, getState, context) => {
10-
const done = dispatch(
10+
return dispatch(
1111
joinSpaces({
1212
userId: userId,
1313
spaces: [{ id: conversationId }]
1414
})
1515
).then(() => {
1616
context.pubnub.api.subscribe({
17-
channels: [conversationId]
17+
channels: [conversationId],
18+
withPresence: true
1819
});
1920
dispatch(focusOnConversation(conversationId));
2021
});
21-
22-
return done;
2322
};
2423
};

0 commit comments

Comments
 (0)