import { AppDispatch } from "app/store";
|
|
import {
|
|
RoomMembership,
|
|
RoomMessagePayload,
|
|
RoomState,
|
|
roomReceiveMessage,
|
|
roomSendMessage,
|
|
roomGetAll,
|
|
roomSetAll,
|
|
} from "modules/room/slice";
|
|
import { SocketMessage, SocketMessageMiddleware } from "modules/socket/message";
|
|
|
|
function roomListRequest(): SocketMessage {
|
|
return "RoomListRequest";
|
|
}
|
|
|
|
function roomMessageRequest({ roomName, message }: RoomMessagePayload) {
|
|
return {
|
|
RoomMessageRequest: {
|
|
room_name: roomName,
|
|
message,
|
|
},
|
|
};
|
|
}
|
|
|
|
function convertMembership(membership: string): RoomMembership {
|
|
switch (membership) {
|
|
case "NonMember":
|
|
return RoomMembership.Left;
|
|
case "Joining":
|
|
return RoomMembership.Joining;
|
|
case "Member":
|
|
return RoomMembership.Joined;
|
|
case "Leaving":
|
|
return RoomMembership.Leaving;
|
|
}
|
|
}
|
|
|
|
function convertMessages(messages: any[]): RoomMessage[] {
|
|
const result = [];
|
|
for (const message of messages) {
|
|
result.push({
|
|
userName: message.user_name,
|
|
message: message.message,
|
|
});
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function convertRoomListEntry(name: string, room: any): RoomState {
|
|
return {
|
|
name,
|
|
membership: convertMembership(room.membership),
|
|
visibility: room.visibility,
|
|
operated: room.operated,
|
|
userCount: room.user_count,
|
|
owner: room.owner,
|
|
operators: room.operators,
|
|
members: room.members,
|
|
messages: convertMessages(room.messages),
|
|
tickers: room.tickers,
|
|
};
|
|
}
|
|
|
|
function handleRoomListResponse(dispatch: AppDispatch, response) {
|
|
const { rooms } = response;
|
|
if (rooms === undefined) {
|
|
console.log("RoomListResponse has wrong shape:", response);
|
|
return;
|
|
}
|
|
|
|
const map = {};
|
|
for (const [name, room] of rooms) {
|
|
map[name] = convertRoomListEntry(name, room);
|
|
}
|
|
|
|
dispatch(roomSetAll(map));
|
|
}
|
|
|
|
function handleRoomMessageResponse(dispatch: AppDispatch, response) {
|
|
dispatch(
|
|
roomReceiveMessage({
|
|
roomName: response.room_name,
|
|
userName: response.user_name,
|
|
message: response.message,
|
|
})
|
|
);
|
|
}
|
|
|
|
export const roomSocketMessageMiddleware: SocketMessageMiddleware = {
|
|
// TODO: Adapt to new response format.
|
|
handleMessage: (dispatch, message) => {
|
|
if ("RoomListResponse" in message) {
|
|
handleRoomListResponse(dispatch, message["RoomListResponse"]);
|
|
} else if ("RoomMessageResponse" in message) {
|
|
handleRoomMessageResponse(dispatch, message["RoomMessageResponse"]);
|
|
}
|
|
},
|
|
|
|
handleAction: (send, action) => {
|
|
if (roomGetAll.match(action)) {
|
|
send(roomListRequest());
|
|
} else if (roomSendMessage.match(action)) {
|
|
send(roomMessageRequest(action.payload));
|
|
}
|
|
},
|
|
};
|