import { THEME_SET, THEME_GENERATE, } from '../actions/theme'; import { Map as ImmutableMap } from 'immutable'; import { brightness, hue, convert } from 'chromatism'; const initialState = ImmutableMap(); const cssrgba = (color, a) => { const { r, g, b } = convert(color).rgb; return `rgba(${[r, g, b, a].join(',')})`; }; export const generateTheme = (brandColor, mode) => { return ImmutableMap({ 'brand-color': brandColor, 'accent-color': brightness(10, hue(-3, brandColor).hex).hex, 'brand-color-faint': cssrgba(brandColor, 0.1), 'highlight-text-color': brandColor, }); }; export const setTheme = themeData => { const { 'brand-color': brandColor } = themeData.toObject(); return ImmutableMap(generateTheme(brandColor, 'light')).merge(themeData); }; export default function theme(state = initialState, action) { switch(action.type) { case THEME_GENERATE: return generateTheme(action.brandColor, action.mode); case THEME_SET: return setTheme(ImmutableMap(action.brandColor)); default: return state; } };