stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
202 lines • 7.93 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Input = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = _interopRequireWildcard(require("react"));
var _reactNative = require("react-native");
var _contexts = require("../../../contexts");
var _ComponentsContext = require("../../../contexts/componentsContext/ComponentsContext");
var _theme = require("../../../theme");
var _jsxRuntime = require("react/jsx-runtime");
var _jsxFileName = "/home/runner/work/stream-chat-react-native/stream-chat-react-native/package/src/components/ui/Input/Input.tsx";
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
var inputAccessibilityStates = {
disabled: {
disabled: true,
selected: false
},
disabledSelected: {
disabled: true,
selected: true
},
enabled: {
disabled: false,
selected: false
},
selected: {
disabled: false,
selected: true
}
};
var getInputAccessibilityState = ({
disabled,
selected
}) => {
if (disabled) return selected ? inputAccessibilityStates.disabledSelected : inputAccessibilityStates.disabled;
return selected ? inputAccessibilityStates.selected : inputAccessibilityStates.enabled;
};
var Input = exports.Input = _react.default.forwardRef(function Input({
title,
description,
variant = 'outline',
LeadingIcon,
TrailingIcon,
editable = true,
state = 'default',
helperText = true,
errorMessage,
successMessage,
infoText,
onFocus,
onBlur,
containerStyle,
...props
}, ref) {
var _props$accessibilityL;
var _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
isFocused = _useState2[0],
setIsFocused = _useState2[1];
var _useComponentsContext = (0, _ComponentsContext.useComponentsContext)(),
icons = _useComponentsContext.icons;
var _useTheme = (0, _contexts.useTheme)(),
semantics = _useTheme.theme.semantics;
var styles = useStyles();
var isRTL = _reactNative.I18nManager.isRTL;
var LeftIcon = isRTL ? TrailingIcon : LeadingIcon;
var RightIcon = isRTL ? LeadingIcon : TrailingIcon;
var accessibilityState = getInputAccessibilityState({
disabled: !editable,
selected: isFocused
});
var handleFocus = (0, _react.useCallback)(e => {
setIsFocused(true);
onFocus == null || onFocus(e);
}, [onFocus]);
var handleBlur = (0, _react.useCallback)(e => {
setIsFocused(false);
onBlur == null || onBlur(e);
}, [onBlur]);
return (0, _jsxRuntime.jsxs)(_reactNative.View, {
style: styles.container,
children: [title ? (0, _jsxRuntime.jsx)(_reactNative.Text, {
style: styles.title,
children: title
}) : null, description ? (0, _jsxRuntime.jsx)(_reactNative.Text, {
style: styles.description,
children: description
}) : null, (0, _jsxRuntime.jsxs)(_reactNative.View, {
style: [styles.inputContainer, {
borderWidth: variant === 'outline' ? 1 : 0,
borderColor: !editable ? semantics.borderUtilityDisabled : isFocused ? semantics.borderUtilityActive : semantics.borderCoreDefault
}, containerStyle],
children: [LeftIcon ? (0, _jsxRuntime.jsx)(LeftIcon, {
height: 20,
width: 20,
strokeWidth: 1.5,
stroke: !editable ? semantics.textDisabled : semantics.textOnAccent
}) : null, (0, _jsxRuntime.jsx)(_reactNative.TextInput, {
ref: ref,
accessibilityHint: description,
accessibilityLabel: (_props$accessibilityL = props.accessibilityLabel) != null ? _props$accessibilityL : title,
accessibilityState: accessibilityState,
editable: editable,
onFocus: handleFocus,
onBlur: handleBlur,
style: [styles.textInput, props.style],
placeholderTextColor: semantics.inputTextPlaceholder,
...props
}), state === 'error' && errorMessage ? (0, _jsxRuntime.jsx)(_reactNative.View, {
accessibilityLiveRegion: "assertive",
accessibilityRole: "alert",
style: {
width: 0,
height: 0
},
children: (0, _jsxRuntime.jsx)(_reactNative.Text, {
children: errorMessage
})
}) : null, RightIcon ? (0, _jsxRuntime.jsx)(RightIcon, {
height: 20,
width: 20,
strokeWidth: 1.5,
stroke: !editable ? semantics.textDisabled : semantics.textOnAccent
}) : null]
}), helperText ? (0, _jsxRuntime.jsxs)(_reactNative.View, {
style: styles.helperContainer,
children: [state === 'success' ? (0, _jsxRuntime.jsx)(icons.Checkmark, {
height: 20,
width: 20,
stroke: semantics.accentSuccess
}) : (0, _jsxRuntime.jsx)(icons.InfoTooltip, {
height: 20,
width: 20,
fill: state === 'error' ? semantics.accentError : semantics.textTertiary
}), (0, _jsxRuntime.jsx)(_reactNative.Text, {
style: [styles.helperText, {
color: state === 'error' ? semantics.accentError : state === 'success' ? semantics.accentSuccess : semantics.textTertiary
}],
children: state === 'error' ? errorMessage : state === 'success' ? successMessage : infoText
})]
}) : null]
});
});
var useStyles = () => {
var _useTheme2 = (0, _contexts.useTheme)(),
semantics = _useTheme2.theme.semantics;
return (0, _react.useMemo)(() => {
return _reactNative.StyleSheet.create({
container: {
gap: _theme.primitives.spacingXs
},
title: {
color: semantics.textPrimary,
fontSize: _theme.primitives.typographyFontSizeMd,
fontWeight: _theme.primitives.typographyFontWeightSemiBold,
lineHeight: _theme.primitives.typographyLineHeightNormal,
textAlign: 'left'
},
description: {
color: semantics.textTertiary,
fontSize: _theme.primitives.typographyFontSizeSm,
fontWeight: _theme.primitives.typographyFontWeightRegular,
lineHeight: _theme.primitives.typographyLineHeightNormal,
textAlign: 'left'
},
inputContainer: {
alignItems: 'center',
flexDirection: 'row',
gap: _theme.primitives.spacingXs,
paddingHorizontal: _theme.primitives.spacingMd,
paddingVertical: _theme.primitives.spacingSm,
borderRadius: _theme.primitives.radiusLg,
borderColor: semantics.borderCoreDefault,
minHeight: 48
},
textInput: {
flex: 1,
fontSize: _theme.primitives.typographyFontSizeMd,
lineHeight: _theme.primitives.typographyLineHeightNormal,
fontWeight: _theme.primitives.typographyFontWeightRegular,
color: semantics.inputTextDefault,
paddingVertical: 0,
textAlign: _reactNative.I18nManager.isRTL ? 'right' : 'left'
},
helperContainer: {
alignItems: 'center',
flexDirection: 'row',
gap: _theme.primitives.spacingXs
},
helperText: {
color: semantics.textTertiary,
fontSize: _theme.primitives.typographyFontSizeSm,
fontWeight: _theme.primitives.typographyFontWeightRegular,
lineHeight: _theme.primitives.typographyLineHeightNormal,
textAlign: 'left'
}
});
}, [semantics]);
};
//# sourceMappingURL=Input.js.map