@sendbird/uikit-react
Version:
Sendbird UIKit for React: A feature-rich and customizable chat UI kit with messaging, channel management, and user authentication.
312 lines (304 loc) • 16 kB
JavaScript
import { _ as __assign, c as __spreadArray } from './bundle-CzBQNSmE.js';
import { u as useStore, c as createStore, s as shimExports } from './bundle-BRRgVYI5.js';
import React__default, { useEffect, useCallback, useState, createContext, useRef, useMemo, useContext } from 'react';
import { u as useSendbird } from './bundle-DMcf5OHL.js';
import { d as deleteNullish } from './bundle-DO80aKFO.js';
function useSetChannel(_a, _b) {
var channelUrl = _a.channelUrl, sdkInit = _a.sdkInit;
var sdk = _b.sdk, logger = _b.logger;
var _c = useMessageSearch().actions, setCurrentChannel = _c.setCurrentChannel, setChannelInvalid = _c.setChannelInvalid;
useEffect(function () {
if (channelUrl && sdkInit && (sdk === null || sdk === void 0 ? void 0 : sdk.groupChannel)) {
sdk.groupChannel.getChannel(channelUrl)
.then(function (groupChannel) {
logger.info('MessageSearch | useSetChannel group channel', groupChannel);
setCurrentChannel(groupChannel);
})
.catch(function () {
setChannelInvalid();
});
}
}, [channelUrl, sdkInit]);
}
var MessageSearchOrder;
(function (MessageSearchOrder) {
MessageSearchOrder["SCORE"] = "score";
MessageSearchOrder["TIMESTAMP"] = "ts";
})(MessageSearchOrder || (MessageSearchOrder = {}));
function useGetSearchedMessages(_a, _b) {
var currentChannel = _a.currentChannel, channelUrl = _a.channelUrl, requestString = _a.requestString, messageSearchQuery = _a.messageSearchQuery, onResultLoaded = _a.onResultLoaded;
var sdk = _b.sdk, logger = _b.logger;
var _c = useMessageSearch(), retryCount = _c.state.retryCount, _d = _c.actions, startMessageSearch = _d.startMessageSearch, getSearchedMessages = _d.getSearchedMessages, setQueryInvalid = _d.setQueryInvalid, startGettingSearchedMessages = _d.startGettingSearchedMessages;
var handleSearchError = useCallback(function (error) {
logger.warning('MessageSearch | useGetSearchedMessages: failed getting search messages.', error);
setQueryInvalid();
if (onResultLoaded && typeof onResultLoaded === 'function') {
onResultLoaded(undefined, error);
}
}, [logger, setQueryInvalid, onResultLoaded]);
useEffect(function () {
startMessageSearch();
if (sdk && channelUrl && sdk.createMessageSearchQuery && currentChannel && requestString) {
currentChannel.refresh()
.then(function (channel) {
var inputSearchMessageQueryObject = __assign({ order: MessageSearchOrder.TIMESTAMP, channelUrl: channelUrl, messageTimestampFrom: channel.invitedAt, keyword: requestString }, messageSearchQuery);
var createdQuery = sdk.createMessageSearchQuery(inputSearchMessageQueryObject);
startGettingSearchedMessages(createdQuery);
createdQuery.next().then(function (messages) {
logger.info('MessageSearch | useGetSearchedMessages: succeeded getting messages', messages);
getSearchedMessages(messages, createdQuery);
if (onResultLoaded && typeof onResultLoaded === 'function') {
onResultLoaded(messages, undefined);
}
}).catch(handleSearchError);
})
.catch(function (error) {
logger.warning('MessageSearch | useGetSearchedMessages: failed getting channel.', error);
handleSearchError(error);
});
}
else if (!requestString) {
logger.info('MessageSearch | useGetSearchedMessages: search string is empty');
}
}, [channelUrl, messageSearchQuery, requestString, currentChannel, retryCount]);
}
function useScrollCallback(_a, _b) {
var onResultLoaded = _a.onResultLoaded;
var logger = _b.logger;
var _c = useMessageSearch(), _d = _c.state, currentMessageSearchQuery = _d.currentMessageSearchQuery, hasMoreResult = _d.hasMoreResult, getNextSearchedMessages = _c.actions.getNextSearchedMessages;
return useCallback(function (cb) {
if (!hasMoreResult) {
logger.warning('MessageSearch | useScrollCallback: no more searched results', hasMoreResult);
}
if (currentMessageSearchQuery && currentMessageSearchQuery.hasNext) {
currentMessageSearchQuery
.next()
.then(function (messages) {
logger.info('MessageSearch | useScrollCallback: succeeded getting searched messages', messages);
getNextSearchedMessages(messages);
cb(messages, null);
if (onResultLoaded && typeof onResultLoaded === 'function') {
onResultLoaded(messages, null);
}
})
.catch(function (error) {
logger.warning('MessageSearch | useScrollCallback: failed getting searched messages', error);
cb(null, error);
if (onResultLoaded && typeof onResultLoaded === 'function') {
onResultLoaded(null, error);
}
});
}
else {
logger.warning('MessageSearch | useScrollCallback: no currentMessageSearchQuery');
}
}, [currentMessageSearchQuery, hasMoreResult]);
}
var DEBOUNCING_TIME = 500;
function useSearchStringEffect(_a) {
var searchString = _a.searchString;
var _b = useState(''), requestString = _b[0], setRequestString = _b[1];
var _c = useState(null), debouncingTimer = _c[0], setDebouncingTimer = _c[1];
var resetSearchString = useMessageSearch().actions.resetSearchString;
var handleSearchStringChange = useCallback(function () {
if (searchString) {
setRequestString(searchString);
}
else {
setRequestString('');
resetSearchString();
}
}, [searchString, resetSearchString]);
useEffect(function () {
if (debouncingTimer) {
clearTimeout(debouncingTimer);
}
var timer = setTimeout(handleSearchStringChange, DEBOUNCING_TIME);
setDebouncingTimer(timer);
return function () {
if (timer) {
clearTimeout(timer);
}
};
}, [searchString, handleSearchStringChange]);
return requestString;
}
var initialState = {
channelUrl: '',
allMessages: [],
loading: false,
isInvalid: false,
initialized: false,
currentChannel: null,
currentMessageSearchQuery: null,
messageSearchQuery: null,
hasMoreResult: false,
retryCount: 0,
selectedMessageId: null,
searchString: '',
requestString: '',
/**
* messageSearchDispatcher is no longer used.
* Please use useMessageSearch() to get the store and update the state.
*/
// messageSearchDispatcher: null,
};
var MessageSearchContext = createContext(null);
var MessageSearchManager = function (_a) {
var _b, _c;
var channelUrl = _a.channelUrl, searchString = _a.searchString, messageSearchQuery = _a.messageSearchQuery, onResultLoaded = _a.onResultLoaded, onResultClick = _a.onResultClick;
var _d = useMessageSearchStore(), state = _d.state, updateState = _d.updateState;
var _e = useSendbird().state, config = _e.config, stores = _e.stores;
var sdk = (_b = stores === null || stores === void 0 ? void 0 : stores.sdkStore) === null || _b === void 0 ? void 0 : _b.sdk;
var sdkInit = (_c = stores === null || stores === void 0 ? void 0 : stores.sdkStore) === null || _c === void 0 ? void 0 : _c.initialized;
var logger = config.logger;
var scrollRef = useRef(null);
useSetChannel({ channelUrl: channelUrl, sdkInit: sdkInit }, { sdk: sdk, logger: logger });
var _searchString = useMemo(function () {
var _a;
return (_a = searchString !== null && searchString !== void 0 ? searchString : messageSearchQuery === null || messageSearchQuery === void 0 ? void 0 : messageSearchQuery.keyword) !== null && _a !== void 0 ? _a : '';
}, [searchString, messageSearchQuery === null || messageSearchQuery === void 0 ? void 0 : messageSearchQuery.keyword]);
var requestString = useSearchStringEffect({ searchString: _searchString });
useGetSearchedMessages({
currentChannel: state.currentChannel,
channelUrl: channelUrl,
requestString: requestString,
messageSearchQuery: messageSearchQuery,
onResultLoaded: onResultLoaded,
}, { sdk: sdk, logger: logger });
var onScroll = useScrollCallback({ onResultLoaded: onResultLoaded }, { logger: logger });
var handleOnScroll = useCallback(function (e) {
var scrollElement = e.target;
var scrollTop = scrollElement.scrollTop, scrollHeight = scrollElement.scrollHeight, clientHeight = scrollElement.clientHeight;
if (!state.hasMoreResult) {
return;
}
if (scrollTop + clientHeight >= scrollHeight) {
onScroll(function () {
// after load more searched messages
});
}
}, [state.hasMoreResult, onScroll]);
useEffect(function () {
updateState({
channelUrl: channelUrl,
searchString: _searchString,
messageSearchQuery: messageSearchQuery,
onResultClick: onResultClick,
onScroll: onScroll,
handleOnScroll: handleOnScroll,
scrollRef: scrollRef,
requestString: requestString,
});
}, [channelUrl, searchString, messageSearchQuery, onResultClick, updateState, requestString]);
return null;
};
var createMessageSearchStore = function (props) { return createStore(__assign(__assign({}, initialState), props)); };
var InternalMessageSearchProvider = function (props) {
var children = props.children;
var defaultProps = deleteNullish({
channelUrl: props === null || props === void 0 ? void 0 : props.channelUrl,
messageSearchQuery: props === null || props === void 0 ? void 0 : props.messageSearchQuery,
searchString: props === null || props === void 0 ? void 0 : props.searchString,
onResultLoaded: props === null || props === void 0 ? void 0 : props.onResultLoaded,
onResultClick: props === null || props === void 0 ? void 0 : props.onResultClick,
});
var storeRef = useRef(createMessageSearchStore(defaultProps));
return (React__default.createElement(MessageSearchContext.Provider, { value: storeRef.current }, children));
};
var MessageSearchProvider = function (props) {
var children = props.children, channelUrl = props.channelUrl, searchString = props.searchString, messageSearchQuery = props.messageSearchQuery, onResultLoaded = props.onResultLoaded, onResultClick = props.onResultClick;
return (React__default.createElement(InternalMessageSearchProvider, __assign({}, props),
React__default.createElement(MessageSearchManager, { channelUrl: channelUrl, searchString: searchString, messageSearchQuery: messageSearchQuery, onResultLoaded: onResultLoaded, onResultClick: onResultClick }),
children));
};
// Keep this function for backward compatibility.
var useMessageSearchContext = function () {
var _a = useMessageSearch(), state = _a.state, actions = _a.actions;
return __assign(__assign({}, state), actions);
};
/**
* A specialized hook for MessageSearch state management
* @returns {ReturnType<typeof createStore<MessageSearchState>>}
*/
var useMessageSearchStore = function () {
return useStore(MessageSearchContext, function (state) { return state; }, initialState);
};
var useMessageSearch = function () {
var store = useContext(MessageSearchContext);
if (!store)
throw new Error('useMessageSearch must be used within a MessageSearchProvider');
var state = shimExports.useSyncExternalStore(store.subscribe, store.getState);
var setCurrentChannel = useCallback(function (channel) {
store.setState(function (state) { return (__assign(__assign({}, state), { currentChannel: channel, initialized: true })); });
}, [store]);
var setChannelInvalid = useCallback(function () {
store.setState(function (state) { return (__assign(__assign({}, state), { currentChannel: null, initialized: false })); });
}, [store]);
var getSearchedMessages = useCallback(function (messages, createdQuery) {
store.setState(function (state) {
var _a;
if (createdQuery && createdQuery.channelUrl === ((_a = state.currentMessageSearchQuery) === null || _a === void 0 ? void 0 : _a.channelUrl)
&& createdQuery.key === state.currentMessageSearchQuery.key) {
return __assign(__assign({}, state), { loading: false, isInvalid: false, allMessages: messages, hasMoreResult: state.currentMessageSearchQuery.hasNext });
}
return state;
});
}, [store]);
var setQueryInvalid = useCallback(function () {
store.setState(function (state) { return (__assign(__assign({}, state), { isInvalid: true })); });
}, [store]);
var startMessageSearch = useCallback(function () {
store.setState(function (state) { return (__assign(__assign({}, state), { isInvalid: false, loading: false })); });
}, [store]);
var startGettingSearchedMessages = useCallback(function (query) {
store.setState(function (state) { return (__assign(__assign({}, state), { loading: true, currentMessageSearchQuery: query })); });
}, [store]);
var getNextSearchedMessages = useCallback(function (messages) {
store.setState(function (state) {
var _a;
return (__assign(__assign({}, state), { allMessages: __spreadArray(__spreadArray([], state.allMessages, true), messages, true), hasMoreResult: ((_a = state.currentMessageSearchQuery) === null || _a === void 0 ? void 0 : _a.hasNext) || false }));
});
}, [store]);
var resetSearchString = useCallback(function () {
store.setState(function (state) { return (__assign(__assign({}, state), { allMessages: [] })); });
}, [store]);
var setSelectedMessageId = function (messageId) { return useCallback(function () {
store.setState(function (state) { return (__assign(__assign({}, state), { selectedMessageId: messageId })); });
}, [store]); };
var handleRetryToConnect = useCallback(function () {
store.setState(function (state) { return (__assign(__assign({}, state), { retryCount: state.retryCount + 1 })); });
}, [store]);
// Looks exactly same as handleRetryToConnect but keep just for backward compatibility
var setRetryCount = useCallback(function () {
store.setState(function (state) { return (__assign(__assign({}, state), { retryCount: state.retryCount + 1 })); });
}, [store]);
var actions = useMemo(function () { return ({
setCurrentChannel: setCurrentChannel,
setChannelInvalid: setChannelInvalid,
getSearchedMessages: getSearchedMessages,
setQueryInvalid: setQueryInvalid,
startMessageSearch: startMessageSearch,
startGettingSearchedMessages: startGettingSearchedMessages,
getNextSearchedMessages: getNextSearchedMessages,
resetSearchString: resetSearchString,
setSelectedMessageId: setSelectedMessageId,
handleRetryToConnect: handleRetryToConnect,
setRetryCount: setRetryCount,
}); }, [
setCurrentChannel,
setChannelInvalid,
getSearchedMessages,
setQueryInvalid,
startMessageSearch,
startGettingSearchedMessages,
getNextSearchedMessages,
resetSearchString,
setSelectedMessageId,
handleRetryToConnect,
setRetryCount,
]);
return { state: state, actions: actions };
};
export { MessageSearchContext as M, MessageSearchProvider as a, useMessageSearchContext as b, MessageSearchManager as c, useMessageSearch as u };
//# sourceMappingURL=bundle-BFal76OU.js.map