1- import { useMemo } from "react" ;
1+ import { usePostHog } from "posthog-js/react" ;
2+ import { useEffect , useMemo , useState } from "react" ;
23import { useNavigate , useParams } from "react-router" ;
34import { useTheme } from "styled-components" ;
45import { useAgenticSelector } from "../../../containers/Agentic/hooks" ;
6+ import { useLogoutMutation } from "../../../redux/services/auth" ;
57import { useGetIncidentsQuery } from "../../../redux/services/digma" ;
68import type { IncidentResponseItem } from "../../../redux/services/types" ;
79import { sendUserActionTrackingEvent } from "../../../utils/actions/sendUserActionTrackingEvent" ;
810import { getThemeKind } from "../../common/App/styles" ;
11+ import { LogoutIcon } from "../../common/icons/16px/LogoutIcon" ;
12+ import { NewPopover } from "../../common/NewPopover" ;
913import { Tooltip } from "../../common/v3/Tooltip" ;
14+ import { MenuList } from "../../Navigation/common/MenuList" ;
15+ import { Popup } from "../../Navigation/common/Popup" ;
1016import { trackingEvents } from "../tracking" ;
1117import * as s from "./styles" ;
1218
@@ -22,11 +28,15 @@ export const Sidebar = () => {
2228 const params = useParams ( ) ;
2329 const incidentId = params . id ;
2430 const navigate = useNavigate ( ) ;
31+ const [ isUserMenuOpen , setIsUserMenuOpen ] = useState ( false ) ;
32+ const posthog = usePostHog ( ) ;
2533
2634 const { data } = useGetIncidentsQuery ( undefined , {
2735 pollingInterval : REFRESH_INTERVAL
2836 } ) ;
2937
38+ const [ logout , result ] = useLogoutMutation ( ) ;
39+
3040 const handleLogoLinkClick = ( ) => {
3141 sendUserActionTrackingEvent ( trackingEvents . LOGO_LINK_CLICKED ) ;
3242 } ;
@@ -39,6 +49,34 @@ export const Sidebar = () => {
3949 sendUserActionTrackingEvent ( trackingEvents . TEMPLATE_BUTTON_CLICKED ) ;
4050 } ;
4151
52+ const handleLogoutMenuItemClick = ( ) => {
53+ sendUserActionTrackingEvent ( trackingEvents . LOGOUT_MENU_ITEM_CLICKED ) ;
54+ void logout ( ) ;
55+ } ;
56+
57+ const handleUserMenuOpenChange = ( isOpen : boolean ) => {
58+ setIsUserMenuOpen ( isOpen ) ;
59+ } ;
60+
61+ useEffect ( ( ) => {
62+ let timeoutId : number | null = null ;
63+
64+ if ( result . isSuccess ) {
65+ if ( posthog . __loaded ) {
66+ posthog . reset ( ) ;
67+ }
68+ timeoutId = window . setTimeout ( ( ) => {
69+ window . location . reload ( ) ;
70+ } , 500 ) ;
71+ }
72+
73+ return ( ) => {
74+ if ( timeoutId ) {
75+ window . clearTimeout ( timeoutId ) ;
76+ }
77+ } ;
78+ } , [ posthog , result . isSuccess ] ) ;
79+
4280 const sortedIncidents = useMemo (
4381 ( ) =>
4482 [ ...( data ?. items ?? [ ] ) ] . sort (
@@ -84,10 +122,30 @@ export const Sidebar = () => {
84122 onClick = { handleTemplateButtonClick }
85123 isDisabled = { true }
86124 />
87- < s . UserInfo >
88- < s . Avatar > { userInitial } </ s . Avatar >
89- { user ?. email ?? "" }
90- </ s . UserInfo >
125+ < NewPopover
126+ content = {
127+ < Popup >
128+ < MenuList
129+ items = { [
130+ {
131+ id : "logout" ,
132+ icon : < LogoutIcon size = { 16 } color = { "currentColor" } /> ,
133+ label : "Log out" ,
134+ onClick : handleLogoutMenuItemClick
135+ }
136+ ] }
137+ />
138+ </ Popup >
139+ }
140+ onOpenChange = { handleUserMenuOpenChange }
141+ isOpen = { isUserMenuOpen }
142+ placement = { "bottom-start" }
143+ >
144+ < s . UserInfo >
145+ < s . Avatar > { userInitial } </ s . Avatar >
146+ { user ?. email ?? "" }
147+ </ s . UserInfo >
148+ </ NewPopover >
91149 </ s . Container >
92150 ) ;
93151} ;
0 commit comments