123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- /* @flow */
-
- import { Platform } from '../react';
-
- import { ColorPalette } from './components';
-
- declare type StyleSheet = Object;
-
- /**
- * The list of the well-known style properties which may not be numbers on Web
- * but must be numbers on React Native.
- *
- * @private
- */
- const _WELL_KNOWN_NUMBER_PROPERTIES = [ 'height', 'width' ];
-
- /* eslint-disable flowtype/space-before-type-colon */
-
- /**
- * Create a style sheet using the provided style definitions.
- *
- * @param {StyleSheet} styles - A dictionary of named style definitions.
- * @param {StyleSheet} [overrides={}] - Optional set of additional (often
- * platform-dependent/specific) style definitions that will override the base
- * (often platform-independent) styles.
- * @returns {StyleSheet}
- */
- export function createStyleSheet(styles: StyleSheet, overrides: StyleSheet = {})
- : StyleSheet {
-
- /* eslint-enable flowtype/space-before-type-colon */
-
- const combinedStyles = {};
-
- for (const k of Object.keys(styles)) {
- combinedStyles[k]
- = _shimStyles({
- ...styles[k],
- ...overrides[k]
- });
- }
-
- return combinedStyles;
- }
-
- /**
- * Works around a bug in react-native or react-native-webrtc on Android which
- * causes Views overlaying RTCView to be clipped. Even though we (may) display
- * multiple RTCViews, it is enough to apply the fix only to a View with a
- * bounding rectangle containing all RTCviews and their overlaying Views.
- *
- * @param {StyleSheet} styles - An object which represents a stylesheet.
- * @public
- * @returns {StyleSheet}
- */
- export function fixAndroidViewClipping<T: StyleSheet>(styles: T): T {
- if (Platform.OS === 'android') {
- styles.borderColor = ColorPalette.appBackground;
- styles.borderWidth = 1;
- }
-
- return styles;
- }
-
- /**
- * Shims style properties to work correctly on native. Allows us to minimize the
- * number of style declarations that need to be set or overridden for specific
- * platforms.
- *
- * @param {StyleSheet} styles - An object which represents a stylesheet.
- * @private
- * @returns {StyleSheet}
- */
- function _shimStyles<T: StyleSheet>(styles: T): T {
- // Certain style properties may not be numbers on Web but must be numbers on
- // React Native. For example, height and width may be expressed in percent
- // on Web but React Native will not understand them and we will get errors
- // (at least during development). Convert such well-known properties to
- // numbers if possible; otherwise, remove them to avoid runtime errors.
- for (const k of _WELL_KNOWN_NUMBER_PROPERTIES) {
- const v = styles[k];
- const typeofV = typeof v;
-
- if (typeofV !== 'undefined' && typeofV !== 'number') {
- const numberV = Number(v);
-
- if (Number.isNaN(numberV)) {
- delete styles[k];
- } else {
- styles[k] = numberV;
- }
- }
- }
-
- return styles;
- }
|