index.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import {
  2. Fragment,
  3. type FC
  4. } from "react";
  5. import {
  6. ScrollView,
  7. View
  8. } from "react-native";
  9. import type IPageContainerProps from "./type";
  10. import stylesheet from "./stylesheet";
  11. import {
  12. NCoreUIKitTheme
  13. } from "../../core/hooks";
  14. import {
  15. SafeAreaView
  16. } from "react-native-safe-area-context";
  17. const PageContainer: FC<IPageContainerProps> = ({
  18. backgroundColor = "default" as keyof NCoreUIKit.ContainerContentColors,
  19. isWrapSafeareaContext = false,
  20. isWorkWithHeaderSpace = true,
  21. safeAreaViewBackgroundColor,
  22. isCustomPadding = false,
  23. isScrollable = false,
  24. safeAreaViewStyle,
  25. scrollViewStyle,
  26. scrollViewProps,
  27. renderOverlays,
  28. customTheme,
  29. children,
  30. style,
  31. ...props
  32. }) => {
  33. const {
  34. configs,
  35. colors,
  36. spaces
  37. } = NCoreUIKitTheme.useContext(customTheme);
  38. const renderScrollview = () => {
  39. if(style) {
  40. console.error("Hey!. You make wrong things. If you must be use isScrollable={true}, you must be use scrollViewStyle. Do not use style prop for this case.");
  41. }
  42. if(Object.keys(props).length) {
  43. console.error("Hey!. You make wrong things. If you must be use isScrollable={true}, you must be use scrollViewProps. Do not use default view props for this case.");
  44. }
  45. return <ScrollView
  46. keyboardShouldPersistTaps="handled"
  47. {...scrollViewProps}
  48. contentContainerStyle={[
  49. stylesheet.contentContainer,
  50. isCustomPadding ? null : {
  51. padding: spaces.spacingMd,
  52. paddingTop: spaces.spacingMd + (isWorkWithHeaderSpace ? configs.headerSpace : 0)
  53. },
  54. scrollViewProps?.contentContainerStyle
  55. ]}
  56. style={[
  57. {
  58. backgroundColor: colors.content.container[backgroundColor]
  59. },
  60. stylesheet.container,
  61. scrollViewStyle
  62. ]}
  63. >
  64. {children}
  65. </ScrollView>;
  66. };
  67. const renderView = () => {
  68. if(scrollViewStyle) {
  69. console.error("Hey!. You make wrong things. If you must be use isScrollable={false}, you must be use style. Do not use scrollViewStyle prop for this case.");
  70. }
  71. if(scrollViewProps) {
  72. console.error("Hey!. You make wrong things. If you must be use isScrollable={false}, you musn't use scrollViewProps.");
  73. }
  74. return <View
  75. {...props}
  76. style={[
  77. stylesheet.contentContainer,
  78. {
  79. backgroundColor: colors.content.container[backgroundColor]
  80. },
  81. isCustomPadding ? null : {
  82. padding: spaces.spacingMd,
  83. paddingTop: spaces.spacingMd + (isWorkWithHeaderSpace ? configs.headerSpace : 0)
  84. },
  85. stylesheet.container,
  86. style
  87. ]}
  88. >
  89. {children}
  90. </View>;
  91. };
  92. const renderWithSafeareaView = () => {
  93. return <SafeAreaView
  94. style={[
  95. safeAreaViewStyle,
  96. {
  97. backgroundColor: safeAreaViewBackgroundColor ? colors.content.container[safeAreaViewBackgroundColor] : colors.content.container[backgroundColor]
  98. },
  99. stylesheet.safeAreaViewContainer
  100. ]}
  101. >
  102. {isScrollable ? renderScrollview() : renderView()}
  103. {renderOverlays ? renderOverlays() : null}
  104. </SafeAreaView>;
  105. };
  106. const renderWithoutSafeareaView = () => {
  107. return isScrollable ? renderScrollview() : renderView();
  108. };
  109. const renderSafeareaContext = () => {
  110. return isWrapSafeareaContext ? renderWithSafeareaView() : <Fragment>
  111. {renderWithoutSafeareaView()}
  112. {renderOverlays ? renderOverlays() : null}
  113. </Fragment>;
  114. };
  115. return renderSafeareaContext();
  116. };
  117. export default PageContainer;