UNPKG

stream-chat-react-native-core

Version:

The official React Native and Expo components for Stream Chat, a service for building chat applications

122 lines 4.65 kB
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.useQueryReminders = void 0; var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = require("react"); var _useStateStore2 = require("./useStateStore"); var _ChatContext = require("../contexts/chatContext/ChatContext"); var selector = nextValue => ({ isLoading: nextValue.isLoading, items: nextValue.items }); var sortRemindersByDate = reminders => { return reminders.sort((a, b) => { if (!a.remind_at || !b.remind_at) { return 0; } return new Date(a.remind_at).getTime() - new Date(b.remind_at).getTime(); }); }; var isReminderOverdue = reminder => { return reminder?.remind_at && new Date(reminder.remind_at) < new Date(); }; var isReminderUpcoming = reminder => { return reminder?.remind_at && new Date(reminder.remind_at) > new Date(); }; var showAllReminders = filters => { return filters && Object.keys(filters).length === 0; }; var useQueryReminders = () => { var _useChatContext = (0, _ChatContext.useChatContext)(), client = _useChatContext.client; var _useStateStore = (0, _useStateStore2.useStateStore)(client.reminders.paginator.state, selector), isLoading = _useStateStore.isLoading, items = _useStateStore.items; var _useState = (0, _react.useState)(items ?? []), _useState2 = (0, _slicedToArray2.default)(_useState, 2), data = _useState2[0], setData = _useState2[1]; var deletedOrUpdatedRemindersCache = (0, _react.useRef)({}); (0, _react.useEffect)(() => { setData(prevData => { if (!items) { return prevData; } var newData = []; items.forEach(reminder => { if (prevData.includes(reminder)) { newData.push(reminder); } else { if (!deletedOrUpdatedRemindersCache.current[reminder.message_id]) { newData.push(reminder); } } }); return newData; }); }, [items, client.reminders.paginator.filters]); (0, _react.useEffect)(() => { var handleReminderDeleted = event => { if (!event.reminder?.message_id) { return; } deletedOrUpdatedRemindersCache.current[event.reminder.message_id] = event.reminder; setData(prevData => { return prevData.filter(item => item.message_id !== event.reminder?.message_id); }); }; var handleReminderCreated = event => { setData(prevData => { if (!event.reminder) { return prevData; } var updatedData = [...prevData, event.reminder]; return sortRemindersByDate(updatedData); }); }; var handleReminderUpdated = event => { var reminder = event.reminder; if (!reminder || showAllReminders(client.reminders.paginator.filters)) { return; } deletedOrUpdatedRemindersCache.current[reminder.message_id] = reminder; setData(prevData => { var existingReminder = prevData.find(item => item.message_id === reminder?.message_id); if (!existingReminder) { return prevData; } if (existingReminder.remind_at && !event.reminder?.remind_at) { return prevData.filter(item => item.message_id !== event.reminder?.message_id); } if (!existingReminder.remind_at && event.reminder?.remind_at) { return prevData.filter(item => item.message_id !== event.reminder?.message_id); } if (isReminderOverdue(existingReminder) && !isReminderOverdue(event.reminder)) { return prevData.filter(item => item.message_id !== event.reminder?.message_id); } if (isReminderUpcoming(existingReminder) && !isReminderUpcoming(event.reminder)) { return prevData.filter(item => item.message_id !== event.reminder?.message_id); } return prevData; }); }; var listeners = [client.on('reminder.created', handleReminderCreated), client.on('reminder.deleted', handleReminderDeleted), client.on('reminder.updated', handleReminderUpdated)]; return () => { listeners.forEach(l => l.unsubscribe()); }; }, [client]); var loadNext = (0, _react.useCallback)((0, _asyncToGenerator2.default)(function* () { yield client.reminders.queryNextReminders(); }), [client.reminders]); return { data, isLoading, loadNext, setData }; }; exports.useQueryReminders = useQueryReminders; //# sourceMappingURL=useQueryReminders.js.map