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
JavaScript
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