diff --git a/apiserver/plane/app/serializers/notification.py b/apiserver/plane/app/serializers/notification.py
index c6713a354..248441bc8 100644
--- a/apiserver/plane/app/serializers/notification.py
+++ b/apiserver/plane/app/serializers/notification.py
@@ -3,11 +3,15 @@ from .base import BaseSerializer
from .user import UserLiteSerializer
from plane.db.models import Notification, UserNotificationPreference
+# Third Party imports
+from rest_framework import serializers
+
class NotificationSerializer(BaseSerializer):
triggered_by_details = UserLiteSerializer(
read_only=True, source="triggered_by"
)
+ is_inbox_issue = serializers.BooleanField(read_only=True)
class Meta:
model = Notification
diff --git a/apiserver/plane/app/views/notification/base.py b/apiserver/plane/app/views/notification/base.py
index 2ef8ab511..12997241c 100644
--- a/apiserver/plane/app/views/notification/base.py
+++ b/apiserver/plane/app/views/notification/base.py
@@ -47,10 +47,18 @@ class NotificationViewSet(BaseViewSet, BasePaginator):
type = request.GET.get("type", "all")
q_filters = Q()
+ inbox_issue = Issue.objects.filter(
+ pk=OuterRef("entity_identifier"),
+ issue_inbox__status__in=[0, 2, -2],
+ workspace__slug=self.kwargs.get("slug"),
+ )
+
notifications = (
Notification.objects.filter(
workspace__slug=slug, receiver_id=request.user.id
)
+ .filter(entity_name="issue")
+ .annotate(is_inbox_issue=Exists(inbox_issue))
.select_related("workspace", "project", "triggered_by", "receiver")
.order_by("snoozed_till", "-created_at")
)
@@ -202,46 +210,19 @@ class NotificationViewSet(BaseViewSet, BasePaginator):
class UnreadNotificationEndpoint(BaseAPIView):
def get(self, request, slug):
# Watching Issues Count
- subscribed_issues_count = Notification.objects.filter(
+ unread_notifications_count = Notification.objects.filter(
workspace__slug=slug,
receiver_id=request.user.id,
read_at__isnull=True,
archived_at__isnull=True,
snoozed_till__isnull=True,
- entity_identifier__in=IssueSubscriber.objects.filter(
- workspace__slug=slug, subscriber_id=request.user.id
- ).values_list("issue_id", flat=True),
- ).count()
-
- # My Issues Count
- my_issues_count = Notification.objects.filter(
- workspace__slug=slug,
- receiver_id=request.user.id,
- read_at__isnull=True,
- archived_at__isnull=True,
- snoozed_till__isnull=True,
- entity_identifier__in=IssueAssignee.objects.filter(
- workspace__slug=slug, assignee_id=request.user.id
- ).values_list("issue_id", flat=True),
- ).count()
-
- # Created Issues Count
- created_issues_count = Notification.objects.filter(
- workspace__slug=slug,
- receiver_id=request.user.id,
- read_at__isnull=True,
- archived_at__isnull=True,
- snoozed_till__isnull=True,
- entity_identifier__in=Issue.objects.filter(
- workspace__slug=slug, created_by=request.user
- ).values_list("pk", flat=True),
).count()
return Response(
{
- "subscribed_issues": subscribed_issues_count,
- "my_issues": my_issues_count,
- "created_issues": created_issues_count,
+ "total_unread_notifications_count": int(
+ unread_notifications_count
+ )
},
status=status.HTTP_200_OK,
)
diff --git a/packages/types/src/workspace-notifications.d.ts b/packages/types/src/workspace-notifications.d.ts
index 95d93b890..0e5bb0975 100644
--- a/packages/types/src/workspace-notifications.d.ts
+++ b/packages/types/src/workspace-notifications.d.ts
@@ -50,6 +50,7 @@ export type TNotification = {
read_at: string | undefined;
archived_at: string | undefined;
snoozed_till: string | undefined;
+ is_inbox_issue: boolean | undefined;
workspace: string | undefined;
project: string | undefined;
created_at: string | undefined;
@@ -84,7 +85,13 @@ export type TNotificationPaginatedInfo = {
// notification count
export type TUnreadNotificationsCount = {
- created_issues: number | undefined;
- my_issues: number | undefined;
- subscribed_issues: number | undefined;
+ total_unread_notifications_count: number;
+};
+
+export type TCurrentSelectedNotification = {
+ workspace_slug: string | undefined;
+ project_id: string | undefined;
+ notification_id: string | undefined;
+ issue_id: string | undefined;
+ is_inbox_issue: boolean | undefined;
};
diff --git a/web/app/[workspaceSlug]/(projects)/notifications/page.tsx b/web/app/[workspaceSlug]/(projects)/notifications/page.tsx
index 8a73d549f..0e29a84d1 100644
--- a/web/app/[workspaceSlug]/(projects)/notifications/page.tsx
+++ b/web/app/[workspaceSlug]/(projects)/notifications/page.tsx
@@ -3,19 +3,25 @@
import { observer } from "mobx-react";
import useSWR from "swr";
// components
+import { LogoSpinner } from "@/components/common";
import { PageHead } from "@/components/core";
+import { InboxContentRoot } from "@/components/inbox";
import { IssuePeekOverview } from "@/components/issues";
// constants
import { ENotificationLoader, ENotificationQueryParamType } from "@/constants/notification";
// hooks
-import { useWorkspace, useWorkspaceNotifications } from "@/hooks/store";
+import { useUser, useWorkspace, useWorkspaceNotifications } from "@/hooks/store";
const WorkspaceDashboardPage = observer(() => {
// hooks
const { currentWorkspace } = useWorkspace();
- const { notificationIdsByWorkspaceId, getNotifications } = useWorkspaceNotifications();
+ const { currentSelectedNotification, notificationIdsByWorkspaceId, getNotifications } = useWorkspaceNotifications();
+ const {
+ membership: { fetchUserProjectInfo },
+ } = useUser();
// derived values
const pageTitle = currentWorkspace?.name ? `${currentWorkspace?.name} - Notifications` : undefined;
+ const { workspace_slug, project_id, issue_id, is_inbox_issue } = currentSelectedNotification;
// fetch workspace notifications
const notificationMutation =
@@ -29,15 +35,42 @@ const WorkspaceDashboardPage = observer(() => {
useSWR(
currentWorkspace?.slug ? `WORKSPACE_NOTIFICATION` : null,
currentWorkspace?.slug
- ? async () => getNotifications(currentWorkspace?.slug, notificationMutation, notificationLoader)
+ ? () => getNotifications(currentWorkspace?.slug, notificationMutation, notificationLoader)
: null
);
+ // fetching user project member info
+ const { isLoading: projectMemberInfoLoader } = useSWR(
+ workspace_slug && project_id && is_inbox_issue
+ ? `PROJECT_MEMBER_PERMISSION_INFO_${workspace_slug}_${project_id}`
+ : null,
+ workspace_slug && project_id && is_inbox_issue ? () => fetchUserProjectInfo(workspace_slug, project_id) : null
+ );
+
return (
<>