@teambit/workspace
Version:
99 lines (97 loc) • 3.02 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ThemeFromUrlSync = ThemeFromUrlSync;
function _react() {
const data = require("react");
_react = function () {
return data;
};
return data;
}
function _reactRouterDom() {
const data = require("react-router-dom");
_reactRouterDom = function () {
return data;
};
return data;
}
function _baseReactThemes() {
const data = require("@teambit/base-react.themes.theme-switcher");
_baseReactThemes = function () {
return data;
};
return data;
}
const STORAGE_KEY = 'workspace-theme';
const CLEAR_VALUES = new Set(['default', 'none', '']);
let lastUrlWrite = null;
let lastSeenUrlTheme = undefined;
let lastAppliedFromUrl = null;
function ThemeFromUrlSync() {
const location = (0, _reactRouterDom().useLocation)();
const [, setSearchParams] = (0, _reactRouterDom().useSearchParams)();
const theme = (0, _baseReactThemes().useThemePicker)();
const urlTheme = (0, _react().useMemo)(() => {
const params = new URLSearchParams(location.search);
return params.get('theme') ?? undefined;
}, [location.search]);
const currentName = theme?.current?.themeName;
(0, _react().useEffect)(() => {
if (!theme) return;
const params = new URLSearchParams(location.search);
const hasThemeParam = params.has('theme');
const storedTheme = sessionStorage.getItem(STORAGE_KEY) || undefined;
if (lastUrlWrite && lastUrlWrite === urlTheme) {
lastUrlWrite = null;
lastSeenUrlTheme = urlTheme;
return;
}
const externalUrlChange = lastSeenUrlTheme !== urlTheme;
lastSeenUrlTheme = urlTheme;
if (externalUrlChange && hasThemeParam && urlTheme && CLEAR_VALUES.has(urlTheme)) {
sessionStorage.removeItem(STORAGE_KEY);
params.delete('theme');
lastUrlWrite = null;
lastAppliedFromUrl = null;
setSearchParams(params, {
replace: true
});
return;
}
if (externalUrlChange && urlTheme) {
sessionStorage.setItem(STORAGE_KEY, urlTheme);
if (currentName !== urlTheme) {
const target = theme.options.find(opt => opt.themeName === urlTheme);
if (target) {
lastAppliedFromUrl = urlTheme;
theme.setTheme(target);
}
}
return;
}
if (externalUrlChange && !hasThemeParam && storedTheme) {
params.set('theme', storedTheme);
lastUrlWrite = storedTheme;
setSearchParams(params, {
replace: true
});
return;
}
if (currentName && urlTheme !== currentName) {
if (lastAppliedFromUrl === currentName) {
lastAppliedFromUrl = null;
return;
}
sessionStorage.setItem(STORAGE_KEY, currentName);
params.set('theme', currentName);
lastUrlWrite = currentName;
setSearchParams(params, {
replace: true
});
}
}, [urlTheme, currentName, location.search, setSearchParams, theme]);
return null;
}
//# sourceMappingURL=theme-from-url.js.map