From 0b4f4eec8e79092db911e01076dfb2a2f4011bdb Mon Sep 17 00:00:00 2001 From: Test User Date: Tue, 3 Aug 2021 03:14:03 -0700 Subject: [PATCH] chore: update Dimensions API Flow types (#31898) Summary: This small PR updates the Flow types used in Dimensions. The following changes has been made: * generic types has been replaced with types from `NativeDeviceInfo` (which already were used in event subscription update) * ~simplification of `DisplayMetricsAndroid` by spreading via intersection with `DisplayMetrics` type and removing shared properties~ > I have tried both notations, but according to the lint, it looks like a Native Modules typing limitation which requires redundancy / code duplication in cases like this. ## Changelog [Internal] [Changed] - update Dimensions API Flow types Pull Request resolved: https://github.com/facebook/react-native/pull/31898 Test Plan: Running `yarn flow` in the workspace yields no errors. Reviewed By: yungsters Differential Revision: D29932940 Pulled By: GijsWeterings fbshipit-source-id: bf97bb972964c585207e2450ccf71d932555e291 --- Libraries/Utilities/Dimensions.js | 21 ++++++++------------- Libraries/Utilities/NativeDeviceInfo.js | 2 +- Libraries/Utilities/useWindowDimensions.js | 9 +++++++-- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Libraries/Utilities/Dimensions.js b/Libraries/Utilities/Dimensions.js index d0a5d7092fc..f295e0fea25 100644 --- a/Libraries/Utilities/Dimensions.js +++ b/Libraries/Utilities/Dimensions.js @@ -14,21 +14,16 @@ import EventEmitter, { import RCTDeviceEventEmitter from '../EventEmitter/RCTDeviceEventEmitter'; import NativeDeviceInfo, { type DisplayMetrics, + type DisplayMetricsAndroid, type DimensionsPayload, } from './NativeDeviceInfo'; import invariant from 'invariant'; -type DimensionsValue = { - window?: DisplayMetrics, - screen?: DisplayMetrics, - ... -}; - const eventEmitter = new EventEmitter<{ - change: [DimensionsValue], + change: [DimensionsPayload], }>(); let dimensionsInitialized = false; -let dimensions: DimensionsValue; +let dimensions: DimensionsPayload; class Dimensions { /** @@ -46,9 +41,9 @@ class Dimensions { * Example: `const {height, width} = Dimensions.get('window');` * * @param {string} dim Name of dimension as defined when calling `set`. - * @returns {Object?} Value for the dimension. + * @returns {DisplayMetrics? | DisplayMetricsAndroid?} Value for the dimension. */ - static get(dim: string): Object { + static get(dim: string): DisplayMetrics | DisplayMetricsAndroid { invariant(dimensions[dim], 'No dimension set for key ' + dim); return dimensions[dim]; } @@ -57,9 +52,9 @@ class Dimensions { * This should only be called from native code by sending the * didUpdateDimensions event. * - * @param {object} dims Simple string-keyed object of dimensions to set + * @param {DimensionsPayload} dims Simple string-keyed object of dimensions to set */ - static set(dims: $ReadOnly<{[key: string]: any, ...}>): void { + static set(dims: $ReadOnly): void { // We calculate the window dimensions in JS so that we don't encounter loss of // precision in transferring the dimensions (which could be non-integers) over // the bridge. @@ -128,7 +123,7 @@ class Dimensions { } } -let initialDims: ?$ReadOnly<{[key: string]: any, ...}> = +let initialDims: ?$ReadOnly = global.nativeExtensions && global.nativeExtensions.DeviceInfo && global.nativeExtensions.DeviceInfo.Dimensions; diff --git a/Libraries/Utilities/NativeDeviceInfo.js b/Libraries/Utilities/NativeDeviceInfo.js index 854fc966b9f..16c72c69544 100644 --- a/Libraries/Utilities/NativeDeviceInfo.js +++ b/Libraries/Utilities/NativeDeviceInfo.js @@ -11,7 +11,7 @@ import type {TurboModule} from '../TurboModule/RCTExport'; import * as TurboModuleRegistry from '../TurboModule/TurboModuleRegistry'; -type DisplayMetricsAndroid = {| +export type DisplayMetricsAndroid = {| width: number, height: number, scale: number, diff --git a/Libraries/Utilities/useWindowDimensions.js b/Libraries/Utilities/useWindowDimensions.js index 7278a9b7479..18ca4a44201 100644 --- a/Libraries/Utilities/useWindowDimensions.js +++ b/Libraries/Utilities/useWindowDimensions.js @@ -9,10 +9,15 @@ */ import Dimensions from './Dimensions'; -import {type DisplayMetrics} from './NativeDeviceInfo'; +import { + type DisplayMetrics, + type DisplayMetricsAndroid, +} from './NativeDeviceInfo'; import {useEffect, useState} from 'react'; -export default function useWindowDimensions(): DisplayMetrics { +export default function useWindowDimensions(): + | DisplayMetrics + | DisplayMetricsAndroid { const [dimensions, setDimensions] = useState(() => Dimensions.get('window')); useEffect(() => { function handleChange({window}) {