|
|
@@ -6,9 +6,9 @@ import loggerFactory from '~/utils/logger';
|
|
|
|
|
|
import AppContainer from '../../client/services/AppContainer';
|
|
|
import { withUnstatedContainers } from '../UnstatedUtils';
|
|
|
-import { IInAppNotification } from '../../interfaces/in-app-notification';
|
|
|
-import { InAppNotification } from './InAppNotification';
|
|
|
+import InAppNotificationList from './InAppNotificationList';
|
|
|
import SocketIoContainer from '../../client/services/SocketIoContainer';
|
|
|
+import { useSWRxInAppNotifications } from '../../stores/in-app-notification';
|
|
|
|
|
|
const logger = loggerFactory('growi:InAppNotificationDropdown');
|
|
|
|
|
|
@@ -21,9 +21,9 @@ const InAppNotificationDropdown: FC<Props> = (props: Props) => {
|
|
|
const { appContainer } = props;
|
|
|
|
|
|
const [count, setCount] = useState(0);
|
|
|
- const [isLoaded, setIsLoaded] = useState(false);
|
|
|
- const [notifications, setNotifications] = useState([]);
|
|
|
const [isOpen, setIsOpen] = useState(false);
|
|
|
+ const limit = 6;
|
|
|
+ const { data: inAppNotificationData } = useSWRxInAppNotifications(limit);
|
|
|
|
|
|
useEffect(() => {
|
|
|
initializeSocket(props);
|
|
|
@@ -60,23 +60,6 @@ const InAppNotificationDropdown: FC<Props> = (props: Props) => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- /**
|
|
|
- * TODO: Fetch notification list by GW-7473
|
|
|
- */
|
|
|
- const fetchNotificationList = async() => {
|
|
|
- const limit = 6;
|
|
|
- try {
|
|
|
- const paginationResult = await appContainer.apiv3Get('/in-app-notification/list', { limit });
|
|
|
-
|
|
|
- setNotifications(paginationResult.data.docs);
|
|
|
- setIsLoaded(true);
|
|
|
- }
|
|
|
- catch (err) {
|
|
|
- logger.error(err);
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
-
|
|
|
const toggleDropdownHandler = () => {
|
|
|
if (isOpen === false && count > 0) {
|
|
|
updateNotificationStatus();
|
|
|
@@ -84,67 +67,17 @@ const InAppNotificationDropdown: FC<Props> = (props: Props) => {
|
|
|
|
|
|
const newIsOpenState = !isOpen;
|
|
|
setIsOpen(newIsOpenState);
|
|
|
-
|
|
|
- if (newIsOpenState === true) {
|
|
|
- fetchNotificationList();
|
|
|
- }
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* TODO: Jump to the page by clicking on the notification by GW-7472
|
|
|
*/
|
|
|
|
|
|
- const notificationClickHandler = async(notification: Notification) => {
|
|
|
- try {
|
|
|
- // await this.props.crowi.apiPost('/notification.open', { id: notification._id });
|
|
|
- // jump to target page
|
|
|
- // window.location.href = notification.target.path;
|
|
|
- }
|
|
|
- catch (err) {
|
|
|
- logger.error(err);
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- const RenderUnLoadedInAppNotification = (): JSX.Element => {
|
|
|
- return (
|
|
|
- <i className="fa fa-spinner"></i>
|
|
|
- );
|
|
|
- };
|
|
|
-
|
|
|
- const RenderEmptyInAppNotification = (): JSX.Element => {
|
|
|
- return (
|
|
|
- // TODO: apply i18n by #78569
|
|
|
- <>You had no notifications, yet.</>
|
|
|
- );
|
|
|
- };
|
|
|
-
|
|
|
- // TODO: improve renderInAppNotificationList by GW-7535
|
|
|
- // refer to https://github.com/crowi/crowi/blob/eecf2bc821098d2516b58104fe88fae81497d3ea/client/components/Notification/Notification.tsx
|
|
|
- const RenderInAppNotificationList = () => {
|
|
|
- console.log('notificationsHoge', notifications);
|
|
|
|
|
|
+ const badge = count > 0 ? <span className="badge badge-pill badge-danger grw-notification-badge">{count}</span> : '';
|
|
|
|
|
|
- if (notifications.length === 0) {
|
|
|
- return <RenderEmptyInAppNotification />;
|
|
|
- }
|
|
|
- const notificationList = notifications.map((notification: IInAppNotification) => {
|
|
|
- return (
|
|
|
- <div className="d-flex flex-row" key={notification._id}>
|
|
|
- <InAppNotification notification={notification} onClick={notificationClickHandler} />
|
|
|
- </div>
|
|
|
- );
|
|
|
- });
|
|
|
- return <>{notificationList}</>;
|
|
|
- };
|
|
|
-
|
|
|
- const InAppNotificationContents = (): JSX.Element => {
|
|
|
- if (!isLoaded) {
|
|
|
- return <RenderUnLoadedInAppNotification />;
|
|
|
- }
|
|
|
- return <RenderInAppNotificationList />;
|
|
|
- };
|
|
|
|
|
|
- const badge = count > 0 ? <span className="badge badge-pill badge-danger grw-notification-badge">{count}</span> : '';
|
|
|
+ // const notifications = inAppNotificationData.docs;
|
|
|
|
|
|
return (
|
|
|
<Dropdown className="notification-wrapper" isOpen={isOpen} toggle={toggleDropdownHandler}>
|
|
|
@@ -154,7 +87,7 @@ const InAppNotificationDropdown: FC<Props> = (props: Props) => {
|
|
|
</button>
|
|
|
</DropdownToggle>
|
|
|
<DropdownMenu className="px-2" right>
|
|
|
- <InAppNotificationContents />
|
|
|
+ <InAppNotificationList inAppNotificationData={inAppNotificationData} />
|
|
|
<DropdownItem divider />
|
|
|
{/* TODO: Able to show all notifications by #79317 */}
|
|
|
<a className="dropdown-item d-flex justify-content-center" href="/me/all-in-app-notifications">See All</a>
|