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