import React, {
useState, useEffect, useRef, type JSX,
} from 'react';
import { useTranslation } from 'next-i18next';
import { useRipple } from 'react-use-ripple';
import {
Dropdown, DropdownToggle, DropdownMenu, DropdownItem,
} from 'reactstrap';
import { useSWRxInAppNotifications, useSWRxInAppNotificationStatus } from '~/stores/in-app-notification';
import { useDefaultSocket } from '~/stores/socket-io';
import InAppNotificationList from './InAppNotificationList';
export const InAppNotificationDropdown = (): JSX.Element => {
const { t } = useTranslation('commons');
const [isOpen, setIsOpen] = useState(false);
const limit = 6;
const { data: socket } = useDefaultSocket();
const { data: inAppNotificationData, mutate: mutateInAppNotificationData } = useSWRxInAppNotifications(
limit, undefined, undefined,
{ revalidateOnFocus: isOpen },
);
const { data: inAppNotificationUnreadStatusCount, mutate: mutateInAppNotificationUnreadStatusCount } = useSWRxInAppNotificationStatus();
// ripple
const buttonRef = useRef(null);
useRipple(buttonRef, { rippleColor: 'rgba(255, 255, 255, 0.3)' });
useEffect(() => {
if (socket != null) {
socket.on('notificationUpdated', () => {
mutateInAppNotificationUnreadStatusCount();
});
// clean up
return () => {
socket.off('notificationUpdated');
};
}
}, [mutateInAppNotificationUnreadStatusCount, socket]);
const toggleDropdownHandler = async() => {
if (!isOpen && inAppNotificationUnreadStatusCount != null && inAppNotificationUnreadStatusCount > 0) {
mutateInAppNotificationUnreadStatusCount();
}
const newIsOpenState = !isOpen;
if (newIsOpenState) {
mutateInAppNotificationData();
}
setIsOpen(newIsOpenState);
};
let badge;
if (inAppNotificationUnreadStatusCount != null && inAppNotificationUnreadStatusCount > 0) {
badge = {inAppNotificationUnreadStatusCount};
}
else {
badge = '';
}
return (
notifications {badge}
{ isOpen && (
{ inAppNotificationData != null && inAppNotificationData.docs.length === 0
// no items
? {t('in_app_notification.no_unread_messages')}
// render DropdownItem
:
}
{ t('in_app_notification.see_all') }
) }
);
};