diff --git a/src/Nav/MessageMenu.js b/src/Nav/MessageMenu.js index f27afc12a..a72e042d6 100644 --- a/src/Nav/MessageMenu.js +++ b/src/Nav/MessageMenu.js @@ -6,7 +6,12 @@ import { useTranslation } from 'react-i18next'; import { ReactComponent as ChatIcon } from '../common/images/icons/chat-icon.svg'; import { allSubjects } from '../selectors/subjects'; -import { fetchAllMessages, fetchMessagesSuccess, updateMessageFromRealtime } from '../ducks/messaging'; +import { + fetchAllMessages, + fetchMessagesSuccess, + fetchUnreadMessagesCount, + updateMessageFromRealtime, updateUnreadMessagesCount +} from '../ducks/messaging'; import MessageContext from '../InReach/context'; import Badge from '../Badge'; @@ -19,6 +24,7 @@ import styles from './styles.module.scss'; const RADIO_MESSAGE_REALTIME = 'radio_message'; const SLEEP_DETECTION_INTERVAL = 60000; +const MENU_MESSAGES_PAGE_SIZE = 100; const MessageMenu = () => { const { t } = useTranslation('top-bar', { keyPrefix: 'nav.messageMenu' }); @@ -29,23 +35,31 @@ const MessageMenu = () => { const [selectedSubject, setSelectedSubject] = useState(null); - const unreads = state.results.filter((message) => !message.read); - const badgeCount = unreads.length > 9 ? '9+' : unreads.length; + const { unreadMessagesCount } = state; + const badgeCount = unreadMessagesCount > 9 ? '9+' : unreadMessagesCount; const canShowMessageMenu = useMemo( () => !!state.results.length || !!subjects.filter((subject) => !!subject?.messaging?.length).length, [state.results.length, subjects] ); + const checkForUnreadMessages = useCallback(() => { + fetchUnreadMessagesCount() + .then(({ data: { data: { count } } }) => dispatch(updateUnreadMessagesCount(count))) + .catch((error) => console.warn('error checking for unread messages', { error })); + }, [dispatch]); + const fetchMenuMessages = useCallback(() => { - fetchAllMessages({ page_size: 100 }) - .then((results = []) => dispatch(fetchMessagesSuccess({ results }))) + fetchAllMessages({ page_size: MENU_MESSAGES_PAGE_SIZE }) + .then((results = []) => { + dispatch(fetchMessagesSuccess({ results })); + }) .catch((error) => console.warn('error fetching messages', { error })); }, [dispatch]); useEffect(() => { - fetchMenuMessages(); - }, [dispatch, fetchMenuMessages]); + checkForUnreadMessages(); + }, [checkForUnreadMessages, state.results]); return canShowMessageMenu ? { - {!!unreads.length && } + {!!unreadMessagesCount && } - setSelectedSubject(subject)} selectedSubject={selectedSubject} /> + setSelectedSubject(subject)} + selectedSubject={selectedSubject} /> ({ refresh, }); - export const updateMessageFromRealtime = payload => ({ type: SOCKET_MESSAGE_UPDATE, payload, @@ -33,8 +33,15 @@ export const removeMessageById = id => ({ payload: id, }); +export const updateUnreadMessagesCount = (payload) => ({ + type: UPDATE_UNREAD_MESSAGES_COUNT, + payload, +}); + const { get, post } = axios; +export const fetchUnreadMessagesCount = () => axios.get(`${MESSAGING_API_URL}?include_additional_data=false&page_size=0&read=false`); + export const fetchMessages = (params = {}) => { const paramString = objectToParamString( { include_additional_data: false, page_size: 25, ...params }, @@ -67,6 +74,7 @@ export const INITIAL_MESSAGE_LIST_STATE = { next: null, previous: null, count: 0, + unreadMessagesCount: 0, }; export const messageListReducer = (state = INITIAL_MESSAGE_LIST_STATE, action) => { const { refresh, type, payload } = action; @@ -95,6 +103,13 @@ export const messageListReducer = (state = INITIAL_MESSAGE_LIST_STATE, action) = }; } + if (type === UPDATE_UNREAD_MESSAGES_COUNT) { + return { + ...state, + unreadMessagesCount: payload, + }; + } + if (type === REMOVE_MESSAGE) { return { ...state,