socketSlice.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import {createSlice} from "@reduxjs/toolkit";
  2. import {APP_SERVER} from "@constants/app";
  3. import CSClientWrap from "@features/colyseus/CSClientWrap";
  4. export const Socket=createSlice({
  5. name: 'socket',
  6. initialState: {
  7. clients:{}
  8. },
  9. reducers: {
  10. onConnect:(state, action) => {
  11. let roomName=action.payload;
  12. if (roomName!=null){
  13. state.clients[roomName]={
  14. isConnected:true,
  15. message:{}//最后一条消息
  16. }
  17. }
  18. },
  19. onDisconnect:(state, action) =>{
  20. let roomName=action.payload;
  21. let client=state.clients[roomName];
  22. if (client!=null){
  23. client.isConnected=false;
  24. }
  25. },
  26. onSend:(state, action) =>{
  27. },
  28. onMessage:(state, action) => {
  29. let {roomName,type,message}=action.payload;
  30. let client=state.clients[roomName];
  31. if (client!=null){
  32. client.message={type,message};
  33. }
  34. }
  35. },
  36. extraReducers: (builder) => {
  37. },
  38. })
  39. export const {onConnect,onDisconnect,onSend,onMessage} = Socket.actions;
  40. export const getHallConnState=(state)=>{
  41. let isConnected=false;
  42. let clients=state.socket.clients;
  43. if (clients!=null){
  44. let hall=clients[APP_SERVER.ROOM_HALL];
  45. if (hall!=null)return hall.isConnected;
  46. }
  47. return isConnected;
  48. }
  49. export default Socket.reducer;
  50. export const connectServer=({roomName, serverUrl,messageCB=null,onRoomConnect=null,onRoomTimeoutClose=null,options={}})=>{
  51. return async (dispatch, getState) => {
  52. if (CSClientWrap.isConnected(roomName))return ;
  53. let isConnected=await CSClientWrap.connect(roomName,serverUrl,(type,message)=>{
  54. dispatch(onMessage({roomName,type,message}));
  55. if (messageCB!=null)dispatch(messageCB(type,message));
  56. },(connected)=>{
  57. dispatch(onConnect(roomName));
  58. if (onRoomConnect!=null)dispatch(onRoomConnect());
  59. },()=>{
  60. dispatch(onDisconnect(roomName));
  61. if (onRoomTimeoutClose!=null)dispatch(onRoomTimeoutClose());
  62. });
  63. }
  64. }
  65. export const disconnectServer=(roomName)=>{
  66. return async (dispatch, getState) => {
  67. await CSClientWrap.disconnect(roomName);
  68. dispatch(onDisconnect(roomName));
  69. }
  70. }
  71. export const sendToServer=({roomName,type,message=""})=>{
  72. return (dispatch)=>{
  73. CSClientWrap.send(roomName,type,message);
  74. dispatch(onSend({roomName,type,message}));
  75. }
  76. }
  77. // export const connectHall=()=>{
  78. // return connectServer({
  79. // roomName:APP_SERVER.ROOM_HALL,
  80. // serverUrl:APP_SERVER.SERVER_URL
  81. // });
  82. // }