@@ -39,7 +39,12 @@ import {
3939} from "@posthog/ui/router/navigationBridge" ;
4040import { useAppView } from "@posthog/ui/router/useAppView" ;
4141import { track } from "@posthog/ui/shell/analytics" ;
42- import { type ComponentPropsWithRef , type ReactNode , useState } from "react" ;
42+ import {
43+ type ComponentPropsWithRef ,
44+ type ReactElement ,
45+ type ReactNode ,
46+ useState ,
47+ } from "react" ;
4348import { ActivityHoverCard } from "./ActivityHoverCard" ;
4449
4550const INBOX_REFETCH_INTERVAL_MS = 60_000 ;
@@ -133,10 +138,51 @@ function NavButton({
133138 ) ;
134139}
135140
141+ function ActivityHoverPopover ( { trigger } : { trigger : ReactElement } ) {
142+ const [ open , setOpen ] = useState ( false ) ;
143+
144+ return (
145+ < Popover open = { open } onOpenChange = { setOpen } >
146+ < PopoverTrigger
147+ openOnHover
148+ delay = { 300 }
149+ closeDelay = { 100 }
150+ onClick = { ( event ) => event . preventBaseUIHandler ( ) }
151+ render = { trigger }
152+ />
153+ { open && (
154+ < ActivityHoverCard side = "bottom" onClose = { ( ) => setOpen ( false ) } />
155+ ) }
156+ </ Popover >
157+ ) ;
158+ }
159+
160+ function ActivityNavItem ( {
161+ isActive,
162+ unreadCount,
163+ onNavigate,
164+ } : {
165+ isActive : boolean ;
166+ unreadCount : number ;
167+ onNavigate : ( ) => void ;
168+ } ) {
169+ const bell = (
170+ < NavButton
171+ icon = { < BellIcon size = { 16 } weight = { isActive ? "fill" : "regular" } /> }
172+ label = "Activity"
173+ isActive = { isActive }
174+ onClick = { onNavigate }
175+ badge = { < CountBadge count = { unreadCount } className = { ICON_BADGE_CLASS } /> }
176+ />
177+ ) ;
178+
179+ if ( isActive ) return bell ;
180+ return < ActivityHoverPopover trigger = { bell } /> ;
181+ }
182+
136183export function ChannelNav ( ) {
137184 const view = useAppView ( ) ;
138185 const loopsEnabled = useFeatureFlag ( LOOPS_FLAG , import . meta. env . DEV ) ;
139- const [ activityOpen , setActivityOpen ] = useState ( false ) ;
140186
141187 const { counts } = useInboxAllReports ( {
142188 ignoreFilters : true ,
@@ -178,44 +224,11 @@ export function ChannelNav() {
178224 < CountBadge count = { counts . pulls } className = { ICON_BADGE_CLASS } />
179225 }
180226 />
181- < Popover
182- open = { ! isActivity && activityOpen }
183- onOpenChange = { ( open ) => setActivityOpen ( ! isActivity && open ) }
184- >
185- < PopoverTrigger
186- openOnHover
187- delay = { 300 }
188- closeDelay = { 100 }
189- render = {
190- < NavButton
191- icon = {
192- < BellIcon
193- size = { 16 }
194- weight = { isActivity ? "fill" : "regular" }
195- />
196- }
197- label = "Activity"
198- isActive = { isActivity }
199- onClick = { ( ) => {
200- setActivityOpen ( false ) ;
201- withTrack ( "activity" , navigateToActivity ) ( ) ;
202- } }
203- badge = {
204- < CountBadge
205- count = { unseenActivity }
206- className = { ICON_BADGE_CLASS }
207- />
208- }
209- />
210- }
211- />
212- { ! isActivity && activityOpen && (
213- < ActivityHoverCard
214- side = "bottom"
215- onClose = { ( ) => setActivityOpen ( false ) }
216- />
217- ) }
218- </ Popover >
227+ < ActivityNavItem
228+ isActive = { isActivity }
229+ unreadCount = { unseenActivity }
230+ onNavigate = { withTrack ( "activity" , navigateToActivity ) }
231+ />
219232 < NavIcon
220233 icon = {
221234 < Lightning
0 commit comments