From 1930497368d425a8791a1ca738fc8e8029b6772c Mon Sep 17 00:00:00 2001 From: Antoine Cottineau Date: Fri, 28 Apr 2023 16:10:49 +0200 Subject: [PATCH] feat: allow web's SafeAreaView to forward ref --- src/SafeArea.types.ts | 3 ++ src/SafeAreaView.tsx | 4 +- src/SafeAreaView.web.tsx | 111 +++++++++++++++++++-------------------- 3 files changed, 59 insertions(+), 59 deletions(-) diff --git a/src/SafeArea.types.ts b/src/SafeArea.types.ts index 6def7b2c..03386aec 100644 --- a/src/SafeArea.types.ts +++ b/src/SafeArea.types.ts @@ -1,5 +1,6 @@ import type * as React from 'react'; import type { NativeSyntheticEvent, ViewProps } from 'react-native'; +import NativeSafeAreaView from './specs/NativeSafeAreaView'; export type Edge = 'top' | 'right' | 'bottom' | 'left'; @@ -36,3 +37,5 @@ export interface NativeSafeAreaViewProps extends ViewProps { mode?: 'padding' | 'margin'; edges?: ReadonlyArray; } + +export type NativeSafeAreaViewInstance = InstanceType; diff --git a/src/SafeAreaView.tsx b/src/SafeAreaView.tsx index 1ac620de..fb226419 100644 --- a/src/SafeAreaView.tsx +++ b/src/SafeAreaView.tsx @@ -1,9 +1,7 @@ import * as React from 'react'; -import type { NativeSafeAreaViewProps } from './SafeArea.types'; +import type { NativeSafeAreaViewInstance, NativeSafeAreaViewProps } from './SafeArea.types'; import NativeSafeAreaView from './specs/NativeSafeAreaView'; -type NativeSafeAreaViewInstance = InstanceType; - export type SafeAreaViewProps = NativeSafeAreaViewProps; export const SafeAreaView: React.ForwardRefExoticComponent< diff --git a/src/SafeAreaView.web.tsx b/src/SafeAreaView.web.tsx index 37f44bb2..8f78f8b3 100644 --- a/src/SafeAreaView.web.tsx +++ b/src/SafeAreaView.web.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { View, StyleSheet } from 'react-native'; import { useSafeAreaInsets } from './SafeAreaContext'; -import type { Edge, NativeSafeAreaViewProps } from './SafeArea.types'; +import type { Edge, NativeSafeAreaViewInstance, NativeSafeAreaViewProps } from './SafeArea.types'; // prettier-ignore const TOP = 0b1000, @@ -19,67 +19,66 @@ const edgeBitmaskMap: Record = { left: LEFT, }; -export function SafeAreaView({ - style = {}, - mode, - edges, - ...rest -}: NativeSafeAreaViewProps) { - const insets = useSafeAreaInsets(); +export const SafeAreaView: React.ForwardRefExoticComponent< +NativeSafeAreaViewProps & React.RefAttributes +> = React.forwardRef( + ({ style = {}, mode, edges, ...rest }, ref) => { + const insets = useSafeAreaInsets(); - const edgeBitmask = - edges != null - ? edges.reduce((accum, edge) => accum | edgeBitmaskMap[edge], 0) - : ALL; + const edgeBitmask = + edges != null + ? edges.reduce((accum, edge) => accum | edgeBitmaskMap[edge], 0) + : ALL; - const appliedStyle = React.useMemo(() => { - const insetTop = edgeBitmask & TOP ? insets.top : 0; - const insetRight = edgeBitmask & RIGHT ? insets.right : 0; - const insetBottom = edgeBitmask & BOTTOM ? insets.bottom : 0; - const insetLeft = edgeBitmask & LEFT ? insets.left : 0; + const appliedStyle = React.useMemo(() => { + const insetTop = edgeBitmask & TOP ? insets.top : 0; + const insetRight = edgeBitmask & RIGHT ? insets.right : 0; + const insetBottom = edgeBitmask & BOTTOM ? insets.bottom : 0; + const insetLeft = edgeBitmask & LEFT ? insets.left : 0; - const flatStyle = StyleSheet.flatten(style) as Record; + const flatStyle = StyleSheet.flatten(style) as Record; - if (mode === 'margin') { - const { - margin = 0, - marginVertical = margin, - marginHorizontal = margin, - marginTop = marginVertical, - marginRight = marginHorizontal, - marginBottom = marginVertical, - marginLeft = marginHorizontal, - } = flatStyle; + if (mode === 'margin') { + const { + margin = 0, + marginVertical = margin, + marginHorizontal = margin, + marginTop = marginVertical, + marginRight = marginHorizontal, + marginBottom = marginVertical, + marginLeft = marginHorizontal, + } = flatStyle; - const marginStyle = { - marginTop: marginTop + insetTop, - marginRight: marginRight + insetRight, - marginBottom: marginBottom + insetBottom, - marginLeft: marginLeft + insetLeft, - }; + const marginStyle = { + marginTop: marginTop + insetTop, + marginRight: marginRight + insetRight, + marginBottom: marginBottom + insetBottom, + marginLeft: marginLeft + insetLeft, + }; - return [style, marginStyle]; - } else { - const { - padding = 0, - paddingVertical = padding, - paddingHorizontal = padding, - paddingTop = paddingVertical, - paddingRight = paddingHorizontal, - paddingBottom = paddingVertical, - paddingLeft = paddingHorizontal, - } = flatStyle; + return [style, marginStyle]; + } else { + const { + padding = 0, + paddingVertical = padding, + paddingHorizontal = padding, + paddingTop = paddingVertical, + paddingRight = paddingHorizontal, + paddingBottom = paddingVertical, + paddingLeft = paddingHorizontal, + } = flatStyle; - const paddingStyle = { - paddingTop: paddingTop + insetTop, - paddingRight: paddingRight + insetRight, - paddingBottom: paddingBottom + insetBottom, - paddingLeft: paddingLeft + insetLeft, - }; + const paddingStyle = { + paddingTop: paddingTop + insetTop, + paddingRight: paddingRight + insetRight, + paddingBottom: paddingBottom + insetBottom, + paddingLeft: paddingLeft + insetLeft, + }; - return [style, paddingStyle]; - } - }, [style, insets, mode, edgeBitmask]); + return [style, paddingStyle]; + } + }, [style, insets, mode, edgeBitmask]); - return ; -} + return ; + }, +);