stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
189 lines • 7.26 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createTextComposerEmojiMiddleware = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _mergeWith = _interopRequireDefault(require("lodash/mergeWith"));
var _streamChat = require("stream-chat");
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function () { return !!t; })(); }
var EmojiSearchSource = function (_BaseSearchSource) {
function EmojiSearchSource(emojiSearchIndex, options) {
var _this;
(0, _classCallCheck2.default)(this, EmojiSearchSource);
_this = _callSuper(this, EmojiSearchSource, [options]);
_this.type = 'emoji';
_this.emojiSearchIndex = emojiSearchIndex;
return _this;
}
(0, _inherits2.default)(EmojiSearchSource, _BaseSearchSource);
return (0, _createClass2.default)(EmojiSearchSource, [{
key: "query",
value: function () {
var _query = (0, _asyncToGenerator2.default)(function* (searchQuery) {
if (searchQuery.length === 0) {
return {
items: [],
next: null
};
}
var emojis = (yield this.emojiSearchIndex.search(searchQuery)) ?? [];
return {
items: emojis.filter(Boolean).slice(0, 7).map(({
emoticons = [],
id,
name,
native,
skins = []
}) => {
var _skins = (0, _slicedToArray2.default)(skins, 1),
firstSkin = _skins[0];
return {
emoticons,
id,
name,
native: native ?? firstSkin.native
};
}),
next: null
};
});
function query(_x) {
return _query.apply(this, arguments);
}
return query;
}()
}, {
key: "filterQueryResults",
value: function filterQueryResults(items) {
return items.map(item => ({
...item,
...(0, _streamChat.getTokenizedSuggestionDisplayName)({
displayName: item.id,
searchToken: this.searchQuery
})
}));
}
}]);
}(_streamChat.BaseSearchSource);
var DEFAULT_OPTIONS = {
minChars: 1,
trigger: ':'
};
var createTextComposerEmojiMiddleware = ({
emojiSearchIndex,
options
}) => {
var finalOptions = (0, _mergeWith.default)(DEFAULT_OPTIONS, options ?? {});
var emojiSearchSource = new EmojiSearchSource(emojiSearchIndex);
emojiSearchSource.activate();
return {
handlers: {
onChange: function () {
var _ref = (0, _asyncToGenerator2.default)(function* ({
complete,
forward,
next,
state
}) {
if (!state.selection) {
return forward();
}
var triggerWithToken = (0, _streamChat.getTriggerCharWithToken)({
acceptTrailingSpaces: false,
text: state.text.slice(0, state.selection.end),
trigger: finalOptions.trigger
});
var triggerWasRemoved = !triggerWithToken || triggerWithToken.length < finalOptions.minChars;
if (triggerWasRemoved) {
var hasSuggestionsForTrigger = state.suggestions?.trigger === finalOptions.trigger;
var newState = {
...state
};
if (hasSuggestionsForTrigger && newState.suggestions) {
delete newState.suggestions;
}
return next(newState);
}
var newSearchTriggerred = triggerWithToken && triggerWithToken === finalOptions.trigger;
if (newSearchTriggerred) {
emojiSearchSource.resetStateAndActivate();
}
var textWithReplacedWord = yield (0, _streamChat.replaceWordWithEntity)({
caretPosition: state.selection.end,
getEntityString: function () {
var _ref2 = (0, _asyncToGenerator2.default)(function* (word) {
var _yield$emojiSearchSou = yield emojiSearchSource.query(word),
items = _yield$emojiSearchSou.items;
var emoji = items.filter(Boolean).slice(0, 10).find(({
emoticons
}) => !!emoticons?.includes(word));
if (!emoji) {
return null;
}
var _ref3 = emoji.skins ?? [],
_ref4 = (0, _slicedToArray2.default)(_ref3, 1),
firstSkin = _ref4[0];
return emoji.native ?? firstSkin.native;
});
return function getEntityString(_x3) {
return _ref2.apply(this, arguments);
};
}(),
text: state.text
});
if (textWithReplacedWord !== state.text) {
return complete({
...state,
suggestions: undefined,
text: textWithReplacedWord
});
}
return complete({
...state,
suggestions: {
query: triggerWithToken.slice(1),
searchSource: emojiSearchSource,
trigger: finalOptions.trigger
}
});
});
return function onChange(_x2) {
return _ref.apply(this, arguments);
};
}(),
onSuggestionItemSelect: ({
complete,
forward,
state
}) => {
var _ref5 = state.change ?? {},
selectedSuggestion = _ref5.selectedSuggestion;
if (!selectedSuggestion || state.suggestions?.trigger !== finalOptions.trigger) {
return forward();
}
emojiSearchSource.resetStateAndActivate();
return complete({
...state,
...(0, _streamChat.insertItemWithTrigger)({
insertText: `${'native' in selectedSuggestion ? selectedSuggestion.native : ''} `,
selection: state.selection,
text: state.text,
trigger: finalOptions.trigger
}),
suggestions: undefined
});
}
},
id: 'stream-io/react-native-sdk/emoji-middleware'
};
};
exports.createTextComposerEmojiMiddleware = createTextComposerEmojiMiddleware;
//# sourceMappingURL=emojiControl.js.map