Implementing Predefined Color Themes in loklak Media Wall

Loklak media wall provides predefined color theme buttons which can be used to directly switch to day or night mode. It is important that the colors of the components are updated instantly with a click of a button. To implement pre-defined color options, we should, first, choose a set of color combinations which should be updated on the concerned divisions of the templates. These set of colors should be stored as an object (same interface) and the current state should be updated with this object when another theme is requested. In this blog, I will explain how to implement predefined theme options and how to add a new theme in media wall. Working Media Wall can provide plenty of themes to help the user to choose a theme of their choice. Loklak media wall currently provides two themes, i.e.,  dark and light themes to provide a contrasting variety of themes at first. Ngrx structure makes it easy to add a predefined themes to the media wall. Let’s see how to add a theme to media wall and see it in action. Adding ngrx structure The first task is to create actions which will be dispatched from the Angular components to update the media wall. Depending on the action dispatched, state properties will change and when passed to the template, will update the media wall with the requested theme. There is no need of payload since the color options for all the themes are stored already as a reducer variable which will be updated directly to the media wall state. export class WallLightThemeChangeAction implements Action { type = ActionTypes.WALL_LIGHT_THEME_CHANGE;constructor(public payload: '') { } }export class WallDarkThemeChangeAction implements Action { type = ActionTypes.WALL_DARK_THEME_CHANGE;constructor(public payload: '') { } } Next, we have to update reducer functions for the corresponding actions so that the state properties change according to the actions and wall is updated. For color options, we have an interface defined for color options. For a particular type of theme, we have to adjust interface and just have to update state with the personalised theme state. As the default theme is set to light theme, we have to update state to the initial state when user requests for  light theme case mediaWallCustomAction.ActionTypes.WALL_DARK_THEME_CHANGE: { state = { wallHeader: { backgroundColor: '#243447', fontColor: '#FFFFFF' }, wallBackground: { backgroundColor: '#2C4158' }, wallCard: { fontColor: '#FFFFFF', backgroundColor: '#1B2836', accentColor: '#1c94e0' } } return state; }case mediaWallCustomAction.ActionTypes.WALL_LIGHT_THEME_CHANGE: { state = initialState;return state; } Component and Template Component Now, we need to define an array of the string value of colors corresponding to a particular theme. These corresponding theme colors will be displayed in a form of color picker to the user through looping in the template. Whenever user requests for a particular theme, at first, the variable currentTheme is updated with the theme color. Next, the action is dispatched according to the selected theme from the method installTheme(). export class MediaWallMenuComponent implements OnInit, OnDestroy { . . public currentTheme: string; public themes = [ '#FFFFFF', '#333' ];public…

Continue ReadingImplementing Predefined Color Themes in loklak Media Wall

Adding Color Options in loklak Media Wall

Color options in loklak media wall gives user the ability to set colors for different elements of the media wall. Taking advantage of Angular two-way data binding property and ngrx/store, we can link up the CSS properties of the elements with concerned state properties which stores the user-selected color. This makes color customization fast and reactive for media walls. In this blog here, I am explaining the unidirectional workflow using ngrx for updating various colors and working of color customization. Flow Chart The flowchart below explains how the color as a string is taken as an input from the user and how actions, reducers and component observables link up to change the current CSS property of the font color. Working Designing Models: It is important at first to design model which must contain every CSS color property that can be customized. A single interface for a particular HTML element of media wall can be added so that color customization for a particular element can take at once with faster rendering. Here we have three interfaces: WallHeader WallBackground WallCard These three interfaces are the models for the three core components of the media wall that can be customized. export interface WallHeader { backgroundColor: string; fontColor: string; } export interface WallBackground { backgroundColor: string; } export interface WallCard { fontColor: string; backgroundColor: string; accentColor: string; }   Creating Actions: Next step is to design actions for customization. Here we need to pass the respective interface model as a payload with updated color properties. These actions when dispatched causes reducer to change the respective state property, and hence, the linked CSS color property. export class WallHeaderPropertiesChangeAction implements Action { type = ActionTypes.WALL_HEADER_PROPERTIES_CHANGE;constructor(public payload: WallHeader) { } } export class WallBackgroundPropertiesChangeAction implements Action { type = ActionTypes.WALL_BACKGROUND_PROPERTIES_CHANGE;constructor(public payload: WallBackground) { } } export class WallCardPropertiesChangeAction implements Action { type = ActionTypes.WALL_CARD_PROPERTIES_CHANGE;constructor(public payload: WallCard) { } }   Creating reducers: Now, we can proceed to create reducer functions so as to change the current state property. Moreover, we need to define an initial state which is the default state for uncustomized media wall. Actions can now be linked to update state property using this reducer when dispatched. These state properties serve two purposes: Updating Query params for Direct URL. Updating Media wall Colors case mediaWallCustomAction.ActionTypes.WALL_HEADER_PROPERTIES_CHANGE: { const wallHeader = action.payload;return Object.assign({}, state, { wallHeader }); }case mediaWallCustomAction.ActionTypes.WALL_BACKGROUND_PROPERTIES_CHANGE: { const wallBackground = action.payload;return Object.assign({}, state, { wallBackground }); }case mediaWallCustomAction.ActionTypes.WALL_CARD_PROPERTIES_CHANGE: { const wallCard = action.payload;return Object.assign({}, state, { wallCard }); }   Extracting Data to the component from the store: In ngrx, the central container for states is the store. Store is itself an observable and returns observable related to state properties. We have already defined various states for media wall color options and now we can use selectors to return state observables from the store. These observables can now easily be linked to the CSS of the elements which changes according to customization. private getDataFromStore(): void { this.wallCustomHeader$ = this.store.select(fromRoot.getMediaWallCustomHeader); this.wallCustomCard$ = this.store.select(fromRoot.getMediaWallCustomCard); this.wallCustomBackground$ =…

Continue ReadingAdding Color Options in loklak Media Wall