socketReducer.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import {createSlice } from '@reduxjs/toolkit';
  2. import {io} from 'socket.io-client';
  3. import { store } from '../store';
  4. import { removeToken } from './userDataReducer';
  5. import { privateMessage } from './userDataReducer';
  6. const initialState = {
  7. socketStatus: 'idle',
  8. socket: null,
  9. socketUserData: {},
  10. usersOnline: [],
  11. startMessages: [],
  12. allUsers: [],
  13. writing: false,
  14. usersWriting: [],
  15. newMessages : [],
  16. newPrivateMessages: {}
  17. }
  18. const SOCKET_URL = process.env.REACT_APP_SERVER_URL;
  19. const connectToSocket = (event) => {
  20. try {
  21. const token = localStorage.getItem('token');
  22. if(token){
  23. const socket = io.connect( //need to add other function for connecting
  24. SOCKET_URL,
  25. {auth: {token}})
  26. socket.on('connected', data => {
  27. store.dispatch(getUser(data));
  28. // socketEventsDispatch(socket)
  29. })
  30. .on(event, (data) => {
  31. switch (event){
  32. case 'allmessages':
  33. store.dispatch(getAllMessages(data));
  34. break;
  35. case 'allDbUsers':
  36. store.dispatch(getAllUsers(data));
  37. break;
  38. default:
  39. break;
  40. }
  41. })
  42. .on('newmessage', (data) => {
  43. store.dispatch(addNewMessage(data))
  44. })
  45. .on('private', (data) => {
  46. store.dispatch(addNewPrivateMessage(data))
  47. })
  48. .on('ban', (data) => {
  49. store.dispatch(removeToken());
  50. localStorage.removeItem('token');
  51. })
  52. .on('usersOnline', (data) => {
  53. store.dispatch(getUsersOnline(data))
  54. })
  55. .on('disconnect', (data) => {
  56. if( data === 'io server disconnect') {
  57. socket.disconnect();
  58. store.dispatch(removeToken());
  59. }
  60. })
  61. .on('error', e => {console.log('On connected', e)});
  62. return socket;
  63. }
  64. } catch (error) {
  65. console.log('error connecting to socket ', error)
  66. }
  67. };
  68. // const socketEventsDispatch = (socket) => {
  69. // socket
  70. // .on('writing', (data) => {
  71. // console.log(data)
  72. // store.dispatch(writing(data));
  73. // })
  74. // }
  75. export const getUserSocketSlice = createSlice({
  76. name: 'userSocket',
  77. initialState,
  78. reducers: {
  79. removeSocket: state => {
  80. state.socket = null
  81. state.socketStatus = 'disconnected'},
  82. getSocket: (state, action) => {
  83. state.socket = connectToSocket(action.payload);
  84. state.socketStatus = 'connected';
  85. },
  86. getUser: (state, action) => {state.socketUserData = action.payload},
  87. getAllMessages: (state, action) => {state.startMessages = action.payload},
  88. getUsersOnline: (state, action) => {state.usersOnline = action.payload},
  89. getAllUsers: (state, action) => {state.allUsers = action.payload},
  90. addNewMessage: (state, action) => {state.newMessages.push(action.payload)},
  91. addNewPrivateMessage: (state, action) => {state.newPrivateMessages = action.payload},
  92. }
  93. }
  94. );
  95. const {actions, reducer} = getUserSocketSlice;
  96. const getUserSocketReducer = reducer;
  97. export default getUserSocketReducer;
  98. export const {
  99. removeSocket,
  100. getSocket,
  101. getUser,
  102. getAllMessages,
  103. getUsersOnline,
  104. addNewMessage,
  105. addNewPrivateMessage,
  106. getAllUsers,
  107. writing
  108. } = actions;