socketReducer.js 4.1 KB

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