import React, { useState, useEffect, FC } from 'react'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem, } from 'reactstrap'; import { useTranslation } from 'react-i18next'; import loggerFactory from '~/utils/logger'; import { apiv3Get, apiv3Post } from '~/client/util/apiv3-client'; import { withUnstatedContainers } from '../UnstatedUtils'; import InAppNotificationList from './InAppNotificationList'; import SocketIoContainer from '~/client/services/SocketIoContainer'; import { useSWRxInAppNotifications, useSWRxInAppNotificationStatus } from '~/stores/in-app-notification'; const logger = loggerFactory('growi:InAppNotificationDropdown'); type Props = { socketIoContainer: SocketIoContainer, }; const InAppNotificationDropdown: FC = (props: Props) => { const { t } = useTranslation(); const [count, setCount] = useState(0); const [isOpen, setIsOpen] = useState(false); const limit = 6; const { data: inAppNotificationData, mutate } = useSWRxInAppNotifications(limit); const { data: inAppNotificationStatusData } = useSWRxInAppNotificationStatus(); const initializeSocket = (props) => { const socket = props.socketIoContainer.getSocket(); socket.on('notificationUpdated', (data: { userId: string, count: number }) => { setCount(data.count); }); }; const updateNotificationStatus = async() => { try { await apiv3Post('/in-app-notification/read'); setCount(0); } catch (err) { logger.error(err); } }; const fetchNotificationStatus = async() => { try { // const res = await apiv3Get('/in-app-notification/status'); // const { count } = res.data; if (inAppNotificationStatusData != null) { console.log('inAppNotificationStatusData', inAppNotificationStatusData); const { count } = inAppNotificationStatusData; setCount(count); } } catch (err) { logger.error(err); } }; useEffect(() => { initializeSocket(props); fetchNotificationStatus(); }, [props]); const toggleDropdownHandler = () => { if (!isOpen && count > 0) { updateNotificationStatus(); } const newIsOpenState = !isOpen; if (newIsOpenState) { mutate(); } setIsOpen(newIsOpenState); }; const badge = count > 0 ? {count} : ''; return ( { t('in_app_notification.see_all') } ); }; /** * Wrapper component for using unstated */ const InAppNotificationDropdownWrapper = withUnstatedContainers(InAppNotificationDropdown, [SocketIoContainer]); export default InAppNotificationDropdownWrapper;