index.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // contexts/User/index.jsx
  2. import React, { useState, useEffect } from 'react';
  3. import { isMobile } from '../../helpers/index.js';
  4. export const StyleContext = React.createContext({
  5. dispatch: () => null,
  6. });
  7. export const StyleProvider = ({ children }) => {
  8. const [state, setState] = useState({
  9. isMobile: false,
  10. showSider: false,
  11. });
  12. const dispatch = (action) => {
  13. if ('type' in action) {
  14. switch (action.type) {
  15. case 'TOGGLE_SIDER':
  16. setState(prev => ({ ...prev, showSider: !prev.showSider }));
  17. break;
  18. case 'SET_SIDER':
  19. setState(prev => ({ ...prev, showSider: action.payload }));
  20. break;
  21. case 'SET_MOBILE':
  22. setState(prev => ({ ...prev, isMobile: action.payload }));
  23. break;
  24. default:
  25. setState(prev => ({ ...prev, ...action }));
  26. }
  27. } else {
  28. setState(prev => ({ ...prev, ...action }));
  29. }
  30. };
  31. useEffect(() => {
  32. const updateIsMobile = () => {
  33. dispatch({ type: 'SET_MOBILE', payload: isMobile() });
  34. };
  35. updateIsMobile();
  36. // Optionally, add event listeners to handle window resize
  37. window.addEventListener('resize', updateIsMobile);
  38. // Cleanup event listener on component unmount
  39. return () => {
  40. window.removeEventListener('resize', updateIsMobile);
  41. };
  42. }, []);
  43. return (
  44. <StyleContext.Provider value={[state, dispatch]}>
  45. {children}
  46. </StyleContext.Provider>
  47. );
  48. };