Browse Source

Refactor rooms reducer, rename rooms.rooms to rooms.roomMap.

pull/1/head
Titouan Rigoudy 9 years ago
parent
commit
2ea93c8d68
3 changed files with 83 additions and 79 deletions
  1. +3
    -3
      src/components/RoomList.js
  2. +6
    -6
      src/containers/RoomsPane.js
  3. +74
    -70
      src/reducers/rooms.js

+ 3
- 3
src/components/RoomList.js View File

@ -13,11 +13,11 @@ class RoomList extends React.Component {
} }
render() { render() {
const { selected, rooms, roomActions } = this.props;
const { selected, roomMap, roomActions } = this.props;
const children = []; const children = [];
for (const [room_name, room_data] of rooms) {
for (const [room_name, room_data] of roomMap) {
const onClick = (event) => { const onClick = (event) => {
roomActions.select(room_name); roomActions.select(room_name);
}; };
@ -43,7 +43,7 @@ class RoomList extends React.Component {
} }
RoomList.propTypes = { RoomList.propTypes = {
rooms: PropTypes.object.isRequired,
roomMap: PropTypes.object.isRequired,
roomActions: PropTypes.shape({ roomActions: PropTypes.shape({
getList: PropTypes.func.isRequired getList: PropTypes.func.isRequired
}).isRequired, }).isRequired,


+ 6
- 6
src/containers/RoomsPane.js View File

@ -15,7 +15,7 @@ class RoomsPane extends React.Component {
} }
render() { render() {
const { loginUserName, params, rooms, roomActions } = this.props;
const { loginUserName, params, roomMap, roomActions } = this.props;
let roomName; let roomName;
let roomChat; let roomChat;
@ -23,7 +23,7 @@ class RoomsPane extends React.Component {
if (params && params.roomName) { if (params && params.roomName) {
roomName = decodeURIComponent(atob(params.roomName)); roomName = decodeURIComponent(atob(params.roomName));
const { membership, messages, showUsers } = rooms.get(roomName);
const { membership, messages, showUsers } = roomMap.get(roomName);
const room = { const room = {
name: roomName, name: roomName,
membership, membership,
@ -42,7 +42,7 @@ class RoomsPane extends React.Component {
return ( return (
<div id="rooms-pane"> <div id="rooms-pane">
<RoomList <RoomList
rooms={rooms}
roomMap={roomMap}
roomActions={roomActions} roomActions={roomActions}
selected={roomName} selected={roomName}
/> />
@ -59,12 +59,12 @@ RoomsPane.propTypes = {
params: PropTypes.shape({ params: PropTypes.shape({
roomName: PropTypes.string roomName: PropTypes.string
}), }),
rooms: ImmutablePropTypes.orderedMap.isRequired,
roomActions: PropTypes.object.isRequired
roomMap: ImmutablePropTypes.orderedMap.isRequired,
roomActions: PropTypes.object.isRequired
}; };
const mapStateToProps = (state) => ({ const mapStateToProps = (state) => ({
rooms: state.rooms.rooms,
roomMap: state.rooms.roomMap,
loginUserName: state.login.username loginUserName: state.login.username
}); });


+ 74
- 70
src/reducers/rooms.js View File

@ -10,10 +10,13 @@ import {
} from "../constants/ActionTypes"; } from "../constants/ActionTypes";
const initialState = { const initialState = {
rooms: Immutable.OrderedMap()
roomMap: Immutable.OrderedMap(),
roomNameByHash: Immutable.Map()
}; };
const reduceRoomList = (oldRoomMap, roomList) => {
const reduceRoomList = (state, roomList) => {
const { roomMap, roomNameByHash } = state;
// First sort the room list by room name // First sort the room list by room name
roomList.sort(([ roomName1 ], [ roomName2 ]) => { roomList.sort(([ roomName1 ], [ roomName2 ]) => {
if (roomName1 < roomName2) { if (roomName1 < roomName2) {
@ -31,123 +34,124 @@ const reduceRoomList = (oldRoomMap, roomList) => {
// Transform room_data.messages to an immutable list. // Transform room_data.messages to an immutable list.
newRoomData.messages = Immutable.List(newRoomData.messages); newRoomData.messages = Immutable.List(newRoomData.messages);
// Get the old room data. // Get the old room data.
const oldRoomData = oldRoomMap.get(roomName);
const roomData = roomMap.get(roomName);
// Merge the old data and the new data, overwriting with new data if // Merge the old data and the new data, overwriting with new data if
// conflicting. // conflicting.
const mergedRoomData = { const mergedRoomData = {
...oldRoomData,
...roomData,
...newRoomData ...newRoomData
}; };
newRoomMap = newRoomMap.set(roomName, mergedRoomData); newRoomMap = newRoomMap.set(roomName, mergedRoomData);
} }
return newRoomMap;
return {
...state,
roomMap: newRoomMap,
roomNameByHash
};
}; };
const reduceReceiveMessage = (rooms, { variant, data }) => {
const reduceReceiveMessageRoom = (roomData, { variant, data }) => {
switch (variant) { switch (variant) {
case "RoomJoinResponse": case "RoomJoinResponse":
{
const { room_name } = data;
const room = rooms.get(room_name);
return rooms.set(room_name, {
...room,
return {
...roomData,
membership: "Member" membership: "Member"
});
}
};
case "RoomLeaveResponse": case "RoomLeaveResponse":
{
const room_name = data;
const room = rooms.get(room_name);
return rooms.set(room_name, {
...room,
return {
...roomData,
membership: "NonMember" membership: "NonMember"
});
}
case "RoomListResponse":
return reduceRoomList(rooms, data.rooms);
};
case "RoomMessageResponse": case "RoomMessageResponse":
{ {
const { room_name, user_name, message } = data;
const room_data = rooms.get(room_name);
if (!room_data) {
console.log(`Error: room "${room_name} not found`);
return rooms;
}
const new_room_data = {
...room_data,
messages: room_data.messages.push({ user_name, message })
const { user_name, message } = data;
return {
...roomData,
messages: roomData.messages.push({ user_name, message })
}; };
return rooms.set(room_name, new_room_data);
} }
default:
return rooms;
} }
}; };
export default (state = initialState, action) => {
const { type, payload } = action;
switch (type) {
case SOCKET_RECEIVE_MESSAGE:
const reduceReceiveMessage = (state, message) => {
const { variant, data } = message;
switch (variant) {
case "RoomJoinResponse":
case "RoomLeaveResponse":
case "RoomMessageResponse":
{
const { room_name } = data;
const roomData = state.roomMap.get(room_name);
const roomMap = state.roomMap.set(room_name,
reduceReceiveMessageRoom(roomData, { variant, data })
);
return { return {
...state, ...state,
rooms: reduceReceiveMessage(state.rooms, payload)
roomMap
}; };
}
case ROOM_MESSAGE:
case "RoomListResponse":
return reduceRoomList(state, data.rooms);
default:
return state; return state;
}
};
const reduceRoom = (roomData, { type, payload }) => {
switch (type) {
case ROOM_JOIN: case ROOM_JOIN:
{
const rooms = state.rooms.set(payload, {
...state.rooms.get(payload),
membership: "Joining"
});
return { return {
...state,
rooms
...roomData,
membership: "Joining"
}; };
}
case ROOM_LEAVE: case ROOM_LEAVE:
{
const rooms = state.rooms.set(payload, {
...state.rooms.get(payload),
membership: "Leaving"
});
return { return {
...state,
rooms
...roomData,
membership: "Leaving"
}; };
}
case ROOM_SHOW_USERS: case ROOM_SHOW_USERS:
{
const rooms = state.rooms.set(payload, {
...state.rooms.get(payload),
return {
...roomData,
showUsers: true showUsers: true
});
};
case ROOM_HIDE_USERS:
return { return {
...state,
rooms
...roomData,
showUsers: false
}; };
}
}
};
export default (state = initialState, action) => {
const { type, payload } = action;
switch (type) {
case SOCKET_RECEIVE_MESSAGE:
return reduceReceiveMessage(state, payload);
case ROOM_JOIN:
case ROOM_LEAVE:
case ROOM_SHOW_USERS:
case ROOM_HIDE_USERS: case ROOM_HIDE_USERS:
{ {
const rooms = state.rooms.set(payload, {
...state.rooms.get(payload),
showUsers: false
});
const roomData = state.roomMap.get(payload);
const roomMap = state.roomMap.set(payload,
reduceRoom(roomData, action)
);
return { return {
...state, ...state,
rooms
roomMap
}; };
} }
case ROOM_MESSAGE:
default: default:
return state; return state;
} }


Loading…
Cancel
Save