您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 

347 行
10 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,isAdminLoggedIn} 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. isAdminLoggedIn() ?
  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'>設定</Link>
  119. </li>
  120. <li>
  121. <Link className="logout" onClick={handleLogout}>登出</Link>
  122. </li>
  123. </div>
  124. );
  125. const logoutContent = (
  126. <div>
  127. <li>
  128. <Link className="login" to='/login'>登入</Link>
  129. </li>
  130. <li>
  131. <Link className="register" to='/register'>申請</Link>
  132. </li>
  133. </div>
  134. );
  135. const drawer = (
  136. isUserLoggedIn()?
  137. <Stack id="sidebar" direction="column" justifyContent="center" alignItems="center" onClick={handleDrawerToggle} sx={{ textAlign: 'center' }}>
  138. <Typography variant="h6" sx={{ my: 2 }}>
  139. PNSPS
  140. </Typography>
  141. <Divider />
  142. <ul id="sidebartop">
  143. {loginContent}
  144. </ul>
  145. <Divider />
  146. <ul id="sidebarbottom">
  147. <li>
  148. <Link className="logout" onClick={handleLogout}>登出</Link>
  149. </li>
  150. </ul>
  151. </Stack>
  152. :
  153. <Stack id="sidebar" direction="column" justifyContent="center" alignItems="center" onClick={handleDrawerToggle} sx={{ textAlign: 'center' }}>
  154. <Typography variant="h6" sx={{ my: 2 }}>
  155. PNSPS
  156. </Typography>
  157. <Divider />
  158. <ul id="sidebartop">
  159. {logoutContent}
  160. </ul>
  161. <Divider />
  162. </Stack>
  163. );
  164. const container = window !== undefined ? () => window().document.body : undefined;
  165. return (
  166. isUserLoggedIn() ?
  167. // User Login success
  168. <Box>
  169. <AppBar component="nav">
  170. <Toolbar id ="nav" width="100%">
  171. {isAdminLoggedIn()
  172. ?<Stack
  173. direction="row"
  174. justifyContent="flex-start"
  175. alignItems="center"
  176. spacing={0}
  177. >
  178. <Box sx={{display: { xs: 'none', sm: 'block' } }}>
  179. <AdminLogo/>
  180. </Box>
  181. <IconButton
  182. color="inherit"
  183. aria-label="open drawer"
  184. edge="start"
  185. onClick={handleDrawerToggle}
  186. sx={{ mr: 2, display: { sm: 'none' } }}
  187. >
  188. <MenuIcon style={{ color: '#0C489E' }} />
  189. </IconButton>
  190. <Box sx={{mr: 2, display: { sm: 'none' } }}>
  191. <MobileLogo/>
  192. <span id="mobileTitle" >PNSPS</span>
  193. </Box>
  194. </Stack>:
  195. <Stack
  196. direction="row"
  197. justifyContent="flex-start"
  198. alignItems="center"
  199. spacing={0}
  200. >
  201. <Box sx={{width:'260px', flexGrow: 1,display: { xs: 'none', sm: 'block' } }}>
  202. <Stack direction="row" justifyContent="flex-start" alignItems="center">
  203. <Logo/>
  204. <Stack justifyContent="flex-start" alignItems="center">
  205. <span id="systemTitle">公共啟事提交</span>
  206. <span id="systemTitle">及繳費系統</span>
  207. </Stack>
  208. </Stack>
  209. </Box>
  210. <IconButton
  211. color="inherit"
  212. aria-label="open drawer"
  213. edge="start"
  214. onClick={handleDrawerToggle}
  215. sx={{ mr: 2, display: { sm: 'none' } }}
  216. >
  217. <MenuIcon style={{ color: '#0C489E' }} />
  218. </IconButton>
  219. <Box sx={{mr: 2, display: { sm: 'none' } }}>
  220. <Stack direction="row" justifyContent="flex-start" alignItems="center">
  221. <MobileLogo/>
  222. <span id="mobileTitle" >公共啟事提交及繳費系統</span>
  223. </Stack>
  224. </Box>
  225. </Stack>
  226. }
  227. <Box sx={{display: { xs: 'none', sm: 'block' } ,width:"100%"}}>
  228. <Stack
  229. direction="row"
  230. justifyContent="space-between"
  231. alignItems="center"
  232. spacing={1}
  233. >
  234. <ul id="navbar" width="100%" >
  235. {loginContent}
  236. </ul>
  237. <Profile />
  238. </Stack>
  239. </Box>
  240. </Toolbar>
  241. </AppBar>
  242. <Box component="nav">
  243. <Drawer
  244. container={container}
  245. variant="temporary"
  246. open={mobileOpen}
  247. onClose={handleDrawerToggle}
  248. ModalProps={{
  249. keepMounted: true, // Better open performance on mobile.
  250. }}
  251. sx={{
  252. display: { xs: 'block', sm: 'none' },
  253. '& .MuiDrawer-paper': { boxSizing: 'border-box', width: drawerWidth },
  254. }}
  255. >
  256. {drawer}
  257. </Drawer>
  258. </Box>
  259. </Box>:
  260. <Box>
  261. <AppBar component="nav">
  262. <Toolbar id ="nav" width="100%">
  263. <Stack
  264. direction="row"
  265. justifyContent="flex-start"
  266. alignItems="center"
  267. spacing={0}
  268. >
  269. <Box sx={{flexGrow: 1,display: { xs: 'none', sm: 'block' } }}>
  270. <Stack direction="row" justifyContent="flex-start" alignItems="center">
  271. <Logo/>
  272. <Stack justifyContent="flex-start" alignItems="center">
  273. <span id="systemTitle">公共啟事提交及繳費系統</span>
  274. </Stack>
  275. </Stack>
  276. </Box>
  277. <IconButton
  278. color="inherit"
  279. aria-label="open drawer"
  280. edge="start"
  281. onClick={handleDrawerToggle}
  282. sx={{ mr: 2, display: { sm: 'none' } }}
  283. >
  284. <MenuIcon style={{ color: '#0C489E' }} />
  285. </IconButton>
  286. <Box sx={{mr: 2, display: { sm: 'none' } }}>
  287. <MobileLogo/>
  288. <span id="mobileTitle" >公共啟事提交及繳費系統</span>
  289. </Box>
  290. </Stack>
  291. <Box sx={{display: { xs: 'none', sm: 'block' } ,width:"75%"}}>
  292. <Stack
  293. direction="row"
  294. justifyContent="space-between"
  295. alignItems="center"
  296. spacing={1}
  297. >
  298. <ul id="navbar" width="100%" >
  299. {logoutContent}
  300. </ul>
  301. {/* <Profile /> */}
  302. </Stack>
  303. </Box>
  304. </Toolbar>
  305. </AppBar>
  306. <Box component="nav">
  307. <Drawer
  308. container={container}
  309. variant="temporary"
  310. open={mobileOpen}
  311. onClose={handleDrawerToggle}
  312. ModalProps={{
  313. keepMounted: true, // Better open performance on mobile.
  314. }}
  315. sx={{
  316. display: { xs: 'block', sm: 'none' },
  317. '& .MuiDrawer-paper': { boxSizing: 'border-box', width: drawerWidth },
  318. }}
  319. >
  320. {drawer}
  321. </Drawer>
  322. </Box>
  323. </Box>
  324. );
  325. }
  326. Header.propTypes = {
  327. /**
  328. * Injected by the documentation to work in an iframe.
  329. * You won't need it on your project.
  330. */
  331. window: PropTypes.func,
  332. };
  333. export default Header;