socketReducer.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. }
  13. const SOCKET_URL = process.env.REACT_APP_SERVER_URL || 'http://localhost:5000';
  14. const connectToSocket = () => {
  15. try {
  16. const token = localStorage.getItem('token');
  17. if(token){
  18. const socket = io.connect(
  19. SOCKET_URL,
  20. {auth: {token}})
  21. socket.on('connected', data => {
  22. store.dispatch(getUser(data));
  23. })
  24. .on('allmessages', (data) => {
  25. store.dispatch(getAllMessages(data));
  26. })
  27. .on('usersOnline', (data) => {
  28. store.dispatch(getUsersOnline(data));
  29. })
  30. .on('allDbUsers', (data) => {
  31. store.dispatch(getAllUsers(data));
  32. })
  33. .on('disconnect', (data) => {
  34. if(data === 'io server disconnect') {
  35. socket.disconnect();
  36. store.dispatch(removeToken());
  37. }
  38. })
  39. .on('error', e => {console.log('On connected', e)});
  40. return socket;
  41. }
  42. } catch (error) {
  43. console.log('error connecting to socket ', error)
  44. }
  45. };
  46. export const getUserSocketSlice = createSlice({
  47. name: 'userSocket',
  48. initialState,
  49. reducers: {
  50. removeSocket: state => {
  51. state.socket = null
  52. state.socketStatus = 'disconnected'},
  53. getSocket: state => {
  54. state.socket = connectToSocket();
  55. state.socketStatus = 'connected';
  56. },
  57. getUser: (state, action) => {state.socketUserData = action.payload},
  58. getAllMessages: (state, action) => {state.startMessages = action.payload},
  59. getUsersOnline: (state, action) => {state.usersOnline = action.payload},
  60. getAllUsers: (state, action) => {state.allUsers = action.payload}
  61. }
  62. }
  63. );
  64. const {actions, reducer} = getUserSocketSlice;
  65. const getUserSocketReducer = reducer;
  66. export default getUserSocketReducer;
  67. export const {
  68. removeSocket,
  69. getSocket,
  70. getUser,
  71. getAllMessages,
  72. getUsersOnline,
  73. getAllUsers
  74. } = actions;