socketReducer.js 3.9 KB

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