stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
116 lines • 4.36 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.usePollOptionVotesPagination = 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 usePollOptionVotesPagination = ({
loadFirstPage = true,
option,
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),
votes = _useState2[0],
setVotes = _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 optionFilter = (0, _react.useMemo)(() => ({
option_id: option.id
}), [option.id]);
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$queryOpti = yield poll.queryOptionVotes({
filter: {
...optionFilter,
...(paginationParams == null ? void 0 : paginationParams.filter)
},
options: !next ? paginationParams == null ? void 0 : paginationParams.options : {
...(paginationParams == null ? void 0 : paginationParams.options),
next
},
sort: {
created_at: -1,
...(paginationParams == null ? void 0 : paginationParams.sort)
}
}),
newNext = _yield$poll$queryOpti.next,
_votes = _yield$poll$queryOpti.votes;
cursorRef.current = newNext || null;
setVotes(prev => (0, _uniqBy.default)([...prev, ..._votes], 'id'));
} catch (e) {
setError(e);
}
queryInProgress.current = false;
setLoading(false);
}), [optionFilter, paginationParams, poll]);
(0, _react.useEffect)(() => {
if (!loadFirstPage || votes.length) {
return;
}
loadMore();
}, [loadFirstPage, loadMore, votes]);
(0, _react.useEffect)(() => {
var castedListeners = ['poll.vote_casted', 'poll.vote_changed'].map(eventName => client.on(eventName, event => {
var _event$poll;
if ((_event$poll = event.poll) != null && _event$poll.id && event.poll.id !== poll.id) {
return;
}
var vote = event.poll_vote;
if (vote && !(0, _streamChat.isVoteAnswer)(vote)) {
if (vote.option_id === option.id) {
setVotes([vote, ...votes.filter(v => v.id !== vote.id)]);
} else if (eventName === 'poll.vote_changed') {
setVotes(votes.filter(v => v.id !== vote.id));
}
}
}));
var removedListener = client.on('poll.vote_removed', event => {
var _event$poll2;
if ((_event$poll2 = event.poll) != null && _event$poll2.id && event.poll.id !== poll.id) {
return;
}
var vote = event.poll_vote;
if (vote && !(0, _streamChat.isVoteAnswer)(vote) && vote.option_id === option.id) {
setVotes(votes.filter(v => v.id !== vote.id));
}
});
return () => {
castedListeners.forEach(listener => listener.unsubscribe());
removedListener.unsubscribe();
};
}, [client, option, poll, votes]);
return {
error,
hasNextPage: cursorRef.current !== null,
loading,
loadMore,
next: cursorRef.current,
votes
};
};
exports.usePollOptionVotesPagination = usePollOptionVotesPagination;
//# sourceMappingURL=usePollOptionVotesPagination.js.map