varminer-app-header 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"AppHeader.d.ts","sourceRoot":"","sources":["../src/AppHeader.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,sBAAsB,CAAC;AAe9B,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAgfvC,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"AppHeader.d.ts","sourceRoot":"","sources":["../src/AppHeader.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAe,MAAM,SAAS,CAAC;AAEtD,OAAO,sBAAsB,CAAC;AAe9B,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAyhBvC,CAAC;AAEF,eAAe,SAAS,CAAC"}
package/dist/index.esm.js CHANGED
@@ -34,6 +34,82 @@ const DrawerProvider = ({ children }) => {
34
34
  };
35
35
  const useDrawer = () => React.useContext(DrawerContext);
36
36
 
37
+ /**
38
+ * Utility functions to get user data from localStorage
39
+ */
40
+ /**
41
+ * Gets user profile data from localStorage
42
+ * Returns user info including name, email, role, etc.
43
+ */
44
+ const getUserDataFromStorage = () => {
45
+ const userDbString = localStorage.getItem("persist:userdb");
46
+ if (userDbString) {
47
+ try {
48
+ const parsedOuter = JSON.parse(userDbString);
49
+ // Helper function to parse nested JSON strings
50
+ const parseNested = (value) => {
51
+ if (typeof value === 'string') {
52
+ try {
53
+ return JSON.parse(value);
54
+ }
55
+ catch {
56
+ return value;
57
+ }
58
+ }
59
+ return value;
60
+ };
61
+ // Try to get user data from different possible locations
62
+ let userData = null;
63
+ // Check for userDetails
64
+ if (parsedOuter.userDetails) {
65
+ const parsedUserDetails = parseNested(parsedOuter.userDetails);
66
+ userData = parsedUserDetails.user || parsedUserDetails.data || parsedUserDetails;
67
+ }
68
+ // Check for user reducer/state
69
+ if (!userData && parsedOuter.user) {
70
+ const parsedUser = parseNested(parsedOuter.user);
71
+ userData = parsedUser.user || parsedUser.data || parsedUser.currentUser || parsedUser;
72
+ }
73
+ // Check for authDetails for user info
74
+ if (!userData && parsedOuter.authDetails) {
75
+ const parsedAuthDetails = parseNested(parsedOuter.authDetails);
76
+ // Check auth object
77
+ if (parsedAuthDetails.auth) {
78
+ userData = parsedAuthDetails.auth.user || parsedAuthDetails.auth.userData;
79
+ }
80
+ // Check root of authDetails
81
+ if (!userData) {
82
+ userData = parsedAuthDetails.user || parsedAuthDetails.userData || parsedAuthDetails.currentUser;
83
+ }
84
+ }
85
+ // Check for profile
86
+ if (!userData && parsedOuter.profile) {
87
+ const parsedProfile = parseNested(parsedOuter.profile);
88
+ userData = parsedProfile.user || parsedProfile.data || parsedProfile;
89
+ }
90
+ if (userData) {
91
+ // Build name from various possible fields
92
+ let name = userData.name || userData.fullName || userData.userName || "";
93
+ if (!name && (userData.firstName || userData.lastName)) {
94
+ name = [userData.firstName, userData.lastName].filter(Boolean).join(' ');
95
+ }
96
+ return {
97
+ name: name || "",
98
+ email: userData.email || userData.emailAddress || "",
99
+ role: userData.role || userData.userRole || userData.designation || userData.title || "",
100
+ avatar: userData.avatar || userData.profilePicture || userData.imageUrl || userData.profileImage,
101
+ initials: userData.initials,
102
+ };
103
+ }
104
+ }
105
+ catch (err) {
106
+ console.error("Error parsing user data from localStorage:", err);
107
+ return null;
108
+ }
109
+ }
110
+ return null;
111
+ };
112
+
37
113
  // Default routes - absolute paths from root
38
114
  const DEFAULT_ROUTES = {
39
115
  settings: "/account/overview",
@@ -45,18 +121,57 @@ const DEFAULT_LOGO = {
45
121
  first: "VAR",
46
122
  second: "MINER",
47
123
  };
48
- const AppHeader = ({ user = {
49
- name: "Shivam Kumar",
50
- email: "shivam@redcliffelabs.com",
51
- role: "Lab Technician",
52
- initials: "SK",
53
- }, isOnline = true, logo, notificationCount = 0, messageCount, onDrawerToggle, routes, onSettingsClick, onProfileClick, onSignOutClick, className, }) => {
124
+ const AppHeader = ({ user: userProp, isOnline = true, logo, notificationCount = 0, messageCount, onDrawerToggle, routes, onSettingsClick, onProfileClick, onSignOutClick, className, isDrawerOpen: isDrawerOpenProp, }) => {
54
125
  // Use provided logo or default
55
126
  const finalLogo = logo ?? DEFAULT_LOGO;
56
- const { isDrawerOpen, toggleDrawer } = useDrawer();
127
+ const { isDrawerOpen: isDrawerOpenContext, toggleDrawer, openDrawer, closeDrawer } = useDrawer();
57
128
  const [anchorEl, setAnchorEl] = React__default.useState(null);
58
129
  const [mobileMoreAnchorEl, setMobileMoreAnchorEl] = React__default.useState(null);
130
+ const [user, setUser] = React__default.useState(() => {
131
+ // Initialize with prop if provided, otherwise try localStorage, otherwise default
132
+ if (userProp) {
133
+ return userProp;
134
+ }
135
+ const storedUser = getUserDataFromStorage();
136
+ if (storedUser && storedUser.name && storedUser.email) {
137
+ return storedUser;
138
+ }
139
+ return {
140
+ name: "Shiva Kumar",
141
+ email: "shivam@redcliffelabs.com",
142
+ role: "Lab Technician",
143
+ initials: "SK",
144
+ };
145
+ });
146
+ // Sync context with prop if provided (for initial state and external control)
147
+ const prevPropRef = React__default.useRef(isDrawerOpenProp);
148
+ React__default.useEffect(() => {
149
+ if (isDrawerOpenProp !== undefined && prevPropRef.current !== isDrawerOpenProp) {
150
+ if (isDrawerOpenProp) {
151
+ openDrawer();
152
+ }
153
+ else {
154
+ closeDrawer();
155
+ }
156
+ prevPropRef.current = isDrawerOpenProp;
157
+ }
158
+ }, [isDrawerOpenProp, openDrawer, closeDrawer]);
159
+ // Always use context state for icon display (since that's what actually changes on click)
160
+ // This ensures the icon updates immediately when user clicks, regardless of prop
161
+ const isDrawerOpen = isDrawerOpenContext;
59
162
  const isMobileMenuOpen = Boolean(mobileMoreAnchorEl);
163
+ // Update user state when prop changes or fetch from localStorage
164
+ React__default.useEffect(() => {
165
+ if (userProp) {
166
+ setUser(userProp);
167
+ }
168
+ else {
169
+ const storedUser = getUserDataFromStorage();
170
+ if (storedUser && storedUser.name && storedUser.email) {
171
+ setUser(storedUser);
172
+ }
173
+ }
174
+ }, [userProp]);
60
175
  // Merge provided routes with defaults - all routes are absolute from root
61
176
  const finalRoutes = {
62
177
  settings: routes?.settings ?? DEFAULT_ROUTES.settings,
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/DrawerContext.tsx","../src/AppHeader.tsx"],"sourcesContent":["import * as React from \"react\";\r\n\r\ninterface DrawerContextType {\r\n isDrawerOpen: boolean;\r\n openDrawer: () => void;\r\n closeDrawer: () => void;\r\n toggleDrawer: () => void;\r\n}\r\n\r\nconst DrawerContext = React.createContext<DrawerContextType>({\r\n isDrawerOpen: false,\r\n openDrawer: () => {},\r\n closeDrawer: () => {},\r\n toggleDrawer: () => {},\r\n});\r\n\r\nexport const DrawerProvider = ({ children }: { children: React.ReactNode }) => {\r\n const [isDrawerOpen, setIsDrawerOpen] = React.useState(false);\r\n\r\n const openDrawer = () => {\r\n setIsDrawerOpen(true);\r\n };\r\n\r\n const closeDrawer = () => {\r\n setIsDrawerOpen(false);\r\n };\r\n\r\n const toggleDrawer = () => {\r\n setIsDrawerOpen((prev) => !prev);\r\n };\r\n\r\n return (\r\n <DrawerContext.Provider\r\n value={{ isDrawerOpen, openDrawer, closeDrawer, toggleDrawer }}\r\n >\r\n {children}\r\n </DrawerContext.Provider>\r\n );\r\n};\r\n\r\nexport const useDrawer = () => React.useContext(DrawerContext);\r\n\r\n","import AccountCircle from \"@mui/icons-material/AccountCircle\";\r\nimport LogoutOutlinedIcon from \"@mui/icons-material/LogoutOutlined\";\r\nimport MailIcon from \"@mui/icons-material/Mail\";\r\nimport MenuIcon from \"@mui/icons-material/Menu\";\r\nimport MenuOpenIcon from \"@mui/icons-material/MenuOpen\";\r\nimport MoreIcon from \"@mui/icons-material/MoreVert\";\r\nimport NotificationsActiveOutlined from \"@mui/icons-material/NotificationsActiveOutlined\";\r\nimport PersonOutlineOutlinedIcon from \"@mui/icons-material/PersonOutlineOutlined\";\r\nimport SettingsOutlinedIcon from \"@mui/icons-material/SettingsOutlined\";\r\nimport {\r\n AppBar,\r\n Avatar,\r\n Badge,\r\n Box,\r\n Divider,\r\n IconButton,\r\n List,\r\n ListItem,\r\n ListItemAvatar,\r\n ListItemIcon,\r\n ListItemText,\r\n Menu,\r\n MenuItem,\r\n styled,\r\n Toolbar,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport { deepOrange } from \"@mui/material/colors\";\r\nimport React from \"react\";\r\nimport { useDrawer } from \"./DrawerContext\";\r\nimport { AppHeaderProps } from \"./types\";\r\nimport \"./styles/Header.scss\";\r\n\r\n// Default routes - absolute paths from root\r\nconst DEFAULT_ROUTES = {\r\n settings: \"/account/overview\",\r\n profile: \"/profile\",\r\n logout: \"/logout\",\r\n};\r\n\r\n// Default logo - can be overridden via props\r\nconst DEFAULT_LOGO = {\r\n first: \"VAR\",\r\n second: \"MINER\",\r\n};\r\n\r\nconst AppHeader: React.FC<AppHeaderProps> = ({\r\n user = {\r\n name: \"Shivam Kumar\",\r\n email: \"shivam@redcliffelabs.com\",\r\n role: \"Lab Technician\",\r\n initials: \"SK\",\r\n },\r\n isOnline = true,\r\n logo,\r\n notificationCount = 0,\r\n messageCount,\r\n onDrawerToggle,\r\n routes,\r\n onSettingsClick,\r\n onProfileClick,\r\n onSignOutClick,\r\n className,\r\n}) => {\r\n // Use provided logo or default\r\n const finalLogo = logo ?? DEFAULT_LOGO;\r\n \r\n const { isDrawerOpen, toggleDrawer } = useDrawer();\r\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\r\n const [mobileMoreAnchorEl, setMobileMoreAnchorEl] =\r\n React.useState<null | HTMLElement>(null);\r\n\r\n const isMobileMenuOpen = Boolean(mobileMoreAnchorEl);\r\n\r\n // Merge provided routes with defaults - all routes are absolute from root\r\n const finalRoutes = {\r\n settings: routes?.settings ?? DEFAULT_ROUTES.settings,\r\n profile: routes?.profile ?? DEFAULT_ROUTES.profile,\r\n logout: routes?.logout ?? DEFAULT_ROUTES.logout,\r\n };\r\n\r\n const OnlineBadge = styled(Badge)(({ theme }) => ({\r\n \"& .MuiBadge-badge\": {\r\n backgroundColor: \"#44b700\",\r\n color: \"#44b700\",\r\n boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,\r\n width: 12,\r\n height: 12,\r\n borderRadius: \"50%\",\r\n },\r\n }));\r\n\r\n const OfflineBadge = styled(Badge)(({ theme }) => ({\r\n \"& .MuiBadge-badge\": {\r\n backgroundColor: \"gray\",\r\n color: \"gray\",\r\n boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,\r\n width: 12,\r\n height: 12,\r\n borderRadius: \"50%\",\r\n },\r\n }));\r\n\r\n const handleDrawerToggle = () => {\r\n toggleDrawer();\r\n onDrawerToggle?.();\r\n };\r\n\r\n const handleProfileMenuOpen = (event: React.MouseEvent<HTMLElement>) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleMobileMenuClose = () => {\r\n setMobileMoreAnchorEl(null);\r\n };\r\n\r\n const handleMobileMenuOpen = (event: React.MouseEvent<HTMLElement>) => {\r\n setMobileMoreAnchorEl(event.currentTarget);\r\n };\r\n\r\n const open = Boolean(anchorEl);\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const handleSettingsClick = () => {\r\n handleClose();\r\n if (onSettingsClick) {\r\n onSettingsClick();\r\n } else {\r\n // Use window.location to navigate to absolute path, bypassing React Router basename\r\n const path = finalRoutes.settings.startsWith('/') \r\n ? finalRoutes.settings \r\n : `/${finalRoutes.settings}`;\r\n window.location.href = path;\r\n }\r\n };\r\n\r\n const handleProfileClick = () => {\r\n handleClose();\r\n if (onProfileClick) {\r\n onProfileClick();\r\n } else {\r\n // Use window.location to navigate to absolute path, bypassing React Router basename\r\n const path = finalRoutes.profile.startsWith('/') \r\n ? finalRoutes.profile \r\n : `/${finalRoutes.profile}`;\r\n window.location.href = path;\r\n }\r\n };\r\n\r\n const handleSignOutClick = () => {\r\n handleClose();\r\n if (onSignOutClick) {\r\n onSignOutClick();\r\n } else {\r\n localStorage.clear();\r\n // Use window.location to navigate to absolute path, bypassing React Router basename\r\n const path = finalRoutes.logout.startsWith('/') \r\n ? finalRoutes.logout \r\n : `/${finalRoutes.logout}`;\r\n window.location.href = path;\r\n }\r\n };\r\n\r\n const menuId = \"primary-account-menu\";\r\n\r\n const getInitials = () => {\r\n if (user.initials) return user.initials;\r\n return user.name\r\n .split(\" \")\r\n .map((n) => n[0])\r\n .join(\"\")\r\n .toUpperCase()\r\n .slice(0, 2);\r\n };\r\n\r\n const profileList = (\r\n <List\r\n className=\"profile-menu-section\"\r\n sx={{\r\n width: \"100%\",\r\n maxWidth: 360,\r\n pointerEvents: \"none\",\r\n }}\r\n component=\"div\"\r\n aria-hidden=\"true\"\r\n tabIndex={-1}\r\n >\r\n <ListItem alignItems=\"flex-start\" className=\"profile-menu-item\">\r\n <ListItemAvatar>\r\n {isOnline ? (\r\n <OnlineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Online\"\r\n aria-label=\"Online status badge\"\r\n data-testid=\"online-badge\"\r\n >\r\n <Avatar\r\n sx={{ bgcolor: deepOrange[500] }}\r\n alt={user.name}\r\n title={user.name}\r\n src={user.avatar}\r\n >\r\n {getInitials()}\r\n </Avatar>\r\n </OnlineBadge>\r\n ) : (\r\n <OfflineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Offline\"\r\n aria-label=\"Offline status badge\"\r\n data-testid=\"offline-badge\"\r\n >\r\n <Avatar\r\n sx={{ bgcolor: deepOrange[500] }}\r\n alt={user.name}\r\n title={user.name}\r\n src={user.avatar}\r\n >\r\n {getInitials()}\r\n </Avatar>\r\n </OfflineBadge>\r\n )}\r\n </ListItemAvatar>\r\n <ListItemText\r\n secondary={\r\n <React.Fragment>\r\n <Typography className=\"profile-name\" component=\"p\">\r\n {user.name}\r\n </Typography>\r\n <Typography className=\"profile-email\" component=\"p\">\r\n {user.email}\r\n </Typography>\r\n <Typography className=\"profile-role\" component=\"p\">\r\n Role: {user.role}\r\n </Typography>\r\n </React.Fragment>\r\n }\r\n />\r\n </ListItem>\r\n </List>\r\n );\r\n\r\n const renderMenu = (\r\n <Menu\r\n anchorEl={anchorEl}\r\n id=\"account-menu\"\r\n open={open}\r\n onClose={handleClose}\r\n onClick={handleClose}\r\n slotProps={{\r\n paper: {\r\n elevation: 0,\r\n sx: {\r\n overflow: \"visible\",\r\n filter: \"drop-shadow(0px 2px 8px rgba(0,0,0,0.32))\",\r\n mt: 1.5,\r\n \"& .MuiAvatar-root\": {\r\n width: 32,\r\n height: 32,\r\n ml: -0.5,\r\n mr: 1,\r\n },\r\n \"&::before\": {\r\n content: '\"\"',\r\n display: \"block\",\r\n position: \"absolute\",\r\n top: 0,\r\n right: 14,\r\n width: 10,\r\n height: 10,\r\n bgcolor: \"background.paper\",\r\n transform: \"translateY(-50%) rotate(45deg)\",\r\n zIndex: 0,\r\n },\r\n },\r\n },\r\n }}\r\n transformOrigin={{ horizontal: \"right\", vertical: \"top\" }}\r\n anchorOrigin={{ horizontal: \"right\", vertical: \"bottom\" }}\r\n >\r\n {profileList}\r\n <Divider />\r\n <MenuItem onClick={handleSettingsClick}>\r\n <ListItemIcon>\r\n <SettingsOutlinedIcon fontSize=\"small\" />\r\n </ListItemIcon>\r\n Account Settings\r\n </MenuItem>\r\n <MenuItem onClick={handleProfileClick}>\r\n <ListItemIcon>\r\n <PersonOutlineOutlinedIcon fontSize=\"small\" />\r\n </ListItemIcon>\r\n Profile\r\n </MenuItem>\r\n <MenuItem onClick={handleSignOutClick}>\r\n <ListItemIcon>\r\n <LogoutOutlinedIcon fontSize=\"small\" />\r\n </ListItemIcon>\r\n Sign out\r\n </MenuItem>\r\n </Menu>\r\n );\r\n\r\n const mobileMenuId = \"primary-account-menu-mobile\";\r\n const renderMobileMenu = (\r\n <Menu\r\n anchorEl={mobileMoreAnchorEl}\r\n anchorOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"right\",\r\n }}\r\n id={mobileMenuId}\r\n keepMounted\r\n transformOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"right\",\r\n }}\r\n open={isMobileMenuOpen}\r\n onClose={handleMobileMenuClose}\r\n >\r\n {messageCount !== undefined && (\r\n <MenuItem>\r\n <IconButton \r\n size=\"large\" \r\n aria-label={`show ${messageCount} new mails`}\r\n sx={{ color: '#1e2f97' }}\r\n >\r\n <Badge badgeContent={messageCount} color=\"error\">\r\n <MailIcon />\r\n </Badge>\r\n </IconButton>\r\n <p>Messages</p>\r\n </MenuItem>\r\n )}\r\n {notificationCount > 0 && (\r\n <MenuItem>\r\n <IconButton\r\n size=\"large\"\r\n aria-label={`show ${notificationCount} new notifications`}\r\n sx={{ color: '#1e2f97' }}\r\n >\r\n <Badge badgeContent={notificationCount} color=\"error\">\r\n <NotificationsActiveOutlined />\r\n </Badge>\r\n </IconButton>\r\n <p>Notifications</p>\r\n </MenuItem>\r\n )}\r\n <MenuItem onClick={handleProfileMenuOpen}>\r\n <IconButton\r\n size=\"large\"\r\n aria-label=\"account of current user\"\r\n aria-controls=\"primary-account-menu\"\r\n aria-haspopup=\"true\"\r\n sx={{ color: '#1e2f97' }}\r\n >\r\n {isOnline ? (\r\n <OnlineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Online\"\r\n aria-label=\"Online status badge\"\r\n data-testid=\"online-badge\"\r\n >\r\n <AccountCircle\r\n titleAccess={user.name}\r\n aria-label=\"User avatar\"\r\n />\r\n </OnlineBadge>\r\n ) : (\r\n <OfflineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Offline\"\r\n aria-label=\"Offline status badge\"\r\n data-testid=\"offline-badge\"\r\n >\r\n <AccountCircle\r\n titleAccess={user.name}\r\n aria-label=\"User avatar\"\r\n />\r\n </OfflineBadge>\r\n )}\r\n </IconButton>\r\n <p>Profile</p>\r\n </MenuItem>\r\n </Menu>\r\n );\r\n\r\n return (\r\n <Box sx={{ flexGrow: 1 }} className={`app-header ${className || \"\"}`}>\r\n <AppBar\r\n sx={{\r\n position: \"fixed\",\r\n top: 0,\r\n backgroundColor: \"#ffffff\",\r\n }}\r\n >\r\n <Toolbar>\r\n <IconButton\r\n size=\"large\"\r\n edge=\"start\"\r\n aria-label=\"open drawer\"\r\n sx={{ \r\n mr: 2,\r\n color: '#1e2f97',\r\n '&:hover': {\r\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\r\n }\r\n }}\r\n onClick={handleDrawerToggle}\r\n >\r\n {isDrawerOpen ? (\r\n <MenuOpenIcon fontSize={\"large\"} />\r\n ) : (\r\n <MenuIcon fontSize={\"large\"} />\r\n )}\r\n </IconButton>\r\n <Typography\r\n variant=\"h6\"\r\n noWrap\r\n component=\"div\"\r\n sx={{ display: { xs: \"none\", sm: \"block\" } }}\r\n data-testid=\"var-miner-wrapper\"\r\n >\r\n <span className=\"var\">{finalLogo.first}</span>\r\n <span className=\"miner\">{finalLogo.second}</span>\r\n </Typography>\r\n <Box sx={{ flexGrow: 1 }} />\r\n <Box sx={{ display: { xs: \"none\", md: \"flex\" } }}>\r\n {notificationCount > 0 && (\r\n <IconButton\r\n size=\"large\"\r\n aria-label={`show ${notificationCount} new notifications`}\r\n sx={{\r\n color: '#1e2f97',\r\n '&:hover': {\r\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\r\n }\r\n }}\r\n >\r\n <Badge badgeContent={notificationCount} color=\"error\">\r\n <NotificationsActiveOutlined />\r\n </Badge>\r\n </IconButton>\r\n )}\r\n <IconButton\r\n size=\"large\"\r\n edge=\"end\"\r\n aria-label=\"account of current user\"\r\n aria-controls={menuId}\r\n aria-haspopup=\"true\"\r\n onClick={handleProfileMenuOpen}\r\n sx={{\r\n color: '#1e2f97',\r\n '&:hover': {\r\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\r\n }\r\n }}\r\n >\r\n {isOnline ? (\r\n <OnlineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Online\"\r\n aria-label=\"Online status badge\"\r\n data-testid=\"online-badge\"\r\n >\r\n <Avatar\r\n sx={{\r\n bgcolor: deepOrange[500],\r\n width: 20,\r\n height: 20,\r\n p: 1,\r\n }}\r\n alt={user.name}\r\n title={user.name}\r\n src={user.avatar}\r\n sizes=\"large\"\r\n >\r\n {getInitials()}\r\n </Avatar>\r\n </OnlineBadge>\r\n ) : (\r\n <OfflineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Offline\"\r\n aria-label=\"Offline status badge\"\r\n data-testid=\"offline-badge\"\r\n >\r\n <Avatar\r\n sx={{\r\n bgcolor: deepOrange[500],\r\n width: 20,\r\n height: 20,\r\n p: 1,\r\n }}\r\n alt={user.name}\r\n title={user.name}\r\n src={user.avatar}\r\n >\r\n {getInitials()}\r\n </Avatar>\r\n </OfflineBadge>\r\n )}\r\n </IconButton>\r\n </Box>\r\n <Box sx={{ display: { xs: \"flex\", md: \"none\" } }}>\r\n <IconButton\r\n size=\"large\"\r\n aria-label=\"show more\"\r\n aria-controls={mobileMenuId}\r\n aria-haspopup=\"true\"\r\n onClick={handleMobileMenuOpen}\r\n sx={{\r\n color: '#1e2f97',\r\n '&:hover': {\r\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\r\n }\r\n }}\r\n >\r\n <MoreIcon />\r\n </IconButton>\r\n </Box>\r\n </Toolbar>\r\n </AppBar>\r\n {renderMobileMenu}\r\n {renderMenu}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default AppHeader;\r\n\r\n"],"names":["_jsx","React","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/DrawerContext.tsx","../src/utils/localStorage.ts","../src/AppHeader.tsx"],"sourcesContent":["import * as React from \"react\";\r\n\r\ninterface DrawerContextType {\r\n isDrawerOpen: boolean;\r\n openDrawer: () => void;\r\n closeDrawer: () => void;\r\n toggleDrawer: () => void;\r\n}\r\n\r\nconst DrawerContext = React.createContext<DrawerContextType>({\r\n isDrawerOpen: false,\r\n openDrawer: () => {},\r\n closeDrawer: () => {},\r\n toggleDrawer: () => {},\r\n});\r\n\r\nexport const DrawerProvider = ({ children }: { children: React.ReactNode }) => {\r\n const [isDrawerOpen, setIsDrawerOpen] = React.useState(false);\r\n\r\n const openDrawer = () => {\r\n setIsDrawerOpen(true);\r\n };\r\n\r\n const closeDrawer = () => {\r\n setIsDrawerOpen(false);\r\n };\r\n\r\n const toggleDrawer = () => {\r\n setIsDrawerOpen((prev) => !prev);\r\n };\r\n\r\n return (\r\n <DrawerContext.Provider\r\n value={{ isDrawerOpen, openDrawer, closeDrawer, toggleDrawer }}\r\n >\r\n {children}\r\n </DrawerContext.Provider>\r\n );\r\n};\r\n\r\nexport const useDrawer = () => React.useContext(DrawerContext);\r\n\r\n","/**\r\n * Utility functions to get user data from localStorage\r\n */\r\n\r\n/**\r\n * Gets user profile data from localStorage\r\n * Returns user info including name, email, role, etc.\r\n */\r\nexport const getUserDataFromStorage = () => {\r\n const userDbString = localStorage.getItem(\"persist:userdb\");\r\n if (userDbString) {\r\n try {\r\n const parsedOuter = JSON.parse(userDbString);\r\n \r\n // Helper function to parse nested JSON strings\r\n const parseNested = (value: any) => {\r\n if (typeof value === 'string') {\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return value;\r\n }\r\n }\r\n return value;\r\n };\r\n \r\n // Try to get user data from different possible locations\r\n let userData = null;\r\n \r\n // Check for userDetails\r\n if (parsedOuter.userDetails) {\r\n const parsedUserDetails = parseNested(parsedOuter.userDetails);\r\n userData = parsedUserDetails.user || parsedUserDetails.data || parsedUserDetails;\r\n }\r\n \r\n // Check for user reducer/state\r\n if (!userData && parsedOuter.user) {\r\n const parsedUser = parseNested(parsedOuter.user);\r\n userData = parsedUser.user || parsedUser.data || parsedUser.currentUser || parsedUser;\r\n }\r\n \r\n // Check for authDetails for user info\r\n if (!userData && parsedOuter.authDetails) {\r\n const parsedAuthDetails = parseNested(parsedOuter.authDetails);\r\n // Check auth object\r\n if (parsedAuthDetails.auth) {\r\n userData = parsedAuthDetails.auth.user || parsedAuthDetails.auth.userData;\r\n }\r\n // Check root of authDetails\r\n if (!userData) {\r\n userData = parsedAuthDetails.user || parsedAuthDetails.userData || parsedAuthDetails.currentUser;\r\n }\r\n }\r\n \r\n // Check for profile\r\n if (!userData && parsedOuter.profile) {\r\n const parsedProfile = parseNested(parsedOuter.profile);\r\n userData = parsedProfile.user || parsedProfile.data || parsedProfile;\r\n }\r\n \r\n if (userData) {\r\n // Build name from various possible fields\r\n let name = userData.name || userData.fullName || userData.userName || \"\";\r\n if (!name && (userData.firstName || userData.lastName)) {\r\n name = [userData.firstName, userData.lastName].filter(Boolean).join(' ');\r\n }\r\n \r\n return {\r\n name: name || \"\",\r\n email: userData.email || userData.emailAddress || \"\",\r\n role: userData.role || userData.userRole || userData.designation || userData.title || \"\",\r\n avatar: userData.avatar || userData.profilePicture || userData.imageUrl || userData.profileImage,\r\n initials: userData.initials,\r\n };\r\n }\r\n } catch (err) {\r\n console.error(\"Error parsing user data from localStorage:\", err);\r\n return null;\r\n }\r\n }\r\n return null;\r\n};\r\n\r\n","import AccountCircle from \"@mui/icons-material/AccountCircle\";\r\nimport LogoutOutlinedIcon from \"@mui/icons-material/LogoutOutlined\";\r\nimport MailIcon from \"@mui/icons-material/Mail\";\r\nimport MenuIcon from \"@mui/icons-material/Menu\";\r\nimport MenuOpenIcon from \"@mui/icons-material/MenuOpen\";\r\nimport MoreIcon from \"@mui/icons-material/MoreVert\";\r\nimport NotificationsActiveOutlined from \"@mui/icons-material/NotificationsActiveOutlined\";\r\nimport PersonOutlineOutlinedIcon from \"@mui/icons-material/PersonOutlineOutlined\";\r\nimport SettingsOutlinedIcon from \"@mui/icons-material/SettingsOutlined\";\r\nimport {\r\n AppBar,\r\n Avatar,\r\n Badge,\r\n Box,\r\n Divider,\r\n IconButton,\r\n List,\r\n ListItem,\r\n ListItemAvatar,\r\n ListItemIcon,\r\n ListItemText,\r\n Menu,\r\n MenuItem,\r\n styled,\r\n Toolbar,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport { deepOrange } from \"@mui/material/colors\";\r\nimport React from \"react\";\r\nimport { useDrawer } from \"./DrawerContext\";\r\nimport { AppHeaderProps, UserProfile } from \"./types\";\r\nimport { getUserDataFromStorage } from \"./utils/localStorage\";\r\nimport \"./styles/Header.scss\";\r\n\r\n// Default routes - absolute paths from root\r\nconst DEFAULT_ROUTES = {\r\n settings: \"/account/overview\",\r\n profile: \"/profile\",\r\n logout: \"/logout\",\r\n};\r\n\r\n// Default logo - can be overridden via props\r\nconst DEFAULT_LOGO = {\r\n first: \"VAR\",\r\n second: \"MINER\",\r\n};\r\n\r\nconst AppHeader: React.FC<AppHeaderProps> = ({\r\n user: userProp,\r\n isOnline = true,\r\n logo,\r\n notificationCount = 0,\r\n messageCount,\r\n onDrawerToggle,\r\n routes,\r\n onSettingsClick,\r\n onProfileClick,\r\n onSignOutClick,\r\n className,\r\n isDrawerOpen: isDrawerOpenProp,\r\n}) => {\r\n // Use provided logo or default\r\n const finalLogo = logo ?? DEFAULT_LOGO;\r\n \r\n const { isDrawerOpen: isDrawerOpenContext, toggleDrawer, openDrawer, closeDrawer } = useDrawer();\r\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\r\n const [mobileMoreAnchorEl, setMobileMoreAnchorEl] =\r\n React.useState<null | HTMLElement>(null);\r\n const [user, setUser] = React.useState<UserProfile>(() => {\r\n // Initialize with prop if provided, otherwise try localStorage, otherwise default\r\n if (userProp) {\r\n return userProp;\r\n }\r\n const storedUser = getUserDataFromStorage();\r\n if (storedUser && storedUser.name && storedUser.email) {\r\n return storedUser;\r\n }\r\n return {\r\n name: \"Shiva Kumar\",\r\n email: \"shivam@redcliffelabs.com\",\r\n role: \"Lab Technician\",\r\n initials: \"SK\",\r\n };\r\n });\r\n\r\n // Sync context with prop if provided (for initial state and external control)\r\n const prevPropRef = React.useRef(isDrawerOpenProp);\r\n React.useEffect(() => {\r\n if (isDrawerOpenProp !== undefined && prevPropRef.current !== isDrawerOpenProp) {\r\n if (isDrawerOpenProp) {\r\n openDrawer();\r\n } else {\r\n closeDrawer();\r\n }\r\n prevPropRef.current = isDrawerOpenProp;\r\n }\r\n }, [isDrawerOpenProp, openDrawer, closeDrawer]);\r\n\r\n // Always use context state for icon display (since that's what actually changes on click)\r\n // This ensures the icon updates immediately when user clicks, regardless of prop\r\n const isDrawerOpen = isDrawerOpenContext;\r\n\r\n const isMobileMenuOpen = Boolean(mobileMoreAnchorEl);\r\n\r\n // Update user state when prop changes or fetch from localStorage\r\n React.useEffect(() => {\r\n if (userProp) {\r\n setUser(userProp);\r\n } else {\r\n const storedUser = getUserDataFromStorage();\r\n if (storedUser && storedUser.name && storedUser.email) {\r\n setUser(storedUser);\r\n }\r\n }\r\n }, [userProp]);\r\n\r\n // Merge provided routes with defaults - all routes are absolute from root\r\n const finalRoutes = {\r\n settings: routes?.settings ?? DEFAULT_ROUTES.settings,\r\n profile: routes?.profile ?? DEFAULT_ROUTES.profile,\r\n logout: routes?.logout ?? DEFAULT_ROUTES.logout,\r\n };\r\n\r\n const OnlineBadge = styled(Badge)(({ theme }) => ({\r\n \"& .MuiBadge-badge\": {\r\n backgroundColor: \"#44b700\",\r\n color: \"#44b700\",\r\n boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,\r\n width: 12,\r\n height: 12,\r\n borderRadius: \"50%\",\r\n },\r\n }));\r\n\r\n const OfflineBadge = styled(Badge)(({ theme }) => ({\r\n \"& .MuiBadge-badge\": {\r\n backgroundColor: \"gray\",\r\n color: \"gray\",\r\n boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,\r\n width: 12,\r\n height: 12,\r\n borderRadius: \"50%\",\r\n },\r\n }));\r\n\r\n const handleDrawerToggle = () => {\r\n toggleDrawer();\r\n onDrawerToggle?.();\r\n };\r\n\r\n const handleProfileMenuOpen = (event: React.MouseEvent<HTMLElement>) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleMobileMenuClose = () => {\r\n setMobileMoreAnchorEl(null);\r\n };\r\n\r\n const handleMobileMenuOpen = (event: React.MouseEvent<HTMLElement>) => {\r\n setMobileMoreAnchorEl(event.currentTarget);\r\n };\r\n\r\n const open = Boolean(anchorEl);\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const handleSettingsClick = () => {\r\n handleClose();\r\n if (onSettingsClick) {\r\n onSettingsClick();\r\n } else {\r\n // Use window.location to navigate to absolute path, bypassing React Router basename\r\n const path = finalRoutes.settings.startsWith('/') \r\n ? finalRoutes.settings \r\n : `/${finalRoutes.settings}`;\r\n window.location.href = path;\r\n }\r\n };\r\n\r\n const handleProfileClick = () => {\r\n handleClose();\r\n if (onProfileClick) {\r\n onProfileClick();\r\n } else {\r\n // Use window.location to navigate to absolute path, bypassing React Router basename\r\n const path = finalRoutes.profile.startsWith('/') \r\n ? finalRoutes.profile \r\n : `/${finalRoutes.profile}`;\r\n window.location.href = path;\r\n }\r\n };\r\n\r\n const handleSignOutClick = () => {\r\n handleClose();\r\n if (onSignOutClick) {\r\n onSignOutClick();\r\n } else {\r\n localStorage.clear();\r\n // Use window.location to navigate to absolute path, bypassing React Router basename\r\n const path = finalRoutes.logout.startsWith('/') \r\n ? finalRoutes.logout \r\n : `/${finalRoutes.logout}`;\r\n window.location.href = path;\r\n }\r\n };\r\n\r\n const menuId = \"primary-account-menu\";\r\n\r\n const getInitials = () => {\r\n if (user.initials) return user.initials;\r\n return user.name\r\n .split(\" \")\r\n .map((n) => n[0])\r\n .join(\"\")\r\n .toUpperCase()\r\n .slice(0, 2);\r\n };\r\n\r\n const profileList = (\r\n <List\r\n className=\"profile-menu-section\"\r\n sx={{\r\n width: \"100%\",\r\n maxWidth: 360,\r\n pointerEvents: \"none\",\r\n }}\r\n component=\"div\"\r\n aria-hidden=\"true\"\r\n tabIndex={-1}\r\n >\r\n <ListItem alignItems=\"flex-start\" className=\"profile-menu-item\">\r\n <ListItemAvatar>\r\n {isOnline ? (\r\n <OnlineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Online\"\r\n aria-label=\"Online status badge\"\r\n data-testid=\"online-badge\"\r\n >\r\n <Avatar\r\n sx={{ bgcolor: deepOrange[500] }}\r\n alt={user.name}\r\n title={user.name}\r\n src={user.avatar}\r\n >\r\n {getInitials()}\r\n </Avatar>\r\n </OnlineBadge>\r\n ) : (\r\n <OfflineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Offline\"\r\n aria-label=\"Offline status badge\"\r\n data-testid=\"offline-badge\"\r\n >\r\n <Avatar\r\n sx={{ bgcolor: deepOrange[500] }}\r\n alt={user.name}\r\n title={user.name}\r\n src={user.avatar}\r\n >\r\n {getInitials()}\r\n </Avatar>\r\n </OfflineBadge>\r\n )}\r\n </ListItemAvatar>\r\n <ListItemText\r\n secondary={\r\n <React.Fragment>\r\n <Typography className=\"profile-name\" component=\"p\">\r\n {user.name}\r\n </Typography>\r\n <Typography className=\"profile-email\" component=\"p\">\r\n {user.email}\r\n </Typography>\r\n <Typography className=\"profile-role\" component=\"p\">\r\n Role: {user.role}\r\n </Typography>\r\n </React.Fragment>\r\n }\r\n />\r\n </ListItem>\r\n </List>\r\n );\r\n\r\n const renderMenu = (\r\n <Menu\r\n anchorEl={anchorEl}\r\n id=\"account-menu\"\r\n open={open}\r\n onClose={handleClose}\r\n onClick={handleClose}\r\n slotProps={{\r\n paper: {\r\n elevation: 0,\r\n sx: {\r\n overflow: \"visible\",\r\n filter: \"drop-shadow(0px 2px 8px rgba(0,0,0,0.32))\",\r\n mt: 1.5,\r\n \"& .MuiAvatar-root\": {\r\n width: 32,\r\n height: 32,\r\n ml: -0.5,\r\n mr: 1,\r\n },\r\n \"&::before\": {\r\n content: '\"\"',\r\n display: \"block\",\r\n position: \"absolute\",\r\n top: 0,\r\n right: 14,\r\n width: 10,\r\n height: 10,\r\n bgcolor: \"background.paper\",\r\n transform: \"translateY(-50%) rotate(45deg)\",\r\n zIndex: 0,\r\n },\r\n },\r\n },\r\n }}\r\n transformOrigin={{ horizontal: \"right\", vertical: \"top\" }}\r\n anchorOrigin={{ horizontal: \"right\", vertical: \"bottom\" }}\r\n >\r\n {profileList}\r\n <Divider />\r\n <MenuItem onClick={handleSettingsClick}>\r\n <ListItemIcon>\r\n <SettingsOutlinedIcon fontSize=\"small\" />\r\n </ListItemIcon>\r\n Account Settings\r\n </MenuItem>\r\n <MenuItem onClick={handleProfileClick}>\r\n <ListItemIcon>\r\n <PersonOutlineOutlinedIcon fontSize=\"small\" />\r\n </ListItemIcon>\r\n Profile\r\n </MenuItem>\r\n <MenuItem onClick={handleSignOutClick}>\r\n <ListItemIcon>\r\n <LogoutOutlinedIcon fontSize=\"small\" />\r\n </ListItemIcon>\r\n Sign out\r\n </MenuItem>\r\n </Menu>\r\n );\r\n\r\n const mobileMenuId = \"primary-account-menu-mobile\";\r\n const renderMobileMenu = (\r\n <Menu\r\n anchorEl={mobileMoreAnchorEl}\r\n anchorOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"right\",\r\n }}\r\n id={mobileMenuId}\r\n keepMounted\r\n transformOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"right\",\r\n }}\r\n open={isMobileMenuOpen}\r\n onClose={handleMobileMenuClose}\r\n >\r\n {messageCount !== undefined && (\r\n <MenuItem>\r\n <IconButton \r\n size=\"large\" \r\n aria-label={`show ${messageCount} new mails`}\r\n sx={{ color: '#1e2f97' }}\r\n >\r\n <Badge badgeContent={messageCount} color=\"error\">\r\n <MailIcon />\r\n </Badge>\r\n </IconButton>\r\n <p>Messages</p>\r\n </MenuItem>\r\n )}\r\n {notificationCount > 0 && (\r\n <MenuItem>\r\n <IconButton\r\n size=\"large\"\r\n aria-label={`show ${notificationCount} new notifications`}\r\n sx={{ color: '#1e2f97' }}\r\n >\r\n <Badge badgeContent={notificationCount} color=\"error\">\r\n <NotificationsActiveOutlined />\r\n </Badge>\r\n </IconButton>\r\n <p>Notifications</p>\r\n </MenuItem>\r\n )}\r\n <MenuItem onClick={handleProfileMenuOpen}>\r\n <IconButton\r\n size=\"large\"\r\n aria-label=\"account of current user\"\r\n aria-controls=\"primary-account-menu\"\r\n aria-haspopup=\"true\"\r\n sx={{ color: '#1e2f97' }}\r\n >\r\n {isOnline ? (\r\n <OnlineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Online\"\r\n aria-label=\"Online status badge\"\r\n data-testid=\"online-badge\"\r\n >\r\n <AccountCircle\r\n titleAccess={user.name}\r\n aria-label=\"User avatar\"\r\n />\r\n </OnlineBadge>\r\n ) : (\r\n <OfflineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Offline\"\r\n aria-label=\"Offline status badge\"\r\n data-testid=\"offline-badge\"\r\n >\r\n <AccountCircle\r\n titleAccess={user.name}\r\n aria-label=\"User avatar\"\r\n />\r\n </OfflineBadge>\r\n )}\r\n </IconButton>\r\n <p>Profile</p>\r\n </MenuItem>\r\n </Menu>\r\n );\r\n\r\n return (\r\n <Box sx={{ flexGrow: 1 }} className={`app-header ${className || \"\"}`}>\r\n <AppBar\r\n sx={{\r\n position: \"fixed\",\r\n top: 0,\r\n backgroundColor: \"#ffffff\",\r\n }}\r\n >\r\n <Toolbar>\r\n <IconButton\r\n size=\"large\"\r\n edge=\"start\"\r\n aria-label=\"open drawer\"\r\n sx={{ \r\n mr: 2,\r\n color: '#1e2f97',\r\n '&:hover': {\r\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\r\n }\r\n }}\r\n onClick={handleDrawerToggle}\r\n >\r\n {isDrawerOpen ? (\r\n <MenuOpenIcon fontSize=\"large\" />\r\n ) : (\r\n <MenuIcon fontSize=\"large\" />\r\n )}\r\n </IconButton>\r\n <Typography\r\n variant=\"h6\"\r\n noWrap\r\n component=\"div\"\r\n sx={{ display: { xs: \"none\", sm: \"block\" } }}\r\n data-testid=\"var-miner-wrapper\"\r\n >\r\n <span className=\"var\">{finalLogo.first}</span>\r\n <span className=\"miner\">{finalLogo.second}</span>\r\n </Typography>\r\n <Box sx={{ flexGrow: 1 }} />\r\n <Box sx={{ display: { xs: \"none\", md: \"flex\" } }}>\r\n {notificationCount > 0 && (\r\n <IconButton\r\n size=\"large\"\r\n aria-label={`show ${notificationCount} new notifications`}\r\n sx={{\r\n color: '#1e2f97',\r\n '&:hover': {\r\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\r\n }\r\n }}\r\n >\r\n <Badge badgeContent={notificationCount} color=\"error\">\r\n <NotificationsActiveOutlined />\r\n </Badge>\r\n </IconButton>\r\n )}\r\n <IconButton\r\n size=\"large\"\r\n edge=\"end\"\r\n aria-label=\"account of current user\"\r\n aria-controls={menuId}\r\n aria-haspopup=\"true\"\r\n onClick={handleProfileMenuOpen}\r\n sx={{\r\n color: '#1e2f97',\r\n '&:hover': {\r\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\r\n }\r\n }}\r\n >\r\n {isOnline ? (\r\n <OnlineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Online\"\r\n aria-label=\"Online status badge\"\r\n data-testid=\"online-badge\"\r\n >\r\n <Avatar\r\n sx={{\r\n bgcolor: deepOrange[500],\r\n width: 20,\r\n height: 20,\r\n p: 1,\r\n }}\r\n alt={user.name}\r\n title={user.name}\r\n src={user.avatar}\r\n sizes=\"large\"\r\n >\r\n {getInitials()}\r\n </Avatar>\r\n </OnlineBadge>\r\n ) : (\r\n <OfflineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Offline\"\r\n aria-label=\"Offline status badge\"\r\n data-testid=\"offline-badge\"\r\n >\r\n <Avatar\r\n sx={{\r\n bgcolor: deepOrange[500],\r\n width: 20,\r\n height: 20,\r\n p: 1,\r\n }}\r\n alt={user.name}\r\n title={user.name}\r\n src={user.avatar}\r\n >\r\n {getInitials()}\r\n </Avatar>\r\n </OfflineBadge>\r\n )}\r\n </IconButton>\r\n </Box>\r\n <Box sx={{ display: { xs: \"flex\", md: \"none\" } }}>\r\n <IconButton\r\n size=\"large\"\r\n aria-label=\"show more\"\r\n aria-controls={mobileMenuId}\r\n aria-haspopup=\"true\"\r\n onClick={handleMobileMenuOpen}\r\n sx={{\r\n color: '#1e2f97',\r\n '&:hover': {\r\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\r\n }\r\n }}\r\n >\r\n <MoreIcon />\r\n </IconButton>\r\n </Box>\r\n </Toolbar>\r\n </AppBar>\r\n {renderMobileMenu}\r\n {renderMenu}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default AppHeader;\r\n\r\n"],"names":["_jsx","React","_jsxs"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -54,6 +54,82 @@ const DrawerProvider = ({ children }) => {
54
54
  };
55
55
  const useDrawer = () => React__namespace.useContext(DrawerContext);
56
56
 
57
+ /**
58
+ * Utility functions to get user data from localStorage
59
+ */
60
+ /**
61
+ * Gets user profile data from localStorage
62
+ * Returns user info including name, email, role, etc.
63
+ */
64
+ const getUserDataFromStorage = () => {
65
+ const userDbString = localStorage.getItem("persist:userdb");
66
+ if (userDbString) {
67
+ try {
68
+ const parsedOuter = JSON.parse(userDbString);
69
+ // Helper function to parse nested JSON strings
70
+ const parseNested = (value) => {
71
+ if (typeof value === 'string') {
72
+ try {
73
+ return JSON.parse(value);
74
+ }
75
+ catch {
76
+ return value;
77
+ }
78
+ }
79
+ return value;
80
+ };
81
+ // Try to get user data from different possible locations
82
+ let userData = null;
83
+ // Check for userDetails
84
+ if (parsedOuter.userDetails) {
85
+ const parsedUserDetails = parseNested(parsedOuter.userDetails);
86
+ userData = parsedUserDetails.user || parsedUserDetails.data || parsedUserDetails;
87
+ }
88
+ // Check for user reducer/state
89
+ if (!userData && parsedOuter.user) {
90
+ const parsedUser = parseNested(parsedOuter.user);
91
+ userData = parsedUser.user || parsedUser.data || parsedUser.currentUser || parsedUser;
92
+ }
93
+ // Check for authDetails for user info
94
+ if (!userData && parsedOuter.authDetails) {
95
+ const parsedAuthDetails = parseNested(parsedOuter.authDetails);
96
+ // Check auth object
97
+ if (parsedAuthDetails.auth) {
98
+ userData = parsedAuthDetails.auth.user || parsedAuthDetails.auth.userData;
99
+ }
100
+ // Check root of authDetails
101
+ if (!userData) {
102
+ userData = parsedAuthDetails.user || parsedAuthDetails.userData || parsedAuthDetails.currentUser;
103
+ }
104
+ }
105
+ // Check for profile
106
+ if (!userData && parsedOuter.profile) {
107
+ const parsedProfile = parseNested(parsedOuter.profile);
108
+ userData = parsedProfile.user || parsedProfile.data || parsedProfile;
109
+ }
110
+ if (userData) {
111
+ // Build name from various possible fields
112
+ let name = userData.name || userData.fullName || userData.userName || "";
113
+ if (!name && (userData.firstName || userData.lastName)) {
114
+ name = [userData.firstName, userData.lastName].filter(Boolean).join(' ');
115
+ }
116
+ return {
117
+ name: name || "",
118
+ email: userData.email || userData.emailAddress || "",
119
+ role: userData.role || userData.userRole || userData.designation || userData.title || "",
120
+ avatar: userData.avatar || userData.profilePicture || userData.imageUrl || userData.profileImage,
121
+ initials: userData.initials,
122
+ };
123
+ }
124
+ }
125
+ catch (err) {
126
+ console.error("Error parsing user data from localStorage:", err);
127
+ return null;
128
+ }
129
+ }
130
+ return null;
131
+ };
132
+
57
133
  // Default routes - absolute paths from root
58
134
  const DEFAULT_ROUTES = {
59
135
  settings: "/account/overview",
@@ -65,18 +141,57 @@ const DEFAULT_LOGO = {
65
141
  first: "VAR",
66
142
  second: "MINER",
67
143
  };
68
- const AppHeader = ({ user = {
69
- name: "Shivam Kumar",
70
- email: "shivam@redcliffelabs.com",
71
- role: "Lab Technician",
72
- initials: "SK",
73
- }, isOnline = true, logo, notificationCount = 0, messageCount, onDrawerToggle, routes, onSettingsClick, onProfileClick, onSignOutClick, className, }) => {
144
+ const AppHeader = ({ user: userProp, isOnline = true, logo, notificationCount = 0, messageCount, onDrawerToggle, routes, onSettingsClick, onProfileClick, onSignOutClick, className, isDrawerOpen: isDrawerOpenProp, }) => {
74
145
  // Use provided logo or default
75
146
  const finalLogo = logo ?? DEFAULT_LOGO;
76
- const { isDrawerOpen, toggleDrawer } = useDrawer();
147
+ const { isDrawerOpen: isDrawerOpenContext, toggleDrawer, openDrawer, closeDrawer } = useDrawer();
77
148
  const [anchorEl, setAnchorEl] = React.useState(null);
78
149
  const [mobileMoreAnchorEl, setMobileMoreAnchorEl] = React.useState(null);
150
+ const [user, setUser] = React.useState(() => {
151
+ // Initialize with prop if provided, otherwise try localStorage, otherwise default
152
+ if (userProp) {
153
+ return userProp;
154
+ }
155
+ const storedUser = getUserDataFromStorage();
156
+ if (storedUser && storedUser.name && storedUser.email) {
157
+ return storedUser;
158
+ }
159
+ return {
160
+ name: "Shiva Kumar",
161
+ email: "shivam@redcliffelabs.com",
162
+ role: "Lab Technician",
163
+ initials: "SK",
164
+ };
165
+ });
166
+ // Sync context with prop if provided (for initial state and external control)
167
+ const prevPropRef = React.useRef(isDrawerOpenProp);
168
+ React.useEffect(() => {
169
+ if (isDrawerOpenProp !== undefined && prevPropRef.current !== isDrawerOpenProp) {
170
+ if (isDrawerOpenProp) {
171
+ openDrawer();
172
+ }
173
+ else {
174
+ closeDrawer();
175
+ }
176
+ prevPropRef.current = isDrawerOpenProp;
177
+ }
178
+ }, [isDrawerOpenProp, openDrawer, closeDrawer]);
179
+ // Always use context state for icon display (since that's what actually changes on click)
180
+ // This ensures the icon updates immediately when user clicks, regardless of prop
181
+ const isDrawerOpen = isDrawerOpenContext;
79
182
  const isMobileMenuOpen = Boolean(mobileMoreAnchorEl);
183
+ // Update user state when prop changes or fetch from localStorage
184
+ React.useEffect(() => {
185
+ if (userProp) {
186
+ setUser(userProp);
187
+ }
188
+ else {
189
+ const storedUser = getUserDataFromStorage();
190
+ if (storedUser && storedUser.name && storedUser.email) {
191
+ setUser(storedUser);
192
+ }
193
+ }
194
+ }, [userProp]);
80
195
  // Merge provided routes with defaults - all routes are absolute from root
81
196
  const finalRoutes = {
82
197
  settings: routes?.settings ?? DEFAULT_ROUTES.settings,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/DrawerContext.tsx","../src/AppHeader.tsx"],"sourcesContent":["import * as React from \"react\";\r\n\r\ninterface DrawerContextType {\r\n isDrawerOpen: boolean;\r\n openDrawer: () => void;\r\n closeDrawer: () => void;\r\n toggleDrawer: () => void;\r\n}\r\n\r\nconst DrawerContext = React.createContext<DrawerContextType>({\r\n isDrawerOpen: false,\r\n openDrawer: () => {},\r\n closeDrawer: () => {},\r\n toggleDrawer: () => {},\r\n});\r\n\r\nexport const DrawerProvider = ({ children }: { children: React.ReactNode }) => {\r\n const [isDrawerOpen, setIsDrawerOpen] = React.useState(false);\r\n\r\n const openDrawer = () => {\r\n setIsDrawerOpen(true);\r\n };\r\n\r\n const closeDrawer = () => {\r\n setIsDrawerOpen(false);\r\n };\r\n\r\n const toggleDrawer = () => {\r\n setIsDrawerOpen((prev) => !prev);\r\n };\r\n\r\n return (\r\n <DrawerContext.Provider\r\n value={{ isDrawerOpen, openDrawer, closeDrawer, toggleDrawer }}\r\n >\r\n {children}\r\n </DrawerContext.Provider>\r\n );\r\n};\r\n\r\nexport const useDrawer = () => React.useContext(DrawerContext);\r\n\r\n","import AccountCircle from \"@mui/icons-material/AccountCircle\";\r\nimport LogoutOutlinedIcon from \"@mui/icons-material/LogoutOutlined\";\r\nimport MailIcon from \"@mui/icons-material/Mail\";\r\nimport MenuIcon from \"@mui/icons-material/Menu\";\r\nimport MenuOpenIcon from \"@mui/icons-material/MenuOpen\";\r\nimport MoreIcon from \"@mui/icons-material/MoreVert\";\r\nimport NotificationsActiveOutlined from \"@mui/icons-material/NotificationsActiveOutlined\";\r\nimport PersonOutlineOutlinedIcon from \"@mui/icons-material/PersonOutlineOutlined\";\r\nimport SettingsOutlinedIcon from \"@mui/icons-material/SettingsOutlined\";\r\nimport {\r\n AppBar,\r\n Avatar,\r\n Badge,\r\n Box,\r\n Divider,\r\n IconButton,\r\n List,\r\n ListItem,\r\n ListItemAvatar,\r\n ListItemIcon,\r\n ListItemText,\r\n Menu,\r\n MenuItem,\r\n styled,\r\n Toolbar,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport { deepOrange } from \"@mui/material/colors\";\r\nimport React from \"react\";\r\nimport { useDrawer } from \"./DrawerContext\";\r\nimport { AppHeaderProps } from \"./types\";\r\nimport \"./styles/Header.scss\";\r\n\r\n// Default routes - absolute paths from root\r\nconst DEFAULT_ROUTES = {\r\n settings: \"/account/overview\",\r\n profile: \"/profile\",\r\n logout: \"/logout\",\r\n};\r\n\r\n// Default logo - can be overridden via props\r\nconst DEFAULT_LOGO = {\r\n first: \"VAR\",\r\n second: \"MINER\",\r\n};\r\n\r\nconst AppHeader: React.FC<AppHeaderProps> = ({\r\n user = {\r\n name: \"Shivam Kumar\",\r\n email: \"shivam@redcliffelabs.com\",\r\n role: \"Lab Technician\",\r\n initials: \"SK\",\r\n },\r\n isOnline = true,\r\n logo,\r\n notificationCount = 0,\r\n messageCount,\r\n onDrawerToggle,\r\n routes,\r\n onSettingsClick,\r\n onProfileClick,\r\n onSignOutClick,\r\n className,\r\n}) => {\r\n // Use provided logo or default\r\n const finalLogo = logo ?? DEFAULT_LOGO;\r\n \r\n const { isDrawerOpen, toggleDrawer } = useDrawer();\r\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\r\n const [mobileMoreAnchorEl, setMobileMoreAnchorEl] =\r\n React.useState<null | HTMLElement>(null);\r\n\r\n const isMobileMenuOpen = Boolean(mobileMoreAnchorEl);\r\n\r\n // Merge provided routes with defaults - all routes are absolute from root\r\n const finalRoutes = {\r\n settings: routes?.settings ?? DEFAULT_ROUTES.settings,\r\n profile: routes?.profile ?? DEFAULT_ROUTES.profile,\r\n logout: routes?.logout ?? DEFAULT_ROUTES.logout,\r\n };\r\n\r\n const OnlineBadge = styled(Badge)(({ theme }) => ({\r\n \"& .MuiBadge-badge\": {\r\n backgroundColor: \"#44b700\",\r\n color: \"#44b700\",\r\n boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,\r\n width: 12,\r\n height: 12,\r\n borderRadius: \"50%\",\r\n },\r\n }));\r\n\r\n const OfflineBadge = styled(Badge)(({ theme }) => ({\r\n \"& .MuiBadge-badge\": {\r\n backgroundColor: \"gray\",\r\n color: \"gray\",\r\n boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,\r\n width: 12,\r\n height: 12,\r\n borderRadius: \"50%\",\r\n },\r\n }));\r\n\r\n const handleDrawerToggle = () => {\r\n toggleDrawer();\r\n onDrawerToggle?.();\r\n };\r\n\r\n const handleProfileMenuOpen = (event: React.MouseEvent<HTMLElement>) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleMobileMenuClose = () => {\r\n setMobileMoreAnchorEl(null);\r\n };\r\n\r\n const handleMobileMenuOpen = (event: React.MouseEvent<HTMLElement>) => {\r\n setMobileMoreAnchorEl(event.currentTarget);\r\n };\r\n\r\n const open = Boolean(anchorEl);\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const handleSettingsClick = () => {\r\n handleClose();\r\n if (onSettingsClick) {\r\n onSettingsClick();\r\n } else {\r\n // Use window.location to navigate to absolute path, bypassing React Router basename\r\n const path = finalRoutes.settings.startsWith('/') \r\n ? finalRoutes.settings \r\n : `/${finalRoutes.settings}`;\r\n window.location.href = path;\r\n }\r\n };\r\n\r\n const handleProfileClick = () => {\r\n handleClose();\r\n if (onProfileClick) {\r\n onProfileClick();\r\n } else {\r\n // Use window.location to navigate to absolute path, bypassing React Router basename\r\n const path = finalRoutes.profile.startsWith('/') \r\n ? finalRoutes.profile \r\n : `/${finalRoutes.profile}`;\r\n window.location.href = path;\r\n }\r\n };\r\n\r\n const handleSignOutClick = () => {\r\n handleClose();\r\n if (onSignOutClick) {\r\n onSignOutClick();\r\n } else {\r\n localStorage.clear();\r\n // Use window.location to navigate to absolute path, bypassing React Router basename\r\n const path = finalRoutes.logout.startsWith('/') \r\n ? finalRoutes.logout \r\n : `/${finalRoutes.logout}`;\r\n window.location.href = path;\r\n }\r\n };\r\n\r\n const menuId = \"primary-account-menu\";\r\n\r\n const getInitials = () => {\r\n if (user.initials) return user.initials;\r\n return user.name\r\n .split(\" \")\r\n .map((n) => n[0])\r\n .join(\"\")\r\n .toUpperCase()\r\n .slice(0, 2);\r\n };\r\n\r\n const profileList = (\r\n <List\r\n className=\"profile-menu-section\"\r\n sx={{\r\n width: \"100%\",\r\n maxWidth: 360,\r\n pointerEvents: \"none\",\r\n }}\r\n component=\"div\"\r\n aria-hidden=\"true\"\r\n tabIndex={-1}\r\n >\r\n <ListItem alignItems=\"flex-start\" className=\"profile-menu-item\">\r\n <ListItemAvatar>\r\n {isOnline ? (\r\n <OnlineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Online\"\r\n aria-label=\"Online status badge\"\r\n data-testid=\"online-badge\"\r\n >\r\n <Avatar\r\n sx={{ bgcolor: deepOrange[500] }}\r\n alt={user.name}\r\n title={user.name}\r\n src={user.avatar}\r\n >\r\n {getInitials()}\r\n </Avatar>\r\n </OnlineBadge>\r\n ) : (\r\n <OfflineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Offline\"\r\n aria-label=\"Offline status badge\"\r\n data-testid=\"offline-badge\"\r\n >\r\n <Avatar\r\n sx={{ bgcolor: deepOrange[500] }}\r\n alt={user.name}\r\n title={user.name}\r\n src={user.avatar}\r\n >\r\n {getInitials()}\r\n </Avatar>\r\n </OfflineBadge>\r\n )}\r\n </ListItemAvatar>\r\n <ListItemText\r\n secondary={\r\n <React.Fragment>\r\n <Typography className=\"profile-name\" component=\"p\">\r\n {user.name}\r\n </Typography>\r\n <Typography className=\"profile-email\" component=\"p\">\r\n {user.email}\r\n </Typography>\r\n <Typography className=\"profile-role\" component=\"p\">\r\n Role: {user.role}\r\n </Typography>\r\n </React.Fragment>\r\n }\r\n />\r\n </ListItem>\r\n </List>\r\n );\r\n\r\n const renderMenu = (\r\n <Menu\r\n anchorEl={anchorEl}\r\n id=\"account-menu\"\r\n open={open}\r\n onClose={handleClose}\r\n onClick={handleClose}\r\n slotProps={{\r\n paper: {\r\n elevation: 0,\r\n sx: {\r\n overflow: \"visible\",\r\n filter: \"drop-shadow(0px 2px 8px rgba(0,0,0,0.32))\",\r\n mt: 1.5,\r\n \"& .MuiAvatar-root\": {\r\n width: 32,\r\n height: 32,\r\n ml: -0.5,\r\n mr: 1,\r\n },\r\n \"&::before\": {\r\n content: '\"\"',\r\n display: \"block\",\r\n position: \"absolute\",\r\n top: 0,\r\n right: 14,\r\n width: 10,\r\n height: 10,\r\n bgcolor: \"background.paper\",\r\n transform: \"translateY(-50%) rotate(45deg)\",\r\n zIndex: 0,\r\n },\r\n },\r\n },\r\n }}\r\n transformOrigin={{ horizontal: \"right\", vertical: \"top\" }}\r\n anchorOrigin={{ horizontal: \"right\", vertical: \"bottom\" }}\r\n >\r\n {profileList}\r\n <Divider />\r\n <MenuItem onClick={handleSettingsClick}>\r\n <ListItemIcon>\r\n <SettingsOutlinedIcon fontSize=\"small\" />\r\n </ListItemIcon>\r\n Account Settings\r\n </MenuItem>\r\n <MenuItem onClick={handleProfileClick}>\r\n <ListItemIcon>\r\n <PersonOutlineOutlinedIcon fontSize=\"small\" />\r\n </ListItemIcon>\r\n Profile\r\n </MenuItem>\r\n <MenuItem onClick={handleSignOutClick}>\r\n <ListItemIcon>\r\n <LogoutOutlinedIcon fontSize=\"small\" />\r\n </ListItemIcon>\r\n Sign out\r\n </MenuItem>\r\n </Menu>\r\n );\r\n\r\n const mobileMenuId = \"primary-account-menu-mobile\";\r\n const renderMobileMenu = (\r\n <Menu\r\n anchorEl={mobileMoreAnchorEl}\r\n anchorOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"right\",\r\n }}\r\n id={mobileMenuId}\r\n keepMounted\r\n transformOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"right\",\r\n }}\r\n open={isMobileMenuOpen}\r\n onClose={handleMobileMenuClose}\r\n >\r\n {messageCount !== undefined && (\r\n <MenuItem>\r\n <IconButton \r\n size=\"large\" \r\n aria-label={`show ${messageCount} new mails`}\r\n sx={{ color: '#1e2f97' }}\r\n >\r\n <Badge badgeContent={messageCount} color=\"error\">\r\n <MailIcon />\r\n </Badge>\r\n </IconButton>\r\n <p>Messages</p>\r\n </MenuItem>\r\n )}\r\n {notificationCount > 0 && (\r\n <MenuItem>\r\n <IconButton\r\n size=\"large\"\r\n aria-label={`show ${notificationCount} new notifications`}\r\n sx={{ color: '#1e2f97' }}\r\n >\r\n <Badge badgeContent={notificationCount} color=\"error\">\r\n <NotificationsActiveOutlined />\r\n </Badge>\r\n </IconButton>\r\n <p>Notifications</p>\r\n </MenuItem>\r\n )}\r\n <MenuItem onClick={handleProfileMenuOpen}>\r\n <IconButton\r\n size=\"large\"\r\n aria-label=\"account of current user\"\r\n aria-controls=\"primary-account-menu\"\r\n aria-haspopup=\"true\"\r\n sx={{ color: '#1e2f97' }}\r\n >\r\n {isOnline ? (\r\n <OnlineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Online\"\r\n aria-label=\"Online status badge\"\r\n data-testid=\"online-badge\"\r\n >\r\n <AccountCircle\r\n titleAccess={user.name}\r\n aria-label=\"User avatar\"\r\n />\r\n </OnlineBadge>\r\n ) : (\r\n <OfflineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Offline\"\r\n aria-label=\"Offline status badge\"\r\n data-testid=\"offline-badge\"\r\n >\r\n <AccountCircle\r\n titleAccess={user.name}\r\n aria-label=\"User avatar\"\r\n />\r\n </OfflineBadge>\r\n )}\r\n </IconButton>\r\n <p>Profile</p>\r\n </MenuItem>\r\n </Menu>\r\n );\r\n\r\n return (\r\n <Box sx={{ flexGrow: 1 }} className={`app-header ${className || \"\"}`}>\r\n <AppBar\r\n sx={{\r\n position: \"fixed\",\r\n top: 0,\r\n backgroundColor: \"#ffffff\",\r\n }}\r\n >\r\n <Toolbar>\r\n <IconButton\r\n size=\"large\"\r\n edge=\"start\"\r\n aria-label=\"open drawer\"\r\n sx={{ \r\n mr: 2,\r\n color: '#1e2f97',\r\n '&:hover': {\r\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\r\n }\r\n }}\r\n onClick={handleDrawerToggle}\r\n >\r\n {isDrawerOpen ? (\r\n <MenuOpenIcon fontSize={\"large\"} />\r\n ) : (\r\n <MenuIcon fontSize={\"large\"} />\r\n )}\r\n </IconButton>\r\n <Typography\r\n variant=\"h6\"\r\n noWrap\r\n component=\"div\"\r\n sx={{ display: { xs: \"none\", sm: \"block\" } }}\r\n data-testid=\"var-miner-wrapper\"\r\n >\r\n <span className=\"var\">{finalLogo.first}</span>\r\n <span className=\"miner\">{finalLogo.second}</span>\r\n </Typography>\r\n <Box sx={{ flexGrow: 1 }} />\r\n <Box sx={{ display: { xs: \"none\", md: \"flex\" } }}>\r\n {notificationCount > 0 && (\r\n <IconButton\r\n size=\"large\"\r\n aria-label={`show ${notificationCount} new notifications`}\r\n sx={{\r\n color: '#1e2f97',\r\n '&:hover': {\r\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\r\n }\r\n }}\r\n >\r\n <Badge badgeContent={notificationCount} color=\"error\">\r\n <NotificationsActiveOutlined />\r\n </Badge>\r\n </IconButton>\r\n )}\r\n <IconButton\r\n size=\"large\"\r\n edge=\"end\"\r\n aria-label=\"account of current user\"\r\n aria-controls={menuId}\r\n aria-haspopup=\"true\"\r\n onClick={handleProfileMenuOpen}\r\n sx={{\r\n color: '#1e2f97',\r\n '&:hover': {\r\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\r\n }\r\n }}\r\n >\r\n {isOnline ? (\r\n <OnlineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Online\"\r\n aria-label=\"Online status badge\"\r\n data-testid=\"online-badge\"\r\n >\r\n <Avatar\r\n sx={{\r\n bgcolor: deepOrange[500],\r\n width: 20,\r\n height: 20,\r\n p: 1,\r\n }}\r\n alt={user.name}\r\n title={user.name}\r\n src={user.avatar}\r\n sizes=\"large\"\r\n >\r\n {getInitials()}\r\n </Avatar>\r\n </OnlineBadge>\r\n ) : (\r\n <OfflineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Offline\"\r\n aria-label=\"Offline status badge\"\r\n data-testid=\"offline-badge\"\r\n >\r\n <Avatar\r\n sx={{\r\n bgcolor: deepOrange[500],\r\n width: 20,\r\n height: 20,\r\n p: 1,\r\n }}\r\n alt={user.name}\r\n title={user.name}\r\n src={user.avatar}\r\n >\r\n {getInitials()}\r\n </Avatar>\r\n </OfflineBadge>\r\n )}\r\n </IconButton>\r\n </Box>\r\n <Box sx={{ display: { xs: \"flex\", md: \"none\" } }}>\r\n <IconButton\r\n size=\"large\"\r\n aria-label=\"show more\"\r\n aria-controls={mobileMenuId}\r\n aria-haspopup=\"true\"\r\n onClick={handleMobileMenuOpen}\r\n sx={{\r\n color: '#1e2f97',\r\n '&:hover': {\r\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\r\n }\r\n }}\r\n >\r\n <MoreIcon />\r\n </IconButton>\r\n </Box>\r\n </Toolbar>\r\n </AppBar>\r\n {renderMobileMenu}\r\n {renderMenu}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default AppHeader;\r\n\r\n"],"names":["React","_jsx","styled","Badge","List","_jsxs","ListItem","ListItemAvatar","Avatar","deepOrange","ListItemText","Typography","Menu","Divider","MenuItem","ListItemIcon","IconButton","Box","AppBar","Toolbar"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/DrawerContext.tsx","../src/utils/localStorage.ts","../src/AppHeader.tsx"],"sourcesContent":["import * as React from \"react\";\r\n\r\ninterface DrawerContextType {\r\n isDrawerOpen: boolean;\r\n openDrawer: () => void;\r\n closeDrawer: () => void;\r\n toggleDrawer: () => void;\r\n}\r\n\r\nconst DrawerContext = React.createContext<DrawerContextType>({\r\n isDrawerOpen: false,\r\n openDrawer: () => {},\r\n closeDrawer: () => {},\r\n toggleDrawer: () => {},\r\n});\r\n\r\nexport const DrawerProvider = ({ children }: { children: React.ReactNode }) => {\r\n const [isDrawerOpen, setIsDrawerOpen] = React.useState(false);\r\n\r\n const openDrawer = () => {\r\n setIsDrawerOpen(true);\r\n };\r\n\r\n const closeDrawer = () => {\r\n setIsDrawerOpen(false);\r\n };\r\n\r\n const toggleDrawer = () => {\r\n setIsDrawerOpen((prev) => !prev);\r\n };\r\n\r\n return (\r\n <DrawerContext.Provider\r\n value={{ isDrawerOpen, openDrawer, closeDrawer, toggleDrawer }}\r\n >\r\n {children}\r\n </DrawerContext.Provider>\r\n );\r\n};\r\n\r\nexport const useDrawer = () => React.useContext(DrawerContext);\r\n\r\n","/**\r\n * Utility functions to get user data from localStorage\r\n */\r\n\r\n/**\r\n * Gets user profile data from localStorage\r\n * Returns user info including name, email, role, etc.\r\n */\r\nexport const getUserDataFromStorage = () => {\r\n const userDbString = localStorage.getItem(\"persist:userdb\");\r\n if (userDbString) {\r\n try {\r\n const parsedOuter = JSON.parse(userDbString);\r\n \r\n // Helper function to parse nested JSON strings\r\n const parseNested = (value: any) => {\r\n if (typeof value === 'string') {\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return value;\r\n }\r\n }\r\n return value;\r\n };\r\n \r\n // Try to get user data from different possible locations\r\n let userData = null;\r\n \r\n // Check for userDetails\r\n if (parsedOuter.userDetails) {\r\n const parsedUserDetails = parseNested(parsedOuter.userDetails);\r\n userData = parsedUserDetails.user || parsedUserDetails.data || parsedUserDetails;\r\n }\r\n \r\n // Check for user reducer/state\r\n if (!userData && parsedOuter.user) {\r\n const parsedUser = parseNested(parsedOuter.user);\r\n userData = parsedUser.user || parsedUser.data || parsedUser.currentUser || parsedUser;\r\n }\r\n \r\n // Check for authDetails for user info\r\n if (!userData && parsedOuter.authDetails) {\r\n const parsedAuthDetails = parseNested(parsedOuter.authDetails);\r\n // Check auth object\r\n if (parsedAuthDetails.auth) {\r\n userData = parsedAuthDetails.auth.user || parsedAuthDetails.auth.userData;\r\n }\r\n // Check root of authDetails\r\n if (!userData) {\r\n userData = parsedAuthDetails.user || parsedAuthDetails.userData || parsedAuthDetails.currentUser;\r\n }\r\n }\r\n \r\n // Check for profile\r\n if (!userData && parsedOuter.profile) {\r\n const parsedProfile = parseNested(parsedOuter.profile);\r\n userData = parsedProfile.user || parsedProfile.data || parsedProfile;\r\n }\r\n \r\n if (userData) {\r\n // Build name from various possible fields\r\n let name = userData.name || userData.fullName || userData.userName || \"\";\r\n if (!name && (userData.firstName || userData.lastName)) {\r\n name = [userData.firstName, userData.lastName].filter(Boolean).join(' ');\r\n }\r\n \r\n return {\r\n name: name || \"\",\r\n email: userData.email || userData.emailAddress || \"\",\r\n role: userData.role || userData.userRole || userData.designation || userData.title || \"\",\r\n avatar: userData.avatar || userData.profilePicture || userData.imageUrl || userData.profileImage,\r\n initials: userData.initials,\r\n };\r\n }\r\n } catch (err) {\r\n console.error(\"Error parsing user data from localStorage:\", err);\r\n return null;\r\n }\r\n }\r\n return null;\r\n};\r\n\r\n","import AccountCircle from \"@mui/icons-material/AccountCircle\";\r\nimport LogoutOutlinedIcon from \"@mui/icons-material/LogoutOutlined\";\r\nimport MailIcon from \"@mui/icons-material/Mail\";\r\nimport MenuIcon from \"@mui/icons-material/Menu\";\r\nimport MenuOpenIcon from \"@mui/icons-material/MenuOpen\";\r\nimport MoreIcon from \"@mui/icons-material/MoreVert\";\r\nimport NotificationsActiveOutlined from \"@mui/icons-material/NotificationsActiveOutlined\";\r\nimport PersonOutlineOutlinedIcon from \"@mui/icons-material/PersonOutlineOutlined\";\r\nimport SettingsOutlinedIcon from \"@mui/icons-material/SettingsOutlined\";\r\nimport {\r\n AppBar,\r\n Avatar,\r\n Badge,\r\n Box,\r\n Divider,\r\n IconButton,\r\n List,\r\n ListItem,\r\n ListItemAvatar,\r\n ListItemIcon,\r\n ListItemText,\r\n Menu,\r\n MenuItem,\r\n styled,\r\n Toolbar,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport { deepOrange } from \"@mui/material/colors\";\r\nimport React from \"react\";\r\nimport { useDrawer } from \"./DrawerContext\";\r\nimport { AppHeaderProps, UserProfile } from \"./types\";\r\nimport { getUserDataFromStorage } from \"./utils/localStorage\";\r\nimport \"./styles/Header.scss\";\r\n\r\n// Default routes - absolute paths from root\r\nconst DEFAULT_ROUTES = {\r\n settings: \"/account/overview\",\r\n profile: \"/profile\",\r\n logout: \"/logout\",\r\n};\r\n\r\n// Default logo - can be overridden via props\r\nconst DEFAULT_LOGO = {\r\n first: \"VAR\",\r\n second: \"MINER\",\r\n};\r\n\r\nconst AppHeader: React.FC<AppHeaderProps> = ({\r\n user: userProp,\r\n isOnline = true,\r\n logo,\r\n notificationCount = 0,\r\n messageCount,\r\n onDrawerToggle,\r\n routes,\r\n onSettingsClick,\r\n onProfileClick,\r\n onSignOutClick,\r\n className,\r\n isDrawerOpen: isDrawerOpenProp,\r\n}) => {\r\n // Use provided logo or default\r\n const finalLogo = logo ?? DEFAULT_LOGO;\r\n \r\n const { isDrawerOpen: isDrawerOpenContext, toggleDrawer, openDrawer, closeDrawer } = useDrawer();\r\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\r\n const [mobileMoreAnchorEl, setMobileMoreAnchorEl] =\r\n React.useState<null | HTMLElement>(null);\r\n const [user, setUser] = React.useState<UserProfile>(() => {\r\n // Initialize with prop if provided, otherwise try localStorage, otherwise default\r\n if (userProp) {\r\n return userProp;\r\n }\r\n const storedUser = getUserDataFromStorage();\r\n if (storedUser && storedUser.name && storedUser.email) {\r\n return storedUser;\r\n }\r\n return {\r\n name: \"Shiva Kumar\",\r\n email: \"shivam@redcliffelabs.com\",\r\n role: \"Lab Technician\",\r\n initials: \"SK\",\r\n };\r\n });\r\n\r\n // Sync context with prop if provided (for initial state and external control)\r\n const prevPropRef = React.useRef(isDrawerOpenProp);\r\n React.useEffect(() => {\r\n if (isDrawerOpenProp !== undefined && prevPropRef.current !== isDrawerOpenProp) {\r\n if (isDrawerOpenProp) {\r\n openDrawer();\r\n } else {\r\n closeDrawer();\r\n }\r\n prevPropRef.current = isDrawerOpenProp;\r\n }\r\n }, [isDrawerOpenProp, openDrawer, closeDrawer]);\r\n\r\n // Always use context state for icon display (since that's what actually changes on click)\r\n // This ensures the icon updates immediately when user clicks, regardless of prop\r\n const isDrawerOpen = isDrawerOpenContext;\r\n\r\n const isMobileMenuOpen = Boolean(mobileMoreAnchorEl);\r\n\r\n // Update user state when prop changes or fetch from localStorage\r\n React.useEffect(() => {\r\n if (userProp) {\r\n setUser(userProp);\r\n } else {\r\n const storedUser = getUserDataFromStorage();\r\n if (storedUser && storedUser.name && storedUser.email) {\r\n setUser(storedUser);\r\n }\r\n }\r\n }, [userProp]);\r\n\r\n // Merge provided routes with defaults - all routes are absolute from root\r\n const finalRoutes = {\r\n settings: routes?.settings ?? DEFAULT_ROUTES.settings,\r\n profile: routes?.profile ?? DEFAULT_ROUTES.profile,\r\n logout: routes?.logout ?? DEFAULT_ROUTES.logout,\r\n };\r\n\r\n const OnlineBadge = styled(Badge)(({ theme }) => ({\r\n \"& .MuiBadge-badge\": {\r\n backgroundColor: \"#44b700\",\r\n color: \"#44b700\",\r\n boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,\r\n width: 12,\r\n height: 12,\r\n borderRadius: \"50%\",\r\n },\r\n }));\r\n\r\n const OfflineBadge = styled(Badge)(({ theme }) => ({\r\n \"& .MuiBadge-badge\": {\r\n backgroundColor: \"gray\",\r\n color: \"gray\",\r\n boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,\r\n width: 12,\r\n height: 12,\r\n borderRadius: \"50%\",\r\n },\r\n }));\r\n\r\n const handleDrawerToggle = () => {\r\n toggleDrawer();\r\n onDrawerToggle?.();\r\n };\r\n\r\n const handleProfileMenuOpen = (event: React.MouseEvent<HTMLElement>) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleMobileMenuClose = () => {\r\n setMobileMoreAnchorEl(null);\r\n };\r\n\r\n const handleMobileMenuOpen = (event: React.MouseEvent<HTMLElement>) => {\r\n setMobileMoreAnchorEl(event.currentTarget);\r\n };\r\n\r\n const open = Boolean(anchorEl);\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const handleSettingsClick = () => {\r\n handleClose();\r\n if (onSettingsClick) {\r\n onSettingsClick();\r\n } else {\r\n // Use window.location to navigate to absolute path, bypassing React Router basename\r\n const path = finalRoutes.settings.startsWith('/') \r\n ? finalRoutes.settings \r\n : `/${finalRoutes.settings}`;\r\n window.location.href = path;\r\n }\r\n };\r\n\r\n const handleProfileClick = () => {\r\n handleClose();\r\n if (onProfileClick) {\r\n onProfileClick();\r\n } else {\r\n // Use window.location to navigate to absolute path, bypassing React Router basename\r\n const path = finalRoutes.profile.startsWith('/') \r\n ? finalRoutes.profile \r\n : `/${finalRoutes.profile}`;\r\n window.location.href = path;\r\n }\r\n };\r\n\r\n const handleSignOutClick = () => {\r\n handleClose();\r\n if (onSignOutClick) {\r\n onSignOutClick();\r\n } else {\r\n localStorage.clear();\r\n // Use window.location to navigate to absolute path, bypassing React Router basename\r\n const path = finalRoutes.logout.startsWith('/') \r\n ? finalRoutes.logout \r\n : `/${finalRoutes.logout}`;\r\n window.location.href = path;\r\n }\r\n };\r\n\r\n const menuId = \"primary-account-menu\";\r\n\r\n const getInitials = () => {\r\n if (user.initials) return user.initials;\r\n return user.name\r\n .split(\" \")\r\n .map((n) => n[0])\r\n .join(\"\")\r\n .toUpperCase()\r\n .slice(0, 2);\r\n };\r\n\r\n const profileList = (\r\n <List\r\n className=\"profile-menu-section\"\r\n sx={{\r\n width: \"100%\",\r\n maxWidth: 360,\r\n pointerEvents: \"none\",\r\n }}\r\n component=\"div\"\r\n aria-hidden=\"true\"\r\n tabIndex={-1}\r\n >\r\n <ListItem alignItems=\"flex-start\" className=\"profile-menu-item\">\r\n <ListItemAvatar>\r\n {isOnline ? (\r\n <OnlineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Online\"\r\n aria-label=\"Online status badge\"\r\n data-testid=\"online-badge\"\r\n >\r\n <Avatar\r\n sx={{ bgcolor: deepOrange[500] }}\r\n alt={user.name}\r\n title={user.name}\r\n src={user.avatar}\r\n >\r\n {getInitials()}\r\n </Avatar>\r\n </OnlineBadge>\r\n ) : (\r\n <OfflineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Offline\"\r\n aria-label=\"Offline status badge\"\r\n data-testid=\"offline-badge\"\r\n >\r\n <Avatar\r\n sx={{ bgcolor: deepOrange[500] }}\r\n alt={user.name}\r\n title={user.name}\r\n src={user.avatar}\r\n >\r\n {getInitials()}\r\n </Avatar>\r\n </OfflineBadge>\r\n )}\r\n </ListItemAvatar>\r\n <ListItemText\r\n secondary={\r\n <React.Fragment>\r\n <Typography className=\"profile-name\" component=\"p\">\r\n {user.name}\r\n </Typography>\r\n <Typography className=\"profile-email\" component=\"p\">\r\n {user.email}\r\n </Typography>\r\n <Typography className=\"profile-role\" component=\"p\">\r\n Role: {user.role}\r\n </Typography>\r\n </React.Fragment>\r\n }\r\n />\r\n </ListItem>\r\n </List>\r\n );\r\n\r\n const renderMenu = (\r\n <Menu\r\n anchorEl={anchorEl}\r\n id=\"account-menu\"\r\n open={open}\r\n onClose={handleClose}\r\n onClick={handleClose}\r\n slotProps={{\r\n paper: {\r\n elevation: 0,\r\n sx: {\r\n overflow: \"visible\",\r\n filter: \"drop-shadow(0px 2px 8px rgba(0,0,0,0.32))\",\r\n mt: 1.5,\r\n \"& .MuiAvatar-root\": {\r\n width: 32,\r\n height: 32,\r\n ml: -0.5,\r\n mr: 1,\r\n },\r\n \"&::before\": {\r\n content: '\"\"',\r\n display: \"block\",\r\n position: \"absolute\",\r\n top: 0,\r\n right: 14,\r\n width: 10,\r\n height: 10,\r\n bgcolor: \"background.paper\",\r\n transform: \"translateY(-50%) rotate(45deg)\",\r\n zIndex: 0,\r\n },\r\n },\r\n },\r\n }}\r\n transformOrigin={{ horizontal: \"right\", vertical: \"top\" }}\r\n anchorOrigin={{ horizontal: \"right\", vertical: \"bottom\" }}\r\n >\r\n {profileList}\r\n <Divider />\r\n <MenuItem onClick={handleSettingsClick}>\r\n <ListItemIcon>\r\n <SettingsOutlinedIcon fontSize=\"small\" />\r\n </ListItemIcon>\r\n Account Settings\r\n </MenuItem>\r\n <MenuItem onClick={handleProfileClick}>\r\n <ListItemIcon>\r\n <PersonOutlineOutlinedIcon fontSize=\"small\" />\r\n </ListItemIcon>\r\n Profile\r\n </MenuItem>\r\n <MenuItem onClick={handleSignOutClick}>\r\n <ListItemIcon>\r\n <LogoutOutlinedIcon fontSize=\"small\" />\r\n </ListItemIcon>\r\n Sign out\r\n </MenuItem>\r\n </Menu>\r\n );\r\n\r\n const mobileMenuId = \"primary-account-menu-mobile\";\r\n const renderMobileMenu = (\r\n <Menu\r\n anchorEl={mobileMoreAnchorEl}\r\n anchorOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"right\",\r\n }}\r\n id={mobileMenuId}\r\n keepMounted\r\n transformOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"right\",\r\n }}\r\n open={isMobileMenuOpen}\r\n onClose={handleMobileMenuClose}\r\n >\r\n {messageCount !== undefined && (\r\n <MenuItem>\r\n <IconButton \r\n size=\"large\" \r\n aria-label={`show ${messageCount} new mails`}\r\n sx={{ color: '#1e2f97' }}\r\n >\r\n <Badge badgeContent={messageCount} color=\"error\">\r\n <MailIcon />\r\n </Badge>\r\n </IconButton>\r\n <p>Messages</p>\r\n </MenuItem>\r\n )}\r\n {notificationCount > 0 && (\r\n <MenuItem>\r\n <IconButton\r\n size=\"large\"\r\n aria-label={`show ${notificationCount} new notifications`}\r\n sx={{ color: '#1e2f97' }}\r\n >\r\n <Badge badgeContent={notificationCount} color=\"error\">\r\n <NotificationsActiveOutlined />\r\n </Badge>\r\n </IconButton>\r\n <p>Notifications</p>\r\n </MenuItem>\r\n )}\r\n <MenuItem onClick={handleProfileMenuOpen}>\r\n <IconButton\r\n size=\"large\"\r\n aria-label=\"account of current user\"\r\n aria-controls=\"primary-account-menu\"\r\n aria-haspopup=\"true\"\r\n sx={{ color: '#1e2f97' }}\r\n >\r\n {isOnline ? (\r\n <OnlineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Online\"\r\n aria-label=\"Online status badge\"\r\n data-testid=\"online-badge\"\r\n >\r\n <AccountCircle\r\n titleAccess={user.name}\r\n aria-label=\"User avatar\"\r\n />\r\n </OnlineBadge>\r\n ) : (\r\n <OfflineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Offline\"\r\n aria-label=\"Offline status badge\"\r\n data-testid=\"offline-badge\"\r\n >\r\n <AccountCircle\r\n titleAccess={user.name}\r\n aria-label=\"User avatar\"\r\n />\r\n </OfflineBadge>\r\n )}\r\n </IconButton>\r\n <p>Profile</p>\r\n </MenuItem>\r\n </Menu>\r\n );\r\n\r\n return (\r\n <Box sx={{ flexGrow: 1 }} className={`app-header ${className || \"\"}`}>\r\n <AppBar\r\n sx={{\r\n position: \"fixed\",\r\n top: 0,\r\n backgroundColor: \"#ffffff\",\r\n }}\r\n >\r\n <Toolbar>\r\n <IconButton\r\n size=\"large\"\r\n edge=\"start\"\r\n aria-label=\"open drawer\"\r\n sx={{ \r\n mr: 2,\r\n color: '#1e2f97',\r\n '&:hover': {\r\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\r\n }\r\n }}\r\n onClick={handleDrawerToggle}\r\n >\r\n {isDrawerOpen ? (\r\n <MenuOpenIcon fontSize=\"large\" />\r\n ) : (\r\n <MenuIcon fontSize=\"large\" />\r\n )}\r\n </IconButton>\r\n <Typography\r\n variant=\"h6\"\r\n noWrap\r\n component=\"div\"\r\n sx={{ display: { xs: \"none\", sm: \"block\" } }}\r\n data-testid=\"var-miner-wrapper\"\r\n >\r\n <span className=\"var\">{finalLogo.first}</span>\r\n <span className=\"miner\">{finalLogo.second}</span>\r\n </Typography>\r\n <Box sx={{ flexGrow: 1 }} />\r\n <Box sx={{ display: { xs: \"none\", md: \"flex\" } }}>\r\n {notificationCount > 0 && (\r\n <IconButton\r\n size=\"large\"\r\n aria-label={`show ${notificationCount} new notifications`}\r\n sx={{\r\n color: '#1e2f97',\r\n '&:hover': {\r\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\r\n }\r\n }}\r\n >\r\n <Badge badgeContent={notificationCount} color=\"error\">\r\n <NotificationsActiveOutlined />\r\n </Badge>\r\n </IconButton>\r\n )}\r\n <IconButton\r\n size=\"large\"\r\n edge=\"end\"\r\n aria-label=\"account of current user\"\r\n aria-controls={menuId}\r\n aria-haspopup=\"true\"\r\n onClick={handleProfileMenuOpen}\r\n sx={{\r\n color: '#1e2f97',\r\n '&:hover': {\r\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\r\n }\r\n }}\r\n >\r\n {isOnline ? (\r\n <OnlineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Online\"\r\n aria-label=\"Online status badge\"\r\n data-testid=\"online-badge\"\r\n >\r\n <Avatar\r\n sx={{\r\n bgcolor: deepOrange[500],\r\n width: 20,\r\n height: 20,\r\n p: 1,\r\n }}\r\n alt={user.name}\r\n title={user.name}\r\n src={user.avatar}\r\n sizes=\"large\"\r\n >\r\n {getInitials()}\r\n </Avatar>\r\n </OnlineBadge>\r\n ) : (\r\n <OfflineBadge\r\n overlap=\"circular\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n variant=\"dot\"\r\n title=\"Offline\"\r\n aria-label=\"Offline status badge\"\r\n data-testid=\"offline-badge\"\r\n >\r\n <Avatar\r\n sx={{\r\n bgcolor: deepOrange[500],\r\n width: 20,\r\n height: 20,\r\n p: 1,\r\n }}\r\n alt={user.name}\r\n title={user.name}\r\n src={user.avatar}\r\n >\r\n {getInitials()}\r\n </Avatar>\r\n </OfflineBadge>\r\n )}\r\n </IconButton>\r\n </Box>\r\n <Box sx={{ display: { xs: \"flex\", md: \"none\" } }}>\r\n <IconButton\r\n size=\"large\"\r\n aria-label=\"show more\"\r\n aria-controls={mobileMenuId}\r\n aria-haspopup=\"true\"\r\n onClick={handleMobileMenuOpen}\r\n sx={{\r\n color: '#1e2f97',\r\n '&:hover': {\r\n backgroundColor: 'rgba(30, 47, 151, 0.04)',\r\n }\r\n }}\r\n >\r\n <MoreIcon />\r\n </IconButton>\r\n </Box>\r\n </Toolbar>\r\n </AppBar>\r\n {renderMobileMenu}\r\n {renderMenu}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default AppHeader;\r\n\r\n"],"names":["React","_jsx","styled","Badge","List","_jsxs","ListItem","ListItemAvatar","Avatar","deepOrange","ListItemText","Typography","Menu","Divider","MenuItem","ListItemIcon","IconButton","Box","AppBar","Toolbar"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Utility functions to get user data from localStorage
3
+ */
4
+ /**
5
+ * Gets user profile data from localStorage
6
+ * Returns user info including name, email, role, etc.
7
+ */
8
+ export declare const getUserDataFromStorage: () => {
9
+ name: any;
10
+ email: any;
11
+ role: any;
12
+ avatar: any;
13
+ initials: any;
14
+ } | null;
15
+ //# sourceMappingURL=localStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localStorage.d.ts","sourceRoot":"","sources":["../../src/utils/localStorage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,eAAO,MAAM,sBAAsB;;;;;;QAyElC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "varminer-app-header",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "type": "module",
5
5
  "description": "A plug-and-play React header component with Material-UI, drawer toggle, notifications, and user profile menu",
6
6
  "main": "dist/index.js",
@@ -27,7 +27,9 @@
27
27
  "prepublish": "npm run build",
28
28
  "publish:public": "npm publish --access public",
29
29
  "publish:dry-run": "npm publish --dry-run",
30
- "pack": "npm pack"
30
+ "pack": "npm pack",
31
+ "test:link": "npm run build && npm link",
32
+ "test:pack": "npm run build && npm pack"
31
33
  },
32
34
  "keywords": [
33
35
  "react",
@@ -75,8 +77,5 @@
75
77
  "sass": "^1.69.0",
76
78
  "tslib": "^2.6.2",
77
79
  "typescript": "^5.3.0"
78
- },
79
- "dependencies": {
80
- "varminer-app-header": "^1.0.1"
81
80
  }
82
81
  }