socketSlice.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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 default Socket.reducer;
  41. export const connectServer=({roomName, serverUrl,messageCB=null,onRoomConnect=null,options={}})=>{
  42. return async (dispatch, getState) => {
  43. if (CSClientWrap.isConnected())return ;
  44. let isConnected=await CSClientWrap.connect(roomName,serverUrl,(type,message)=>{
  45. dispatch(onMessage({roomName,type,message}));
  46. if (messageCB!=null)dispatch(messageCB(type,message));
  47. });
  48. if(isConnected){
  49. dispatch(onConnect(roomName));
  50. if (onRoomConnect!=null)dispatch(onRoomConnect());
  51. }
  52. }
  53. }
  54. export const disconnectServer=(roomName)=>{
  55. return async (dispatch, getState) => {
  56. await CSClientWrap.disconnect(roomName);
  57. dispatch(onDisconnect(roomName));
  58. }
  59. }
  60. export const sendToServer=({roomName,type,message=""})=>{
  61. return (dispatch)=>{
  62. CSClientWrap.send(roomName,type,message);
  63. dispatch(onSend({roomName,type,message}));
  64. }
  65. }
  66. // export const connectHall=()=>{
  67. // return connectServer({
  68. // roomName:APP_SERVER.ROOM_HALL,
  69. // serverUrl:APP_SERVER.SERVER_URL
  70. // });
  71. // }