socketReducer.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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. console.log(data)
  47. store.dispatch(addNewPrivateMessage(data))
  48. })
  49. .on('ban', (data) => {
  50. store.dispatch(removeToken());
  51. localStorage.removeItem('token');
  52. })
  53. .on('usersOnline', (data) => {
  54. store.dispatch(getUsersOnline(data))
  55. })
  56. .on('disconnect', (data) => {
  57. if( data === 'io server disconnect') {
  58. socket.disconnect();
  59. store.dispatch(removeToken());
  60. }
  61. })
  62. .on('error', e => {console.log('On connected', e)});
  63. return socket;
  64. }
  65. } catch (error) {
  66. console.log('error connecting to socket ', error)
  67. }
  68. };
  69. // const socketEventsDispatch = (socket) => {
  70. // socket
  71. // .on('writing', (data) => {
  72. // console.log(data)
  73. // store.dispatch(writing(data));
  74. // })
  75. // }
  76. export const getUserSocketSlice = createSlice({
  77. name: 'userSocket',
  78. initialState,
  79. reducers: {
  80. removeSocket: state => {
  81. state.socket = null
  82. state.socketStatus = 'disconnected'},
  83. getSocket: (state, action) => {
  84. state.socket = connectToSocket(action.payload);
  85. state.socketStatus = 'connected';
  86. },
  87. getUser: (state, action) => {state.socketUserData = action.payload},
  88. getAllMessages: (state, action) => {state.startMessages = action.payload},
  89. getUsersOnline: (state, action) => {state.usersOnline = action.payload},
  90. getAllUsers: (state, action) => {state.allUsers = action.payload},
  91. addNewMessage: (state, action) => {state.newMessages.push(action.payload)},
  92. addNewPrivateMessage: (state, action) => {state.newPrivateMessages = action.payload},
  93. }
  94. }
  95. );
  96. const {actions, reducer} = getUserSocketSlice;
  97. const getUserSocketReducer = reducer;
  98. export default getUserSocketReducer;
  99. export const {
  100. removeSocket,
  101. getSocket,
  102. getUser,
  103. getAllMessages,
  104. getUsersOnline,
  105. addNewMessage,
  106. addNewPrivateMessage,
  107. getAllUsers,
  108. writing
  109. } = actions;