151 lines
4.5 KiB
JavaScript
151 lines
4.5 KiB
JavaScript
import { useDeepCompareEffect } from '@fuse/hooks';
|
|
import _ from '@lodash';
|
|
import AppContext from 'src/app/contexts/AppContext';
|
|
import {
|
|
generateSettings,
|
|
selectFuseCurrentSettings,
|
|
selectFuseDefaultSettings,
|
|
setSettings,
|
|
} from 'app/store/fuse/settingsSlice';
|
|
import { memo, useCallback, useContext, useMemo, useRef } from 'react';
|
|
import { useDispatch, useSelector } from 'react-redux';
|
|
import { matchRoutes, useLocation } from 'react-router-dom';
|
|
import GlobalStyles from '@mui/material/GlobalStyles';
|
|
|
|
const inputGlobalStyles = (
|
|
<GlobalStyles
|
|
styles={(theme) => ({
|
|
html: {
|
|
backgroundColor: `${theme.palette.background.default}!important`,
|
|
color: `${theme.palette.text.primary}!important`,
|
|
},
|
|
body: {
|
|
backgroundColor: theme.palette.background.default,
|
|
color: theme.palette.text.primary,
|
|
},
|
|
/* 'code:not([class*="language-"])': {
|
|
color: theme.palette.secondary.dark,
|
|
backgroundColor:
|
|
theme.palette.mode === 'light' ? 'rgba(255, 255, 255, .9)' : 'rgba(0, 0, 0, .9)',
|
|
padding: '2px 3px',
|
|
borderRadius: 2,
|
|
lineHeight: 1.7,
|
|
}, */
|
|
'table.simple tbody tr th': {
|
|
borderColor: theme.palette.divider,
|
|
},
|
|
'table.simple thead tr th': {
|
|
borderColor: theme.palette.divider,
|
|
},
|
|
// 'a:not([role=button]):not(.MuiButtonBase-root)': {
|
|
// color: theme.palette.secondary.main,
|
|
// textDecoration: 'underline',
|
|
// '&:hover': {},
|
|
// },
|
|
// 'a.link, a:not([role=button])[target=_blank]': {
|
|
// background: alpha(theme.palette.secondary.main, 0.2),
|
|
// color: 'inherit',
|
|
// borderBottom: `1px solid ${theme.palette.divider}`,
|
|
// textDecoration: 'none',
|
|
// '&:hover': {
|
|
// background: alpha(theme.palette.secondary.main, 0.3),
|
|
// textDecoration: 'none',
|
|
// },
|
|
// },
|
|
// '[class*="MuiOutlinedInput-root"]': {
|
|
// borderRadius: `${theme.spacing('10px')}`,
|
|
// },
|
|
// '[class^="border"]': {
|
|
// borderColor: theme.palette.divider,
|
|
// },
|
|
// '[class*="border"]': {
|
|
// borderColor: theme.palette.divider,
|
|
// },
|
|
'[class*="divide-"] > :not([hidden]) ~ :not([hidden])': {
|
|
borderColor: theme.palette.divider,
|
|
},
|
|
hr: {
|
|
borderColor: theme.palette.divider,
|
|
},
|
|
|
|
'::-webkit-scrollbar-thumb': {
|
|
boxShadow: `inset 0 0 0 20px ${
|
|
theme.palette.mode === 'light' ? 'rgba(0, 0, 0, 0.24)' : 'rgba(255, 255, 255, 0.24)'
|
|
}`,
|
|
},
|
|
'::-webkit-scrollbar-thumb:active': {
|
|
boxShadow: `inset 0 0 0 20px ${
|
|
theme.palette.mode === 'light' ? 'rgba(0, 0, 0, 0.37)' : 'rgba(255, 255, 255, 0.37)'
|
|
}`,
|
|
},
|
|
})}
|
|
/>
|
|
);
|
|
|
|
function FuseLayout(props) {
|
|
const { layouts } = props;
|
|
const dispatch = useDispatch();
|
|
const settings = useSelector(selectFuseCurrentSettings);
|
|
const defaultSettings = useSelector(selectFuseDefaultSettings);
|
|
|
|
const appContext = useContext(AppContext);
|
|
const { routes } = appContext;
|
|
|
|
const location = useLocation();
|
|
const { pathname } = location;
|
|
|
|
const matchedRoutes = matchRoutes(routes, pathname);
|
|
const matched = matchedRoutes ? matchedRoutes[0] : false;
|
|
|
|
const newSettings = useRef(null);
|
|
|
|
const shouldAwaitRender = useCallback(() => {
|
|
let _newSettings;
|
|
/**
|
|
* On Path changed
|
|
*/
|
|
// if (prevPathname !== pathname) {
|
|
if (matched && matched.route.settings) {
|
|
/**
|
|
* if matched route has settings
|
|
*/
|
|
|
|
const routeSettings = matched.route.settings;
|
|
|
|
_newSettings = generateSettings(defaultSettings, routeSettings);
|
|
} else if (!_.isEqual(newSettings.current, defaultSettings)) {
|
|
/**
|
|
* Reset to default settings on the new path
|
|
*/
|
|
_newSettings = _.merge({}, defaultSettings);
|
|
} else {
|
|
_newSettings = newSettings.current;
|
|
}
|
|
|
|
if (!_.isEqual(newSettings.current, _newSettings)) {
|
|
newSettings.current = _newSettings;
|
|
}
|
|
}, [defaultSettings, matched]);
|
|
|
|
shouldAwaitRender();
|
|
|
|
useDeepCompareEffect(() => {
|
|
if (!_.isEqual(newSettings.current, settings)) {
|
|
dispatch(setSettings(newSettings.current));
|
|
}
|
|
}, [dispatch, newSettings.current, settings]);
|
|
|
|
// console.warn('::FuseLayout:: rendered');
|
|
|
|
const Layout = useMemo(() => layouts[settings.layout.style], [layouts, settings.layout.style]);
|
|
|
|
return _.isEqual(newSettings.current, settings) ? (
|
|
<>
|
|
{inputGlobalStyles}
|
|
<Layout {...props} />
|
|
</>
|
|
) : null;
|
|
}
|
|
|
|
export default memo(FuseLayout);
|