UNPKG

stream-chat-react-native-core

Version:

The official React Native and Expo components for Stream Chat, a service for building chat applications

246 lines 9.99 kB
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.AutoCompleteInput = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _react = _interopRequireWildcard(require("react")); var _reactNative = require("react-native"); var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated")); var _ChannelContext = require("../../contexts/channelContext/ChannelContext"); var _useMessageComposer = require("../../contexts/messageInputContext/hooks/useMessageComposer"); var _MessageInputContext = require("../../contexts/messageInputContext/MessageInputContext"); var _ThemeContext = require("../../contexts/themeContext/ThemeContext"); var _TranslationContext = require("../../contexts/translationContext/TranslationContext"); var _hooks = require("../../hooks"); var _useStateStore3 = require("../../hooks/useStateStore"); var _useCooldownRemaining = require("../MessageInput/hooks/useCooldownRemaining"); var _jsxRuntime = require("react/jsx-runtime"); var _excluded = ["channel", "cooldownRemainingSeconds", "setInputBoxRef", "t", "TextInputComponent", "placeholder"]; var _jsxFileName = "/home/runner/work/stream-chat-react-native/stream-chat-react-native/package/src/components/AutoCompleteInput/AutoCompleteInput.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 TextInputRenderer = _react.default.forwardRef(({ TextInputComponent: Component, ...props }, ref) => (0, _jsxRuntime.jsx)(Component, { ...props, ref: ref })); var AnimatedTextInputRenderer = _reactNativeReanimated.default.createAnimatedComponent(TextInputRenderer); var setRef = (ref, value) => { if (!ref) { return; } if (typeof ref === 'function') { ref(value); return; } ref.current = value; }; var textComposerStateSelector = state => ({ command: state.command, text: state.text }); var configStateSelector = state => ({ enabled: state.text.enabled }); var MAX_NUMBER_OF_LINES = 5; var LINE_HEIGHT = 20; var INPUT_VERTICAL_PADDING = _reactNative.Platform.OS === 'ios' ? 7 : 12; var commandPlaceHolders = { giphy: 'Search GIFs', ban: '@username', unban: '@username', mute: '@username', unmute: '@username' }; var AutoCompleteInputWithContext = props => { var styles = useStyles(); var channel = props.channel, cooldownRemainingSeconds = props.cooldownRemainingSeconds, setInputBoxRef = props.setInputBoxRef, t = props.t, _props$TextInputCompo = props.TextInputComponent, TextInputComponent = _props$TextInputCompo === void 0 ? _reactNative.TextInput : _props$TextInputCompo, placeholder = props.placeholder, rest = (0, _objectWithoutProperties2.default)(props, _excluded); var _useState = (0, _react.useState)(''), _useState2 = (0, _slicedToArray2.default)(_useState, 2), localText = _useState2[0], setLocalText = _useState2[1]; var messageComposer = (0, _useMessageComposer.useMessageComposer)(); var textComposer = messageComposer.textComposer; var _useStateStore = (0, _useStateStore3.useStateStore)(textComposer.state, textComposerStateSelector), command = _useStateStore.command, text = _useStateStore.text; var _useStateStore2 = (0, _useStateStore3.useStateStore)(messageComposer.configState, configStateSelector), enabled = _useStateStore2.enabled; var latestTextRef = (0, _react.useRef)(''); var latestSelectionRef = (0, _react.useRef)({ end: 0, start: 0 }); var flushHandleRef = (0, _react.useRef)(null); var flushChange = (0, _react.useCallback)(() => { flushHandleRef.current = null; textComposer.handleChange({ selection: latestSelectionRef.current, text: latestTextRef.current }); }, [textComposer]); var scheduleChange = (0, _react.useCallback)(() => { if (flushHandleRef.current !== null) return; flushHandleRef.current = setTimeout(flushChange, 0); }, [flushChange]); (0, _react.useEffect)(() => { return () => { if (flushHandleRef.current !== null) { clearTimeout(flushHandleRef.current); flushHandleRef.current = null; } }; }, []); var maxMessageLength = (0, _react.useMemo)(() => { return channel.getConfig()?.max_message_length; }, [channel]); var numberOfLines = (0, _react.useMemo)(() => { return props.numberOfLines ?? MAX_NUMBER_OF_LINES; }, [props.numberOfLines]); (0, _react.useEffect)(() => { setLocalText(text); if (text !== latestTextRef.current) { latestTextRef.current = text; latestSelectionRef.current = { end: text.length, start: text.length }; } }, [text]); var nativeInputRef = (0, _react.useRef)(null); var clearState = (0, _react.useCallback)(() => { setLocalText(''); if (_reactNative.Platform.OS === 'ios') { nativeInputRef.current?.setNativeProps({ text: '' }); } }, []); var restoreState = (0, _hooks.useStableCallback)(restoredText => { setLocalText(restoredText); }); var setExtendedInputRef = (0, _react.useCallback)(ref => { nativeInputRef.current = ref; if (!ref) { setRef(setInputBoxRef, null); return; } var inputBoxRef = Object.assign(ref, { clearState, restoreState }); setRef(setInputBoxRef, inputBoxRef); }, [clearState, restoreState, setInputBoxRef]); var handleSelectionChange = (0, _react.useCallback)(e => { var selection = e.nativeEvent.selection; latestSelectionRef.current = selection; textComposer.setSelection(selection); scheduleChange(); }, [scheduleChange, textComposer]); var onChangeTextHandler = (0, _react.useCallback)(newText => { setLocalText(newText); latestTextRef.current = newText; scheduleChange(); }, [scheduleChange]); var _useTheme = (0, _ThemeContext.useTheme)(), _useTheme$theme = _useTheme.theme, inputBox = _useTheme$theme.messageComposer.inputBox, semantics = _useTheme$theme.semantics; var placeholderText = (0, _react.useMemo)(() => { return placeholder ? placeholder : command ? commandPlaceHolders[command.name ?? ''] : cooldownRemainingSeconds ? t('Slow mode, wait {{seconds}}s...', { seconds: cooldownRemainingSeconds }) : t('Send a message'); }, [command, cooldownRemainingSeconds, t, placeholder]); return (0, _jsxRuntime.jsx)(AnimatedTextInputRenderer, { TextInputComponent: TextInputComponent, layout: _reactNativeReanimated.LinearTransition.duration(200), autoFocus: !!command, editable: enabled, maxLength: maxMessageLength, multiline: true, onChangeText: onChangeTextHandler, onSelectionChange: handleSelectionChange, placeholder: placeholderText, placeholderTextColor: semantics.inputTextPlaceholder, ref: setExtendedInputRef, style: [styles.inputBox, { maxHeight: LINE_HEIGHT * numberOfLines + INPUT_VERTICAL_PADDING * 2, paddingLeft: command ? 0 : 16, paddingRight: command ? 4 : 8, textAlign: _reactNative.I18nManager.isRTL ? 'right' : 'left' }, inputBox], testID: "auto-complete-text-input", value: localText, ...rest }); }; var areEqual = (prevProps, nextProps) => { var prevChannel = prevProps.channel, prevCooldownRemainingSeconds = prevProps.cooldownRemainingSeconds, prevT = prevProps.t; var nextChannel = nextProps.channel, nextCooldownRemainingSeconds = nextProps.cooldownRemainingSeconds, nextT = nextProps.t; var tEqual = prevT === nextT; if (!tEqual) { return false; } var cooldownRemainingSecondsEqual = prevCooldownRemainingSeconds === nextCooldownRemainingSeconds; if (!cooldownRemainingSecondsEqual) { return false; } var channelEqual = prevChannel.cid === nextChannel.cid; if (!channelEqual) { return false; } return true; }; var MemoizedAutoCompleteInput = _react.default.memo(AutoCompleteInputWithContext, areEqual); var AutoCompleteInput = props => { var _useMessageInputConte = (0, _MessageInputContext.useMessageInputContext)(), setInputBoxRef = _useMessageInputConte.setInputBoxRef; var _useTranslationContex = (0, _TranslationContext.useTranslationContext)(), t = _useTranslationContex.t; var _useChannelContext = (0, _ChannelContext.useChannelContext)(), channel = _useChannelContext.channel; var cooldownRemainingSeconds = (0, _useCooldownRemaining.useCooldownRemaining)(); return (0, _jsxRuntime.jsx)(MemoizedAutoCompleteInput, { channel, setInputBoxRef, t, cooldownRemainingSeconds, ...props }); }; exports.AutoCompleteInput = AutoCompleteInput; var useStyles = () => { var _useTheme2 = (0, _ThemeContext.useTheme)(), semantics = _useTheme2.theme.semantics; return (0, _react.useMemo)(() => { return _reactNative.StyleSheet.create({ inputBox: { color: semantics.inputTextDefault, flex: 1, fontSize: 16, includeFontPadding: false, lineHeight: 20, paddingLeft: 16, paddingVertical: 12, textAlignVertical: 'center', alignSelf: 'center' } }); }, [semantics]); }; AutoCompleteInput.displayName = 'AutoCompleteInput{messageComposer{inputBox}}'; //# sourceMappingURL=AutoCompleteInput.js.map