feat: My Performance page + logout modal + sidebar cleanup

- My Performance page with KPI cards, ECharts, DatePicker, time utilization
- Sidecar: agent summary + AHT + performance aggregation endpoint
- Logout confirmation modal
- Removed Patients from CC agent nav

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-21 13:40:37 +05:30
parent 5ccfa9bca8
commit 721c2879ec
4 changed files with 669 additions and 0 deletions

View File

@@ -1,3 +1,4 @@
import { useState } from "react";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import {
faBullhorn,
@@ -12,10 +13,13 @@ import {
faPhone,
faPlug,
faUsers,
faArrowRightFromBracket,
} from "@fortawesome/pro-duotone-svg-icons";
import { faIcon } from "@/lib/icon-wrapper";
import { useAtom } from "jotai";
import { Link, useNavigate } from "react-router";
import { ModalOverlay, Modal, Dialog } from "@/components/application/modals/modal";
import { Button } from "@/components/base/buttons/button";
import { MobileNavigationHeader } from "@/components/application/app-navigation/base-components/mobile-header";
import { NavAccountCard } from "@/components/application/app-navigation/base-components/nav-account-card";
import { NavItemBase } from "@/components/application/app-navigation/base-components/nav-item";
@@ -66,6 +70,7 @@ const getNavSections = (role: string): NavSection[] => {
{ label: 'Call Center', items: [
{ label: 'Call Desk', href: '/', icon: IconPhone },
{ label: 'Call History', href: '/call-history', icon: IconClockRewind },
{ label: 'My Performance', href: '/my-performance', icon: IconChartMixed },
]},
];
}
@@ -103,7 +108,14 @@ export const Sidebar = ({ activeUrl = "/" }: SidebarProps) => {
const width = collapsed ? COLLAPSED_WIDTH : EXPANDED_WIDTH;
const [logoutOpen, setLogoutOpen] = useState(false);
const handleSignOut = () => {
setLogoutOpen(true);
};
const confirmSignOut = () => {
setLogoutOpen(false);
logout();
navigate('/login');
};
@@ -224,6 +236,35 @@ export const Sidebar = ({ activeUrl = "/" }: SidebarProps) => {
style={{ paddingLeft: width + 4 }}
className="invisible hidden lg:sticky lg:top-0 lg:bottom-0 lg:left-0 lg:block transition-all duration-200 ease-linear"
/>
{/* Logout confirmation modal */}
<ModalOverlay isOpen={logoutOpen} onOpenChange={setLogoutOpen} isDismissable>
<Modal className="max-w-md">
<Dialog>
<div className="rounded-xl bg-primary p-6 shadow-xl">
<div className="flex flex-col items-center text-center gap-4">
<div className="flex size-12 items-center justify-center rounded-full bg-warning-secondary">
<FontAwesomeIcon icon={faArrowRightFromBracket} className="size-5 text-fg-warning-primary" />
</div>
<div>
<h3 className="text-lg font-semibold text-primary">Sign out?</h3>
<p className="mt-1 text-sm text-tertiary">
You will be logged out of Helix Engage and your Ozonetel agent session will end. Any active calls will be disconnected.
</p>
</div>
<div className="flex w-full gap-3">
<Button size="md" color="secondary" className="flex-1" onClick={() => setLogoutOpen(false)}>
Cancel
</Button>
<Button size="md" color="primary-destructive" className="flex-1" onClick={confirmSignOut}>
Sign out
</Button>
</div>
</div>
</div>
</Dialog>
</Modal>
</ModalOverlay>
</>
);
};