socketReducer.js 4.5 KB

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