Solstice web interface.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

107 lines
2.6 KiB

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));
}
},
};