Advertisement
Guest User

Untitled

a guest
May 20th, 2019
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import React, { ReactNode } from 'react'
  2. import { View, ViewProps, ViewStyle, FlexAlignType, StyleSheet } from 'react-native';
  3. import { Spacing } from '../theme';
  4. import EStyleSheet from 'react-native-extended-stylesheet'
  5.  
  6. export interface BoxProps extends ViewProps {
  7.     children: ReactNode,
  8.     padding?: keyof typeof Spacing,
  9.     paddingBottom?: keyof typeof Spacing,
  10.     paddingEnd?: keyof typeof Spacing,
  11.     paddingHorizontal?: keyof typeof Spacing,
  12.     paddingLeft?: keyof typeof Spacing,
  13.     paddingRight?: keyof typeof Spacing,
  14.     paddingStart?: keyof typeof Spacing,
  15.     paddingTop?: keyof typeof Spacing,
  16.     paddingVertical?: keyof typeof Spacing,
  17.     margin?: keyof typeof Spacing,
  18.     marginBottom?: keyof typeof Spacing,
  19.     marginEnd?: keyof typeof Spacing,
  20.     marginHorizontal?: keyof typeof Spacing,
  21.     marginLeft?: keyof typeof Spacing,
  22.     marginRight?: keyof typeof Spacing,
  23.     marginStart?: keyof typeof Spacing,
  24.     marginTop?: keyof typeof Spacing,
  25.     marginVertical?: keyof typeof Spacing,
  26.     style?: ViewStyle
  27. }
  28.  
  29. export interface FlexComponentProps extends BoxProps {
  30.     alignContent?: "flex-start" | "flex-end" | "center" | "stretch" | "space-between" | "space-around";
  31.     alignItems?: FlexAlignType;
  32.     alignSelf?: "auto" | FlexAlignType;
  33.     flex?: number;
  34.     flexBasis?: number | string;
  35.     flexDirection?: "row" | "column" | "row-reverse" | "column-reverse";
  36.     flexGrow?: number;
  37.     flexShrink?: number;
  38.     flexWrap?: "wrap" | "nowrap" | "wrap-reverse";
  39.     justifyContent?: "flex-start" | "flex-end" | "center" | "space-between" | "space-around" | "space-evenly";
  40. }
  41.  
  42. function pick<T extends { [key: string]: any }>(object: T) {
  43.     return function <K extends keyof T>(key: K) {
  44.         return object[key]
  45.     }
  46. }
  47.  
  48. const pickSpacing = pick(Spacing)
  49.  
  50. export default function Box(props: BoxProps) {
  51.     const {
  52.         children,
  53.         style: overrideStyle,
  54.         padding,
  55.         paddingBottom,
  56.         paddingEnd,
  57.         paddingHorizontal,
  58.         paddingLeft,
  59.         paddingRight,
  60.         paddingStart,
  61.         paddingTop,
  62.         paddingVertical,
  63.         margin,
  64.         marginBottom,
  65.         marginEnd,
  66.         marginHorizontal,
  67.         marginLeft,
  68.         marginRight,
  69.         marginStart,
  70.         marginTop,
  71.         marginVertical,
  72.         ...rest
  73.     } = props
  74.  
  75.     const style = createStyle(props)
  76.  
  77.     return (
  78.         <View style={[style, overrideStyle]} {...rest}>
  79.             {children}
  80.         </View>
  81.     )
  82. }
  83.  
  84. const createStyle = props => {
  85.     const {
  86.         padding,
  87.         paddingBottom,
  88.         paddingEnd,
  89.         paddingHorizontal,
  90.         paddingLeft,
  91.         paddingRight,
  92.         paddingStart,
  93.         paddingTop,
  94.         paddingVertical,
  95.         margin,
  96.         marginBottom,
  97.         marginEnd,
  98.         marginHorizontal,
  99.         marginLeft,
  100.         marginRight,
  101.         marginStart,
  102.         marginTop,
  103.         marginVertical,
  104.     } = props
  105.  
  106.     const { style } = EStyleSheet.create({
  107.         style: {
  108.             padding: pickSpacing(padding),
  109.             paddingBottom: pickSpacing(paddingBottom),
  110.             paddingEnd: pickSpacing(paddingEnd),
  111.             paddingHorizontal: pickSpacing(paddingHorizontal),
  112.             paddingLeft: pickSpacing(paddingLeft),
  113.             paddingRight: pickSpacing(paddingRight),
  114.             paddingStart: pickSpacing(paddingStart),
  115.             paddingTop: pickSpacing(paddingTop),
  116.             paddingVertical: pickSpacing(paddingVertical),
  117.             margin: pickSpacing(margin),
  118.             marginBottom: pickSpacing(marginBottom),
  119.             marginEnd: pickSpacing(marginEnd),
  120.             marginHorizontal: pickSpacing(marginHorizontal),
  121.             marginLeft: pickSpacing(marginLeft),
  122.             marginRight: pickSpacing(marginRight),
  123.             marginStart: pickSpacing(marginStart),
  124.             marginTop: pickSpacing(marginTop),
  125.             marginVertical: pickSpacing(marginVertical),
  126.         }
  127.     })
  128.  
  129.     return style
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement