fix(notifications): dismiss bell badge when dropdown opens
continuous-integration/drone/push Build is passing
continuous-integration/drone/push Build is passing
Hide the unread count badge after the user opens notifications, and show it again only when new unread items arrive. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -17,14 +17,16 @@ import { TNotificationDetailsResponse } from "@/lib/api/types/NotificationHistor
|
|||||||
import { cn, sanitizeHtmlWithStyles } from "@/lib/utils";
|
import { cn, sanitizeHtmlWithStyles } from "@/lib/utils";
|
||||||
import { capitalize, unixToDate } from "@/utils/shared";
|
import { capitalize, unixToDate } from "@/utils/shared";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { useEffect, useMemo, useState } from "react";
|
import { useEffect, useMemo, useRef, useState } from "react";
|
||||||
import { BellIcon } from "./icons";
|
import { BellIcon } from "./icons";
|
||||||
import NotificationList from "./notification-list";
|
import NotificationList from "./notification-list";
|
||||||
|
|
||||||
export function Notification() {
|
export function Notification() {
|
||||||
const [isOpen, setIsOpen] = useState(false);
|
const [isOpen, setIsOpen] = useState(false);
|
||||||
|
const [isBadgeVisible, setIsBadgeVisible] = useState(true);
|
||||||
const [unreadNotificationCount, setUnreadNotificationCount] =
|
const [unreadNotificationCount, setUnreadNotificationCount] =
|
||||||
useState<number>(0);
|
useState<number>(0);
|
||||||
|
const previousUnreadCountRef = useRef(0);
|
||||||
const [isModalOpen, setIsModalOpen] = useState(false);
|
const [isModalOpen, setIsModalOpen] = useState(false);
|
||||||
const [currentNotification, setCurrentNotification] =
|
const [currentNotification, setCurrentNotification] =
|
||||||
useState<TNotificationDetailsResponse | null>(null);
|
useState<TNotificationDetailsResponse | null>(null);
|
||||||
@@ -36,7 +38,14 @@ export function Notification() {
|
|||||||
const { user } = useUser();
|
const { user } = useUser();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setUnreadNotificationCount(unreadNotifications?.data.length ?? 0);
|
const count = unreadNotifications?.data.length ?? 0;
|
||||||
|
setUnreadNotificationCount(count);
|
||||||
|
|
||||||
|
if (count > previousUnreadCountRef.current) {
|
||||||
|
setIsBadgeVisible(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
previousUnreadCountRef.current = count;
|
||||||
}, [unreadNotifications]);
|
}, [unreadNotifications]);
|
||||||
|
|
||||||
const notificationHistoryHref = useMemo(() => {
|
const notificationHistoryHref = useMemo(() => {
|
||||||
@@ -56,14 +65,20 @@ export function Notification() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Dropdown isOpen={isOpen} setIsOpen={setIsOpen}>
|
<Dropdown
|
||||||
|
isOpen={isOpen}
|
||||||
|
setIsOpen={(open) => {
|
||||||
|
setIsOpen(open);
|
||||||
|
if (open) setIsBadgeVisible(false);
|
||||||
|
}}
|
||||||
|
>
|
||||||
<DropdownTrigger
|
<DropdownTrigger
|
||||||
className="shadow-theme-xs grid size-12 place-items-center rounded-full border border-stroke/70 bg-white/75 text-dark outline-none backdrop-blur-md transition-colors hover:text-primary focus-visible:border-primary focus-visible:text-primary dark:border-dark-3 dark:bg-dark-2/75 dark:text-white dark:focus-visible:border-primary"
|
className="shadow-theme-xs grid size-12 place-items-center rounded-full border border-stroke/70 bg-white/75 text-dark outline-none backdrop-blur-md transition-colors hover:text-primary focus-visible:border-primary focus-visible:text-primary dark:border-dark-3 dark:bg-dark-2/75 dark:text-white dark:focus-visible:border-primary"
|
||||||
aria-label="View Notifications"
|
aria-label="View Notifications"
|
||||||
>
|
>
|
||||||
<span className="relative">
|
<span className="relative">
|
||||||
<BellIcon />
|
<BellIcon />
|
||||||
{unreadNotificationCount > 0 && (
|
{isBadgeVisible && unreadNotificationCount > 0 && (
|
||||||
<span
|
<span
|
||||||
className={cn(
|
className={cn(
|
||||||
"absolute -right-1.5 -top-1.5 z-1 grid min-w-[18px] place-items-center rounded-full bg-gradient-to-br from-rose-500 to-red-600 px-1 text-[10px] font-bold leading-none text-white shadow-[0_2px_8px_rgba(239,68,68,0.55)] ring-2 ring-white dark:ring-dark-2",
|
"absolute -right-1.5 -top-1.5 z-1 grid min-w-[18px] place-items-center rounded-full bg-gradient-to-br from-rose-500 to-red-600 px-1 text-[10px] font-bold leading-none text-white shadow-[0_2px_8px_rgba(239,68,68,0.55)] ring-2 ring-white dark:ring-dark-2",
|
||||||
|
|||||||
Reference in New Issue
Block a user