Skip to content

Commit 1c14543

Browse files
author
Ives van Hoorne
committed
User leaving/connecting handling
1 parent eaf83f8 commit 1c14543

File tree

7 files changed

+65
-6
lines changed

7 files changed

+65
-6
lines changed

packages/app/src/app/components/CodeEditor/Monaco/index.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,13 @@ class MonacoEditor extends React.Component<Props, State> implements Editor {
405405
if (corrections) {
406406
this.setCorrections(corrections);
407407
}
408+
409+
if (this.props.onCodeReceived) {
410+
// Whenever the user changes a module we set up a state that defines
411+
// that the changes of code are not sent to live users. We need to reset
412+
// this state when we're doing changing modules
413+
this.props.onCodeReceived();
414+
}
408415
});
409416
};
410417

packages/app/src/app/store/modules/editor/sequences.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
sendModuleSaved,
77
getSelectionsForCurrentModule,
88
sendChangeCurrentModule,
9+
setReceivingStatus,
910
} from '../live/actions';
1011
import {
1112
ensureOwnedSandbox,
@@ -49,6 +50,7 @@ export const stopResizing = set(state`editor.isResizing`, false);
4950
export const createZip = actions.createZip;
5051

5152
export const changeCurrentModule = [
53+
setReceivingStatus,
5254
setCurrentModule(props`id`),
5355
equals(state`live.isLive`),
5456
{

packages/app/src/app/store/modules/live/actions.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ export function sendSelection({ props, state, live }) {
133133
});
134134
}
135135

136-
export function consumeUserEnteredState({ props }) {
136+
export function consumeUserState({ props }) {
137137
const users = camelizeKeys(props.data.users);
138138

139139
return { users };
@@ -399,6 +399,18 @@ export function getUserJoinedNotification({ props }) {
399399
return { message: `${user.username} joined the live session!` };
400400
}
401401

402+
export function getUserLeftNotification({ props, state }) {
403+
const users = state.get(`live.roomInfo.users`);
404+
if (users) {
405+
const user = users.find(u => u.id === props.data.left_user_id);
406+
if (user) {
407+
return { message: `${user.username} left the live session.` };
408+
}
409+
}
410+
411+
return { message: 'Someone left the live session' };
412+
}
413+
402414
export function sendMode({ props, live }) {
403415
live.send('live:mode', {
404416
mode: props.mode,

packages/app/src/app/store/modules/live/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export default Module({
1111
isLoading: false,
1212
isOwner: false,
1313
receivingCode: false,
14+
reconnecting: false,
1415
},
1516
getters: {
1617
isCurrentEditor,

packages/app/src/app/store/modules/live/model.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export default {
2222
receivingCode: types.boolean,
2323
error: types.maybe(types.string),
2424
isOwner: types.boolean,
25+
reconnecting: types.boolean,
2526
roomInfo: types.maybe(
2627
types.model({
2728
startTime: types.maybe(types.number),

packages/app/src/app/store/modules/live/sequences.js

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { set, push, when, equals } from 'cerebral/operators';
1+
import { unset, set, push, when, equals } from 'cerebral/operators';
22
import { state, props } from 'cerebral/tags';
33

44
import * as factories from '../../factories';
@@ -45,11 +45,23 @@ export const changeMode = [
4545
export const handleMessage = [
4646
equals(props`event`),
4747
{
48+
join: [
49+
set(props`message`, 'Connected to Live!'),
50+
factories.addNotification(props`message`, 'success'),
51+
set(state`live.reconnecting`, false),
52+
],
4853
'user:entered': [
49-
actions.consumeUserEnteredState,
54+
actions.consumeUserState,
5055
set(state`live.roomInfo.users`, props`users`),
51-
actions.getUserJoinedNotification,
52-
factories.addNotification(props`message`, 'notice'),
56+
set(props`data.user_id`, props`data.joined_user_id`),
57+
isOwnMessage,
58+
{
59+
false: [
60+
actions.getUserJoinedNotification,
61+
factories.addNotification(props`message`, 'notice'),
62+
],
63+
true: [],
64+
},
5365
equals(state`live.isOwner`),
5466
{
5567
true: [
@@ -60,6 +72,13 @@ export const handleMessage = [
6072
false: [],
6173
},
6274
],
75+
'user:left': [
76+
actions.getUserLeftNotification,
77+
factories.addNotification(props`message`, 'notice'),
78+
actions.consumeUserState,
79+
set(state`live.roomInfo.users`, props`users`),
80+
unset(state`live.roomInfo.usersMetadata.${props`data.left_user_id`}`),
81+
],
6382
state: [
6483
isOwnMessage,
6584
{
@@ -201,6 +220,20 @@ export const handleMessage = [
201220
false: actions.receiveTransformation,
202221
},
203222
],
223+
'connection-loss': [
224+
equals(state`live.reconnecting`),
225+
{
226+
false: [
227+
set(
228+
props`message`,
229+
'We lost connection with the live server, reconnecting...'
230+
),
231+
factories.addNotification(props`message`, 'error'),
232+
set(state`live.reconnecting`, true),
233+
],
234+
true: [],
235+
},
236+
],
204237
otherwise: [],
205238
},
206239
];

packages/app/src/app/store/providers/Live.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@ export default Provider({
3030
listen(signalPath) {
3131
const signal = this.context.controller.getSignal(signalPath);
3232
channel.onMessage = (event: any, data: any) => {
33-
signal({ event, data });
33+
const alteredEvent =
34+
data == null && event === 'phx_err' ? 'connection-loss' : event;
35+
36+
signal({ event: alteredEvent, data: data == null ? {} : data });
3437

3538
return data;
3639
};

0 commit comments

Comments
 (0)