stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
160 lines • 6.33 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.usePaginatedChannels = void 0;
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = require("react");
var _ActiveChannelsRefContext = require("../../../contexts/activeChannelsRefContext/ActiveChannelsRefContext");
var _ChatContext = require("../../../contexts/chatContext/ChatContext");
var _hooks = require("../../../hooks");
var _useIsMountedRef = require("../../../hooks/useIsMountedRef");
var RETRY_INTERVAL_IN_MS = 5000;
var selector = nextValue => ({
channelListInitialized: nextValue.initialized,
channels: nextValue.channels,
error: nextValue.error,
pagination: nextValue.pagination
});
var usePaginatedChannels = ({
channelManager,
enableOfflineSupport,
filters = {},
options = {},
sort = {}
}) => {
var _useStateStore;
var _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
staticChannelsActive = _useState2[0],
setStaticChannelsActive = _useState2[1];
var _useState3 = (0, _react.useState)('queryLocalDB'),
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
activeQueryType = _useState4[0],
setActiveQueryType = _useState4[1];
var activeChannels = (0, _ActiveChannelsRefContext.useActiveChannelsRefContext)();
var isMountedRef = (0, _useIsMountedRef.useIsMountedRef)();
var _useChatContext = (0, _ChatContext.useChatContext)(),
client = _useChatContext.client;
var _ref = (_useStateStore = (0, _hooks.useStateStore)(channelManager == null ? void 0 : channelManager.state, selector)) != null ? _useStateStore : {},
channelListInitialized = _ref.channelListInitialized,
channels = _ref.channels,
pagination = _ref.pagination,
error = _ref.error;
var hasNextPage = pagination == null ? void 0 : pagination.hasNext;
var filtersRef = (0, _react.useRef)(null);
var optionsRef = (0, _react.useRef)(null);
var sortRef = (0, _react.useRef)(null);
var activeRequestId = (0, _react.useRef)(0);
var isQueryingRef = (0, _react.useRef)(false);
var lastRefresh = (0, _react.useRef)(Date.now());
var queryChannels = function () {
var _ref2 = (0, _asyncToGenerator2.default)(function* (queryType = 'loadChannels') {
if (!client || !isMountedRef.current) {
return;
}
var hasUpdatedData = queryType === 'loadChannels' || queryType === 'refresh' || queryType === 'backgroundRefresh' || JSON.stringify(filtersRef.current) !== JSON.stringify(filters) || JSON.stringify(optionsRef.current) !== JSON.stringify(options) || JSON.stringify(sortRef.current) !== JSON.stringify(sort);
var isQueryStale = () => !isMountedRef || activeRequestId.current !== currentRequestId;
if (!hasUpdatedData) {
if (activeQueryType === null) {
return;
}
}
filtersRef.current = filters;
optionsRef.current = options;
sortRef.current = sort;
isQueryingRef.current = true;
activeRequestId.current++;
var currentRequestId = activeRequestId.current;
setActiveQueryType(queryType);
var newOptions = {
offset: 0,
...options
};
try {
if (isQueryStale() || !isMountedRef.current) {
return;
}
if (queryType === 'loadChannels') {
yield channelManager.loadNext();
} else {
yield channelManager.queryChannels(filters, sort, newOptions, {
skipInitialization: enableOfflineSupport ? undefined : activeChannels.current
});
}
setStaticChannelsActive(false);
isQueryingRef.current = false;
} catch (err) {
isQueryingRef.current = false;
if (isQueryStale()) {
return;
}
console.warn(err);
}
setActiveQueryType(null);
});
return function queryChannels() {
return _ref2.apply(this, arguments);
};
}();
var refreshList = function () {
var _ref3 = (0, _asyncToGenerator2.default)(function* ({
force = false,
isBackground = false
} = {}) {
var now = Date.now();
if (!force && now - lastRefresh.current < RETRY_INTERVAL_IN_MS && error === undefined) {
return;
}
lastRefresh.current = Date.now();
yield queryChannels(isBackground ? 'backgroundRefresh' : 'refresh');
});
return function refreshList() {
return _ref3.apply(this, arguments);
};
}();
var reloadList = function () {
var _ref4 = (0, _asyncToGenerator2.default)(function* () {
yield queryChannels('reload');
});
return function reloadList() {
return _ref4.apply(this, arguments);
};
}();
var filterStr = (0, _react.useMemo)(() => JSON.stringify(filters), [filters]);
var optionsStr = (0, _react.useMemo)(() => JSON.stringify(options), [options]);
var sortStr = (0, _react.useMemo)(() => JSON.stringify(sort), [sort]);
(0, _react.useEffect)(() => {
var listener = client.on('connection.changed', function () {
var _ref5 = (0, _asyncToGenerator2.default)(function* (event) {
if (event.online) {
yield refreshList({
force: true,
isBackground: true
});
}
});
return function (_x) {
return _ref5.apply(this, arguments);
};
}());
reloadList();
return () => listener == null || listener.unsubscribe == null ? void 0 : listener.unsubscribe();
}, [filterStr, optionsStr, sortStr, channelManager]);
return {
channelListInitialized,
channels,
error,
hasNextPage,
loadingChannels: activeQueryType === 'queryLocalDB' ? true : (pagination == null ? void 0 : pagination.isLoading) || !channelListInitialized && channels.length === 0 && !error,
loadingNextPage: pagination == null ? void 0 : pagination.isLoadingNext,
loadNextPage: channelManager.loadNext,
refreshing: activeQueryType === 'refresh',
refreshList: () => refreshList(),
reloadList,
staticChannelsActive
};
};
exports.usePaginatedChannels = usePaginatedChannels;
//# sourceMappingURL=usePaginatedChannels.js.map