В итоге я перенес свое приложение в styled-components и реализовал theme .
Я храню основные переменные для каждого арендатора в объекте темы:
export const themes = {
tenantOne: {
primaryOne: COLOURS.wallop,
primaryTwo: COLOURS.wallop,
logoBackground: COLOURS.wallop,
secondaryOne: COLOURS.lostForest,
secondaryTwo: COLOURS.darkPurp,
[...]
},
tenantTwo: {
primaryOne: COLOURS.red,
primaryTwo: COLOURS.orange,
logoBackground: COLOURS.darkerGrey,
secondaryOne: COLOURS.darkerGrey,
secondaryTwo: COLOURS.darkerGrey,
[...]
},
};
Затем я завернул свое приложение в компонент <ThemeProvider>
, предоставленный styled-components
.Я передал функцию в theme
prop, которая выясняет, какой арендатор использует приложение (с идентификатором, извлеченным из серверной части), а затем возвращает используемый объект темы.
<ThemeProvider theme={ platformBrandingHelper.getPlatformTheme(appId) }>
<App />
</ThemeProvider>
Вспомогательная функция:
function getPlatformTheme(appId) {
switch (appId) {
case 'tenantOne':
return THEMES.tenantOne;
case 'tenantTwo':
return THEMES.tenantTwo;
default:
return THEMES.default;
}
}
С этого момента это просто пример стилизации вашего приложения с использованием переменных в вашей теме, а не жестких кодирующих цветов.Вот почему я перешел на styled-components
Пример:
const Button = ({
className,
type,
onClick,
disabled,
active,
children,
}) => (
<button
disabled={ disabled }
className={ `${ className } ${ active ? 'active' : '' }` }
type={ type }
onClick={ (e) => onClick(e) }
>
<span className="content">
{ children }
</span>
</button>
);
const StyledButton = styled(Button)`
border-color: ${ (props) => props.theme.primaryOne };;
background: ${ (props) => props.theme.primaryOne };;
color: ${ (props) => props.theme.baseSix };
`;
Теперь приложение будет загружать правильный объект темы для каждого арендатора, тогда каждый компонент будет стилизован с использованием соответствующих цветов и т. Д.потому что все они полагаются на переменные, переданные им из темы.