stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
103 lines • 3.77 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.usePollAnswersPagination = void 0;
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = require("react");
var _uniqBy = _interopRequireDefault(require("lodash/uniqBy"));
var _streamChat = require("stream-chat");
var _contexts = require("../../../contexts");
var usePollAnswersPagination = ({
loadFirstPage = true,
paginationParams
} = {}) => {
var _usePollContext = (0, _contexts.usePollContext)(),
poll = _usePollContext.poll;
var _useChatContext = (0, _contexts.useChatContext)(),
client = _useChatContext.client;
var _useState = (0, _react.useState)([]),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
pollAnswers = _useState2[0],
setPollAnswers = _useState2[1];
var _useState3 = (0, _react.useState)(false),
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
loading = _useState4[0],
setLoading = _useState4[1];
var _useState5 = (0, _react.useState)(),
_useState6 = (0, _slicedToArray2.default)(_useState5, 2),
error = _useState6[0],
setError = _useState6[1];
var cursorRef = (0, _react.useRef)(undefined);
var queryInProgress = (0, _react.useRef)(false);
var loadMore = (0, _react.useCallback)((0, _asyncToGenerator2.default)(function* () {
if (cursorRef.current === null || queryInProgress.current) {
return;
}
var next = cursorRef.current;
setLoading(true);
queryInProgress.current = true;
try {
var _yield$poll$queryAnsw = yield poll.queryAnswers({
filter: paginationParams?.filter,
options: !next ? paginationParams?.options : {
...paginationParams?.options,
next
},
sort: {
updated_at: -1,
...paginationParams?.sort
}
}),
newNext = _yield$poll$queryAnsw.next,
answers = _yield$poll$queryAnsw.votes;
cursorRef.current = newNext || null;
setPollAnswers(prev => (0, _uniqBy.default)([...prev, ...answers], 'id'));
} catch (e) {
setError(e);
}
queryInProgress.current = false;
setLoading(false);
}), [paginationParams, poll]);
(0, _react.useEffect)(() => {
if (!loadFirstPage || pollAnswers.length) {
return;
}
loadMore();
}, [loadFirstPage, loadMore, pollAnswers]);
(0, _react.useEffect)(() => {
var castedListeners = ['poll.vote_casted', 'poll.vote_changed'].map(eventName => client.on(eventName, event => {
if (event.poll?.id && event.poll.id !== poll.id) {
return;
}
var vote = event.poll_vote;
if (vote && (0, _streamChat.isVoteAnswer)(vote)) {
setPollAnswers([vote, ...pollAnswers.filter(answer => answer.id !== vote.id)]);
}
}));
var removedListener = client.on('poll.vote_removed', event => {
if (event.poll?.id && event.poll.id !== poll.id) {
return;
}
var vote = event.poll_vote;
if (vote && (0, _streamChat.isVoteAnswer)(vote)) {
setPollAnswers(pollAnswers.filter(item => item.id !== vote.id));
}
});
return () => {
castedListeners.forEach(listener => listener.unsubscribe());
removedListener.unsubscribe();
};
}, [client, poll, pollAnswers]);
return {
error,
hasNextPage: cursorRef.current !== null,
loading,
loadMore,
next: cursorRef.current,
pollAnswers
};
};
exports.usePollAnswersPagination = usePollAnswersPagination;
//# sourceMappingURL=usePollAnswersPagination.js.map