|
|
@ -2,6 +2,7 @@ import Immutable from "immutable"; |
|
|
|
|
|
|
|
|
import { |
|
|
import { |
|
|
ROOM_JOIN, |
|
|
ROOM_JOIN, |
|
|
|
|
|
ROOM_SAY, |
|
|
ROOM_SELECT, |
|
|
ROOM_SELECT, |
|
|
SOCKET_RECEIVE_MESSAGE |
|
|
SOCKET_RECEIVE_MESSAGE |
|
|
} from "../constants/ActionTypes"; |
|
|
} from "../constants/ActionTypes"; |
|
|
@ -11,6 +12,19 @@ const initialState = { |
|
|
selected: null |
|
|
selected: null |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
const reduceRoom = (old_room, new_room) => { |
|
|
|
|
|
if (!old_room) { |
|
|
|
|
|
return { |
|
|
|
|
|
messages: Immutable.List(), |
|
|
|
|
|
...new_room |
|
|
|
|
|
}; |
|
|
|
|
|
} |
|
|
|
|
|
return { |
|
|
|
|
|
...old_room, |
|
|
|
|
|
...new_room |
|
|
|
|
|
}; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
const reduceRoomList = (old_rooms, room_list) => { |
|
|
const reduceRoomList = (old_rooms, room_list) => { |
|
|
// First sort the room list by room name
|
|
|
// First sort the room list by room name
|
|
|
room_list.sort((room_pair_1, room_pair_2) => { |
|
|
room_list.sort((room_pair_1, room_pair_2) => { |
|
|
@ -28,28 +42,34 @@ const reduceRoomList = (old_rooms, room_list) => { |
|
|
let new_rooms = Immutable.OrderedMap(); |
|
|
let new_rooms = Immutable.OrderedMap(); |
|
|
for (const [ room_name, room_data ] of room_list) { |
|
|
for (const [ room_name, room_data ] of room_list) { |
|
|
const old_data = old_rooms.get(room_name); |
|
|
const old_data = old_rooms.get(room_name); |
|
|
if (old_data) { |
|
|
|
|
|
new_rooms = new_rooms.set(room_name, { |
|
|
|
|
|
...old_data, |
|
|
|
|
|
...room_data |
|
|
|
|
|
}); |
|
|
|
|
|
} else { |
|
|
|
|
|
new_rooms = new_rooms.set(room_name, room_data); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
const new_data = reduceRoom(old_data, room_data); |
|
|
|
|
|
new_rooms = new_rooms.set(room_name, new_data); |
|
|
} |
|
|
} |
|
|
return new_rooms; |
|
|
return new_rooms; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
const reduceReceiveMessage = (state, payload) => { |
|
|
|
|
|
|
|
|
const reduceReceiveMessage = (rooms, payload) => { |
|
|
switch (payload.variant) { |
|
|
switch (payload.variant) { |
|
|
case "RoomListResponse": |
|
|
case "RoomListResponse": |
|
|
return { |
|
|
|
|
|
...state, |
|
|
|
|
|
rooms: reduceRoomList(state.rooms, payload.data.rooms) |
|
|
|
|
|
|
|
|
return reduceRoomList(rooms, payload.data.rooms); |
|
|
|
|
|
|
|
|
|
|
|
case "SayRoomResponse": |
|
|
|
|
|
{ |
|
|
|
|
|
const { room_name, user_name, message } = payload.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 }) |
|
|
}; |
|
|
}; |
|
|
|
|
|
return rooms.set(room_name, new_room_data); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
default: |
|
|
default: |
|
|
return state; |
|
|
|
|
|
|
|
|
return rooms; |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
@ -57,7 +77,13 @@ export default (state = initialState, action) => { |
|
|
const { type, payload } = action; |
|
|
const { type, payload } = action; |
|
|
switch (type) { |
|
|
switch (type) { |
|
|
case SOCKET_RECEIVE_MESSAGE: |
|
|
case SOCKET_RECEIVE_MESSAGE: |
|
|
return reduceReceiveMessage(state, payload); |
|
|
|
|
|
|
|
|
return { |
|
|
|
|
|
...state, |
|
|
|
|
|
rooms: reduceReceiveMessage(state.rooms, payload) |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
case ROOM_SAY: |
|
|
|
|
|
return state; |
|
|
|
|
|
|
|
|
case ROOM_SELECT: |
|
|
case ROOM_SELECT: |
|
|
return { |
|
|
return { |
|
|
|