UNPKG

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
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