import { type ViewStyle, type TextStyle, StyleSheet } from "react-native"; import { type TextInputDynamicStyleType, type TextInputTypes, type TextInputType } from "./type"; import type { Mutable } from "../../types"; export const TEXT_INPUT_TYPE_STYLES: Record< TextInputType, TextInputTypes > = { default: { focusBorderColor: "emphasized", borderColor: "emphasized", hintTextIconColor: "mid", placeholderColor: "low", containerColor: "mid", hintTextColor: "mid", titleColor: "high", inputColor: "mid", iconColor: "mid" }, question: { focusBorderColor: "emphasized", borderColor: "emphasized", hintTextIconColor: "mid", placeholderColor: "low", containerColor: "mid", hintTextColor: "mid", titleColor: "mid", inputColor: "mid", iconColor: "mid" }, success: { placeholderColor: "successLow", hintTextIconColor: "success", focusBorderColor: "success", containerColor: "success", hintTextColor: "success", borderColor: "success", titleColor: "success", inputColor: "success", iconColor: "success" }, warning: { placeholderColor: "warningLow", hintTextIconColor: "warning", focusBorderColor: "warning", containerColor: "warning", hintTextColor: "warning", borderColor: "warning", titleColor: "warning", inputColor: "warning", iconColor: "warning" }, danger: { placeholderColor: "dangerLow", hintTextIconColor: "danger", focusBorderColor: "danger", containerColor: "danger", hintTextColor: "danger", borderColor: "danger", titleColor: "danger", inputColor: "danger", iconColor: "danger" }, info: { placeholderColor: "infoLow", hintTextIconColor: "info", focusBorderColor: "info", containerColor: "info", hintTextColor: "info", borderColor: "info", titleColor: "info", inputColor: "info", iconColor: "info" } }; export const getTextInputType = ({ type }: { type: TextInputType; }) => { const currentType = TEXT_INPUT_TYPE_STYLES[type]; return currentType; }; const stylesheet = StyleSheet.create({ input: { backgroundColor: "transparent", textAlignVertical: "center", borderColor: "transparent", paddingBottom: 0, paddingRight: 0, paddingLeft: 0, borderWidth: 0, paddingTop: 0, minHeight: 20, zIndex: 99, flex: 1 }, hideTextIconContainer: { justifyContent: "center", alignItems: "center", alignSelf: "center", display: "flex", zIndex: 99, height: 18 }, cleanButton: { justifyContent: "center", alignItems: "center", alignSelf: "center", display: "flex", zIndex: 99 }, rightIcon: { justifyContent: "center", alignItems: "center", alignSelf: "center", display: "flex", zIndex: 99 }, icon: { justifyContent: "center", alignContent: "center", alignItems: "center", display: "flex", zIndex: 99 }, content: { boxSizing: "border-box", flexDirection: "row", borderStyle: "solid", alignItems: "center", position: "relative", display: "flex", minWidth: 250 }, container: { flexDirection: "column", boxSizing: "border-box", alignSelf: "auto", display: "flex" }, hintText: { flexDirection: "row", alignItems: "center", display: "flex" }, titleContainer: { flexDirection: "row", alignItems: "center" }, overlay: { position: "absolute", zIndex: 98 }, hintTextIcon: { }, required: { }, subTitle: { }, title: { } }); export const useStyles = ({ customBorderColor, spreadBehaviour, inlineSpaces, currentType, customColor, isDisabled, typography, isFocused, radiuses, borders, colors, spaces, type }: TextInputDynamicStyleType) => { const styleType = type === "danger" ? "error" : type === "question" ? "neutral" : type; const styles = { content: { backgroundColor: colors.content.container[currentType.containerColor], borderColor: colors.content.container[currentType.containerColor], paddingBottom: spaces.spacingMd, paddingRight: spaces.spacingMd, borderRadius: radiuses.actions, paddingLeft: spaces.spacingMd, paddingTop: spaces.spacingMd, borderWidth: borders.line } as Mutable, input: { ...typography.labelLargeSize, color: colors.content.text[currentType.inputColor] } as Mutable, overlay: { borderRadius: radiuses.actions - 1, bottom: -borders.line, right: -borders.line, left: -borders.line, top: -borders.line } as Mutable, required: { marginRight: inlineSpaces.required } as Mutable, subTitle: { marginLeft: inlineSpaces.subTitle } as Mutable, titleContainer: { marginBottom: spaces.spacingSm } as Mutable, hintTextIcon: { marginRight: spaces.spacingXs } as Mutable, icon: { marginRight: spaces.spacingSm } as Mutable, hideTextIconContainer: { marginLeft: spaces.spacingSm } as Mutable, cleanButton: { marginLeft: spaces.spacingSm } as Mutable, rightIcon: { marginLeft: spaces.spacingSm } as Mutable, hintText: { marginTop: spaces.spacingSm } as Mutable, container: { } as Mutable, title: { } as Mutable }; if(isDisabled) { const disableStyleType = styleType === "default" ? "neutral" : styleType; styles.overlay.backgroundColor = colors.system.state.overlay.disabled[disableStyleType]; styles.container.borderColor = colors.system.state.overlay.disabled[disableStyleType]; styles.input.color = colors.content.text.disabled; } if (spreadBehaviour === "baseline") { styles.container.alignSelf = spreadBehaviour; styles.container.width = "auto"; } if (spreadBehaviour === "stretch") { styles.container.alignSelf = spreadBehaviour; styles.container.justifyContent = "center"; styles.container.flexShrink = 1; styles.container.width = "100%"; } if(customBorderColor) { styles.container.borderColor = customBorderColor; } if(isFocused && !isDisabled) { if(type === "question" || type === "default") { styles.content.borderColor = colors.content.border.emphasized; } else { styles.content.borderColor = colors.content.border[type]; } } if(customColor) { styles.container.backgroundColor = customColor; } return styles; }; export default stylesheet;