No Description

index.tsx 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import * as React from 'react';
  2. import { StyleSheet, View, ViewProps } from 'react-native';
  3. import { EdgeInsets as EdgeInsetsT, InsetChangedEvent } from './SafeArea.types';
  4. import NativeSafeAreaView from './NativeSafeAreaView';
  5. export { default as initialWindowSafeAreaInsets } from './InitialWindowSafeAreaInsets';
  6. export const SafeAreaContext = React.createContext<EdgeInsetsT | null>(null);
  7. export interface SafeAreaViewProps {
  8. children?: React.ReactNode;
  9. initialSafeAreaInsets?: EdgeInsetsT | null;
  10. }
  11. export function SafeAreaProvider({
  12. children,
  13. initialSafeAreaInsets,
  14. }: SafeAreaViewProps) {
  15. const parentInsets = useParentSafeArea();
  16. const [insets, setInsets] = React.useState<EdgeInsetsT | null | undefined>(
  17. initialSafeAreaInsets || parentInsets,
  18. );
  19. const onInsetsChange = React.useCallback((event: InsetChangedEvent) => {
  20. setInsets(event.nativeEvent.insets);
  21. }, []);
  22. return (
  23. <NativeSafeAreaView style={styles.fill} onInsetsChange={onInsetsChange}>
  24. {insets != null ? (
  25. <SafeAreaContext.Provider value={insets}>
  26. {children}
  27. </SafeAreaContext.Provider>
  28. ) : null}
  29. </NativeSafeAreaView>
  30. );
  31. }
  32. const styles = StyleSheet.create({
  33. fill: { flex: 1 },
  34. });
  35. export const SafeAreaConsumer = SafeAreaContext.Consumer;
  36. function useParentSafeArea(): React.ContextType<typeof SafeAreaContext> {
  37. return React.useContext(SafeAreaContext);
  38. }
  39. export function useSafeArea(): EdgeInsetsT {
  40. const safeArea = React.useContext(SafeAreaContext);
  41. if (safeArea == null) {
  42. throw new Error(
  43. 'No safe area value available. Make sure you are rendering `<SafeAreaProvider>` at the top of your app.',
  44. );
  45. }
  46. return safeArea;
  47. }
  48. export function SafeAreaView({
  49. style,
  50. ...rest
  51. }: ViewProps & { children: React.ReactNode }) {
  52. const insets = useSafeArea();
  53. return (
  54. <View
  55. style={[
  56. {
  57. paddingTop: insets.top,
  58. paddingRight: insets.right,
  59. paddingBottom: insets.bottom,
  60. paddingLeft: insets.left,
  61. },
  62. style,
  63. ]}
  64. {...rest}
  65. />
  66. );
  67. }
  68. export type EdgeInsets = EdgeInsetsT;