wcz-layout 5.2.2 → 5.4.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.
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "wcz-layout",
3
+ "license": "MIT",
4
+ "author": "Dalibor Homola",
5
+ "version": "0.1.8",
6
+ "main": "dist/src/index.js",
7
+ "module": "dist/src/index.js",
8
+ "exports": {
9
+ ".": "./dist/src/index.js"
10
+ },
11
+ "scripts": {
12
+ "npm-install": "npm install",
13
+ "npm-update": "npm update",
14
+ "analyze": "cem analyze --litelement",
15
+ "start": "tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wds\"",
16
+ "build": "tsc && npm run analyze -- --exclude dist",
17
+ "prepublish": "tsc && npm run analyze -- --exclude dist",
18
+ "publish": "npm publish"
19
+ },
20
+ "dependencies": {
21
+ "guid-ts": "^1.1.2",
22
+ "i18next": "^22.0.6",
23
+ "i18next-browser-languagedetector": "^7.0.1",
24
+ "i18next-http-backend": "^2.0.1",
25
+ "keycloak-js": "^19.0.2",
26
+ "react-i18next": "^12.0.0"
27
+ },
28
+ "devDependencies": {
29
+ "@custom-elements-manifest/analyzer": "^0.4.17",
30
+ "@web/dev-server": "^0.1.28",
31
+ "concurrently": "^5.3.0",
32
+ "lit": "^2.0.2",
33
+ "react": "18.2.0",
34
+ "react-dom": "18.2.0",
35
+ "tslib": "^2.3.1",
36
+ "typescript": "^4.8.4"
37
+ },
38
+ "peerDependencies": {
39
+ "@emotion/react": "11.x",
40
+ "@emotion/styled": "11.x",
41
+ "@mui/icons-material": "5.x",
42
+ "@mui/material": "5.x",
43
+ "@tanstack/react-query": "4.x",
44
+ "moment": "2.x",
45
+ "react-router-dom": "6.x"
46
+ },
47
+ "customElements": "custom-elements.json",
48
+ "keycloak": {}
49
+ }
@@ -47,6 +47,7 @@ const Drawer = styled(MuiDrawer, { shouldForwardProp: (prop) => prop !== 'open'
47
47
  '& .MuiDrawer-paper': closedMixin(theme),
48
48
  }),
49
49
  }));
50
+ const isExternalUrl = (url) => url.startsWith('http://') || url.startsWith('https://');
50
51
  export default function LeftDrawer(props) {
51
52
  const { appVersion, drawerOpen, setDrawerOpen, items } = props;
52
53
  const theme = useTheme();
@@ -56,12 +57,14 @@ export default function LeftDrawer(props) {
56
57
  const openDrawer = useCallback(() => setDrawerOpen(true), []);
57
58
  const closeDrawer = useCallback(() => setDrawerOpen(false), []);
58
59
  const handleMenuItemClick = useCallback((path) => () => {
59
- navigate(path);
60
+ setDrawerOpen(false);
60
61
  if (location.pathname === path)
61
62
  return window.location.reload();
62
- setDrawerOpen(false);
63
+ if (isExternalUrl(path))
64
+ return window.open(path, '_blank');
65
+ navigate(path);
63
66
  }, [location.pathname]);
64
- const menuItems = (_jsx(List, { children: items.filter(item => !item.hidden).map(item => _jsx(ListItem, { disablePadding: true, sx: { display: 'block' }, onClick: handleMenuItemClick(item.path), children: _jsxs(ListItemButton, { selected: location.pathname === item.path, children: [_jsx(ListItemIcon, { children: item.icon }), _jsx(ListItemText, { primary: t(item.title) })] }) }, item.path)) }));
67
+ const menuItems = (_jsx(List, { children: items.filter(item => !item.hidden).map(item => _jsxs(Fragment, { children: [_jsx(ListItem, { disablePadding: true, sx: { display: 'block' }, onClick: handleMenuItemClick(item.path), children: _jsxs(ListItemButton, { selected: location.pathname === item.path, children: [_jsx(ListItemIcon, { children: item.icon }), _jsx(ListItemText, { primary: t(item.title) })] }) }), item.divider && _jsx(Divider, { sx: { my: 1 } })] }, item.path)) }));
65
68
  const hasItems = useMemo(() => (items.filter(item => !item.hidden).length > 1), [items]);
66
69
  return (_jsxs(Fragment, { children: [_jsxs(Drawer, { variant: "permanent", open: drawerOpen, sx: { display: { xs: 'none', sm: hasItems ? 'inherit' : 'none' } }, children: [_jsxs(DrawerHeader, { children: [_jsxs(Typography, { sx: { flexGrow: 1, textAlign: 'center', marginLeft: 3 }, children: [t("Layout.Version"), ": ", appVersion] }), _jsx(IconButton, { onClick: closeDrawer, children: theme.direction === 'rtl' ? _jsx(ChevronRight, {}) : _jsx(ChevronLeft, {}) })] }), _jsx(Divider, {}), menuItems] }), _jsx(SwipeableDrawer, { anchor: "left", open: drawerOpen, onClose: closeDrawer, onOpen: openDrawer, sx: { display: { xs: 'inherit', sm: hasItems ? 'none' : 'inherit' } }, children: _jsxs(Box, { sx: { width: drawerWidth }, role: "presentation", children: [_jsxs(Typography, { sx: { textAlign: 'center', my: 1.5 }, children: [t("Layout.Version"), ": ", appVersion] }), menuItems] }) })] }));
67
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LeftDrawer.js","sourceRoot":"","sources":["../../../../src/components/layout/LeftDrawer.tsx"],"names":[],"mappings":"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","sourcesContent":["import { ChevronLeft, ChevronRight } from '@mui/icons-material';\r\nimport { Box, Divider, Drawer as MuiDrawer, IconButton, List, ListItem, ListItemButton, ListItemIcon, ListItemText, SwipeableDrawer, Typography } from '@mui/material';\r\nimport { CSSObject, styled, Theme, useTheme } from '@mui/material/styles';\r\nimport { Fragment, useCallback, useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useLocation, useNavigate } from 'react-router-dom';\r\nimport { LeftDrawerItem as LeftDrawerItemModel } from '../../models/LeftDrawerItem';\r\n\r\nconst drawerWidth = 240;\r\n\r\nconst openedMixin = (theme: Theme): CSSObject => ({\r\n width: drawerWidth,\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n overflowX: 'hidden',\r\n});\r\n\r\nconst closedMixin = (theme: Theme): CSSObject => ({\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n overflowX: 'hidden',\r\n width: `calc(${theme.spacing(7)} + 1px)`,\r\n [theme.breakpoints.up('sm')]: {\r\n width: `calc(${theme.spacing(8.4)} + 1px)`,\r\n },\r\n});\r\n\r\nconst DrawerHeader = styled('div')(({ theme }) => ({\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n padding: theme.spacing(0, 1),\r\n // necessary for content to be below app bar\r\n ...theme.mixins.toolbar,\r\n}));\r\n\r\nconst Drawer = styled(MuiDrawer, { shouldForwardProp: (prop) => prop !== 'open' })(\r\n ({ theme, open }) => ({\r\n width: drawerWidth,\r\n flexShrink: 0,\r\n whiteSpace: 'nowrap',\r\n boxSizing: 'border-box',\r\n ...(open && {\r\n ...openedMixin(theme),\r\n '& .MuiDrawer-paper': openedMixin(theme),\r\n }),\r\n ...(!open && {\r\n ...closedMixin(theme),\r\n '& .MuiDrawer-paper': closedMixin(theme),\r\n }),\r\n }),\r\n);\r\n\r\ninterface LeftDrawerProps {\r\n appVersion: string,\r\n drawerOpen: boolean,\r\n setDrawerOpen: (drawerOpen: boolean) => void,\r\n items: LeftDrawerItemModel[]\r\n}\r\n\r\nexport default function LeftDrawer(props: LeftDrawerProps) {\r\n const { appVersion, drawerOpen, setDrawerOpen, items } = props;\r\n const theme = useTheme();\r\n const { t } = useTranslation();\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n\r\n const openDrawer = useCallback(() => setDrawerOpen(true), []);\r\n const closeDrawer = useCallback(() => setDrawerOpen(false), []);\r\n\r\n const handleMenuItemClick = useCallback((path: string) => () => {\r\n navigate(path);\r\n\r\n if (location.pathname === path)\r\n return window.location.reload();\r\n\r\n setDrawerOpen(false);\r\n }, [location.pathname]);\r\n\r\n const menuItems = (\r\n <List>\r\n {items.filter(item => !item.hidden).map(item =>\r\n <ListItem key={item.path} disablePadding sx={{ display: 'block' }} onClick={handleMenuItemClick(item.path)}>\r\n <ListItemButton selected={location.pathname === item.path} >\r\n <ListItemIcon>\r\n {item.icon}\r\n </ListItemIcon>\r\n <ListItemText primary={t(item.title)} />\r\n </ListItemButton>\r\n </ListItem>\r\n )}\r\n </List>\r\n );\r\n\r\n const hasItems: boolean = useMemo(() => (items.filter(item => !item.hidden).length > 1), [items]);\r\n return (\r\n <Fragment>\r\n <Drawer variant=\"permanent\" open={drawerOpen} sx={{ display: { xs: 'none', sm: hasItems ? 'inherit' : 'none' } }}>\r\n <DrawerHeader>\r\n <Typography sx={{ flexGrow: 1, textAlign: 'center', marginLeft: 3 }}>{t(\"Layout.Version\")}: {appVersion}</Typography>\r\n <IconButton onClick={closeDrawer}>\r\n {theme.direction === 'rtl' ? <ChevronRight /> : <ChevronLeft />}\r\n </IconButton>\r\n </DrawerHeader>\r\n <Divider />\r\n {menuItems}\r\n </Drawer>\r\n\r\n <SwipeableDrawer anchor=\"left\" open={drawerOpen} onClose={closeDrawer} onOpen={openDrawer} sx={{ display: { xs: 'inherit', sm: hasItems ? 'none' : 'inherit' } }}>\r\n <Box sx={{ width: drawerWidth }} role=\"presentation\">\r\n <Typography sx={{ textAlign: 'center', my: 1.5 }}>{t(\"Layout.Version\")}: {appVersion}</Typography>\r\n {menuItems}\r\n </Box>\r\n </SwipeableDrawer>\r\n </Fragment>\r\n );\r\n}\r\n"]}
1
+ {"version":3,"file":"LeftDrawer.js","sourceRoot":"","sources":["../../../../src/components/layout/LeftDrawer.tsx"],"names":[],"mappings":"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","sourcesContent":["import { ChevronLeft, ChevronRight } from '@mui/icons-material';\r\nimport { Box, Divider, Drawer as MuiDrawer, IconButton, List, ListItem, ListItemButton, ListItemIcon, ListItemText, SwipeableDrawer, Typography } from '@mui/material';\r\nimport { CSSObject, styled, Theme, useTheme } from '@mui/material/styles';\r\nimport { Fragment, useCallback, useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useLocation, useNavigate } from 'react-router-dom';\r\nimport { LeftDrawerItem as LeftDrawerItemModel } from '../../models/LeftDrawerItem';\r\n\r\nconst drawerWidth = 240;\r\n\r\nconst openedMixin = (theme: Theme): CSSObject => ({\r\n width: drawerWidth,\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n overflowX: 'hidden',\r\n});\r\n\r\nconst closedMixin = (theme: Theme): CSSObject => ({\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n overflowX: 'hidden',\r\n width: `calc(${theme.spacing(7)} + 1px)`,\r\n [theme.breakpoints.up('sm')]: {\r\n width: `calc(${theme.spacing(8.4)} + 1px)`,\r\n },\r\n});\r\n\r\nconst DrawerHeader = styled('div')(({ theme }) => ({\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n padding: theme.spacing(0, 1),\r\n // necessary for content to be below app bar\r\n ...theme.mixins.toolbar,\r\n}));\r\n\r\nconst Drawer = styled(MuiDrawer, { shouldForwardProp: (prop) => prop !== 'open' })(\r\n ({ theme, open }) => ({\r\n width: drawerWidth,\r\n flexShrink: 0,\r\n whiteSpace: 'nowrap',\r\n boxSizing: 'border-box',\r\n ...(open && {\r\n ...openedMixin(theme),\r\n '& .MuiDrawer-paper': openedMixin(theme),\r\n }),\r\n ...(!open && {\r\n ...closedMixin(theme),\r\n '& .MuiDrawer-paper': closedMixin(theme),\r\n }),\r\n }),\r\n);\r\n\r\nconst isExternalUrl = (url: string) => url.startsWith('http://') || url.startsWith('https://');\r\n\r\ninterface LeftDrawerProps {\r\n appVersion: string,\r\n drawerOpen: boolean,\r\n setDrawerOpen: (drawerOpen: boolean) => void,\r\n items: LeftDrawerItemModel[]\r\n}\r\n\r\nexport default function LeftDrawer(props: LeftDrawerProps) {\r\n const { appVersion, drawerOpen, setDrawerOpen, items } = props;\r\n const theme = useTheme();\r\n const { t } = useTranslation();\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n\r\n const openDrawer = useCallback(() => setDrawerOpen(true), []);\r\n const closeDrawer = useCallback(() => setDrawerOpen(false), []);\r\n\r\n const handleMenuItemClick = useCallback((path: string) => () => {\r\n setDrawerOpen(false);\r\n\r\n if (location.pathname === path)\r\n return window.location.reload();\r\n\r\n if (isExternalUrl(path))\r\n return window.open(path, '_blank');\r\n\r\n navigate(path);\r\n }, [location.pathname]);\r\n\r\n const menuItems = (\r\n <List>\r\n {items.filter(item => !item.hidden).map(item =>\r\n <Fragment key={item.path}>\r\n <ListItem disablePadding sx={{ display: 'block' }} onClick={handleMenuItemClick(item.path)}>\r\n <ListItemButton selected={location.pathname === item.path}>\r\n <ListItemIcon>\r\n {item.icon}\r\n </ListItemIcon>\r\n <ListItemText primary={t(item.title)} />\r\n </ListItemButton>\r\n </ListItem>\r\n\r\n {item.divider && <Divider sx={{ my: 1 }} />}\r\n </Fragment>\r\n )}\r\n </List>\r\n );\r\n\r\n const hasItems: boolean = useMemo(() => (items.filter(item => !item.hidden).length > 1), [items]);\r\n return (\r\n <Fragment>\r\n <Drawer variant=\"permanent\" open={drawerOpen} sx={{ display: { xs: 'none', sm: hasItems ? 'inherit' : 'none' } }}>\r\n <DrawerHeader>\r\n <Typography sx={{ flexGrow: 1, textAlign: 'center', marginLeft: 3 }}>{t(\"Layout.Version\")}: {appVersion}</Typography>\r\n <IconButton onClick={closeDrawer}>\r\n {theme.direction === 'rtl' ? <ChevronRight /> : <ChevronLeft />}\r\n </IconButton>\r\n </DrawerHeader>\r\n <Divider />\r\n {menuItems}\r\n </Drawer>\r\n\r\n <SwipeableDrawer anchor=\"left\" open={drawerOpen} onClose={closeDrawer} onOpen={openDrawer} sx={{ display: { xs: 'inherit', sm: hasItems ? 'none' : 'inherit' } }}>\r\n <Box sx={{ width: drawerWidth }} role=\"presentation\">\r\n <Typography sx={{ textAlign: 'center', my: 1.5 }}>{t(\"Layout.Version\")}: {appVersion}</Typography>\r\n {menuItems}\r\n </Box>\r\n </SwipeableDrawer>\r\n </Fragment>\r\n );\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"LeftDrawerItem.js","sourceRoot":"","sources":["../../../../../src/components/layout/leftDrawer/LeftDrawerItem.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAErE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAWrD,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,KAA0B;IACzD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACnE,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,MAAM,aAAa,GAAG,GAAG,EAAE;QACvB,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEd,IAAI,QAAQ,CAAC,QAAQ,KAAK,GAAG;YACzB,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAEpC,aAAa,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CAAA;IAED,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM;QACxC,OAAO,IAAI,CAAC;IAEhB,OAAO,CACH,MAAC,QAAQ,IAAC,MAAM,QAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,KAAK,GAAG,EAAE,OAAO,EAAE,aAAa,aACxE,KAAC,YAAY,cACR,IAAI,GACM,EACf,KAAC,YAAY,IAAC,OAAO,EAAE,KAAK,GAAI,IACzB,CACd,CAAA;AACL,CAAC","sourcesContent":["import { ListItem, ListItemIcon, ListItemText } from '@mui/material';\r\nimport React from 'react';\r\nimport { useLocation, useNavigate } from 'react-router-dom';\r\nimport { hasRole } from '../../../utils/UserService';\r\n\r\ninterface LeftDrawerItemProps {\r\n title: string,\r\n url: string,\r\n icon: React.ReactNode,\r\n forRole?: string[],\r\n setDrawerOpen: (drawerOpen: boolean) => void,\r\n hidden?: boolean\r\n}\r\n\r\nexport default function DrawerItem(props: LeftDrawerItemProps) {\r\n const { title, url, icon, forRole, setDrawerOpen, hidden } = props;\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n\r\n const handleOnClick = () => {\r\n navigate(url);\r\n\r\n if (location.pathname === url)\r\n return window.location.reload();\r\n\r\n setDrawerOpen(false);\r\n }\r\n\r\n if ((forRole && !hasRole(forRole)) || hidden)\r\n return null;\r\n\r\n return (\r\n <ListItem button selected={location.pathname === url} onClick={handleOnClick}>\r\n <ListItemIcon>\r\n {icon}\r\n </ListItemIcon>\r\n <ListItemText primary={title} />\r\n </ListItem>\r\n )\r\n}\r\n"]}
1
+ {"version":3,"file":"LeftDrawerItem.js","sourceRoot":"","sources":["../../../../../src/components/layout/leftDrawer/LeftDrawerItem.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAErE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAWrD,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,KAA0B;IACzD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACnE,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,MAAM,aAAa,GAAG,GAAG,EAAE;QACvB,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEd,IAAI,QAAQ,CAAC,QAAQ,KAAK,GAAG;YACzB,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAEpC,aAAa,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CAAA;IAED,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM;QACxC,OAAO,IAAI,CAAC;IAEhB,OAAO,CACH,MAAC,QAAQ,IAAC,MAAM,QAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,KAAK,GAAG,EAAE,OAAO,EAAE,aAAa,aACxE,KAAC,YAAY,cACR,IAAI,GACM,EACf,KAAC,YAAY,IAAC,OAAO,EAAE,KAAK,GAAI,IACzB,CACd,CAAA;AACL,CAAC","sourcesContent":["import { ListItem, ListItemIcon, ListItemText } from '@mui/material';\nimport React from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { hasRole } from '../../../utils/UserService';\n\ninterface LeftDrawerItemProps {\n title: string,\n url: string,\n icon: React.ReactNode,\n forRole?: string[],\n setDrawerOpen: (drawerOpen: boolean) => void,\n hidden?: boolean\n}\n\nexport default function DrawerItem(props: LeftDrawerItemProps) {\n const { title, url, icon, forRole, setDrawerOpen, hidden } = props;\n const navigate = useNavigate();\n const location = useLocation();\n\n const handleOnClick = () => {\n navigate(url);\n\n if (location.pathname === url)\n return window.location.reload();\n\n setDrawerOpen(false);\n }\n\n if ((forRole && !hasRole(forRole)) || hidden)\n return null;\n\n return (\n <ListItem button selected={location.pathname === url} onClick={handleOnClick}>\n <ListItemIcon>\n {icon}\n </ListItemIcon>\n <ListItemText primary={title} />\n </ListItem>\n )\n}\n"]}
@@ -7,14 +7,14 @@ import I18NextHttpBackend from 'i18next-http-backend';
7
7
  import moment from 'moment';
8
8
  import { createContext, useCallback, useEffect, useMemo, useState } from 'react';
9
9
  import { initReactI18next, useTranslation } from 'react-i18next';
10
- import Layout from '../components/Layout';
11
10
  import CenteredBox from '../components/common/CenteredBox';
11
+ import Layout from '../components/Layout';
12
12
  import { persistStorage } from '../utils/PersistStorage';
13
- import { doLogin, doLogout, initKeycloak, loggedIn } from '../utils/UserService';
13
+ import { initKeycloak } from '../utils/UserService';
14
+ import { useUser } from '../utils/UseUser';
14
15
  export const LayoutContext = createContext({});
15
16
  //User
16
17
  initKeycloak();
17
- const initialUser = { login: doLogin, logout: doLogout, loggedIn: loggedIn(), department: "", id: "", name: "" };
18
18
  //QueryClient
19
19
  const queryClient = new QueryClient({ defaultOptions: { queries: { enabled: false } } });
20
20
  //Localization
@@ -23,7 +23,6 @@ i18next
23
23
  .use(LanguageDetector)
24
24
  .use(I18NextHttpBackend)
25
25
  .init({ fallbackLng: 'en' });
26
- //Moment
27
26
  moment.defaultFormat = 'YYYY-MM-DD';
28
27
  moment.fn.formatDate = function () {
29
28
  if (!this.isValid())
@@ -36,26 +35,11 @@ moment.fn.formatDateTime = function () {
36
35
  return this.format("YYYY-MM-DD HH:mm");
37
36
  };
38
37
  export function LayoutProvider(props) {
39
- const [user, setUser] = useState(initialUser);
40
38
  const [title, setTitle] = useState(props.title);
41
39
  const [snackbar, setSnackbar] = useState({});
42
40
  const [initialized, setInitialized] = useState(false);
43
41
  const { t, i18n } = useTranslation();
44
- useEffect(() => {
45
- window.addEventListener('user', initUserInfo);
46
- return () => window.removeEventListener('user', initUserInfo);
47
- }, []);
48
- const initUserInfo = () => {
49
- const userInfo = persistStorage.getObject("user");
50
- if (userInfo)
51
- setUser({
52
- ...user,
53
- id: userInfo.id,
54
- department: userInfo.department,
55
- name: userInfo.name,
56
- loggedIn: loggedIn()
57
- });
58
- };
42
+ const user = useUser();
59
43
  useEffect(() => setQueryClientDefaultOptions(), [user.loggedIn]);
60
44
  const setQueryClientDefaultOptions = () => {
61
45
  const storedKeycloak = persistStorage.getObject("keycloak");
@@ -65,10 +49,11 @@ export function LayoutProvider(props) {
65
49
  queries: {
66
50
  enabled: enabled,
67
51
  refetchOnWindowFocus: false,
68
- onError: message => setSnackbar({ message: String(message), severity: "error" })
52
+ onError: message => setSnackbar({ message: String(message), severity: "error" }),
53
+ retry: false
69
54
  },
70
55
  mutations: {
71
- onError: message => setSnackbar({ message: String(message), severity: "error" })
56
+ onError: message => setSnackbar({ message: String(message), severity: "error" }),
72
57
  }
73
58
  });
74
59
  };
@@ -1 +1 @@
1
- {"version":3,"file":"LayoutContext.js","sourceRoot":"","sources":["../../../src/contexts/LayoutContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,OAA4B,MAAM,SAAS,CAAC;AACnD,OAAO,gBAAgB,MAAM,kCAAkC,CAAC;AAChE,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AACtD,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,aAAa,EAA6B,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5G,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAK3D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAUjF,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC,EAA4B,CAAC,CAAC;AAEzE,MAAM;AACN,YAAY,EAAE,CAAC;AACf,MAAM,WAAW,GAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAE/H,aAAa;AACb,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;AAEzF,cAAc;AACd,OAAO;KACF,GAAG,CAAC,gBAAgB,CAAC;KACrB,GAAG,CAAC,gBAAgB,CAAC;KACrB,GAAG,CAAC,kBAAkB,CAAC;KACvB,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;AAEjC,QAAQ;AACR,MAAM,CAAC,aAAa,GAAG,YAAY,CAAC;AASpC,MAAM,CAAC,EAAE,CAAC,UAAU,GAAG;IACnB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,CAAC;IAC/B,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,CAAC,EAAE,CAAC,cAAc,GAAG;IACvB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,CAAC;IAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAC3C,CAAC,CAAC;AAWF,MAAM,UAAU,cAAc,CAAC,KAA0B;IACrD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAe,WAAW,CAAC,CAAC;IAC5D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAmB,CAAC,CAAC;IAC9D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IAC/D,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAC;IAErC,SAAS,CAAC,GAAG,EAAE;QACX,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAC9C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAClE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,GAAG,EAAE;QACtB,MAAM,QAAQ,GAAgB,cAAc,CAAC,SAAS,CAAO,MAAM,CAAC,CAAC;QACrE,IAAI,QAAQ;YACR,OAAO,CAAC;gBACJ,GAAG,IAAI;gBACP,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,QAAQ,EAAE,QAAQ,EAAE;aACvB,CAAC,CAAC;IACX,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE,CAAC,4BAA4B,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEjE,MAAM,4BAA4B,GAAG,GAAG,EAAE;QACtC,MAAM,cAAc,GAAkC,cAAc,CAAC,SAAS,CAAyB,UAAU,CAAC,CAAC;QACnH,MAAM,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;QAClH,cAAc,CAAC,OAAO,CAAC,CAAC;QAExB,WAAW,CAAC,iBAAiB,CAAC;YAC1B,OAAO,EAAE;gBACL,OAAO,EAAE,OAAO;gBAChB,oBAAoB,EAAE,KAAK;gBAC3B,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;aACnF;YACD,SAAS,EAAE;gBACP,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;aACnF;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,QAAgB,EAAE,EAAE;QACjD,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC;QAC1B,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,qBAAqB,GAAG,WAAW,CAAC,CAAC,KAA8B,EAAE,MAAe,EAAE,EAAE;QAC1F,IAAI,MAAM,KAAK,WAAW;YAAE,OAAO;QACnC,WAAW,CAAC,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,aAAa,GAA2B,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAE5L,OAAO,CACH,KAAC,mBAAmB,IAAC,MAAM,EAAE,WAAW,YACpC,KAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,aAAa,YACxC,MAAC,MAAM,IAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,aACnM,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAC,WAAW,IAAC,gBAAgB,SAAG,EAEhE,KAAC,KAAK,IAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YACpC,KAAC,QAAQ,IAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,qBAAqB,YACtF,KAAC,KAAK,IAAC,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAC,QAAQ,YAAE,QAAQ,CAAC,OAAO,GAAS,GAC/H,GACP,IACH,GACY,GACP,CACzB,CAAC;AACN,CAAC","sourcesContent":["import { Alert, Snackbar, Stack } from '@mui/material';\r\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\r\nimport i18next, { i18n, TFunction } from 'i18next';\r\nimport LanguageDetector from 'i18next-browser-languagedetector';\r\nimport I18NextHttpBackend from 'i18next-http-backend';\r\nimport moment from 'moment';\r\nimport { createContext, ReactNode, SyntheticEvent, useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { initReactI18next, useTranslation } from 'react-i18next';\r\nimport Layout from '../components/Layout';\r\nimport CenteredBox from '../components/common/CenteredBox';\r\nimport KeycloakExtendedConfig from '../models/KeycloakExtendedConfig';\r\nimport { LeftDrawerItem } from '../models/LeftDrawerItem';\r\nimport SnackbarModel from '../models/SnackbarModel';\r\nimport { ExtendedUser, User } from '../models/User';\r\nimport { persistStorage } from '../utils/PersistStorage';\r\nimport { doLogin, doLogout, initKeycloak, loggedIn } from '../utils/UserService';\r\n\r\ninterface LayoutContextInterface {\r\n changeTitle: (title: string) => void,\r\n snackbar: (snackbar: SnackbarModel) => void,\r\n user: User,\r\n t: TFunction<\"translation\", undefined>,\r\n i18n: i18n\r\n}\r\n\r\nexport const LayoutContext = createContext({} as LayoutContextInterface);\r\n\r\n//User\r\ninitKeycloak();\r\nconst initialUser: ExtendedUser = { login: doLogin, logout: doLogout, loggedIn: loggedIn(), department: \"\", id: \"\", name: \"\" };\r\n\r\n//QueryClient\r\nconst queryClient = new QueryClient({ defaultOptions: { queries: { enabled: false } } });\r\n\r\n//Localization\r\ni18next\r\n .use(initReactI18next)\r\n .use(LanguageDetector)\r\n .use(I18NextHttpBackend)\r\n .init({ fallbackLng: 'en' });\r\n\r\n//Moment\r\nmoment.defaultFormat = 'YYYY-MM-DD';\r\n\r\ndeclare module \"moment\" {\r\n interface Moment {\r\n formatDate(): string;\r\n formatDateTime(): string;\r\n }\r\n}\r\n\r\nmoment.fn.formatDate = function (): string {\r\n if (!this.isValid()) return \"\";\r\n return this.format();\r\n};\r\n\r\nmoment.fn.formatDateTime = function (): string {\r\n if (!this.isValid()) return \"\";\r\n return this.format(\"YYYY-MM-DD HH:mm\");\r\n};\r\n\r\ninterface LayoutProviderProps {\r\n title: string,\r\n appVersion: string,\r\n leftDrawerItems: LeftDrawerItem[],\r\n primaryColor: string,\r\n secondaryColor: string,\r\n children: ReactNode\r\n}\r\n\r\nexport function LayoutProvider(props: LayoutProviderProps) {\r\n const [user, setUser] = useState<ExtendedUser>(initialUser);\r\n const [title, setTitle] = useState(props.title);\r\n const [snackbar, setSnackbar] = useState({} as SnackbarModel);\r\n const [initialized, setInitialized] = useState<boolean>(false);\r\n const { t, i18n } = useTranslation();\r\n\r\n useEffect(() => {\r\n window.addEventListener('user', initUserInfo);\r\n return () => window.removeEventListener('user', initUserInfo);\r\n }, []);\r\n\r\n const initUserInfo = () => {\r\n const userInfo: User | null = persistStorage.getObject<User>(\"user\");\r\n if (userInfo)\r\n setUser({\r\n ...user,\r\n id: userInfo.id,\r\n department: userInfo.department,\r\n name: userInfo.name,\r\n loggedIn: loggedIn()\r\n });\r\n };\r\n\r\n useEffect(() => setQueryClientDefaultOptions(), [user.loggedIn]);\r\n\r\n const setQueryClientDefaultOptions = () => {\r\n const storedKeycloak: KeycloakExtendedConfig | null = persistStorage.getObject<KeycloakExtendedConfig>(\"keycloak\");\r\n const enabled = storedKeycloak ? (storedKeycloak.autoLogin && user.loggedIn) || !storedKeycloak.autoLogin : false;\r\n setInitialized(enabled);\r\n\r\n queryClient.setDefaultOptions({\r\n queries: {\r\n enabled: enabled,\r\n refetchOnWindowFocus: false,\r\n onError: message => setSnackbar({ message: String(message), severity: \"error\" })\r\n },\r\n mutations: {\r\n onError: message => setSnackbar({ message: String(message), severity: \"error\" })\r\n }\r\n });\r\n };\r\n\r\n const changeTitle = useCallback((newTitle: string) => {\r\n document.title = newTitle;\r\n setTitle(newTitle);\r\n }, []);\r\n\r\n const handleOnSnackbarClose = useCallback((event?: SyntheticEvent | Event, reason?: string) => {\r\n if (reason === 'clickaway') return;\r\n setSnackbar({ ...snackbar, message: \"\" });\r\n }, []);\r\n\r\n const providerValue: LayoutContextInterface = useMemo(() => ({ changeTitle: changeTitle, snackbar: setSnackbar, user: user, t: t, i18n: i18n }), [changeTitle, setSnackbar, user, t, i18n]);\r\n\r\n return (\r\n <QueryClientProvider client={queryClient}>\r\n <LayoutContext.Provider value={providerValue}>\r\n <Layout title={title} appVersion={props.appVersion} primaryColor={props.primaryColor} secondaryColor={props.secondaryColor} leftDrawerItems={props.leftDrawerItems} user={user} initialized={initialized}>\r\n {initialized ? props.children : <CenteredBox circularProgress />}\r\n\r\n <Stack spacing={2} sx={{ width: '100%' }}>\r\n <Snackbar open={!!snackbar.message} autoHideDuration={6000} onClose={handleOnSnackbarClose}>\r\n <Alert onClose={handleOnSnackbarClose} severity={snackbar.severity} sx={{ width: '100%' }} variant=\"filled\">{snackbar.message}</Alert>\r\n </Snackbar>\r\n </Stack>\r\n </Layout>\r\n </LayoutContext.Provider>\r\n </QueryClientProvider>\r\n );\r\n}"]}
1
+ {"version":3,"file":"LayoutContext.js","sourceRoot":"","sources":["../../../src/contexts/LayoutContext.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Alert, Snackbar, Stack } from '@mui/material';\r\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\r\nimport i18next, { i18n, TFunction } from 'i18next';\r\nimport LanguageDetector from 'i18next-browser-languagedetector';\r\nimport I18NextHttpBackend from 'i18next-http-backend';\r\nimport moment from 'moment';\r\nimport { createContext, ReactNode, SyntheticEvent, useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { initReactI18next, useTranslation } from 'react-i18next';\r\nimport CenteredBox from '../components/common/CenteredBox';\r\nimport Layout from '../components/Layout';\r\nimport KeycloakExtendedConfig from '../models/KeycloakExtendedConfig';\r\nimport { LeftDrawerItem } from '../models/LeftDrawerItem';\r\nimport SnackbarModel from '../models/SnackbarModel';\r\nimport { User } from '../models/User';\r\nimport { persistStorage } from '../utils/PersistStorage';\r\nimport { initKeycloak } from '../utils/UserService';\r\nimport { useUser } from '../utils/UseUser';\r\n\r\ninterface LayoutContextInterface {\r\n changeTitle: (title: string) => void,\r\n snackbar: (snackbar: SnackbarModel) => void,\r\n user: User,\r\n t: TFunction<\"translation\", undefined>,\r\n i18n: i18n\r\n}\r\n\r\nexport const LayoutContext = createContext({} as LayoutContextInterface);\r\n\r\n//User\r\ninitKeycloak();\r\n\r\n//QueryClient\r\nconst queryClient = new QueryClient({ defaultOptions: { queries: { enabled: false } } });\r\n\r\n//Localization\r\ni18next\r\n .use(initReactI18next)\r\n .use(LanguageDetector)\r\n .use(I18NextHttpBackend)\r\n .init({ fallbackLng: 'en' });\r\n\r\nmoment.defaultFormat = 'YYYY-MM-DD';\r\n\r\ndeclare module \"moment\" {\r\n interface Moment {\r\n formatDate(): string;\r\n formatDateTime(): string;\r\n }\r\n}\r\n\r\nmoment.fn.formatDate = function (): string {\r\n if (!this.isValid()) return \"\";\r\n return this.format();\r\n};\r\n\r\nmoment.fn.formatDateTime = function (): string {\r\n if (!this.isValid()) return \"\";\r\n return this.format(\"YYYY-MM-DD HH:mm\");\r\n};\r\n\r\ninterface LayoutProviderProps {\r\n title: string,\r\n appVersion: string,\r\n leftDrawerItems: LeftDrawerItem[],\r\n primaryColor: string,\r\n secondaryColor: string,\r\n children: ReactNode\r\n}\r\n\r\nexport function LayoutProvider(props: LayoutProviderProps) {\r\n const [title, setTitle] = useState(props.title);\r\n const [snackbar, setSnackbar] = useState({} as SnackbarModel);\r\n const [initialized, setInitialized] = useState<boolean>(false);\r\n const { t, i18n } = useTranslation();\r\n const user = useUser();\r\n\r\n useEffect(() => setQueryClientDefaultOptions(), [user.loggedIn]);\r\n\r\n const setQueryClientDefaultOptions = () => {\r\n const storedKeycloak: KeycloakExtendedConfig | null = persistStorage.getObject<KeycloakExtendedConfig>(\"keycloak\");\r\n const enabled = storedKeycloak ? (storedKeycloak.autoLogin && user.loggedIn) || !storedKeycloak.autoLogin : false;\r\n setInitialized(enabled);\r\n\r\n queryClient.setDefaultOptions({\r\n queries: {\r\n enabled: enabled,\r\n refetchOnWindowFocus: false,\r\n onError: message => setSnackbar({ message: String(message), severity: \"error\" }),\r\n retry: false\r\n },\r\n mutations: {\r\n onError: message => setSnackbar({ message: String(message), severity: \"error\" }),\r\n }\r\n });\r\n };\r\n\r\n const changeTitle = useCallback((newTitle: string) => {\r\n document.title = newTitle;\r\n setTitle(newTitle);\r\n }, []);\r\n\r\n const handleOnSnackbarClose = useCallback((event?: SyntheticEvent | Event, reason?: string) => {\r\n if (reason === 'clickaway') return;\r\n setSnackbar({ ...snackbar, message: \"\" });\r\n }, []);\r\n\r\n const providerValue: LayoutContextInterface = useMemo(() => ({ changeTitle: changeTitle, snackbar: setSnackbar, user: user, t: t, i18n: i18n }), [changeTitle, setSnackbar, user, t, i18n]);\r\n\r\n return (\r\n <QueryClientProvider client={queryClient}>\r\n <LayoutContext.Provider value={providerValue}>\r\n <Layout title={title} appVersion={props.appVersion} primaryColor={props.primaryColor} secondaryColor={props.secondaryColor} leftDrawerItems={props.leftDrawerItems} user={user} initialized={initialized}>\r\n {initialized ? props.children : <CenteredBox circularProgress />}\r\n\r\n <Stack spacing={2} sx={{ width: '100%' }}>\r\n <Snackbar open={!!snackbar.message} autoHideDuration={6000} onClose={handleOnSnackbarClose}>\r\n <Alert onClose={handleOnSnackbarClose} severity={snackbar.severity} sx={{ width: '100%' }} variant=\"filled\">{snackbar.message}</Alert>\r\n </Snackbar>\r\n </Stack>\r\n </Layout>\r\n </LayoutContext.Provider>\r\n </QueryClientProvider>\r\n );\r\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"KeycloakExtendedConfig.js","sourceRoot":"","sources":["../../../src/models/KeycloakExtendedConfig.ts"],"names":[],"mappings":"","sourcesContent":["export default interface KeycloakExtendedConfig {\r\n autoLogin?: boolean,\r\n confidential?: Confidential,\r\n realm: string,\r\n \"auth-server-url\": string,\r\n idpHint?: string\r\n}\r\n\r\nexport interface Confidential {\r\n client: string,\r\n secret: string\r\n}"]}
1
+ {"version":3,"file":"KeycloakExtendedConfig.js","sourceRoot":"","sources":["../../../src/models/KeycloakExtendedConfig.ts"],"names":[],"mappings":"","sourcesContent":["export default interface KeycloakExtendedConfig {\n autoLogin?: boolean,\n confidential?: Confidential,\n realm: string,\n \"auth-server-url\": string,\n idpHint?: string\n}\n\nexport interface Confidential {\n client: string,\n secret: string\n}"]}
@@ -4,4 +4,5 @@ export interface LeftDrawerItem {
4
4
  path: string;
5
5
  icon: React.ReactNode;
6
6
  hidden?: boolean;
7
+ divider?: boolean;
7
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LeftDrawerItem.js","sourceRoot":"","sources":["../../../src/models/LeftDrawerItem.ts"],"names":[],"mappings":"","sourcesContent":["export interface LeftDrawerItem {\r\n title: string,\r\n path: string,\r\n icon: React.ReactNode,\r\n hidden?: boolean\r\n}\r\n"]}
1
+ {"version":3,"file":"LeftDrawerItem.js","sourceRoot":"","sources":["../../../src/models/LeftDrawerItem.ts"],"names":[],"mappings":"","sourcesContent":["export interface LeftDrawerItem {\r\n title: string,\r\n path: string,\r\n icon: React.ReactNode,\r\n hidden?: boolean,\r\n divider?: boolean,\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SnackbarModel.js","sourceRoot":"","sources":["../../../src/models/SnackbarModel.ts"],"names":[],"mappings":"","sourcesContent":["import { AlertColor } from \"@mui/material\";\r\n\r\nexport default interface SnackbarModel {\r\n message: string,\r\n severity?: AlertColor\r\n}"]}
1
+ {"version":3,"file":"SnackbarModel.js","sourceRoot":"","sources":["../../../src/models/SnackbarModel.ts"],"names":[],"mappings":"","sourcesContent":["import { AlertColor } from \"@mui/material\";\n\nexport default interface SnackbarModel {\n message: string,\n severity?: AlertColor\n}"]}
@@ -59,9 +59,9 @@ const getRequestInit = async (method, data, signal) => {
59
59
  return request;
60
60
  };
61
61
  const getQueryErrorMessage = async (response) => {
62
- let message = `Error connecting to server`;
62
+ let message = `[${response.status}] ${response.statusText}`;
63
63
  const detailMessage = await response.json()
64
- .then(data => { var _a; return (_a = data.message) !== null && _a !== void 0 ? _a : data.title; })
64
+ .then(data => `[${response.status}] ${data.message}`)
65
65
  .catch(() => (message));
66
66
  if (detailMessage)
67
67
  message = detailMessage;
@@ -1 +1 @@
1
- {"version":3,"file":"Fetches.js","sourceRoot":"","sources":["../../../src/utils/Fetches.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAW,EAAE,MAA+B,EAAgB,EAAE;IACzF,MAAM,OAAO,GAAgB,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAEvE,MAAM,QAAQ,GAAa,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,CAAC,EAAE;QACZ,MAAM,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAE/C,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,GAAW,EAAE,MAA+B,EAAiB,EAAE;IAC9F,MAAM,OAAO,GAAgB,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAEvE,MAAM,QAAQ,GAAa,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,CAAC,EAAE;QACZ,MAAM,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAE/C,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,GAAW,EAAE,IAAa,EAAgB,EAAE;IACxE,MAAM,OAAO,GAAgB,MAAM,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEhE,MAAM,QAAQ,GAAa,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,CAAC,EAAE;QACZ,MAAM,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAE/C,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAW,EAAE,IAAa,EAAqB,EAAE;IAC5E,MAAM,OAAO,GAAgB,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAE/D,MAAM,QAAQ,GAAa,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,CAAC,EAAE;QACZ,MAAM,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAE/C,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,GAAW,EAAqB,EAAE;IAChE,MAAM,OAAO,GAAgB,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE5D,MAAM,QAAQ,GAAa,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,CAAC,EAAE;QACZ,MAAM,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAE/C,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,KAAK,EAAE,MAAc,EAAE,IAAc,EAAE,MAAoB,EAAwB,EAAE;IACxG,MAAM,OAAO,GAAgB;QACzB,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,MAAM;QACd,WAAW,EAAE,SAAS;KACzB,CAAC;IAEF,IAAI,IAAI,EAAE;QACN,IAAI,IAAI,YAAY,QAAQ;YACxB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;;YAEpB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;KAC3C;IAED,IAAI,IAAI,YAAY,QAAQ;QACxB,OAAO,CAAC,OAAO,GAAG;YACd,eAAe,EAAE,UAAU,MAAM,QAAQ,EAAE,EAAE;SAChD,CAAC;SACD;QACD,OAAO,CAAC,OAAO,GAAG;YACd,cAAc,EAAE,kBAAkB;YAClC,eAAe,EAAE,UAAU,MAAM,QAAQ,EAAE,EAAE;SAChD,CAAC;KACL;IAED,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,KAAK,EAAE,QAAkB,EAAmB,EAAE;IACvE,IAAI,OAAO,GAAW,4BAA4B,CAAC;IAEnD,MAAM,aAAa,GAAuB,MAAM,QAAQ,CAAC,IAAI,EAAE;SAC1D,IAAI,CAAC,IAAI,CAAC,EAAE,WAAC,OAAA,MAAA,IAAI,CAAC,OAAO,mCAAI,IAAI,CAAC,KAAK,CAAA,EAAA,CAAC;SACxC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5B,IAAI,aAAa;QACb,OAAO,GAAG,aAAa,CAAC;IAE5B,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC","sourcesContent":["import { getToken } from \"./UserService\";\r\n\r\nexport const fetchGet = async (url: string, signal: AbortSignal | undefined): Promise<any> => {\r\n const initReq: RequestInit = await getRequestInit(\"GET\", null, signal);\r\n\r\n const response: Response = await fetch(url, initReq);\r\n if (!response.ok)\r\n throw await getQueryErrorMessage(response);\r\n\r\n return response.json();\r\n};\r\n\r\nexport const fetchFileGet = async (url: string, signal: AbortSignal | undefined): Promise<Blob> => {\r\n const initReq: RequestInit = await getRequestInit(\"GET\", null, signal);\r\n\r\n const response: Response = await fetch(url, initReq);\r\n if (!response.ok)\r\n throw await getQueryErrorMessage(response);\r\n\r\n return response.blob();\r\n};\r\n\r\nexport const fetchPost = async (url: string, data: unknown): Promise<any> => {\r\n const initReq: RequestInit = await getRequestInit(\"POST\", data);\r\n\r\n const response: Response = await fetch(url, initReq);\r\n if (!response.ok)\r\n throw await getQueryErrorMessage(response);\r\n\r\n return response.json();\r\n};\r\n\r\nexport const fetchPut = async (url: string, data: unknown): Promise<Response> => {\r\n const initReq: RequestInit = await getRequestInit(\"PUT\", data);\r\n\r\n const response: Response = await fetch(url, initReq);\r\n if (!response.ok)\r\n throw await getQueryErrorMessage(response);\r\n\r\n return response;\r\n};\r\n\r\nexport const fetchDelete = async (url: string): Promise<Response> => {\r\n const initReq: RequestInit = await getRequestInit(\"DELETE\");\r\n\r\n const response: Response = await fetch(url, initReq);\r\n if (!response.ok)\r\n throw await getQueryErrorMessage(response);\r\n\r\n return response;\r\n};\r\n\r\nconst getRequestInit = async (method: string, data?: unknown, signal?: AbortSignal): Promise<RequestInit> => {\r\n const request: RequestInit = {\r\n method: method,\r\n signal: signal,\r\n credentials: 'include'\r\n };\r\n\r\n if (data) {\r\n if (data instanceof FormData)\r\n request.body = data;\r\n else\r\n request.body = JSON.stringify(data);\r\n }\r\n\r\n if (data instanceof FormData)\r\n request.headers = {\r\n 'Authorization': `Bearer ${await getToken()}`\r\n };\r\n else {\r\n request.headers = {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${await getToken()}`\r\n };\r\n }\r\n\r\n return request;\r\n};\r\n\r\nconst getQueryErrorMessage = async (response: Response): Promise<string> => {\r\n let message: string = `Error connecting to server`;\r\n\r\n const detailMessage: string | undefined = await response.json()\r\n .then(data => data.message ?? data.title)\r\n .catch(() => (message));\r\n\r\n if (detailMessage)\r\n message = detailMessage;\r\n\r\n return message;\r\n};"]}
1
+ {"version":3,"file":"Fetches.js","sourceRoot":"","sources":["../../../src/utils/Fetches.ts"],"names":[],"mappings":"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","sourcesContent":["import { getToken } from \"./UserService\";\n\nexport const fetchGet = async (url: string, signal: AbortSignal | undefined): Promise<any> => {\n const initReq: RequestInit = await getRequestInit(\"GET\", null, signal);\n\n const response: Response = await fetch(url, initReq);\n if (!response.ok)\n throw await getQueryErrorMessage(response);\n\n return response.json();\n};\n\nexport const fetchFileGet = async (url: string, signal: AbortSignal | undefined): Promise<Blob> => {\n const initReq: RequestInit = await getRequestInit(\"GET\", null, signal);\n\n const response: Response = await fetch(url, initReq);\n if (!response.ok)\n throw await getQueryErrorMessage(response);\n\n return response.blob();\n};\n\nexport const fetchPost = async (url: string, data: unknown): Promise<any> => {\n const initReq: RequestInit = await getRequestInit(\"POST\", data);\n\n const response: Response = await fetch(url, initReq);\n if (!response.ok)\n throw await getQueryErrorMessage(response);\n\n return response.json();\n};\n\nexport const fetchPut = async (url: string, data: unknown): Promise<Response> => {\n const initReq: RequestInit = await getRequestInit(\"PUT\", data);\n\n const response: Response = await fetch(url, initReq);\n if (!response.ok)\n throw await getQueryErrorMessage(response);\n\n return response;\n};\n\nexport const fetchDelete = async (url: string): Promise<Response> => {\n const initReq: RequestInit = await getRequestInit(\"DELETE\");\n\n const response: Response = await fetch(url, initReq);\n if (!response.ok)\n throw await getQueryErrorMessage(response);\n\n return response;\n};\n\nconst getRequestInit = async (method: string, data?: unknown, signal?: AbortSignal): Promise<RequestInit> => {\n const request: RequestInit = {\n method: method,\n signal: signal,\n credentials: 'include'\n };\n\n if (data) {\n if (data instanceof FormData)\n request.body = data;\n else\n request.body = JSON.stringify(data);\n }\n\n if (data instanceof FormData)\n request.headers = {\n 'Authorization': `Bearer ${await getToken()}`\n };\n else {\n request.headers = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${await getToken()}`\n };\n }\n\n return request;\n};\n\nconst getQueryErrorMessage = async (response: Response): Promise<string> => {\n let message: string = `[${response.status}] ${response.statusText}`;\n\n const detailMessage: string | undefined = await response.json()\n .then(data => `[${response.status}] ${data.message}`)\n .catch(() => (message));\n\n if (detailMessage)\n message = detailMessage;\n\n return message;\n};"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Helpers.js","sourceRoot":"","sources":["../../../src/utils/Helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,MAAM,CAAC,MAAM,SAAS,GAAY,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AACzE,MAAM,CAAC,MAAM,QAAQ,GAAY,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAE/E,MAAM,CAAC,MAAM,aAAa,GAAY,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAE1H,MAAM,CAAC,MAAM,OAAO,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC","sourcesContent":["import { Guid } from \"guid-ts\";\r\n\r\nexport const isAndroid: boolean = /(android)/i.test(navigator.userAgent);\r\nexport const isMobile: boolean = /(android|iphone)/i.test(navigator.userAgent);\r\n\r\nexport const isDevelopment: boolean = window.location.href.includes(\".dev\") || window.location.href.includes(\"localhost\");\r\n\r\nexport const newGuid = (): string => Guid.newGuid().toString();\r\n"]}
1
+ {"version":3,"file":"Helpers.js","sourceRoot":"","sources":["../../../src/utils/Helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,MAAM,CAAC,MAAM,SAAS,GAAY,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AACzE,MAAM,CAAC,MAAM,QAAQ,GAAY,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAE/E,MAAM,CAAC,MAAM,aAAa,GAAY,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAE1H,MAAM,CAAC,MAAM,OAAO,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC","sourcesContent":["import { Guid } from \"guid-ts\";\n\nexport const isAndroid: boolean = /(android)/i.test(navigator.userAgent);\nexport const isMobile: boolean = /(android|iphone)/i.test(navigator.userAgent);\n\nexport const isDevelopment: boolean = window.location.href.includes(\".dev\") || window.location.href.includes(\"localhost\");\n\nexport const newGuid = (): string => Guid.newGuid().toString();"]}
@@ -1,2 +1,2 @@
1
- import { User } from "../models/User";
2
- export declare const useUser: () => User;
1
+ import { ExtendedUser } from "../models/User";
2
+ export declare const useUser: () => ExtendedUser;
@@ -1,7 +1,9 @@
1
1
  import { useEffect, useState } from "react";
2
2
  import { persistStorage } from "./PersistStorage";
3
+ import { doLogin, doLogout, loggedIn } from "./UserService";
4
+ const initialUser = { login: doLogin, logout: doLogout, loggedIn: loggedIn(), department: "", id: "", name: "" };
3
5
  export const useUser = () => {
4
- const [user, setUser] = useState({ id: "", name: "", department: "" });
6
+ const [user, setUser] = useState(initialUser);
5
7
  useEffect(() => {
6
8
  window.addEventListener('user', initUser);
7
9
  return () => window.removeEventListener('user', initUser);
@@ -9,7 +11,13 @@ export const useUser = () => {
9
11
  const initUser = () => {
10
12
  const storedUser = persistStorage.getObject("user");
11
13
  if (storedUser)
12
- setUser(storedUser);
14
+ setUser({
15
+ ...user,
16
+ id: storedUser.id,
17
+ department: storedUser.department,
18
+ name: storedUser.name,
19
+ loggedIn: loggedIn()
20
+ });
13
21
  };
14
22
  return user;
15
23
  };
@@ -1 +1 @@
1
- {"version":3,"file":"UseUser.js","sourceRoot":"","sources":["../../../src/utils/UseUser.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE;IACxB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAE7E,SAAS,CAAC,GAAG,EAAE;QACX,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,QAAQ,GAAG,GAAG,EAAE;QAClB,MAAM,UAAU,GAAgB,cAAc,CAAC,SAAS,CAAO,MAAM,CAAC,CAAC;QACvE,IAAI,UAAU;YACV,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC","sourcesContent":["import { useEffect, useState } from \"react\";\r\nimport { User } from \"../models/User\";\r\nimport { persistStorage } from \"./PersistStorage\";\r\n\r\nexport const useUser = () => {\r\n const [user, setUser] = useState<User>({ id: \"\", name: \"\", department: \"\" });\r\n \r\n useEffect(() => {\r\n window.addEventListener('user', initUser);\r\n return () => window.removeEventListener('user', initUser);\r\n }, []);\r\n\r\n const initUser = () => {\r\n const storedUser: User | null = persistStorage.getObject<User>(\"user\");\r\n if (storedUser)\r\n setUser(storedUser);\r\n };\r\n\r\n return user;\r\n};"]}
1
+ {"version":3,"file":"UseUser.js","sourceRoot":"","sources":["../../../src/utils/UseUser.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE5D,MAAM,WAAW,GAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAE/H,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE;IACxB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAe,WAAW,CAAC,CAAC;IAE5D,SAAS,CAAC,GAAG,EAAE;QACX,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,QAAQ,GAAG,GAAG,EAAE;QAClB,MAAM,UAAU,GAAgB,cAAc,CAAC,SAAS,CAAO,MAAM,CAAC,CAAC;QACvE,IAAI,UAAU;YACV,OAAO,CAAC;gBACJ,GAAG,IAAI;gBACP,EAAE,EAAE,UAAU,CAAC,EAAE;gBACjB,UAAU,EAAE,UAAU,CAAC,UAAU;gBACjC,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,QAAQ,EAAE,QAAQ,EAAE;aACvB,CAAC,CAAC;IACX,CAAC,CAAC;IAEF,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC","sourcesContent":["import { useEffect, useState } from \"react\";\r\nimport { ExtendedUser, User } from \"../models/User\";\r\nimport { persistStorage } from \"./PersistStorage\";\r\nimport { doLogin, doLogout, loggedIn } from \"./UserService\";\r\n\r\nconst initialUser: ExtendedUser = { login: doLogin, logout: doLogout, loggedIn: loggedIn(), department: \"\", id: \"\", name: \"\" };\r\n\r\nexport const useUser = () => {\r\n const [user, setUser] = useState<ExtendedUser>(initialUser);\r\n\r\n useEffect(() => {\r\n window.addEventListener('user', initUser);\r\n return () => window.removeEventListener('user', initUser);\r\n }, []);\r\n\r\n const initUser = () => {\r\n const storedUser: User | null = persistStorage.getObject<User>(\"user\");\r\n if (storedUser)\r\n setUser({\r\n ...user,\r\n id: storedUser.id,\r\n department: storedUser.department,\r\n name: storedUser.name,\r\n loggedIn: loggedIn()\r\n });\r\n };\r\n\r\n return user;\r\n};"]}