index.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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 if (pathname === '/setup') {
  56. dispatch({ type: 'SET_SIDER', payload: false });
  57. dispatch({ type: 'SET_INNER_PADDING', payload: false });
  58. } else {
  59. // Only show sidebar on non-mobile devices by default
  60. dispatch({ type: 'SET_SIDER', payload: !isMobile() });
  61. dispatch({ type: 'SET_INNER_PADDING', payload: true });
  62. }
  63. };
  64. updateShowSider();
  65. const updateSiderCollapsed = () => {
  66. const isCollapsed = localStorage.getItem('default_collapse_sidebar') === 'true';
  67. dispatch({ type: 'SET_SIDER_COLLAPSED', payload: isCollapsed });
  68. };
  69. updateSiderCollapsed();
  70. // Add event listeners to handle window resize
  71. const handleResize = () => {
  72. updateIsMobile();
  73. };
  74. window.addEventListener('resize', handleResize);
  75. // Cleanup event listener on component unmount
  76. return () => {
  77. window.removeEventListener('resize', handleResize);
  78. };
  79. }, []);
  80. return (
  81. <StyleContext.Provider value={[state, dispatch]}>
  82. {children}
  83. </StyleContext.Provider>
  84. );
  85. };