123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- import ReducerRegistry from '../base/redux/ReducerRegistry';
- import { type Image } from '../virtual-background/constants';
-
- import {
- SET_DYNAMIC_BRANDING_DATA,
- SET_DYNAMIC_BRANDING_FAILED,
- SET_DYNAMIC_BRANDING_READY,
- UNSET_DYNAMIC_BRANDING
- } from './actionTypes';
-
-
- /**
- * The name of the redux store/state property which is the root of the redux
- * state of the feature {@code dynamic-branding}.
- */
- const STORE_NAME = 'features/dynamic-branding';
-
- const DEFAULT_STATE = {
-
- /**
- * The pool of avatar backgrounds.
- *
- * @public
- * @type {Array<string>}
- */
- avatarBackgrounds: [],
-
- /**
- * The custom background color for the LargeVideo.
- *
- * @public
- * @type {string}
- */
- backgroundColor: '',
-
- /**
- * The custom background image used on the LargeVideo.
- *
- * @public
- * @type {string}
- */
- backgroundImageUrl: '',
-
- /**
- * Flag indicating that the branding data can be displayed.
- * This is used in order to avoid image flickering / text changing(blipping).
- *
- * @public
- * @type {boolean}
- */
- customizationReady: false,
-
- /**
- * Flag indicating that the dynamic branding data request has failed.
- * When the request fails there is no logo (JitsiWatermark) displayed.
- *
- * @public
- * @type {boolean}
- */
- customizationFailed: false,
-
- /**
- * Flag indicating that the dynamic branding has not been modified and should use
- * the default options.
- *
- * @public
- * @type {boolean}
- */
- defaultBranding: true,
-
- /**
- * Url for a custom page for DID numbers list.
- *
- * @public
- * @type {string}
- */
- didPageUrl: '',
-
- /**
- * The custom invite domain.
- *
- * @public
- * @type {string}
- */
- inviteDomain: '',
-
- /**
- * An object containing the mapping between the language and url where the translation
- * bundle is hosted.
- *
- * @public
- * @type {Object}
- */
- labels: null,
-
- /**
- * The custom url used when the user clicks the logo.
- *
- * @public
- * @type {string}
- */
- logoClickUrl: '',
-
- /**
- * The custom logo (JitisWatermark).
- *
- * @public
- * @type {string}
- */
- logoImageUrl: '',
-
- /**
- * The generated MUI branded theme based on the custom theme json.
- *
- * @public
- * @type {boolean}
- */
- muiBrandedTheme: undefined,
-
- /**
- * The lobby/prejoin background.
- *
- * @public
- * @type {string}
- */
- premeetingBackground: '',
-
- /**
- * Flag used to signal if the app should use a custom logo or not.
- *
- * @public
- * @type {boolean}
- */
- useDynamicBrandingData: false,
-
- /**
- * An array of images to be used as virtual backgrounds instead of the default ones.
- *
- * @public
- * @type {Array<Object>}
- */
- virtualBackgrounds: []
- };
-
- export interface IDynamicBrandingState {
- avatarBackgrounds: string[];
- backgroundColor: string;
- backgroundImageUrl: string;
- brandedIcons?: Record<string, string>;
- customizationFailed: boolean;
- customizationReady: boolean;
- defaultBranding: boolean;
- didPageUrl: string;
- inviteDomain: string;
- labels: Object | null;
- logoClickUrl: string;
- logoImageUrl: string;
- muiBrandedTheme?: boolean;
- premeetingBackground: string;
- sharedVideoAllowedURLDomains?: Array<string>;
- showGiphyIntegration?: boolean;
- supportUrl?: string;
- useDynamicBrandingData: boolean;
- virtualBackgrounds: Array<Image>;
- }
-
- /**
- * Reduces redux actions for the purposes of the feature {@code dynamic-branding}.
- */
- ReducerRegistry.register<IDynamicBrandingState>(STORE_NAME, (state = DEFAULT_STATE, action): IDynamicBrandingState => {
- switch (action.type) {
- case SET_DYNAMIC_BRANDING_DATA: {
- const {
- avatarBackgrounds,
- backgroundColor,
- backgroundImageUrl,
- brandedIcons,
- defaultBranding,
- didPageUrl,
- inviteDomain,
- labels,
- logoClickUrl,
- logoImageUrl,
- muiBrandedTheme,
- premeetingBackground,
- sharedVideoAllowedURLDomains,
- showGiphyIntegration,
- supportUrl,
- virtualBackgrounds
- } = action.value;
-
- return {
- avatarBackgrounds,
- backgroundColor,
- backgroundImageUrl,
- brandedIcons,
- defaultBranding,
- didPageUrl,
- inviteDomain,
- labels,
- logoClickUrl,
- logoImageUrl,
- muiBrandedTheme,
- premeetingBackground,
- sharedVideoAllowedURLDomains,
- showGiphyIntegration,
- supportUrl,
- customizationFailed: false,
- customizationReady: true,
- useDynamicBrandingData: true,
- virtualBackgrounds: formatImages(virtualBackgrounds || [])
- };
- }
- case SET_DYNAMIC_BRANDING_FAILED: {
- return {
- ...state,
- customizationReady: true,
- customizationFailed: true,
- useDynamicBrandingData: true
- };
- }
- case SET_DYNAMIC_BRANDING_READY:
- return {
- ...state,
- customizationReady: true
- };
-
- case UNSET_DYNAMIC_BRANDING:
- return DEFAULT_STATE;
- }
-
- return state;
- });
-
- /**
- * Transforms the branding images into an array of Images objects ready
- * to be used as virtual backgrounds.
- *
- * @param {Array<string>} images - The branding images.
- * @private
- * @returns {{Props}}
- */
- function formatImages(images: Array<string> | Array<{ src: string; tooltip?: string; }>): Array<Image> {
- return images.map((img, i) => {
- let src;
- let tooltip;
-
- if (typeof img === 'object') {
- ({ src, tooltip } = img);
- } else {
- src = img;
- }
-
- return {
- id: `branding-${i}`,
- src,
- tooltip
- };
- });
- }
|