varminer-app-header 1.0.0
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.
- package/README.md +203 -0
- package/dist/AppHeader.d.ts +6 -0
- package/dist/AppHeader.d.ts.map +1 -0
- package/dist/DrawerContext.d.ts +13 -0
- package/dist/DrawerContext.d.ts.map +1 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +101 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.esm.css +1 -0
- package/dist/index.esm.js +224 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +246 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +80 -0
package/README.md
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# varminer-app-header
|
|
2
|
+
|
|
3
|
+
A plug-and-play React header component built with Material-UI (MUI) that provides a professional app header with drawer toggle, notifications, user profile menu, and responsive design.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- 🎨 **Material-UI Integration** - Built with MUI components
|
|
8
|
+
- 📱 **Responsive Design** - Mobile and desktop support
|
|
9
|
+
- 🔔 **Notifications** - Badge support for notifications and messages
|
|
10
|
+
- 👤 **User Profile Menu** - Dropdown menu with user info and actions
|
|
11
|
+
- 🎯 **Drawer Toggle** - Built-in drawer context for sidebar navigation
|
|
12
|
+
- 🎨 **Customizable** - Configurable props for branding and behavior
|
|
13
|
+
- 📦 **TypeScript** - Full TypeScript support
|
|
14
|
+
- 🎨 **SCSS Styling** - Customizable styles
|
|
15
|
+
|
|
16
|
+
## Installation
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install varminer-app-header
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Peer Dependencies
|
|
23
|
+
|
|
24
|
+
Make sure you have these installed in your project:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm install react react-dom react-router-dom @mui/material @mui/icons-material @emotion/react @emotion/styled
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Important:** The package uses React Router's `useNavigate` hook for internal navigation. Make sure your app is wrapped with a `BrowserRouter` (or similar router) from `react-router-dom`.
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
### Basic Example (Minimal Configuration)
|
|
35
|
+
|
|
36
|
+
The package includes sensible defaults for logo and routes. Minimal setup:
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
import React from 'react';
|
|
40
|
+
import { AppHeader, DrawerProvider } from 'varminer-app-header';
|
|
41
|
+
import 'varminer-app-header/dist/index.css'; // Don't forget the CSS!
|
|
42
|
+
|
|
43
|
+
function App() {
|
|
44
|
+
return (
|
|
45
|
+
<DrawerProvider>
|
|
46
|
+
<AppHeader
|
|
47
|
+
user={{
|
|
48
|
+
name: "John Doe",
|
|
49
|
+
email: "john@example.com",
|
|
50
|
+
role: "Administrator",
|
|
51
|
+
initials: "JD"
|
|
52
|
+
}}
|
|
53
|
+
notificationCount={5}
|
|
54
|
+
/>
|
|
55
|
+
</DrawerProvider>
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Defaults:**
|
|
61
|
+
- Logo: "VAR" and "MINER"
|
|
62
|
+
- Routes: `/account/overview` (settings), `/profile` (profile), `/logout` (logout)
|
|
63
|
+
- Navigation: Handled internally with React Router
|
|
64
|
+
|
|
65
|
+
### With Custom Callbacks (Override Default Behavior)
|
|
66
|
+
|
|
67
|
+
You can override the default navigation by providing custom callbacks:
|
|
68
|
+
|
|
69
|
+
```tsx
|
|
70
|
+
import React from 'react';
|
|
71
|
+
import { AppHeader, DrawerProvider } from 'varminer-app-header';
|
|
72
|
+
import { useNavigate } from 'react-router-dom';
|
|
73
|
+
|
|
74
|
+
function App() {
|
|
75
|
+
const navigate = useNavigate();
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
<DrawerProvider>
|
|
79
|
+
<AppHeader
|
|
80
|
+
user={{
|
|
81
|
+
name: "Jane Smith",
|
|
82
|
+
email: "jane@example.com",
|
|
83
|
+
role: "Manager",
|
|
84
|
+
avatar: "/path/to/avatar.jpg"
|
|
85
|
+
}}
|
|
86
|
+
isOnline={true}
|
|
87
|
+
logo={{ first: "MY", second: "APP" }}
|
|
88
|
+
routes={{
|
|
89
|
+
settings: "/settings",
|
|
90
|
+
profile: "/profile",
|
|
91
|
+
logout: "/login"
|
|
92
|
+
}}
|
|
93
|
+
onDrawerToggle={() => {
|
|
94
|
+
// Handle drawer toggle
|
|
95
|
+
console.log('Drawer toggled');
|
|
96
|
+
}}
|
|
97
|
+
onSettingsClick={() => {
|
|
98
|
+
// Custom logic before navigation
|
|
99
|
+
console.log('Custom settings handler');
|
|
100
|
+
navigate('/custom-settings');
|
|
101
|
+
}}
|
|
102
|
+
onSignOutClick={() => {
|
|
103
|
+
// Custom sign out logic
|
|
104
|
+
localStorage.clear();
|
|
105
|
+
sessionStorage.clear();
|
|
106
|
+
navigate('/login');
|
|
107
|
+
}}
|
|
108
|
+
/>
|
|
109
|
+
</DrawerProvider>
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Props
|
|
115
|
+
|
|
116
|
+
### AppHeaderProps
|
|
117
|
+
|
|
118
|
+
| Prop | Type | Default | Description |
|
|
119
|
+
|------|------|---------|-------------|
|
|
120
|
+
| `user` | `UserProfile` | See below | User profile information |
|
|
121
|
+
| `isOnline` | `boolean` | `true` | Whether the user is online |
|
|
122
|
+
| `logo` | `{ first: string, second: string }` | `{ first: "VAR", second: "MINER" }` | App logo/brand name (optional) |
|
|
123
|
+
| `notificationCount` | `number` | `0` | Notification badge count (only shown if > 0) |
|
|
124
|
+
| `messageCount` | `number` | `undefined` | Message badge count (optional, shown only in mobile menu) |
|
|
125
|
+
| `onDrawerToggle` | `() => void` | - | Callback when drawer toggle is clicked |
|
|
126
|
+
| `routes` | `{ settings?: string, profile?: string, logout?: string }` | See below | Route paths for navigation (optional) |
|
|
127
|
+
| `onSettingsClick` | `() => void` | - | Callback when settings is clicked (overrides default navigation) |
|
|
128
|
+
| `onProfileClick` | `() => void` | - | Callback when profile is clicked (overrides default navigation) |
|
|
129
|
+
| `onSignOutClick` | `() => void` | - | Callback when sign out is clicked (overrides default navigation) |
|
|
130
|
+
| `className` | `string` | - | Custom CSS class name |
|
|
131
|
+
|
|
132
|
+
**Default routes (used if not provided):**
|
|
133
|
+
- `settings`: `"/account/overview"`
|
|
134
|
+
- `profile`: `"/profile"`
|
|
135
|
+
- `logout`: `"/logout"`
|
|
136
|
+
|
|
137
|
+
**Note:** If callbacks are not provided, the package will automatically handle navigation using React Router's `useNavigate` hook. For sign out, it will also clear `localStorage` before navigating.
|
|
138
|
+
|
|
139
|
+
### UserProfile
|
|
140
|
+
|
|
141
|
+
| Property | Type | Required | Description |
|
|
142
|
+
|----------|------|----------|-------------|
|
|
143
|
+
| `name` | `string` | Yes | User's full name |
|
|
144
|
+
| `email` | `string` | Yes | User's email address |
|
|
145
|
+
| `role` | `string` | Yes | User's role/title |
|
|
146
|
+
| `avatar` | `string` | No | URL to user's avatar image |
|
|
147
|
+
| `initials` | `string` | No | Custom initials (auto-generated from name if not provided) |
|
|
148
|
+
|
|
149
|
+
## DrawerProvider
|
|
150
|
+
|
|
151
|
+
The `DrawerProvider` component provides drawer state management. Wrap your app with it to enable drawer functionality:
|
|
152
|
+
|
|
153
|
+
```tsx
|
|
154
|
+
import { DrawerProvider, useDrawer } from 'varminer-app-header';
|
|
155
|
+
|
|
156
|
+
function MyApp() {
|
|
157
|
+
return (
|
|
158
|
+
<DrawerProvider>
|
|
159
|
+
<YourApp />
|
|
160
|
+
</DrawerProvider>
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Use the drawer context in any component
|
|
165
|
+
function Sidebar() {
|
|
166
|
+
const { isDrawerOpen, toggleDrawer } = useDrawer();
|
|
167
|
+
|
|
168
|
+
return (
|
|
169
|
+
<Drawer open={isDrawerOpen} onClose={toggleDrawer}>
|
|
170
|
+
{/* Sidebar content */}
|
|
171
|
+
</Drawer>
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## Styling
|
|
177
|
+
|
|
178
|
+
The component includes SCSS styles that can be customized. The styles use SCSS variables defined in `src/styles/_variables.scss`. You can override these by importing the styles and customizing the variables.
|
|
179
|
+
|
|
180
|
+
### Custom Styling
|
|
181
|
+
|
|
182
|
+
```tsx
|
|
183
|
+
import 'varminer-app-header/dist/index.css';
|
|
184
|
+
// Your custom overrides
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Development
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
# Install dependencies
|
|
191
|
+
npm install
|
|
192
|
+
|
|
193
|
+
# Build the package
|
|
194
|
+
npm run build
|
|
195
|
+
|
|
196
|
+
# Watch mode for development
|
|
197
|
+
npm run dev
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## License
|
|
201
|
+
|
|
202
|
+
MIT
|
|
203
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppHeader.d.ts","sourceRoot":"","sources":["../src/AppHeader.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,sBAAsB,CAAC;AAe9B,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAqevC,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
interface DrawerContextType {
|
|
3
|
+
isDrawerOpen: boolean;
|
|
4
|
+
openDrawer: () => void;
|
|
5
|
+
closeDrawer: () => void;
|
|
6
|
+
toggleDrawer: () => void;
|
|
7
|
+
}
|
|
8
|
+
export declare const DrawerProvider: ({ children }: {
|
|
9
|
+
children: React.ReactNode;
|
|
10
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export declare const useDrawer: () => DrawerContextType;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=DrawerContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrawerContext.d.ts","sourceRoot":"","sources":["../src/DrawerContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,UAAU,iBAAiB;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AASD,eAAO,MAAM,cAAc,GAAI,cAAc;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,4CAsBzE,CAAC;AAEF,eAAO,MAAM,SAAS,yBAAwC,CAAC"}
|
package/dist/index.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.MuiToolbar-root{background-color:#fff!important;color:#1e2f97!important;padding-left:15px!important}.MuiToolbar-root .MuiButtonBase-root{color:#1e2f97!important;margin-right:0}.app-header,.app-header .MuiAppBar-root{background-color:#fff!important}.app-header .MuiPaper-root:only-of-type{border-bottom:1px solid #e5e9eb;box-shadow:none!important;padding:0!important}.var{color:#1aa7ee!important}.miner,.var{font:500 20px OpenSans-SemiBold,Roboto,sans-serif}.miner{color:#0f1e75!important}#account-menu:has(.profile-menu-section) .MuiList-root .MuiListItem-root .MuiListItemText-root .MuiTypography-root.profile-name{color:#1e2f97;font:600 16px/28px OpenSans-SemiBold,Roboto,sans-serif}#account-menu:has(.profile-menu-section) .MuiList-root .MuiListItem-root .MuiListItemText-root .MuiTypography-root.profile-email{color:rgba(0,0,0,.6);font:400 14px/24px OpenSans-Regular,Roboto,sans-serif;text-decoration:underline}#account-menu:has(.profile-menu-section) .MuiList-root .MuiListItem-root .MuiListItemText-root .MuiTypography-root.profile-role{color:rgba(0,0,0,.38);font:400 12px/28px OpenSans-Regular,Roboto,sans-serif;text-transform:uppercase}#account-menu:has(.profile-menu-item) .profile-menu-item{padding:10px 15px 5px}#account-menu:has(.profile-menu-item) .MuiMenu-paper{background:linear-gradient(180deg,#fff,#ddf7ff,#ddf7ff);box-shadow:none!important;color:#000;margin:0;max-width:280px;width:280px}#account-menu:has(.profile-menu-item) .MuiMenu-paper .MuiListItemAvatar-root{min-width:40px;padding:10px}#account-menu:has(.profile-menu-item) .MuiMenu-paper .MuiListItemAvatar-root .MuiAvatar-circular{height:40px;margin-left:-10px;margin-right:0;width:40px}#account-menu:has(.profile-menu-item) .MuiMenu-paper .MuiMenuItem-root:first-of-type{margin-top:10px}#account-menu:has(.profile-menu-item) .MuiMenu-paper .MuiMenuItem-root .MuiListItemIcon-root .MuiSvgIcon-root{color:#1e2f97}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import React__default from 'react';
|
|
3
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
interface UserProfile {
|
|
6
|
+
name: string;
|
|
7
|
+
email: string;
|
|
8
|
+
role: string;
|
|
9
|
+
avatar?: string;
|
|
10
|
+
initials?: string;
|
|
11
|
+
}
|
|
12
|
+
interface AppHeaderProps {
|
|
13
|
+
/**
|
|
14
|
+
* User profile information
|
|
15
|
+
*/
|
|
16
|
+
user?: UserProfile;
|
|
17
|
+
/**
|
|
18
|
+
* Whether the user is online
|
|
19
|
+
* @default true
|
|
20
|
+
*/
|
|
21
|
+
isOnline?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* App logo/brand name (optional - defaults to "VAR" and "MINER")
|
|
24
|
+
*/
|
|
25
|
+
logo?: {
|
|
26
|
+
first: string;
|
|
27
|
+
second: string;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Notification count (shown in desktop and mobile menu)
|
|
31
|
+
* @default 0
|
|
32
|
+
*/
|
|
33
|
+
notificationCount?: number;
|
|
34
|
+
/**
|
|
35
|
+
* Message count (shown only in mobile menu, optional)
|
|
36
|
+
* @default undefined (not shown if not provided)
|
|
37
|
+
*/
|
|
38
|
+
messageCount?: number;
|
|
39
|
+
/**
|
|
40
|
+
* Callback when drawer toggle is clicked
|
|
41
|
+
*/
|
|
42
|
+
onDrawerToggle?: () => void;
|
|
43
|
+
/**
|
|
44
|
+
* Whether drawer is open
|
|
45
|
+
* @default false
|
|
46
|
+
*/
|
|
47
|
+
isDrawerOpen?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Route paths for navigation (optional - defaults are used if not provided)
|
|
50
|
+
*/
|
|
51
|
+
routes?: {
|
|
52
|
+
/**
|
|
53
|
+
* Settings route path
|
|
54
|
+
* @default "/account/overview"
|
|
55
|
+
*/
|
|
56
|
+
settings?: string;
|
|
57
|
+
/**
|
|
58
|
+
* Profile route path
|
|
59
|
+
* @default "/profile"
|
|
60
|
+
*/
|
|
61
|
+
profile?: string;
|
|
62
|
+
/**
|
|
63
|
+
* Logout route path
|
|
64
|
+
* @default "/logout"
|
|
65
|
+
*/
|
|
66
|
+
logout?: string;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Callback when settings is clicked (overrides default navigation)
|
|
70
|
+
*/
|
|
71
|
+
onSettingsClick?: () => void;
|
|
72
|
+
/**
|
|
73
|
+
* Callback when profile is clicked (overrides default navigation)
|
|
74
|
+
*/
|
|
75
|
+
onProfileClick?: () => void;
|
|
76
|
+
/**
|
|
77
|
+
* Callback when sign out is clicked (overrides default navigation)
|
|
78
|
+
* If not provided, will clear localStorage and navigate to logout route
|
|
79
|
+
*/
|
|
80
|
+
onSignOutClick?: () => void;
|
|
81
|
+
/**
|
|
82
|
+
* Custom CSS class name
|
|
83
|
+
*/
|
|
84
|
+
className?: string;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
declare const AppHeader: React__default.FC<AppHeaderProps>;
|
|
88
|
+
|
|
89
|
+
interface DrawerContextType {
|
|
90
|
+
isDrawerOpen: boolean;
|
|
91
|
+
openDrawer: () => void;
|
|
92
|
+
closeDrawer: () => void;
|
|
93
|
+
toggleDrawer: () => void;
|
|
94
|
+
}
|
|
95
|
+
declare const DrawerProvider: ({ children }: {
|
|
96
|
+
children: React.ReactNode;
|
|
97
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
98
|
+
declare const useDrawer: () => DrawerContextType;
|
|
99
|
+
|
|
100
|
+
export { AppHeader, DrawerProvider, useDrawer };
|
|
101
|
+
export type { AppHeaderProps, UserProfile };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.MuiToolbar-root{background-color:#fff!important;color:#1e2f97!important;padding-left:15px!important}.MuiToolbar-root .MuiButtonBase-root{color:#1e2f97!important;margin-right:0}.app-header,.app-header .MuiAppBar-root{background-color:#fff!important}.app-header .MuiPaper-root:only-of-type{border-bottom:1px solid #e5e9eb;box-shadow:none!important;padding:0!important}.var{color:#1aa7ee!important}.miner,.var{font:500 20px OpenSans-SemiBold,Roboto,sans-serif}.miner{color:#0f1e75!important}#account-menu:has(.profile-menu-section) .MuiList-root .MuiListItem-root .MuiListItemText-root .MuiTypography-root.profile-name{color:#1e2f97;font:600 16px/28px OpenSans-SemiBold,Roboto,sans-serif}#account-menu:has(.profile-menu-section) .MuiList-root .MuiListItem-root .MuiListItemText-root .MuiTypography-root.profile-email{color:rgba(0,0,0,.6);font:400 14px/24px OpenSans-Regular,Roboto,sans-serif;text-decoration:underline}#account-menu:has(.profile-menu-section) .MuiList-root .MuiListItem-root .MuiListItemText-root .MuiTypography-root.profile-role{color:rgba(0,0,0,.38);font:400 12px/28px OpenSans-Regular,Roboto,sans-serif;text-transform:uppercase}#account-menu:has(.profile-menu-item) .profile-menu-item{padding:10px 15px 5px}#account-menu:has(.profile-menu-item) .MuiMenu-paper{background:linear-gradient(180deg,#fff,#ddf7ff,#ddf7ff);box-shadow:none!important;color:#000;margin:0;max-width:280px;width:280px}#account-menu:has(.profile-menu-item) .MuiMenu-paper .MuiListItemAvatar-root{min-width:40px;padding:10px}#account-menu:has(.profile-menu-item) .MuiMenu-paper .MuiListItemAvatar-root .MuiAvatar-circular{height:40px;margin-left:-10px;margin-right:0;width:40px}#account-menu:has(.profile-menu-item) .MuiMenu-paper .MuiMenuItem-root:first-of-type{margin-top:10px}#account-menu:has(.profile-menu-item) .MuiMenu-paper .MuiMenuItem-root .MuiListItemIcon-root .MuiSvgIcon-root{color:#1e2f97}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import AccountCircle from '@mui/icons-material/AccountCircle';
|
|
3
|
+
import LogoutOutlinedIcon from '@mui/icons-material/LogoutOutlined';
|
|
4
|
+
import MailIcon from '@mui/icons-material/Mail';
|
|
5
|
+
import MenuIcon from '@mui/icons-material/Menu';
|
|
6
|
+
import MenuOpenIcon from '@mui/icons-material/MenuOpen';
|
|
7
|
+
import MoreIcon from '@mui/icons-material/MoreVert';
|
|
8
|
+
import NotificationsActiveOutlined from '@mui/icons-material/NotificationsActiveOutlined';
|
|
9
|
+
import PersonOutlineOutlinedIcon from '@mui/icons-material/PersonOutlineOutlined';
|
|
10
|
+
import SettingsOutlinedIcon from '@mui/icons-material/SettingsOutlined';
|
|
11
|
+
import { styled, Badge, List, ListItem, ListItemAvatar, Avatar, ListItemText, Typography, Menu, Divider, MenuItem, ListItemIcon, IconButton, Box, AppBar, Toolbar } from '@mui/material';
|
|
12
|
+
import { deepOrange } from '@mui/material/colors';
|
|
13
|
+
import * as React from 'react';
|
|
14
|
+
import React__default from 'react';
|
|
15
|
+
import { useNavigate } from 'react-router-dom';
|
|
16
|
+
|
|
17
|
+
const DrawerContext = React.createContext({
|
|
18
|
+
isDrawerOpen: false,
|
|
19
|
+
openDrawer: () => { },
|
|
20
|
+
closeDrawer: () => { },
|
|
21
|
+
toggleDrawer: () => { },
|
|
22
|
+
});
|
|
23
|
+
const DrawerProvider = ({ children }) => {
|
|
24
|
+
const [isDrawerOpen, setIsDrawerOpen] = React.useState(false);
|
|
25
|
+
const openDrawer = () => {
|
|
26
|
+
setIsDrawerOpen(true);
|
|
27
|
+
};
|
|
28
|
+
const closeDrawer = () => {
|
|
29
|
+
setIsDrawerOpen(false);
|
|
30
|
+
};
|
|
31
|
+
const toggleDrawer = () => {
|
|
32
|
+
setIsDrawerOpen((prev) => !prev);
|
|
33
|
+
};
|
|
34
|
+
return (jsx(DrawerContext.Provider, { value: { isDrawerOpen, openDrawer, closeDrawer, toggleDrawer }, children: children }));
|
|
35
|
+
};
|
|
36
|
+
const useDrawer = () => React.useContext(DrawerContext);
|
|
37
|
+
|
|
38
|
+
// Default routes - can be overridden via props
|
|
39
|
+
const DEFAULT_ROUTES = {
|
|
40
|
+
settings: "/account/overview",
|
|
41
|
+
profile: "/profile",
|
|
42
|
+
logout: "/logout",
|
|
43
|
+
};
|
|
44
|
+
// Default logo - can be overridden via props
|
|
45
|
+
const DEFAULT_LOGO = {
|
|
46
|
+
first: "VAR",
|
|
47
|
+
second: "MINER",
|
|
48
|
+
};
|
|
49
|
+
const AppHeader = ({ user = {
|
|
50
|
+
name: "Shivam Kumar",
|
|
51
|
+
email: "shivam@redcliffelabs.com",
|
|
52
|
+
role: "Lab Technician",
|
|
53
|
+
initials: "SK",
|
|
54
|
+
}, isOnline = true, logo, notificationCount = 0, messageCount, onDrawerToggle, routes, onSettingsClick, onProfileClick, onSignOutClick, className, }) => {
|
|
55
|
+
// Merge provided routes with defaults
|
|
56
|
+
const finalRoutes = {
|
|
57
|
+
settings: routes?.settings ?? DEFAULT_ROUTES.settings,
|
|
58
|
+
profile: routes?.profile ?? DEFAULT_ROUTES.profile,
|
|
59
|
+
logout: routes?.logout ?? DEFAULT_ROUTES.logout,
|
|
60
|
+
};
|
|
61
|
+
// Use provided logo or default
|
|
62
|
+
const finalLogo = logo ?? DEFAULT_LOGO;
|
|
63
|
+
const { isDrawerOpen, toggleDrawer } = useDrawer();
|
|
64
|
+
const navigate = useNavigate();
|
|
65
|
+
const [anchorEl, setAnchorEl] = React__default.useState(null);
|
|
66
|
+
const [mobileMoreAnchorEl, setMobileMoreAnchorEl] = React__default.useState(null);
|
|
67
|
+
const isMobileMenuOpen = Boolean(mobileMoreAnchorEl);
|
|
68
|
+
const OnlineBadge = styled(Badge)(({ theme }) => ({
|
|
69
|
+
"& .MuiBadge-badge": {
|
|
70
|
+
backgroundColor: "#44b700",
|
|
71
|
+
color: "#44b700",
|
|
72
|
+
boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,
|
|
73
|
+
width: 12,
|
|
74
|
+
height: 12,
|
|
75
|
+
borderRadius: "50%",
|
|
76
|
+
},
|
|
77
|
+
}));
|
|
78
|
+
const OfflineBadge = styled(Badge)(({ theme }) => ({
|
|
79
|
+
"& .MuiBadge-badge": {
|
|
80
|
+
backgroundColor: "gray",
|
|
81
|
+
color: "gray",
|
|
82
|
+
boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,
|
|
83
|
+
width: 12,
|
|
84
|
+
height: 12,
|
|
85
|
+
borderRadius: "50%",
|
|
86
|
+
},
|
|
87
|
+
}));
|
|
88
|
+
const handleDrawerToggle = () => {
|
|
89
|
+
toggleDrawer();
|
|
90
|
+
onDrawerToggle?.();
|
|
91
|
+
};
|
|
92
|
+
const handleProfileMenuOpen = (event) => {
|
|
93
|
+
setAnchorEl(event.currentTarget);
|
|
94
|
+
};
|
|
95
|
+
const handleMobileMenuClose = () => {
|
|
96
|
+
setMobileMoreAnchorEl(null);
|
|
97
|
+
};
|
|
98
|
+
const handleMobileMenuOpen = (event) => {
|
|
99
|
+
setMobileMoreAnchorEl(event.currentTarget);
|
|
100
|
+
};
|
|
101
|
+
const open = Boolean(anchorEl);
|
|
102
|
+
const handleClose = () => {
|
|
103
|
+
setAnchorEl(null);
|
|
104
|
+
};
|
|
105
|
+
const handleSettingsClick = () => {
|
|
106
|
+
handleClose();
|
|
107
|
+
if (onSettingsClick) {
|
|
108
|
+
onSettingsClick();
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
navigate(finalRoutes.settings);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
const handleProfileClick = () => {
|
|
115
|
+
handleClose();
|
|
116
|
+
if (onProfileClick) {
|
|
117
|
+
onProfileClick();
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
navigate(finalRoutes.profile);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
const handleSignOutClick = () => {
|
|
124
|
+
handleClose();
|
|
125
|
+
if (onSignOutClick) {
|
|
126
|
+
onSignOutClick();
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
localStorage.clear();
|
|
130
|
+
navigate(finalRoutes.logout);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
const menuId = "primary-account-menu";
|
|
134
|
+
const getInitials = () => {
|
|
135
|
+
if (user.initials)
|
|
136
|
+
return user.initials;
|
|
137
|
+
return user.name
|
|
138
|
+
.split(" ")
|
|
139
|
+
.map((n) => n[0])
|
|
140
|
+
.join("")
|
|
141
|
+
.toUpperCase()
|
|
142
|
+
.slice(0, 2);
|
|
143
|
+
};
|
|
144
|
+
const profileList = (jsx(List, { className: "profile-menu-section", sx: {
|
|
145
|
+
width: "100%",
|
|
146
|
+
maxWidth: 360,
|
|
147
|
+
pointerEvents: "none",
|
|
148
|
+
}, component: "div", "aria-hidden": "true", tabIndex: -1, children: jsxs(ListItem, { alignItems: "flex-start", className: "profile-menu-item", children: [jsx(ListItemAvatar, { children: isOnline ? (jsx(OnlineBadge, { overlap: "circular", anchorOrigin: { vertical: "bottom", horizontal: "right" }, variant: "dot", title: "Online", "aria-label": "Online status badge", "data-testid": "online-badge", children: jsx(Avatar, { sx: { bgcolor: deepOrange[500] }, alt: user.name, title: user.name, src: user.avatar, children: getInitials() }) })) : (jsx(OfflineBadge, { overlap: "circular", anchorOrigin: { vertical: "bottom", horizontal: "right" }, variant: "dot", title: "Offline", "aria-label": "Offline status badge", "data-testid": "offline-badge", children: jsx(Avatar, { sx: { bgcolor: deepOrange[500] }, alt: user.name, title: user.name, src: user.avatar, children: getInitials() }) })) }), jsx(ListItemText, { secondary: jsxs(React__default.Fragment, { children: [jsx(Typography, { className: "profile-name", component: "p", children: user.name }), jsx(Typography, { className: "profile-email", component: "p", children: user.email }), jsxs(Typography, { className: "profile-role", component: "p", children: ["Role: ", user.role] })] }) })] }) }));
|
|
149
|
+
const renderMenu = (jsxs(Menu, { anchorEl: anchorEl, id: "account-menu", open: open, onClose: handleClose, onClick: handleClose, slotProps: {
|
|
150
|
+
paper: {
|
|
151
|
+
elevation: 0,
|
|
152
|
+
sx: {
|
|
153
|
+
overflow: "visible",
|
|
154
|
+
filter: "drop-shadow(0px 2px 8px rgba(0,0,0,0.32))",
|
|
155
|
+
mt: 1.5,
|
|
156
|
+
"& .MuiAvatar-root": {
|
|
157
|
+
width: 32,
|
|
158
|
+
height: 32,
|
|
159
|
+
ml: -0.5,
|
|
160
|
+
mr: 1,
|
|
161
|
+
},
|
|
162
|
+
"&::before": {
|
|
163
|
+
content: '""',
|
|
164
|
+
display: "block",
|
|
165
|
+
position: "absolute",
|
|
166
|
+
top: 0,
|
|
167
|
+
right: 14,
|
|
168
|
+
width: 10,
|
|
169
|
+
height: 10,
|
|
170
|
+
bgcolor: "background.paper",
|
|
171
|
+
transform: "translateY(-50%) rotate(45deg)",
|
|
172
|
+
zIndex: 0,
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
}, transformOrigin: { horizontal: "right", vertical: "top" }, anchorOrigin: { horizontal: "right", vertical: "bottom" }, children: [profileList, jsx(Divider, {}), jsxs(MenuItem, { onClick: handleSettingsClick, children: [jsx(ListItemIcon, { children: jsx(SettingsOutlinedIcon, { fontSize: "small" }) }), "Settings"] }), jsxs(MenuItem, { onClick: handleProfileClick, children: [jsx(ListItemIcon, { children: jsx(PersonOutlineOutlinedIcon, { fontSize: "small" }) }), "Profile"] }), jsxs(MenuItem, { onClick: handleSignOutClick, children: [jsx(ListItemIcon, { children: jsx(LogoutOutlinedIcon, { fontSize: "small" }) }), "Sign out"] })] }));
|
|
177
|
+
const mobileMenuId = "primary-account-menu-mobile";
|
|
178
|
+
const renderMobileMenu = (jsxs(Menu, { anchorEl: mobileMoreAnchorEl, anchorOrigin: {
|
|
179
|
+
vertical: "top",
|
|
180
|
+
horizontal: "right",
|
|
181
|
+
}, id: mobileMenuId, keepMounted: true, transformOrigin: {
|
|
182
|
+
vertical: "top",
|
|
183
|
+
horizontal: "right",
|
|
184
|
+
}, open: isMobileMenuOpen, onClose: handleMobileMenuClose, children: [messageCount !== undefined && (jsxs(MenuItem, { children: [jsx(IconButton, { size: "large", "aria-label": `show ${messageCount} new mails`, sx: { color: '#1e2f97' }, children: jsx(Badge, { badgeContent: messageCount, color: "error", children: jsx(MailIcon, {}) }) }), jsx("p", { children: "Messages" })] })), notificationCount > 0 && (jsxs(MenuItem, { children: [jsx(IconButton, { size: "large", "aria-label": `show ${notificationCount} new notifications`, sx: { color: '#1e2f97' }, children: jsx(Badge, { badgeContent: notificationCount, color: "error", children: jsx(NotificationsActiveOutlined, {}) }) }), jsx("p", { children: "Notifications" })] })), jsxs(MenuItem, { onClick: handleProfileMenuOpen, children: [jsx(IconButton, { size: "large", "aria-label": "account of current user", "aria-controls": "primary-account-menu", "aria-haspopup": "true", sx: { color: '#1e2f97' }, children: isOnline ? (jsx(OnlineBadge, { overlap: "circular", anchorOrigin: { vertical: "bottom", horizontal: "right" }, variant: "dot", title: "Online", "aria-label": "Online status badge", "data-testid": "online-badge", children: jsx(AccountCircle, { titleAccess: user.name, "aria-label": "User avatar" }) })) : (jsx(OfflineBadge, { overlap: "circular", anchorOrigin: { vertical: "bottom", horizontal: "right" }, variant: "dot", title: "Offline", "aria-label": "Offline status badge", "data-testid": "offline-badge", children: jsx(AccountCircle, { titleAccess: user.name, "aria-label": "User avatar" }) })) }), jsx("p", { children: "Profile" })] })] }));
|
|
185
|
+
return (jsxs(Box, { sx: { flexGrow: 1 }, className: `app-header ${className || ""}`, children: [jsx(AppBar, { sx: {
|
|
186
|
+
position: "fixed",
|
|
187
|
+
top: 0,
|
|
188
|
+
backgroundColor: "#ffffff",
|
|
189
|
+
}, children: jsxs(Toolbar, { children: [jsx(IconButton, { size: "large", edge: "start", "aria-label": "open drawer", sx: {
|
|
190
|
+
mr: 2,
|
|
191
|
+
color: '#1e2f97',
|
|
192
|
+
'&:hover': {
|
|
193
|
+
backgroundColor: 'rgba(30, 47, 151, 0.04)',
|
|
194
|
+
}
|
|
195
|
+
}, onClick: handleDrawerToggle, children: isDrawerOpen ? (jsx(MenuOpenIcon, { fontSize: "large" })) : (jsx(MenuIcon, { fontSize: "large" })) }), jsxs(Typography, { variant: "h6", noWrap: true, component: "div", sx: { display: { xs: "none", sm: "block" } }, "data-testid": "var-miner-wrapper", children: [jsx("span", { className: "var", children: finalLogo.first }), jsx("span", { className: "miner", children: finalLogo.second })] }), jsx(Box, { sx: { flexGrow: 1 } }), jsxs(Box, { sx: { display: { xs: "none", md: "flex" } }, children: [notificationCount > 0 && (jsx(IconButton, { size: "large", "aria-label": `show ${notificationCount} new notifications`, sx: {
|
|
196
|
+
color: '#1e2f97',
|
|
197
|
+
'&:hover': {
|
|
198
|
+
backgroundColor: 'rgba(30, 47, 151, 0.04)',
|
|
199
|
+
}
|
|
200
|
+
}, children: jsx(Badge, { badgeContent: notificationCount, color: "error", children: jsx(NotificationsActiveOutlined, {}) }) })), jsx(IconButton, { size: "large", edge: "end", "aria-label": "account of current user", "aria-controls": menuId, "aria-haspopup": "true", onClick: handleProfileMenuOpen, sx: {
|
|
201
|
+
color: '#1e2f97',
|
|
202
|
+
'&:hover': {
|
|
203
|
+
backgroundColor: 'rgba(30, 47, 151, 0.04)',
|
|
204
|
+
}
|
|
205
|
+
}, children: isOnline ? (jsx(OnlineBadge, { overlap: "circular", anchorOrigin: { vertical: "bottom", horizontal: "right" }, variant: "dot", title: "Online", "aria-label": "Online status badge", "data-testid": "online-badge", children: jsx(Avatar, { sx: {
|
|
206
|
+
bgcolor: deepOrange[500],
|
|
207
|
+
width: 20,
|
|
208
|
+
height: 20,
|
|
209
|
+
p: 1,
|
|
210
|
+
}, alt: user.name, title: user.name, src: user.avatar, sizes: "large", children: getInitials() }) })) : (jsx(OfflineBadge, { overlap: "circular", anchorOrigin: { vertical: "bottom", horizontal: "right" }, variant: "dot", title: "Offline", "aria-label": "Offline status badge", "data-testid": "offline-badge", children: jsx(Avatar, { sx: {
|
|
211
|
+
bgcolor: deepOrange[500],
|
|
212
|
+
width: 20,
|
|
213
|
+
height: 20,
|
|
214
|
+
p: 1,
|
|
215
|
+
}, alt: user.name, title: user.name, src: user.avatar, children: getInitials() }) })) })] }), jsx(Box, { sx: { display: { xs: "flex", md: "none" } }, children: jsx(IconButton, { size: "large", "aria-label": "show more", "aria-controls": mobileMenuId, "aria-haspopup": "true", onClick: handleMobileMenuOpen, sx: {
|
|
216
|
+
color: '#1e2f97',
|
|
217
|
+
'&:hover': {
|
|
218
|
+
backgroundColor: 'rgba(30, 47, 151, 0.04)',
|
|
219
|
+
}
|
|
220
|
+
}, children: jsx(MoreIcon, {}) }) })] }) }), renderMobileMenu, renderMenu] }));
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
export { AppHeader, DrawerProvider, useDrawer };
|
|
224
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +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 { useNavigate } from \"react-router-dom\";\r\nimport { useDrawer } from \"./DrawerContext\";\r\nimport { AppHeaderProps } from \"./types\";\r\nimport \"./styles/Header.scss\";\r\n\r\n// Default routes - can be overridden via props\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 // Merge provided routes with defaults\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 // Use provided logo or default\r\n const finalLogo = logo ?? DEFAULT_LOGO;\r\n \r\n const { isDrawerOpen, toggleDrawer } = useDrawer();\r\n const navigate = useNavigate();\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 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 navigate(finalRoutes.settings);\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 navigate(finalRoutes.profile);\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 navigate(finalRoutes.logout);\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 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
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var AccountCircle = require('@mui/icons-material/AccountCircle');
|
|
5
|
+
var LogoutOutlinedIcon = require('@mui/icons-material/LogoutOutlined');
|
|
6
|
+
var MailIcon = require('@mui/icons-material/Mail');
|
|
7
|
+
var MenuIcon = require('@mui/icons-material/Menu');
|
|
8
|
+
var MenuOpenIcon = require('@mui/icons-material/MenuOpen');
|
|
9
|
+
var MoreIcon = require('@mui/icons-material/MoreVert');
|
|
10
|
+
var NotificationsActiveOutlined = require('@mui/icons-material/NotificationsActiveOutlined');
|
|
11
|
+
var PersonOutlineOutlinedIcon = require('@mui/icons-material/PersonOutlineOutlined');
|
|
12
|
+
var SettingsOutlinedIcon = require('@mui/icons-material/SettingsOutlined');
|
|
13
|
+
var material = require('@mui/material');
|
|
14
|
+
var colors = require('@mui/material/colors');
|
|
15
|
+
var React = require('react');
|
|
16
|
+
var reactRouterDom = require('react-router-dom');
|
|
17
|
+
|
|
18
|
+
function _interopNamespaceDefault(e) {
|
|
19
|
+
var n = Object.create(null);
|
|
20
|
+
if (e) {
|
|
21
|
+
Object.keys(e).forEach(function (k) {
|
|
22
|
+
if (k !== 'default') {
|
|
23
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
24
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function () { return e[k]; }
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
n.default = e;
|
|
32
|
+
return Object.freeze(n);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
36
|
+
|
|
37
|
+
const DrawerContext = React__namespace.createContext({
|
|
38
|
+
isDrawerOpen: false,
|
|
39
|
+
openDrawer: () => { },
|
|
40
|
+
closeDrawer: () => { },
|
|
41
|
+
toggleDrawer: () => { },
|
|
42
|
+
});
|
|
43
|
+
const DrawerProvider = ({ children }) => {
|
|
44
|
+
const [isDrawerOpen, setIsDrawerOpen] = React__namespace.useState(false);
|
|
45
|
+
const openDrawer = () => {
|
|
46
|
+
setIsDrawerOpen(true);
|
|
47
|
+
};
|
|
48
|
+
const closeDrawer = () => {
|
|
49
|
+
setIsDrawerOpen(false);
|
|
50
|
+
};
|
|
51
|
+
const toggleDrawer = () => {
|
|
52
|
+
setIsDrawerOpen((prev) => !prev);
|
|
53
|
+
};
|
|
54
|
+
return (jsxRuntime.jsx(DrawerContext.Provider, { value: { isDrawerOpen, openDrawer, closeDrawer, toggleDrawer }, children: children }));
|
|
55
|
+
};
|
|
56
|
+
const useDrawer = () => React__namespace.useContext(DrawerContext);
|
|
57
|
+
|
|
58
|
+
// Default routes - can be overridden via props
|
|
59
|
+
const DEFAULT_ROUTES = {
|
|
60
|
+
settings: "/account/overview",
|
|
61
|
+
profile: "/profile",
|
|
62
|
+
logout: "/logout",
|
|
63
|
+
};
|
|
64
|
+
// Default logo - can be overridden via props
|
|
65
|
+
const DEFAULT_LOGO = {
|
|
66
|
+
first: "VAR",
|
|
67
|
+
second: "MINER",
|
|
68
|
+
};
|
|
69
|
+
const AppHeader = ({ user = {
|
|
70
|
+
name: "Shivam Kumar",
|
|
71
|
+
email: "shivam@redcliffelabs.com",
|
|
72
|
+
role: "Lab Technician",
|
|
73
|
+
initials: "SK",
|
|
74
|
+
}, isOnline = true, logo, notificationCount = 0, messageCount, onDrawerToggle, routes, onSettingsClick, onProfileClick, onSignOutClick, className, }) => {
|
|
75
|
+
// Merge provided routes with defaults
|
|
76
|
+
const finalRoutes = {
|
|
77
|
+
settings: routes?.settings ?? DEFAULT_ROUTES.settings,
|
|
78
|
+
profile: routes?.profile ?? DEFAULT_ROUTES.profile,
|
|
79
|
+
logout: routes?.logout ?? DEFAULT_ROUTES.logout,
|
|
80
|
+
};
|
|
81
|
+
// Use provided logo or default
|
|
82
|
+
const finalLogo = logo ?? DEFAULT_LOGO;
|
|
83
|
+
const { isDrawerOpen, toggleDrawer } = useDrawer();
|
|
84
|
+
const navigate = reactRouterDom.useNavigate();
|
|
85
|
+
const [anchorEl, setAnchorEl] = React.useState(null);
|
|
86
|
+
const [mobileMoreAnchorEl, setMobileMoreAnchorEl] = React.useState(null);
|
|
87
|
+
const isMobileMenuOpen = Boolean(mobileMoreAnchorEl);
|
|
88
|
+
const OnlineBadge = material.styled(material.Badge)(({ theme }) => ({
|
|
89
|
+
"& .MuiBadge-badge": {
|
|
90
|
+
backgroundColor: "#44b700",
|
|
91
|
+
color: "#44b700",
|
|
92
|
+
boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,
|
|
93
|
+
width: 12,
|
|
94
|
+
height: 12,
|
|
95
|
+
borderRadius: "50%",
|
|
96
|
+
},
|
|
97
|
+
}));
|
|
98
|
+
const OfflineBadge = material.styled(material.Badge)(({ theme }) => ({
|
|
99
|
+
"& .MuiBadge-badge": {
|
|
100
|
+
backgroundColor: "gray",
|
|
101
|
+
color: "gray",
|
|
102
|
+
boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,
|
|
103
|
+
width: 12,
|
|
104
|
+
height: 12,
|
|
105
|
+
borderRadius: "50%",
|
|
106
|
+
},
|
|
107
|
+
}));
|
|
108
|
+
const handleDrawerToggle = () => {
|
|
109
|
+
toggleDrawer();
|
|
110
|
+
onDrawerToggle?.();
|
|
111
|
+
};
|
|
112
|
+
const handleProfileMenuOpen = (event) => {
|
|
113
|
+
setAnchorEl(event.currentTarget);
|
|
114
|
+
};
|
|
115
|
+
const handleMobileMenuClose = () => {
|
|
116
|
+
setMobileMoreAnchorEl(null);
|
|
117
|
+
};
|
|
118
|
+
const handleMobileMenuOpen = (event) => {
|
|
119
|
+
setMobileMoreAnchorEl(event.currentTarget);
|
|
120
|
+
};
|
|
121
|
+
const open = Boolean(anchorEl);
|
|
122
|
+
const handleClose = () => {
|
|
123
|
+
setAnchorEl(null);
|
|
124
|
+
};
|
|
125
|
+
const handleSettingsClick = () => {
|
|
126
|
+
handleClose();
|
|
127
|
+
if (onSettingsClick) {
|
|
128
|
+
onSettingsClick();
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
navigate(finalRoutes.settings);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
const handleProfileClick = () => {
|
|
135
|
+
handleClose();
|
|
136
|
+
if (onProfileClick) {
|
|
137
|
+
onProfileClick();
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
navigate(finalRoutes.profile);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
const handleSignOutClick = () => {
|
|
144
|
+
handleClose();
|
|
145
|
+
if (onSignOutClick) {
|
|
146
|
+
onSignOutClick();
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
localStorage.clear();
|
|
150
|
+
navigate(finalRoutes.logout);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
const menuId = "primary-account-menu";
|
|
154
|
+
const getInitials = () => {
|
|
155
|
+
if (user.initials)
|
|
156
|
+
return user.initials;
|
|
157
|
+
return user.name
|
|
158
|
+
.split(" ")
|
|
159
|
+
.map((n) => n[0])
|
|
160
|
+
.join("")
|
|
161
|
+
.toUpperCase()
|
|
162
|
+
.slice(0, 2);
|
|
163
|
+
};
|
|
164
|
+
const profileList = (jsxRuntime.jsx(material.List, { className: "profile-menu-section", sx: {
|
|
165
|
+
width: "100%",
|
|
166
|
+
maxWidth: 360,
|
|
167
|
+
pointerEvents: "none",
|
|
168
|
+
}, component: "div", "aria-hidden": "true", tabIndex: -1, children: jsxRuntime.jsxs(material.ListItem, { alignItems: "flex-start", className: "profile-menu-item", children: [jsxRuntime.jsx(material.ListItemAvatar, { children: isOnline ? (jsxRuntime.jsx(OnlineBadge, { overlap: "circular", anchorOrigin: { vertical: "bottom", horizontal: "right" }, variant: "dot", title: "Online", "aria-label": "Online status badge", "data-testid": "online-badge", children: jsxRuntime.jsx(material.Avatar, { sx: { bgcolor: colors.deepOrange[500] }, alt: user.name, title: user.name, src: user.avatar, children: getInitials() }) })) : (jsxRuntime.jsx(OfflineBadge, { overlap: "circular", anchorOrigin: { vertical: "bottom", horizontal: "right" }, variant: "dot", title: "Offline", "aria-label": "Offline status badge", "data-testid": "offline-badge", children: jsxRuntime.jsx(material.Avatar, { sx: { bgcolor: colors.deepOrange[500] }, alt: user.name, title: user.name, src: user.avatar, children: getInitials() }) })) }), jsxRuntime.jsx(material.ListItemText, { secondary: jsxRuntime.jsxs(React.Fragment, { children: [jsxRuntime.jsx(material.Typography, { className: "profile-name", component: "p", children: user.name }), jsxRuntime.jsx(material.Typography, { className: "profile-email", component: "p", children: user.email }), jsxRuntime.jsxs(material.Typography, { className: "profile-role", component: "p", children: ["Role: ", user.role] })] }) })] }) }));
|
|
169
|
+
const renderMenu = (jsxRuntime.jsxs(material.Menu, { anchorEl: anchorEl, id: "account-menu", open: open, onClose: handleClose, onClick: handleClose, slotProps: {
|
|
170
|
+
paper: {
|
|
171
|
+
elevation: 0,
|
|
172
|
+
sx: {
|
|
173
|
+
overflow: "visible",
|
|
174
|
+
filter: "drop-shadow(0px 2px 8px rgba(0,0,0,0.32))",
|
|
175
|
+
mt: 1.5,
|
|
176
|
+
"& .MuiAvatar-root": {
|
|
177
|
+
width: 32,
|
|
178
|
+
height: 32,
|
|
179
|
+
ml: -0.5,
|
|
180
|
+
mr: 1,
|
|
181
|
+
},
|
|
182
|
+
"&::before": {
|
|
183
|
+
content: '""',
|
|
184
|
+
display: "block",
|
|
185
|
+
position: "absolute",
|
|
186
|
+
top: 0,
|
|
187
|
+
right: 14,
|
|
188
|
+
width: 10,
|
|
189
|
+
height: 10,
|
|
190
|
+
bgcolor: "background.paper",
|
|
191
|
+
transform: "translateY(-50%) rotate(45deg)",
|
|
192
|
+
zIndex: 0,
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
}, transformOrigin: { horizontal: "right", vertical: "top" }, anchorOrigin: { horizontal: "right", vertical: "bottom" }, children: [profileList, jsxRuntime.jsx(material.Divider, {}), jsxRuntime.jsxs(material.MenuItem, { onClick: handleSettingsClick, children: [jsxRuntime.jsx(material.ListItemIcon, { children: jsxRuntime.jsx(SettingsOutlinedIcon, { fontSize: "small" }) }), "Settings"] }), jsxRuntime.jsxs(material.MenuItem, { onClick: handleProfileClick, children: [jsxRuntime.jsx(material.ListItemIcon, { children: jsxRuntime.jsx(PersonOutlineOutlinedIcon, { fontSize: "small" }) }), "Profile"] }), jsxRuntime.jsxs(material.MenuItem, { onClick: handleSignOutClick, children: [jsxRuntime.jsx(material.ListItemIcon, { children: jsxRuntime.jsx(LogoutOutlinedIcon, { fontSize: "small" }) }), "Sign out"] })] }));
|
|
197
|
+
const mobileMenuId = "primary-account-menu-mobile";
|
|
198
|
+
const renderMobileMenu = (jsxRuntime.jsxs(material.Menu, { anchorEl: mobileMoreAnchorEl, anchorOrigin: {
|
|
199
|
+
vertical: "top",
|
|
200
|
+
horizontal: "right",
|
|
201
|
+
}, id: mobileMenuId, keepMounted: true, transformOrigin: {
|
|
202
|
+
vertical: "top",
|
|
203
|
+
horizontal: "right",
|
|
204
|
+
}, open: isMobileMenuOpen, onClose: handleMobileMenuClose, children: [messageCount !== undefined && (jsxRuntime.jsxs(material.MenuItem, { children: [jsxRuntime.jsx(material.IconButton, { size: "large", "aria-label": `show ${messageCount} new mails`, sx: { color: '#1e2f97' }, children: jsxRuntime.jsx(material.Badge, { badgeContent: messageCount, color: "error", children: jsxRuntime.jsx(MailIcon, {}) }) }), jsxRuntime.jsx("p", { children: "Messages" })] })), notificationCount > 0 && (jsxRuntime.jsxs(material.MenuItem, { children: [jsxRuntime.jsx(material.IconButton, { size: "large", "aria-label": `show ${notificationCount} new notifications`, sx: { color: '#1e2f97' }, children: jsxRuntime.jsx(material.Badge, { badgeContent: notificationCount, color: "error", children: jsxRuntime.jsx(NotificationsActiveOutlined, {}) }) }), jsxRuntime.jsx("p", { children: "Notifications" })] })), jsxRuntime.jsxs(material.MenuItem, { onClick: handleProfileMenuOpen, children: [jsxRuntime.jsx(material.IconButton, { size: "large", "aria-label": "account of current user", "aria-controls": "primary-account-menu", "aria-haspopup": "true", sx: { color: '#1e2f97' }, children: isOnline ? (jsxRuntime.jsx(OnlineBadge, { overlap: "circular", anchorOrigin: { vertical: "bottom", horizontal: "right" }, variant: "dot", title: "Online", "aria-label": "Online status badge", "data-testid": "online-badge", children: jsxRuntime.jsx(AccountCircle, { titleAccess: user.name, "aria-label": "User avatar" }) })) : (jsxRuntime.jsx(OfflineBadge, { overlap: "circular", anchorOrigin: { vertical: "bottom", horizontal: "right" }, variant: "dot", title: "Offline", "aria-label": "Offline status badge", "data-testid": "offline-badge", children: jsxRuntime.jsx(AccountCircle, { titleAccess: user.name, "aria-label": "User avatar" }) })) }), jsxRuntime.jsx("p", { children: "Profile" })] })] }));
|
|
205
|
+
return (jsxRuntime.jsxs(material.Box, { sx: { flexGrow: 1 }, className: `app-header ${className || ""}`, children: [jsxRuntime.jsx(material.AppBar, { sx: {
|
|
206
|
+
position: "fixed",
|
|
207
|
+
top: 0,
|
|
208
|
+
backgroundColor: "#ffffff",
|
|
209
|
+
}, children: jsxRuntime.jsxs(material.Toolbar, { children: [jsxRuntime.jsx(material.IconButton, { size: "large", edge: "start", "aria-label": "open drawer", sx: {
|
|
210
|
+
mr: 2,
|
|
211
|
+
color: '#1e2f97',
|
|
212
|
+
'&:hover': {
|
|
213
|
+
backgroundColor: 'rgba(30, 47, 151, 0.04)',
|
|
214
|
+
}
|
|
215
|
+
}, onClick: handleDrawerToggle, children: isDrawerOpen ? (jsxRuntime.jsx(MenuOpenIcon, { fontSize: "large" })) : (jsxRuntime.jsx(MenuIcon, { fontSize: "large" })) }), jsxRuntime.jsxs(material.Typography, { variant: "h6", noWrap: true, component: "div", sx: { display: { xs: "none", sm: "block" } }, "data-testid": "var-miner-wrapper", children: [jsxRuntime.jsx("span", { className: "var", children: finalLogo.first }), jsxRuntime.jsx("span", { className: "miner", children: finalLogo.second })] }), jsxRuntime.jsx(material.Box, { sx: { flexGrow: 1 } }), jsxRuntime.jsxs(material.Box, { sx: { display: { xs: "none", md: "flex" } }, children: [notificationCount > 0 && (jsxRuntime.jsx(material.IconButton, { size: "large", "aria-label": `show ${notificationCount} new notifications`, sx: {
|
|
216
|
+
color: '#1e2f97',
|
|
217
|
+
'&:hover': {
|
|
218
|
+
backgroundColor: 'rgba(30, 47, 151, 0.04)',
|
|
219
|
+
}
|
|
220
|
+
}, children: jsxRuntime.jsx(material.Badge, { badgeContent: notificationCount, color: "error", children: jsxRuntime.jsx(NotificationsActiveOutlined, {}) }) })), jsxRuntime.jsx(material.IconButton, { size: "large", edge: "end", "aria-label": "account of current user", "aria-controls": menuId, "aria-haspopup": "true", onClick: handleProfileMenuOpen, sx: {
|
|
221
|
+
color: '#1e2f97',
|
|
222
|
+
'&:hover': {
|
|
223
|
+
backgroundColor: 'rgba(30, 47, 151, 0.04)',
|
|
224
|
+
}
|
|
225
|
+
}, children: isOnline ? (jsxRuntime.jsx(OnlineBadge, { overlap: "circular", anchorOrigin: { vertical: "bottom", horizontal: "right" }, variant: "dot", title: "Online", "aria-label": "Online status badge", "data-testid": "online-badge", children: jsxRuntime.jsx(material.Avatar, { sx: {
|
|
226
|
+
bgcolor: colors.deepOrange[500],
|
|
227
|
+
width: 20,
|
|
228
|
+
height: 20,
|
|
229
|
+
p: 1,
|
|
230
|
+
}, alt: user.name, title: user.name, src: user.avatar, sizes: "large", children: getInitials() }) })) : (jsxRuntime.jsx(OfflineBadge, { overlap: "circular", anchorOrigin: { vertical: "bottom", horizontal: "right" }, variant: "dot", title: "Offline", "aria-label": "Offline status badge", "data-testid": "offline-badge", children: jsxRuntime.jsx(material.Avatar, { sx: {
|
|
231
|
+
bgcolor: colors.deepOrange[500],
|
|
232
|
+
width: 20,
|
|
233
|
+
height: 20,
|
|
234
|
+
p: 1,
|
|
235
|
+
}, alt: user.name, title: user.name, src: user.avatar, children: getInitials() }) })) })] }), jsxRuntime.jsx(material.Box, { sx: { display: { xs: "flex", md: "none" } }, children: jsxRuntime.jsx(material.IconButton, { size: "large", "aria-label": "show more", "aria-controls": mobileMenuId, "aria-haspopup": "true", onClick: handleMobileMenuOpen, sx: {
|
|
236
|
+
color: '#1e2f97',
|
|
237
|
+
'&:hover': {
|
|
238
|
+
backgroundColor: 'rgba(30, 47, 151, 0.04)',
|
|
239
|
+
}
|
|
240
|
+
}, children: jsxRuntime.jsx(MoreIcon, {}) }) })] }) }), renderMobileMenu, renderMenu] }));
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
exports.AppHeader = AppHeader;
|
|
244
|
+
exports.DrawerProvider = DrawerProvider;
|
|
245
|
+
exports.useDrawer = useDrawer;
|
|
246
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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 { useNavigate } from \"react-router-dom\";\r\nimport { useDrawer } from \"./DrawerContext\";\r\nimport { AppHeaderProps } from \"./types\";\r\nimport \"./styles/Header.scss\";\r\n\r\n// Default routes - can be overridden via props\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 // Merge provided routes with defaults\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 // Use provided logo or default\r\n const finalLogo = logo ?? DEFAULT_LOGO;\r\n \r\n const { isDrawerOpen, toggleDrawer } = useDrawer();\r\n const navigate = useNavigate();\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 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 navigate(finalRoutes.settings);\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 navigate(finalRoutes.profile);\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 navigate(finalRoutes.logout);\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 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","useNavigate","styled","Badge","List","_jsxs","ListItem","ListItemAvatar","Avatar","deepOrange","ListItemText","Typography","Menu","Divider","MenuItem","ListItemIcon","IconButton","Box","AppBar","Toolbar"],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export interface UserProfile {
|
|
2
|
+
name: string;
|
|
3
|
+
email: string;
|
|
4
|
+
role: string;
|
|
5
|
+
avatar?: string;
|
|
6
|
+
initials?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface AppHeaderProps {
|
|
9
|
+
/**
|
|
10
|
+
* User profile information
|
|
11
|
+
*/
|
|
12
|
+
user?: UserProfile;
|
|
13
|
+
/**
|
|
14
|
+
* Whether the user is online
|
|
15
|
+
* @default true
|
|
16
|
+
*/
|
|
17
|
+
isOnline?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* App logo/brand name (optional - defaults to "VAR" and "MINER")
|
|
20
|
+
*/
|
|
21
|
+
logo?: {
|
|
22
|
+
first: string;
|
|
23
|
+
second: string;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Notification count (shown in desktop and mobile menu)
|
|
27
|
+
* @default 0
|
|
28
|
+
*/
|
|
29
|
+
notificationCount?: number;
|
|
30
|
+
/**
|
|
31
|
+
* Message count (shown only in mobile menu, optional)
|
|
32
|
+
* @default undefined (not shown if not provided)
|
|
33
|
+
*/
|
|
34
|
+
messageCount?: number;
|
|
35
|
+
/**
|
|
36
|
+
* Callback when drawer toggle is clicked
|
|
37
|
+
*/
|
|
38
|
+
onDrawerToggle?: () => void;
|
|
39
|
+
/**
|
|
40
|
+
* Whether drawer is open
|
|
41
|
+
* @default false
|
|
42
|
+
*/
|
|
43
|
+
isDrawerOpen?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Route paths for navigation (optional - defaults are used if not provided)
|
|
46
|
+
*/
|
|
47
|
+
routes?: {
|
|
48
|
+
/**
|
|
49
|
+
* Settings route path
|
|
50
|
+
* @default "/account/overview"
|
|
51
|
+
*/
|
|
52
|
+
settings?: string;
|
|
53
|
+
/**
|
|
54
|
+
* Profile route path
|
|
55
|
+
* @default "/profile"
|
|
56
|
+
*/
|
|
57
|
+
profile?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Logout route path
|
|
60
|
+
* @default "/logout"
|
|
61
|
+
*/
|
|
62
|
+
logout?: string;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Callback when settings is clicked (overrides default navigation)
|
|
66
|
+
*/
|
|
67
|
+
onSettingsClick?: () => void;
|
|
68
|
+
/**
|
|
69
|
+
* Callback when profile is clicked (overrides default navigation)
|
|
70
|
+
*/
|
|
71
|
+
onProfileClick?: () => void;
|
|
72
|
+
/**
|
|
73
|
+
* Callback when sign out is clicked (overrides default navigation)
|
|
74
|
+
* If not provided, will clear localStorage and navigate to logout route
|
|
75
|
+
*/
|
|
76
|
+
onSignOutClick?: () => void;
|
|
77
|
+
/**
|
|
78
|
+
* Custom CSS class name
|
|
79
|
+
*/
|
|
80
|
+
className?: string;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,IAAI,CAAC,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;OAEG;IACH,MAAM,CAAC,EAAE;QACP;;;WAGG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB;;;WAGG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB;;;WAGG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
|
package/package.json
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "varminer-app-header",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "A plug-and-play React header component with Material-UI, drawer toggle, notifications, and user profile menu",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"module": "dist/index.esm.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"style": "dist/index.css",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"import": "./dist/index.esm.js",
|
|
13
|
+
"require": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts"
|
|
15
|
+
},
|
|
16
|
+
"./dist/index.css": "./dist/index.css"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "rollup -c",
|
|
24
|
+
"dev": "rollup -c -w",
|
|
25
|
+
"prepublishOnly": "npm run build",
|
|
26
|
+
"prepack": "npm run build",
|
|
27
|
+
"prepublish": "npm run build",
|
|
28
|
+
"publish:public": "npm publish --access public",
|
|
29
|
+
"publish:dry-run": "npm publish --dry-run",
|
|
30
|
+
"pack": "npm pack"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"react",
|
|
34
|
+
"header",
|
|
35
|
+
"material-ui",
|
|
36
|
+
"mui",
|
|
37
|
+
"appbar",
|
|
38
|
+
"toolbar",
|
|
39
|
+
"navigation",
|
|
40
|
+
"component",
|
|
41
|
+
"typescript",
|
|
42
|
+
"responsive",
|
|
43
|
+
"drawer",
|
|
44
|
+
"notifications"
|
|
45
|
+
],
|
|
46
|
+
"author": "",
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"repository": {
|
|
49
|
+
"type": "git",
|
|
50
|
+
"url": "https://github.com/your-org/app-header.git"
|
|
51
|
+
},
|
|
52
|
+
"bugs": {
|
|
53
|
+
"url": "https://github.com/your-org/app-header/issues"
|
|
54
|
+
},
|
|
55
|
+
"homepage": "https://github.com/your-org/app-header#readme",
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
58
|
+
"react-dom": "^18.0.0 || ^19.0.0",
|
|
59
|
+
"react-router-dom": "^6.0.0 || ^7.0.0",
|
|
60
|
+
"@mui/material": "^5.0.0 || ^6.0.0 || ^7.0.0",
|
|
61
|
+
"@mui/icons-material": "^5.0.0 || ^6.0.0 || ^7.0.0",
|
|
62
|
+
"@emotion/react": "^11.0.0",
|
|
63
|
+
"@emotion/styled": "^11.0.0"
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@rollup/plugin-commonjs": "^25.0.7",
|
|
67
|
+
"@rollup/plugin-node-resolve": "^15.2.3",
|
|
68
|
+
"@rollup/plugin-typescript": "^11.1.5",
|
|
69
|
+
"@types/react": "^18.2.0",
|
|
70
|
+
"@types/react-dom": "^18.2.0",
|
|
71
|
+
"rollup": "^4.9.0",
|
|
72
|
+
"rollup-plugin-dts": "^6.1.0",
|
|
73
|
+
"rollup-plugin-postcss": "^4.0.2",
|
|
74
|
+
"rollup-plugin-peer-deps-external": "^2.2.4",
|
|
75
|
+
"sass": "^1.69.0",
|
|
76
|
+
"tslib": "^2.6.2",
|
|
77
|
+
"typescript": "^5.3.0"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|