Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 

357 wiersze
11 KiB

  1. import PropTypes from 'prop-types';
  2. import React
  3. ,{useState}
  4. from 'react';
  5. import {useDispatch} from "react-redux";
  6. import {useNavigate} from "react-router-dom";
  7. // material-ui
  8. // import { useTheme } from '@mui/material/styles';
  9. import {
  10. AppBar,
  11. // Container,
  12. Typography,
  13. Box,
  14. Stack,
  15. // IconButton,
  16. // Menu,
  17. // MenuItem,
  18. // Button,
  19. // Tooltip,
  20. // Avatar,
  21. // Stack,
  22. Toolbar,
  23. Divider,
  24. // List,
  25. // ListItem,
  26. // ListItemButton,
  27. // ListItemText,
  28. IconButton,
  29. Drawer,
  30. // useMediaQuery
  31. } from '@mui/material';
  32. import MenuIcon from '@mui/icons-material/Menu';
  33. import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
  34. // project import
  35. // import AppBarStyled from './AppBarStyled';
  36. // import HeaderContent from './HeaderContent';
  37. import Logo from 'components/Logo';
  38. import AdminLogo from 'components/AdminLogo';
  39. import MobileLogo from 'components/MobileLogo';
  40. import Profile from './HeaderContent/Profile';
  41. import "assets/style/navbarStyles.css";
  42. import {isUserLoggedIn,isGLDLoggedIn, isPrimaryLoggedIn} from "utils/Utils";
  43. import { handleLogoutFunction } from 'auth/index';
  44. // assets
  45. // import { MenuFoldOutlined,MenuOutlined } from '@ant-design/icons';
  46. // import { AppBar } from '../../../../node_modules/@mui/material/index';
  47. import { Link } from "react-router-dom";
  48. const drawerWidth = 240;
  49. // const navItems = ['Home', 'About', 'Contact'];
  50. // ==============================|| MAIN LAYOUT - HEADER ||============================== //
  51. function Header(props) {
  52. const { window } = props;
  53. const [mobileOpen, setMobileOpen] = useState(false);
  54. const dispatch = useDispatch()
  55. const navigate = useNavigate()
  56. const handleDrawerToggle = () => {
  57. setMobileOpen((prevState) => !prevState);
  58. };
  59. const handleLogout = async () => {
  60. dispatch(handleLogoutFunction());
  61. //await handleLogoutFunction();
  62. navigate('/login');
  63. };
  64. const loginContent = (
  65. isGLDLoggedIn() ?
  66. <div id="adminContent">
  67. <li>
  68. <Link className="dashboard" to='/dashboard'>Dashboard</Link>
  69. </li>
  70. <li>
  71. <Link className="application" to='/dashboard'>Application</Link>
  72. </li>
  73. <li>
  74. <Link className="proof" to='/dashboard'>Proof</Link>
  75. </li>
  76. <li>
  77. <Link className="payment" to='/dashboard'>Payment</Link>
  78. </li>
  79. <li>
  80. <Link className="client" >Client<KeyboardArrowDownIcon/></Link>
  81. <ul className='dropdown'>
  82. <li>
  83. <Link className="userSearchview" to='/userSearchview'>Users (GLD)</Link>
  84. </li>
  85. <li>
  86. <Link className="indUser" to='/indUser'>Users (Individual)</Link>
  87. </li>
  88. <li>
  89. <Link className="orgUser" to='/orgUser'>Users (Organization)</Link>
  90. </li>
  91. <li>
  92. <Link className="org" to='/org'>Organization</Link>
  93. </li>
  94. <li>
  95. <Link className="usergroupSearchview" to='/usergroupSearchview'>User Group</Link>
  96. </li>
  97. </ul>
  98. </li>
  99. <li>
  100. <Link className="logout" onClick={handleLogout}>Logout</Link>
  101. </li>
  102. </div>
  103. :
  104. <div id="individualUserContent">
  105. <li>
  106. <Link className="dashboard" to='/dashboard'>主頁</Link>
  107. </li>
  108. <li>
  109. <Link className="myDocumet" to='/dashboard'>我的公共啟事</Link>
  110. </li>
  111. <li>
  112. <Link className="documentRecord" to='/dashboard'>校對記錄</Link>
  113. </li>
  114. <li>
  115. <Link className="paymentRecord" to='/dashboard'>付款記錄</Link>
  116. </li>
  117. <li>
  118. <Link className="userSetting" to='/dashboard'>設定<KeyboardArrowDownIcon/></Link>
  119. <ul className='dropdown'>
  120. { isPrimaryLoggedIn()?
  121. <li>
  122. <Link className="manageOrgUser" to='setting/manageUser'>公司/機構用戶記錄</Link>
  123. </li>
  124. :
  125. <></>
  126. }
  127. </ul>
  128. </li>
  129. <li>
  130. <Link className="logout" onClick={handleLogout}>登出</Link>
  131. </li>
  132. </div>
  133. );
  134. const logoutContent = (
  135. <div>
  136. <li>
  137. <Link className="login" to='/login'>登入</Link>
  138. </li>
  139. <li>
  140. <Link className="register" to='/register'>申請</Link>
  141. </li>
  142. </div>
  143. );
  144. const drawer = (
  145. isUserLoggedIn()?
  146. <Stack id="sidebar" direction="column" justifyContent="center" alignItems="center" onClick={handleDrawerToggle} sx={{ textAlign: 'center' }}>
  147. <Typography variant="h6" sx={{ my: 2 }}>
  148. PNSPS
  149. </Typography>
  150. <Divider />
  151. <ul id="sidebartop">
  152. {loginContent}
  153. </ul>
  154. <Divider />
  155. <ul id="sidebarbottom">
  156. <li>
  157. <Link className="logout" onClick={handleLogout}>登出</Link>
  158. </li>
  159. </ul>
  160. </Stack>
  161. :
  162. <Stack id="sidebar" direction="column" justifyContent="center" alignItems="center" onClick={handleDrawerToggle} sx={{ textAlign: 'center' }}>
  163. <Typography variant="h6" sx={{ my: 2 }}>
  164. PNSPS
  165. </Typography>
  166. <Divider />
  167. <ul id="sidebartop">
  168. {logoutContent}
  169. </ul>
  170. <Divider />
  171. </Stack>
  172. );
  173. const container = window !== undefined ? () => window().document.body : undefined;
  174. return (
  175. isUserLoggedIn() ?
  176. // User Login success
  177. <Box>
  178. <AppBar component="nav">
  179. <Toolbar id ="nav" width="100%">
  180. {isGLDLoggedIn()
  181. ?<Stack
  182. direction="row"
  183. justifyContent="flex-start"
  184. alignItems="center"
  185. spacing={0}
  186. >
  187. <Box sx={{display: { xs: 'none', sm: 'block' } }}>
  188. <AdminLogo/>
  189. </Box>
  190. <IconButton
  191. color="inherit"
  192. aria-label="open drawer"
  193. edge="start"
  194. onClick={handleDrawerToggle}
  195. sx={{ mr: 2, display: { sm: 'none' } }}
  196. >
  197. <MenuIcon style={{ color: '#0C489E' }} />
  198. </IconButton>
  199. <Box sx={{mr: 2, display: { sm: 'none' } }}>
  200. <MobileLogo/>
  201. <span id="mobileTitle" >PNSPS</span>
  202. </Box>
  203. </Stack>:
  204. <Stack
  205. direction="row"
  206. justifyContent="flex-start"
  207. alignItems="center"
  208. spacing={0}
  209. >
  210. <Box sx={{width:'260px', flexGrow: 1,display: { xs: 'none', sm: 'block' } }}>
  211. <Stack direction="row" justifyContent="flex-start" alignItems="center">
  212. <Logo/>
  213. <Stack justifyContent="flex-start" alignItems="center">
  214. <span id="systemTitle">公共啟事提交</span>
  215. <span id="systemTitle">及繳費系統</span>
  216. </Stack>
  217. </Stack>
  218. </Box>
  219. <IconButton
  220. color="inherit"
  221. aria-label="open drawer"
  222. edge="start"
  223. onClick={handleDrawerToggle}
  224. sx={{ mr: 2, display: { sm: 'none' } }}
  225. >
  226. <MenuIcon style={{ color: '#0C489E' }} />
  227. </IconButton>
  228. <Box sx={{mr: 2, display: { sm: 'none' } }}>
  229. <Stack direction="row" justifyContent="flex-start" alignItems="center">
  230. <MobileLogo/>
  231. <span id="mobileTitle" >公共啟事提交及繳費系統</span>
  232. </Stack>
  233. </Box>
  234. </Stack>
  235. }
  236. <Box sx={{display: { xs: 'none', sm: 'block' } ,width:"100%"}}>
  237. <Stack
  238. direction="row"
  239. justifyContent="space-between"
  240. alignItems="center"
  241. spacing={1}
  242. >
  243. <ul id="navbar" width="100%" >
  244. {loginContent}
  245. </ul>
  246. <Profile />
  247. </Stack>
  248. </Box>
  249. </Toolbar>
  250. </AppBar>
  251. <Box component="nav">
  252. <Drawer
  253. container={container}
  254. variant="temporary"
  255. open={mobileOpen}
  256. onClose={handleDrawerToggle}
  257. ModalProps={{
  258. keepMounted: true, // Better open performance on mobile.
  259. }}
  260. sx={{
  261. display: { xs: 'block', sm: 'none' },
  262. '& .MuiDrawer-paper': { boxSizing: 'border-box', width: drawerWidth },
  263. }}
  264. >
  265. {drawer}
  266. </Drawer>
  267. </Box>
  268. </Box>:
  269. <Box>
  270. <AppBar component="nav">
  271. <Toolbar id ="nav" width="100%">
  272. <Stack
  273. direction="row"
  274. justifyContent="flex-start"
  275. alignItems="center"
  276. spacing={0}
  277. >
  278. <Box sx={{flexGrow: 1,display: { xs: 'none', sm: 'block' } }}>
  279. <Stack direction="row" justifyContent="flex-start" alignItems="center">
  280. <Logo/>
  281. <Stack justifyContent="flex-start" alignItems="center">
  282. <span id="systemTitle">公共啟事提交及繳費系統</span>
  283. </Stack>
  284. </Stack>
  285. </Box>
  286. <IconButton
  287. color="inherit"
  288. aria-label="open drawer"
  289. edge="start"
  290. onClick={handleDrawerToggle}
  291. sx={{ mr: 2, display: { sm: 'none' } }}
  292. >
  293. <MenuIcon style={{ color: '#0C489E' }} />
  294. </IconButton>
  295. <Box sx={{mr: 2, display: { sm: 'none' } }}>
  296. <MobileLogo/>
  297. <span id="mobileTitle" >公共啟事提交及繳費系統</span>
  298. </Box>
  299. </Stack>
  300. <Box sx={{display: { xs: 'none', sm: 'block' } ,width:"75%"}}>
  301. <Stack
  302. direction="row"
  303. justifyContent="space-between"
  304. alignItems="center"
  305. spacing={1}
  306. >
  307. <ul id="navbar" width="100%" >
  308. {logoutContent}
  309. </ul>
  310. {/* <Profile /> */}
  311. </Stack>
  312. </Box>
  313. </Toolbar>
  314. </AppBar>
  315. <Box component="nav">
  316. <Drawer
  317. container={container}
  318. variant="temporary"
  319. open={mobileOpen}
  320. onClose={handleDrawerToggle}
  321. ModalProps={{
  322. keepMounted: true, // Better open performance on mobile.
  323. }}
  324. sx={{
  325. display: { xs: 'block', sm: 'none' },
  326. '& .MuiDrawer-paper': { boxSizing: 'border-box', width: drawerWidth },
  327. }}
  328. >
  329. {drawer}
  330. </Drawer>
  331. </Box>
  332. </Box>
  333. );
  334. }
  335. Header.propTypes = {
  336. /**
  337. * Injected by the documentation to work in an iframe.
  338. * You won't need it on your project.
  339. */
  340. window: PropTypes.func,
  341. };
  342. export default Header;