@applicaster/zapp-react-native-ui-components
Version:
Applicaster Zapp React Native ui components for the Quick Brick App
254 lines (221 loc) • 5.7 kB
text/typescript
import { identity, isNil } from "ramda";
import {
POSITION_OVER_IMAGE,
DISPLAY_MODE_DYNAMIC,
DISPLAY_MODE_FIXED,
VISIBILITY_ALWAYS,
VISIBILITY_DEFAULT,
VISIBILITY_FOCUSED,
IMAGE_POSITION,
IMAGE_SIZING_FIT,
IMAGE_SIZING_FILL,
FIT_POSITION,
} from "@applicaster/zapp-react-native-utils/manifestUtils/secondaryImage";
import { ImageStyle } from "react-native";
const SECONDARY_IMAGE_PREFIX = "secondary_image";
type ImageSizing = typeof IMAGE_SIZING_FIT | typeof IMAGE_SIZING_FILL;
type ImagePosition = (typeof IMAGE_POSITION)[keyof typeof IMAGE_POSITION];
export type DisplayMode =
| typeof DISPLAY_MODE_FIXED
| typeof DISPLAY_MODE_DYNAMIC;
export enum SecondaryImageStyleKeys {
ENABLE = "switch",
IMAGE_KEY = "image_key",
VISIBILITY = "visibility",
DISPLAY_MODE = "display_mode",
FIXED_HEIGHT = "fixed_height",
FIXED_WIDTH = "fixed_width",
IMAGE_SIZING = "image_sizing",
FIT_POSITION = "fit_position",
DYNAMIC_WIDTH = "dynamic_width",
POSITION = "position",
ALIGN = "align",
IMAGE_POSITION = "image_position",
CORNER_RADIUS = "corner_radius",
MARGIN_TOP = "margin_top",
MARGIN_BOTTOM = "margin_bottom",
MARGIN_LEFT = "margin_left",
MARGIN_RIGHT = "margin_right",
}
export const getSecondaryImageStylesFor =
(value) =>
(key: SecondaryImageStyleKeys, transformFn = identity) =>
transformFn(value(`${SECONDARY_IMAGE_PREFIX}_${key}`));
export const isPositionOverImage = (position: string): boolean =>
position === POSITION_OVER_IMAGE;
export const isDisplayModeFixed = (displayMode: DisplayMode): boolean =>
displayMode === DISPLAY_MODE_FIXED;
export const isImageSizingFit = (imageSizing: ImageSizing): boolean =>
imageSizing === IMAGE_SIZING_FIT;
export const toSize = ({
displayMode,
fixedWidth,
fixedHeight,
dynamicWidth,
}): { width: number; height: Option<number> } => {
if (isDisplayModeFixed(displayMode)) {
return { width: fixedWidth, height: fixedHeight };
}
return { width: dynamicWidth, height: undefined };
};
export const isVisible = (visibility, state): boolean => {
if (isNil(visibility)) {
// for mobile cells we don't have visibilty into configuration and assume is is === always
return true;
}
if (VISIBILITY_ALWAYS === visibility) {
return true;
}
if (VISIBILITY_DEFAULT === visibility && state === "default") {
return true;
}
if (VISIBILITY_FOCUSED === visibility && state.includes("focused")) {
return true;
}
return false;
};
export const getImageContainerStyles = (imagePosition: ImagePosition) => {
const position = {
position: "absolute",
};
if (imagePosition === IMAGE_POSITION.TOP_LEFT) {
return {
...position,
top: 0,
left: 0,
};
}
if (imagePosition === IMAGE_POSITION.TOP_RIGHT) {
return {
...position,
top: 0,
right: 0,
};
}
if (imagePosition === IMAGE_POSITION.BOTTOM_LEFT) {
return {
...position,
bottom: 0,
left: 0,
};
}
if (imagePosition === IMAGE_POSITION.BOTTOM_RIGHT) {
return {
...position,
bottom: 0,
right: 0,
};
}
if (imagePosition === IMAGE_POSITION.CENTER) {
return {
...position,
top: 0,
right: 0,
bottom: 0,
left: 0,
alignItems: "center",
justifyContent: "center",
};
}
return {};
};
const calculateImageSize = ({
imageDimension,
containerWidth,
containerHeight,
}) => {
const imageWidth = imageDimension.width;
const imageHeight = imageDimension.height;
const imageAspectRatio = imageWidth / imageHeight;
const containerAspectRatio = containerWidth / containerHeight;
const calculatedImageWidth =
imageAspectRatio > containerAspectRatio
? containerWidth
: containerHeight * imageAspectRatio;
const calculatedImageHeight =
imageAspectRatio > containerAspectRatio
? containerWidth / imageAspectRatio
: containerHeight;
return { width: calculatedImageWidth, height: calculatedImageHeight };
};
export const getStyle = ({
imageSizing,
fitPosition,
displayMode,
imageDimension,
containerWidth,
containerHeight,
}): ImageStyle => {
if (!isImageSizingFit(imageSizing)) {
return {
width: containerWidth,
height: containerHeight,
};
}
const imageSize = calculateImageSize({
imageDimension,
containerWidth,
containerHeight,
});
if (!isDisplayModeFixed(displayMode)) {
return imageSize;
}
switch (fitPosition) {
case FIT_POSITION.BOTTOM_RIGHT:
return {
position: "absolute",
bottom: 0,
right: 0,
...imageSize,
};
case FIT_POSITION.BOTTOM_CENTER:
return {
position: "absolute",
bottom: 0,
...imageSize,
alignSelf: "center",
};
case FIT_POSITION.BOTTOM_LEFT:
return {
position: "absolute",
bottom: 0,
left: 0,
...imageSize,
};
case FIT_POSITION.TOP_RIGHT:
return {
position: "absolute",
top: 0,
right: 0,
...imageSize,
};
case FIT_POSITION.TOP_CENTER:
return {
position: "absolute",
top: 0,
...imageSize,
alignSelf: "center",
};
case FIT_POSITION.TOP_LEFT:
return {
position: "absolute",
top: 0,
left: 0,
...imageSize,
};
case FIT_POSITION.CENTER_RIGHT:
return {
position: "absolute",
right: 0,
...imageSize,
};
case FIT_POSITION.CENTER_LEFT:
return {
position: "absolute",
left: 0,
...imageSize,
};
default:
return imageSize;
}
};