@sendbird/uikit-react-native
Version:
Sendbird UIKit for React Native: A feature-rich and customizable chat UI kit with messaging, channel management, and user authentication.
106 lines (105 loc) • 4.54 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = require("react");
var _uikitTools = require("@sendbird/uikit-tools");
var _uikitUtils = require("@sendbird/uikit-utils");
var _useContext = require("../hooks/useContext");
const useMentionSuggestion = params => {
const {
text,
selection,
channel,
mentionedUsers
} = params;
const [freshChannel, setFreshChannel] = (0, _react.useState)(channel);
(0, _uikitUtils.useAsyncEffect)(async () => {
setFreshChannel(await channel.refresh());
}, [channel.url]);
(0, _uikitTools.useGroupChannelHandler)(params.sdk, {
onUserJoined(eventChannel) {
if ((0, _uikitUtils.isDifferentChannel)(eventChannel, channel)) return;
setFreshChannel(eventChannel);
},
onUserLeft(eventChannel) {
if ((0, _uikitUtils.isDifferentChannel)(eventChannel, channel)) return;
setFreshChannel(eventChannel);
},
onUserBanned(eventChannel) {
if ((0, _uikitUtils.isDifferentChannel)(eventChannel, channel)) return;
if (!eventChannel.isGroupChannel()) return;
setFreshChannel(eventChannel);
}
});
const {
mentionManager,
currentUser
} = (0, _useContext.useSendbirdChat)();
const [members, setMembers] = (0, _react.useState)([]);
const searchStringRangeRef = (0, _react.useRef)({
start: 0,
end: 0
});
const searchLimitedRef = (0, _react.useRef)(false);
const updateSearchStringRange = (selectionIndex, searchString) => {
searchStringRangeRef.current = mentionManager.getSearchStringRangeInText(selectionIndex, searchString);
return searchStringRangeRef.current;
};
const updateSearchLimited = (mentionCount, mentionLimit) => {
searchLimitedRef.current = mentionCount >= mentionLimit;
return searchLimitedRef.current;
};
const resetRefs = () => {
searchLimitedRef.current = false;
searchStringRangeRef.current = {
start: 0,
end: 0
};
};
const fetchMembers = async () => {
resetRefs();
const selectionRanged = selection.start !== selection.end;
if (selectionRanged) return [];
const selectionContainsMentionedUser = mentionedUsers.some(it => mentionManager.rangeHelpers.overlaps(it.range, selection, 'underMore'));
if (selectionContainsMentionedUser) return [];
const {
isTriggered,
isValidSearchString,
searchString
} = mentionManager.getSearchString(text, selection.start);
if (!isTriggered() || !isValidSearchString()) return [];
const limited = updateSearchLimited(mentionedUsers.length, mentionManager.config.mentionLimit);
if (limited) return [];
updateSearchStringRange(selection.start, searchString);
if (freshChannel.isSuper) {
return freshChannel.createMemberListQuery({
nicknameStartsWithFilter: searchString,
limit: mentionManager.config.suggestionLimit + 1
}).next().then(members => members.filter(member => member.userId !== (currentUser === null || currentUser === void 0 ? void 0 : currentUser.userId))).then(members => members.slice(0, mentionManager.config.suggestionLimit));
} else {
return freshChannel.members
// NOTE: When using 'org.webkit:android-jsc', there is a problem with sorting lists that include words starting with uppercase and lowercase letters.
// To ensure consistent sorting regardless of the JSC, we compare the words in lowercase.
.sort((a, b) => {
var _a$nickname;
return (_a$nickname = a.nickname) === null || _a$nickname === void 0 ? void 0 : _a$nickname.toLowerCase().localeCompare(b.nickname.toLowerCase());
}).filter(member => {
var _member$nickname;
return ((_member$nickname = member.nickname) === null || _member$nickname === void 0 ? void 0 : _member$nickname.toLowerCase().startsWith(searchString.toLowerCase())) && member.userId !== (currentUser === null || currentUser === void 0 ? void 0 : currentUser.userId) && member.isActive;
}).slice(0, mentionManager.config.suggestionLimit);
}
};
(0, _uikitUtils.useDebounceEffect)(() => {
return fetchMembers().then(setMembers).catch(() => setMembers([]));
}, mentionManager.config.debounceMills, [text, selection]);
return {
members,
reset: (0, _react.useCallback)(() => setMembers([]), []),
searchStringRange: searchStringRangeRef.current,
searchLimited: searchLimitedRef.current
};
};
var _default = exports.default = useMentionSuggestion;
//# sourceMappingURL=useMentionSuggestion.js.map
;