index.js 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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: isMobile(),
  10. showSider: false,
  11. siderCollapsed: false,
  12. shouldInnerPadding: false,
  13. });
  14. const dispatch = (action) => {
  15. if ('type' in action) {
  16. switch (action.type) {
  17. case 'TOGGLE_SIDER':
  18. setState(prev => ({ ...prev, showSider: !prev.showSider }));
  19. break;
  20. case 'SET_SIDER':
  21. setState(prev => ({ ...prev, showSider: action.payload }));
  22. break;
  23. case 'SET_MOBILE':
  24. setState(prev => ({ ...prev, isMobile: action.payload }));
  25. break;
  26. case 'SET_SIDER_COLLAPSED':
  27. setState(prev => ({ ...prev, siderCollapsed: action.payload }));
  28. break
  29. case 'SET_INNER_PADDING':
  30. setState(prev => ({ ...prev, shouldInnerPadding: action.payload }));
  31. break;
  32. default:
  33. setState(prev => ({ ...prev, ...action }));
  34. }
  35. } else {
  36. setState(prev => ({ ...prev, ...action }));
  37. }
  38. };
  39. useEffect(() => {
  40. const updateIsMobile = () => {
  41. const mobileDetected = isMobile();
  42. dispatch({ type: 'SET_MOBILE', payload: mobileDetected });
  43. // If on mobile, we might want to auto-hide the sidebar
  44. if (mobileDetected && state.showSider) {
  45. dispatch({ type: 'SET_SIDER', payload: false });
  46. }
  47. };
  48. updateIsMobile();
  49. const updateShowSider = () => {
  50. // check pathname
  51. const pathname = window.location.pathname;
  52. if (pathname === '' || pathname === '/' || pathname.includes('/home') || pathname.includes('/chat')) {
  53. dispatch({ type: 'SET_SIDER', payload: false });
  54. dispatch({ type: 'SET_INNER_PADDING', payload: false });
  55. } else {
  56. // Only show sidebar on non-mobile devices by default
  57. dispatch({ type: 'SET_SIDER', payload: !isMobile() });
  58. dispatch({ type: 'SET_INNER_PADDING', payload: true });
  59. }
  60. };
  61. updateShowSider();
  62. const updateSiderCollapsed = () => {
  63. const isCollapsed = localStorage.getItem('default_collapse_sidebar') === 'true';
  64. dispatch({ type: 'SET_SIDER_COLLAPSED', payload: isCollapsed });
  65. };
  66. updateSiderCollapsed();
  67. // Add event listeners to handle window resize
  68. const handleResize = () => {
  69. updateIsMobile();
  70. };
  71. window.addEventListener('resize', handleResize);
  72. // Cleanup event listener on component unmount
  73. return () => {
  74. window.removeEventListener('resize', handleResize);
  75. };
  76. }, []);
  77. return (
  78. <StyleContext.Provider value={[state, dispatch]}>
  79. {children}
  80. </StyleContext.Provider>
  81. );
  82. };