@zohodesk/dot
Version:
In this Library, we Provide Some Basic Components to Build Your Application
125 lines (111 loc) • 3.78 kB
JavaScript
import { useMemo, useLayoutEffect } from 'react';
import { getThemeAppearanceAssetPromise } from "../utils/assetPromiseHandlers/themeAppearanceAssetPromise.js";
import { getThemeColorAssetPromise } from "../utils/assetPromiseHandlers/themeColorAssetPromise.js";
import { getFontSizeAssetPromise } from "../utils/assetPromiseHandlers/fontSizeAssetPromise.js";
import { getZoomSizeAssetPromise } from "../utils/assetPromiseHandlers/zoomSizeAssetPromise.js";
export default function useDownloadAssetsAndSetAttr({
themeAppearance,
themeColor,
baseZoomUnit,
baseFontUnit,
getProviderElement,
zoomUnitVariable,
fontUnitVariable,
excludeFeatures,
themeAppearanceAttr,
themeColorAttr
}) {
const excluded = useMemo(() => new Set(excludeFeatures), [excludeFeatures]);
const needTheme = !excluded.has('theme');
const needZoom = !excluded.has('zoom');
const needFont = !excluded.has('font');
const themeAppearancePromise = useMemo(() => {
if (!needTheme) {
return [Promise.resolve()];
}
return getThemeAppearanceAssetPromise({
themeAppearance
});
}, [themeAppearance, needTheme]);
const themeColorPromise = useMemo(() => {
if (!needTheme) {
return [Promise.resolve()];
}
return getThemeColorAssetPromise({
themeAppearance,
themeColor
});
}, [themeAppearance, themeColor, needTheme]);
const modifiedZoomUnitWithSuffix = useMemo(() => {
return !isNaN(Number(baseZoomUnit)) ? `${Number(baseZoomUnit)}px` : baseZoomUnit;
}, [baseZoomUnit]);
const zoomSizePromise = useMemo(() => {
if (!needZoom) {
return Promise.resolve();
}
return getZoomSizeAssetPromise();
}, [needZoom]);
const fontSizePromise = useMemo(() => {
if (!needFont) {
return Promise.resolve();
}
return getFontSizeAssetPromise();
}, [needFont]);
const combinedPromise = {
themeAppearancePromise,
themeColorPromise,
zoomSizePromise,
fontSizePromise
};
function setThemeAttribute() {
if (!needTheme) {
return;
}
const themePromise = [...themeAppearancePromise, ...themeColorPromise];
Promise.all(themePromise).then(() => {
const providerElement = getProviderElement();
if (providerElement) {
providerElement.setAttribute(themeAppearanceAttr, themeAppearance);
providerElement.setAttribute(themeColorAttr, themeColor);
}
}).catch(error => {
console.error('Error on setting theme appearance and color attributes:', error);
});
}
function setZoomSizeAttribute() {
if (!needZoom) {
return;
}
zoomSizePromise.then(() => {
const providerElement = getProviderElement();
if (providerElement) {
providerElement.style.setProperty(zoomUnitVariable, modifiedZoomUnitWithSuffix);
}
}).catch(error => {
console.error('Error on setting zoom-size property', error);
});
}
function setFontSizeAttribute() {
if (!needFont) {
return;
}
fontSizePromise.then(() => {
const providerElement = getProviderElement();
if (providerElement) {
providerElement.style.setProperty(fontUnitVariable, baseFontUnit);
}
}).catch(error => {
console.error('Error on setting font-size property', error);
});
}
useLayoutEffect(() => {
setThemeAttribute();
}, [themeAppearanceAttr, themeColorAttr, themeAppearance, themeColor, getProviderElement, needTheme]);
useLayoutEffect(() => {
setZoomSizeAttribute();
}, [zoomUnitVariable, modifiedZoomUnitWithSuffix, zoomSizePromise, getProviderElement, needZoom]);
useLayoutEffect(() => {
setFontSizeAttribute();
}, [fontUnitVariable, baseFontUnit, fontSizePromise, getProviderElement, needFont]);
return combinedPromise;
}