wcz-test 6.20.0 → 6.22.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.
Files changed (42) hide show
  1. package/dist/{DialogsHooks-Bi8dZoyu.js → DialogsContext-DMZRefiY.js} +3 -35
  2. package/dist/DialogsContext-DMZRefiY.js.map +1 -0
  3. package/dist/DialogsHooks-DBK6rBoU.js +37 -0
  4. package/dist/DialogsHooks-DBK6rBoU.js.map +1 -0
  5. package/dist/{FileHooks-hWKTwLCr.js → FileHooks-BM2Oyvh6.js} +2 -3
  6. package/dist/FileHooks-BM2Oyvh6.js.map +1 -0
  7. package/dist/{RouterListItemButton-CHS7rofI.js → RouterListItemButton-Vj6OoqkV.js} +2 -2
  8. package/dist/{RouterListItemButton-CHS7rofI.js.map → RouterListItemButton-Vj6OoqkV.js.map} +1 -1
  9. package/dist/UseHook-DB7btKDE.js +11 -0
  10. package/dist/UseHook-DB7btKDE.js.map +1 -0
  11. package/dist/client.d.ts +0 -705
  12. package/dist/client.js +2 -4
  13. package/dist/client.js.map +1 -1
  14. package/dist/components.js +4 -3
  15. package/dist/components.js.map +1 -1
  16. package/dist/hooks.d.ts +15 -0
  17. package/dist/hooks.js +5 -3
  18. package/dist/hooks.js.map +1 -1
  19. package/dist/index.d.ts +2 -2
  20. package/dist/index.js +145 -54
  21. package/dist/index.js.map +1 -1
  22. package/dist/models.d.ts +0 -9
  23. package/dist/queries.js +2 -3
  24. package/dist/queries.js.map +1 -1
  25. package/dist/server.d.ts +0 -36
  26. package/dist/server.js +1 -8732
  27. package/dist/server.js.map +1 -1
  28. package/dist/{utils-DKyKGba7.js → utils-CKW5pi6k.js} +21 -2
  29. package/dist/utils-CKW5pi6k.js.map +1 -0
  30. package/dist/utils.js +1 -1
  31. package/package.json +117 -120
  32. package/dist/DialogsHooks-Bi8dZoyu.js.map +0 -1
  33. package/dist/FileHooks-hWKTwLCr.js.map +0 -1
  34. package/dist/auth-client-B6cIXYDV.js +0 -1417
  35. package/dist/auth-client-B6cIXYDV.js.map +0 -1
  36. package/dist/env-CoxTjaDr.js +0 -27
  37. package/dist/env-CoxTjaDr.js.map +0 -1
  38. package/dist/error-BhAKg8LX-X0sdNXNa.js +0 -195
  39. package/dist/error-BhAKg8LX-X0sdNXNa.js.map +0 -1
  40. package/dist/server-mxQ3s5dx-CC81W42s.js +0 -644
  41. package/dist/server-mxQ3s5dx-CC81W42s.js.map +0 -1
  42. package/dist/utils-DKyKGba7.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
- import { j as jsxRuntimeExports, D as DialogsContext, u as useDialogs } from "./DialogsHooks-Bi8dZoyu.js";
1
+ import { j as jsxRuntimeExports, D as DialogsContext } from "./DialogsContext-DMZRefiY.js";
2
+ import { useMsalAuthentication, useMsal, AuthenticatedTemplate, MsalProvider } from "@azure/msal-react";
2
3
  import { Stack, Typography, Collapse, useMediaQuery, useColorScheme, List as List$1, ListItemButton as ListItemButton$1, ListItemIcon as ListItemIcon$1, ListItemText as ListItemText$1, ListSubheader as ListSubheader$1, IconButton, Avatar as Avatar$1, Menu, Box as Box$1, ListItem as ListItem$1, InitColorSchemeScript, CssBaseline, AppBar, Toolbar, LinearProgress, ThemeProvider } from "@mui/material";
3
4
  import { LocalizationProvider } from "@mui/x-date-pickers";
4
5
  import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
@@ -7,17 +8,20 @@ import { getCookie } from "@tanstack/react-start/server";
7
8
  import dayjs from "dayjs";
8
9
  import i18n from "i18next";
9
10
  import LanguageDetector from "i18next-browser-languagedetector";
10
- import { useState, useId, useRef, Fragment, useEffect, useEffectEvent } from "react";
11
+ import { useState, useId, useRef, useEffect, Fragment, useEffectEvent } from "react";
11
12
  import { useTranslation, initReactI18next } from "react-i18next";
12
13
  import { resources } from "virtual:wcz-layout";
13
14
  import z__default from "zod";
14
15
  import useEventCallback from "@mui/utils/useEventCallback";
15
- import { a as authClient, u as useGetTheme } from "./auth-client-B6cIXYDV.js";
16
+ import { PublicClientApplication, EventType, InteractionType } from "@azure/msal-browser";
17
+ import { U as UserContext, u as useUser } from "./UseHook-DB7btKDE.js";
18
+ import { useQuery, useIsFetching, useIsMutating } from "@tanstack/react-query";
19
+ import axios from "axios";
20
+ import { c as clientEnv } from "./utils-CKW5pi6k.js";
21
+ import { r } from "./utils-CKW5pi6k.js";
16
22
  import Menu$1 from "@mui/icons-material/Menu";
17
23
  import MenuOpen from "@mui/icons-material/MenuOpen";
18
24
  import { styled, useTheme } from "@mui/material/styles";
19
- import { useIsFetching, useIsMutating } from "@tanstack/react-query";
20
- import { c as clientEnv } from "./env-CoxTjaDr.js";
21
25
  import Box from "@mui/material/Box";
22
26
  import Drawer from "@mui/material/Drawer";
23
27
  import { useNavigate, useRouterState } from "@tanstack/react-router";
@@ -33,20 +37,18 @@ import ListItemText from "@mui/material/ListItemText";
33
37
  import Paper from "@mui/material/Paper";
34
38
  import Popper from "@mui/material/Popper";
35
39
  import Typography$1 from "@mui/material/Typography";
36
- import { R as RouterListItemButton } from "./RouterListItemButton-CHS7rofI.js";
37
- import "@mui/icons-material/AccountCircle";
40
+ import { R as RouterListItemButton } from "./RouterListItemButton-Vj6OoqkV.js";
41
+ import AccountCircle from "@mui/icons-material/AccountCircle";
38
42
  import ArrowBack from "@mui/icons-material/ArrowBack";
39
43
  import Brightness4 from "@mui/icons-material/Brightness4";
40
44
  import ChevronRight from "@mui/icons-material/ChevronRight";
41
45
  import DarkMode from "@mui/icons-material/DarkMode";
46
+ import Done from "@mui/icons-material/Done";
42
47
  import LightMode from "@mui/icons-material/LightMode";
43
- import Login from "@mui/icons-material/Login";
44
48
  import Logout from "@mui/icons-material/Logout";
45
49
  import SettingsBrightness from "@mui/icons-material/SettingsBrightness";
46
50
  import Translate from "@mui/icons-material/Translate";
47
- import Done from "@mui/icons-material/Done";
48
- import { r } from "./utils-DKyKGba7.js";
49
- function DialogsProvider({ children, unmountAfter = 1e3 }) {
51
+ function DialogsProvider({ children }) {
50
52
  const [stack, setStack] = useState([]);
51
53
  const keyPrefix = useId();
52
54
  const nextId = useRef(0);
@@ -81,7 +83,7 @@ function DialogsProvider({ children, unmountAfter = 1e3 }) {
81
83
  setStack(
82
84
  (previousStack) => previousStack.map((entry) => entry.promise === dialog ? { ...entry, open: false } : entry)
83
85
  );
84
- setTimeout(() => removeDialogFromStack(dialog), unmountAfter);
86
+ setTimeout(() => removeDialogFromStack(dialog), 1e3);
85
87
  });
86
88
  const closeDialog = useEventCallback(async function closeDialog2(dialog, result) {
87
89
  const entryToClose = dialogMetadata.current.get(dialog);
@@ -111,6 +113,116 @@ function DialogsProvider({ children, unmountAfter = 1e3 }) {
111
113
  ))
112
114
  ] });
113
115
  }
116
+ const msalConfig = {
117
+ auth: {
118
+ clientId: clientEnv.VITE_MICROSOFT_CLIENT_ID,
119
+ authority: `https://login.microsoftonline.com/${clientEnv.VITE_MICROSOFT_TENANT_ID}`
120
+ }
121
+ };
122
+ const msalInstance = new PublicClientApplication(msalConfig);
123
+ msalInstance.initialize().then(() => {
124
+ if (!msalInstance.getActiveAccount() && msalInstance.getAllAccounts().length > 0) {
125
+ msalInstance.setActiveAccount(msalInstance.getAllAccounts()[0]);
126
+ }
127
+ msalInstance.enableAccountStorageEvents();
128
+ msalInstance.addEventCallback((event) => {
129
+ if (event.eventType === EventType.LOGIN_SUCCESS && event.payload) {
130
+ const payload = event.payload;
131
+ const account = payload.account;
132
+ msalInstance.setActiveAccount(account);
133
+ }
134
+ });
135
+ });
136
+ const acquireAccessToken = async () => {
137
+ const account = msalInstance.getActiveAccount();
138
+ if (!account) {
139
+ throw new Error("No active account! Verify a user has been signed in and setActiveAccount has been called.");
140
+ }
141
+ const response = await msalInstance.acquireTokenSilent({
142
+ scopes: ["User.Read"],
143
+ account
144
+ });
145
+ return response.accessToken;
146
+ };
147
+ const QUERY_KEY = "user";
148
+ const DAY = 1e3 * 60 * 60 * 24;
149
+ const api = axios.create({
150
+ baseURL: "https://graph.microsoft.com/v1.0/"
151
+ });
152
+ api.interceptors.request.use(async (config) => {
153
+ config.headers.Authorization = `Bearer ${await acquireAccessToken()}`;
154
+ return config;
155
+ });
156
+ const useGetUser = (enabled = true) => {
157
+ return useQuery({
158
+ queryKey: [QUERY_KEY, "me"],
159
+ queryFn: ({ signal }) => api.request({
160
+ method: "GET",
161
+ url: "me?$select=id,displayName,jobTitle,mail,mobilePhone",
162
+ signal
163
+ }),
164
+ select: (response) => ({
165
+ id: response.data.id,
166
+ name: response.data.displayName.split("/")[0],
167
+ jobTitle: response.data.jobTitle,
168
+ email: response.data.mail,
169
+ mobilePhone: response.data.mobilePhone,
170
+ photo: null,
171
+ groups: []
172
+ }),
173
+ staleTime: DAY,
174
+ gcTime: DAY,
175
+ refetchOnWindowFocus: false,
176
+ enabled
177
+ });
178
+ };
179
+ const useGetUserPhoto = (enabled = true) => {
180
+ return useQuery({
181
+ queryKey: [QUERY_KEY, "me", "photo"],
182
+ queryFn: ({ signal }) => api.request({
183
+ method: "GET",
184
+ url: "me/photo/$value",
185
+ signal,
186
+ responseType: "blob"
187
+ }),
188
+ select: (response) => URL.createObjectURL(response.data),
189
+ staleTime: DAY,
190
+ gcTime: DAY,
191
+ refetchOnWindowFocus: false,
192
+ enabled
193
+ });
194
+ };
195
+ const useGetUserGroups = (enabled = true) => {
196
+ return useQuery({
197
+ queryKey: [QUERY_KEY, "me", "memberOf"],
198
+ queryFn: ({ signal }) => api.request({
199
+ method: "GET",
200
+ url: "me/memberOf?$select=displayName",
201
+ signal
202
+ }),
203
+ select: (response) => response.data.value.map((group) => group.displayName),
204
+ staleTime: DAY,
205
+ gcTime: DAY,
206
+ refetchOnWindowFocus: false,
207
+ enabled
208
+ });
209
+ };
210
+ function UserProvider({ children }) {
211
+ const { result } = useMsalAuthentication(InteractionType.Redirect);
212
+ const [user, setUser] = useState({});
213
+ const { data } = useGetUser(!!result);
214
+ const { data: photo } = useGetUserPhoto(!!result);
215
+ const { data: groups } = useGetUserGroups(!!result);
216
+ useEffect(() => {
217
+ setUser((prevUser) => ({
218
+ ...data,
219
+ ...photo && { photo },
220
+ ...groups && { groups },
221
+ ...prevUser
222
+ }));
223
+ }, [data, photo, groups]);
224
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(UserContext.Provider, { value: { user, setUser }, children });
225
+ }
114
226
  const AppTitle = () => {
115
227
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(Stack, { direction: "row", alignItems: "center", spacing: 2, flexGrow: 1, children: [
116
228
  /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: "/favicon-32x32.png", alt: "app-logo", loading: "lazy" }),
@@ -423,7 +535,7 @@ const NavigationRail = ({ navigation, expanded, setExpanded }) => {
423
535
  height: `calc(100% - ${TOOLBAR_HEIGHT}px)`,
424
536
  width: expanded ? EXPANDED_WIDTH : MINI_WIDTH,
425
537
  borderTop: "1px solid",
426
- borderColor: theme.vars?.palette.divider
538
+ borderColor: "var(--mui-palette-divider)"
427
539
  }
428
540
  },
429
541
  children: drawerContent(!expanded)
@@ -438,8 +550,8 @@ const ToolbarAccount = () => {
438
550
  const open = Boolean(anchorElement);
439
551
  const { t, i18n: i18n2 } = useTranslation();
440
552
  const { mode, setMode } = useColorScheme();
441
- const { data: session } = authClient.useSession();
442
- const { alert } = useDialogs();
553
+ const { instance } = useMsal();
554
+ const user = useUser();
443
555
  const supportedLanguages = (Array.isArray(i18n2.options.supportedLngs) ? i18n2.options.supportedLngs : []).filter((lng) => lng !== "cimode");
444
556
  const languageDisplayNames = new Intl.DisplayNames([i18n2.language], { type: "language" });
445
557
  const colorModes = [
@@ -447,15 +559,6 @@ const ToolbarAccount = () => {
447
559
  { mode: "dark", icon: DarkMode, label: t("Layout.Dark") },
448
560
  { mode: "system", icon: SettingsBrightness, label: t("Layout.System") }
449
561
  ];
450
- const user = {
451
- name: "Dalibor Homola",
452
- employeeId: "C2503017",
453
- department: "IT"
454
- };
455
- const usernameInitials = () => {
456
- const splittedName = user.name.split(" ");
457
- return `${splittedName[0][0]}${splittedName.length > 1 ? splittedName[1][0] : ""}`;
458
- };
459
562
  const openMenu = (event) => setAnchorElement(event.currentTarget);
460
563
  const closeMenu = () => {
461
564
  setAnchorElement(void 0);
@@ -512,20 +615,21 @@ const ToolbarAccount = () => {
512
615
  )
513
616
  ) });
514
617
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(Fragment, { children: [
515
- /* @__PURE__ */ jsxRuntimeExports.jsx(IconButton, { size: "small", edge: "end", onClick: openMenu, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Avatar$1, { sx: { width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 }, bgcolor: "primary.main" }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Typography, { variant: "subtitle2", sx: { fontWeight: "bold", lineHeight: 0 }, children: usernameInitials() }) }) }),
618
+ /* @__PURE__ */ jsxRuntimeExports.jsx(IconButton, { size: "small", edge: "end", onClick: openMenu, children: user.photo ? /* @__PURE__ */ jsxRuntimeExports.jsx(
619
+ Avatar$1,
620
+ {
621
+ src: user.photo,
622
+ sx: { width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 } }
623
+ }
624
+ ) : /* @__PURE__ */ jsxRuntimeExports.jsx(AccountCircle, { sx: { width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 } } }) }),
516
625
  /* @__PURE__ */ jsxRuntimeExports.jsx(Menu, { anchorEl: anchorElement, open, onClose: closeMenu, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Box$1, { sx: { width: 240 }, children: [
517
- /* @__PURE__ */ jsxRuntimeExports.jsx(List$1, { children: session ? /* @__PURE__ */ jsxRuntimeExports.jsxs(Fragment, { children: [
518
- /* @__PURE__ */ jsxRuntimeExports.jsx(ListItem$1, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ListItemText$1, { primary: user.name, secondary: /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
519
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: user.employeeId }),
520
- /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
521
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: user.department })
522
- ] }) }) }),
626
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(List$1, { disablePadding: true, children: [
627
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ListItem$1, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ListItemText$1, { primary: user.name, secondary: user.jobTitle }) }),
523
628
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
524
629
  ListItemButton$1,
525
630
  {
526
- onClick: () => authClient.signOut({}, {
527
- onSuccess: () => closeMenu(),
528
- onError: ({ error }) => alert(error.message)
631
+ onClick: () => instance.logoutRedirect({
632
+ postLogoutRedirectUri: "/"
529
633
  }),
530
634
  children: [
531
635
  /* @__PURE__ */ jsxRuntimeExports.jsx(ListItemIcon$1, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Logout, { color: "error" }) }),
@@ -533,19 +637,7 @@ const ToolbarAccount = () => {
533
637
  ]
534
638
  }
535
639
  )
536
- ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(
537
- ListItemButton$1,
538
- {
539
- onClick: () => authClient.signIn.social({ provider: "microsoft" }, {
540
- onSuccess: () => closeMenu(),
541
- onError: ({ error }) => alert(error.message)
542
- }),
543
- children: [
544
- /* @__PURE__ */ jsxRuntimeExports.jsx(ListItemIcon$1, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Login, { color: "success" }) }),
545
- /* @__PURE__ */ jsxRuntimeExports.jsx(ListItemText$1, { primary: t("Layout.LogIn") })
546
- ]
547
- }
548
- ) }),
640
+ ] }),
549
641
  tab === "settings" && settings,
550
642
  tab === "theme" && theme,
551
643
  tab === "language" && language
@@ -580,11 +672,11 @@ const Layout = (props) => {
580
672
  {
581
673
  color: "transparent",
582
674
  position: "fixed",
583
- sx: (theme) => ({
675
+ sx: {
584
676
  borderBottom: "1px solid",
585
- borderColor: theme.vars?.palette.divider,
677
+ borderColor: "var(--mui-palette-divider)",
586
678
  boxShadow: "none"
587
- }),
679
+ },
588
680
  children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Toolbar, { children: [
589
681
  props.navigation && /* @__PURE__ */ jsxRuntimeExports.jsx(
590
682
  IconButton,
@@ -618,7 +710,7 @@ const Layout = (props) => {
618
710
  ),
619
711
  /* @__PURE__ */ jsxRuntimeExports.jsxs(Box$1, { component: "main", sx: { flexGrow: 1, display: "flex", flexDirection: "column", minWidth: 0, height: "100%", overflow: "hidden" }, children: [
620
712
  /* @__PURE__ */ jsxRuntimeExports.jsx(DrawerHeader, {}),
621
- /* @__PURE__ */ jsxRuntimeExports.jsx(Box$1, { sx: { flex: 1, overflow: "auto", position: "relative" }, children: props.children })
713
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Box$1, { sx: { flex: 1, overflow: "auto", position: "relative" }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(AuthenticatedTemplate, { children: props.children }) })
622
714
  ] })
623
715
  ] }),
624
716
  (isFetching || isMutating) && /* @__PURE__ */ jsxRuntimeExports.jsx(LinearProgress, { sx: { position: "fixed", top: { xs: 56, sm: 64 }, left: 0, right: 0 } })
@@ -636,7 +728,6 @@ i18n.use(LanguageDetector).use(initReactI18next).init({
636
728
  interpolation: { escapeValue: false }
637
729
  });
638
730
  const LayoutProvider = ({ navigation, theme, children }) => {
639
- const createdTheme = useGetTheme(theme);
640
731
  const languageChangedHandler = useEffectEvent(() => {
641
732
  z__default.config(z__default.core.locales[i18n.language]());
642
733
  dayjs.locale(i18n.language);
@@ -648,12 +739,12 @@ const LayoutProvider = ({ navigation, theme, children }) => {
648
739
  i18n.off("languageChanged", languageChangedHandler);
649
740
  };
650
741
  }, []);
651
- return /* @__PURE__ */ jsxRuntimeExports.jsx(ThemeProvider, { theme: createdTheme, children: /* @__PURE__ */ jsxRuntimeExports.jsx(LocalizationProvider, { dateAdapter: AdapterDayjs, adapterLocale: i18n.language, children: /* @__PURE__ */ jsxRuntimeExports.jsx(DialogsProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Layout, { navigation, children }) }) }, i18n.language) });
742
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(MsalProvider, { instance: msalInstance, children: /* @__PURE__ */ jsxRuntimeExports.jsx(UserProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ThemeProvider, { theme, children: /* @__PURE__ */ jsxRuntimeExports.jsx(LocalizationProvider, { dateAdapter: AdapterDayjs, adapterLocale: i18n.language, children: /* @__PURE__ */ jsxRuntimeExports.jsx(DialogsProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Layout, { navigation, children }) }) }, i18n.language) }) }) });
652
743
  };
653
744
  const setSSRLanguage = createServerFn().handler(async () => {
654
745
  const language = getCookie(i18n.services.languageDetector.options.lookupCookie) || "en";
655
- dayjs.locale(language);
656
746
  z__default.config(z__default.core.locales[language]());
747
+ dayjs.locale(language);
657
748
  await i18n.changeLanguage(language);
658
749
  });
659
750
  export {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/providers/DialogsProvider.tsx","../src/components/core/AppTitle.tsx","../src/components/core/navigation/NavigationListItem.tsx","../src/components/core/navigation/NavigationList.tsx","../src/components/core/navigation/NavigationRail.tsx","../src/components/core/ToolbarAccount.tsx","../src/components/core/Layout.tsx","../src/providers/LayoutProvider.tsx"],"sourcesContent":["import useEventCallback from \"@mui/utils/useEventCallback\";\nimport { useId, useRef, useState } from \"react\";\nimport { DialogsContext } from \"../contexts/DialogsContext\";\nimport type { DialogComponent, OpenDialog, OpenDialogOptions } from \"../hooks/DialogsHooks\";\n\ninterface DialogStackEntry<TPayload, TResult> {\n key: string;\n open: boolean;\n promise: Promise<TResult>;\n Component: DialogComponent<TPayload, TResult>;\n payload: TPayload;\n onClose: (result: TResult) => Promise<void>;\n resolve: (result: TResult) => void;\n}\n\nexport interface DialogProviderProps {\n children?: React.ReactNode;\n unmountAfter?: number;\n}\n\nfunction DialogsProvider({ children, unmountAfter = 1000 }: Readonly<DialogProviderProps>) {\n const [stack, setStack] = useState<Array<DialogStackEntry<any, any>>>([]);\n const keyPrefix = useId();\n const nextId = useRef(0);\n const dialogMetadata = useRef(new WeakMap<Promise<any>, DialogStackEntry<any, any>>());\n\n const requestDialog = useEventCallback<OpenDialog>(function open<TPayload, TResult>(\n Component: DialogComponent<TPayload, TResult>,\n payload: TPayload,\n options: OpenDialogOptions<TResult> = {},\n ) {\n const { onClose = async () => { } } = options;\n\n let resolve: (result: TResult) => void;\n const promise = new Promise<TResult>((resolveImpl) => {\n resolve = resolveImpl;\n });\n\n const key = `${keyPrefix}-${nextId.current}`;\n nextId.current += 1;\n\n const newEntry: DialogStackEntry<TPayload, TResult> = {\n key,\n open: true,\n promise,\n Component,\n payload,\n onClose,\n resolve: resolve!,\n };\n\n dialogMetadata.current.set(promise, newEntry);\n\n setStack((previousStack) => [...previousStack, newEntry]);\n\n return promise;\n });\n\n const removeDialogFromStack = (dialog: Promise<any>) => {\n setStack((previousStack) => previousStack.filter((entry) => entry.promise !== dialog));\n dialogMetadata.current.delete(dialog);\n };\n\n const closeDialogUi = useEventCallback(function closeDialogUi<TResult>(dialog: Promise<TResult>) {\n setStack((previousStack) =>\n previousStack.map((entry) => (entry.promise === dialog ? { ...entry, open: false } : entry)),\n );\n\n setTimeout(() => removeDialogFromStack(dialog), unmountAfter);\n });\n\n const closeDialog = useEventCallback(async function closeDialog<TResult>(\n dialog: Promise<TResult>,\n result: TResult,\n ) {\n const entryToClose = dialogMetadata.current.get(dialog);\n if (!entryToClose) {\n throw new Error(\"Dialog not found in stack\");\n }\n\n try {\n await entryToClose.onClose(result);\n } finally {\n entryToClose.resolve(result);\n closeDialogUi(dialog);\n }\n\n return dialog;\n });\n\n return (\n <DialogsContext.Provider value={{ open: requestDialog, close: closeDialog }}>\n {children}\n {stack.map(({ key, open, Component, payload, promise }) => (\n <Component\n key={key}\n payload={payload}\n open={open}\n onClose={async (result) => {\n await closeDialog(promise, result);\n }}\n />\n ))}\n </DialogsContext.Provider>\n );\n}\n\nexport { DialogsProvider };\n\n","import { Chip, Stack, Typography } from \"@mui/material\";\nimport type { FC } from \"react\";\nimport { clientEnv } from \"~/env\";\n\nexport const AppTitle: FC = () => {\n return (\n <Stack direction=\"row\" alignItems=\"center\" spacing={2} flexGrow={1}>\n <img src=\"/favicon-32x32.png\" alt=\"app-logo\" loading=\"lazy\" />\n <Typography variant=\"h6\">{clientEnv.VITE_APP_TITLE}</Typography>\n {import.meta.env.DEV && <Chip size=\"small\" label=\"TEST\" color=\"info\" />}\n </Stack>\n );\n};\n","import ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\nimport { Collapse } from \"@mui/material\";\nimport Avatar from \"@mui/material/Avatar\";\nimport Box from \"@mui/material/Box\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemButton from \"@mui/material/ListItemButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport Paper from \"@mui/material/Paper\";\nimport Popper from \"@mui/material/Popper\";\nimport { styled } from \"@mui/material/styles\";\nimport Typography from \"@mui/material/Typography\";\nimport { Fragment, useState } from \"react\";\nimport { MINI_WIDTH } from \"./NavigationRail\";\nimport type { NavigationItem, NavigationPageItem } from \"~/models/Navigation\";\nimport type { FC, ReactNode } from \"react\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport { RouterListItemButton } from \"~/components/router/RouterListItemButton\";\n\nconst ICON_SIZE = 34;\n\nconst StyledNavButton = styled(ListItemButton)(({ theme }) => ({\n borderRadius: 8,\n \"&.Mui-selected\": {\n \"& .MuiListItemIcon-root, & .MuiTypography-root, & .MuiSvgIcon-root\": {\n color: (theme.vars ?? theme).palette.primary.dark,\n },\n \"& .MuiAvatar-root\": {\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\n },\n \"& .MuiTouchRipple-child\": {\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\n },\n },\n \"& .MuiSvgIcon-root\": {\n color: (theme.vars ?? theme).palette.action.active,\n },\n \"& .MuiAvatar-root\": {\n backgroundColor: (theme.vars ?? theme).palette.action.active,\n },\n}));\n\nconst StyledRouterButton = styled(RouterListItemButton)(({ theme }) => ({\n borderRadius: 8,\n \"&.Mui-selected\": {\n \"& .MuiListItemIcon-root, & .MuiTypography-root, & .MuiSvgIcon-root\": {\n color: (theme.vars ?? theme).palette.primary.dark,\n },\n \"& .MuiAvatar-root\": {\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\n },\n \"& .MuiTouchRipple-child\": {\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\n },\n },\n \"& .MuiSvgIcon-root\": {\n color: (theme.vars ?? theme).palette.action.active,\n },\n \"& .MuiAvatar-root\": {\n backgroundColor: (theme.vars ?? theme).palette.action.active,\n },\n}));\n\nconst IconOrAvatar: FC<{ item: NavigationPageItem; collapsed?: boolean }> = ({ item, collapsed }) => {\n if (item.icon || collapsed) {\n return (\n <Box sx={collapsed ? { position: \"absolute\", left: \"50%\", top: \"calc(50% - 6px)\", transform: \"translate(-50%, -50%)\" } : {}}>\n <ListItemIcon sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", minWidth: ICON_SIZE }}>\n {item.icon ?? null}\n {!item.icon && collapsed ? (\n <Avatar sx={{ width: ICON_SIZE - 7, height: ICON_SIZE - 7, fontSize: 12 }}>{item.title}</Avatar>\n ) : null}\n </ListItemIcon>\n {collapsed ? (\n <Typography\n variant=\"caption\"\n sx={{\n position: \"absolute\",\n bottom: -18,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n fontSize: 10,\n fontWeight: 500,\n textAlign: \"center\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n maxWidth: MINI_WIDTH - 28,\n }}\n >\n {item.title}\n </Typography>\n ) : null}\n </Box>\n );\n }\n return null;\n};\n\ninterface MiniPopoverProps {\n open: boolean;\n anchorEl: HTMLElement | null;\n children?: ReactNode;\n}\n\nconst MiniPopover: FC<MiniPopoverProps> = ({ open, anchorEl, children }) => (\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement=\"right-start\"\n modifiers={[\n { name: \"offset\", options: { offset: [6, 0] } },\n { name: \"preventOverflow\", options: { padding: 8 } },\n { name: \"flip\", options: { fallbackPlacements: [\"right-end\", \"left-start\"] } },\n ]}\n >\n <Paper\n sx={{\n pt: 0.5,\n pb: 0.5,\n maxHeight: \"min(calc(100vh - 100px), 560px)\",\n overflowY: \"auto\",\n overscrollBehavior: \"contain\",\n }}\n >\n {children}\n </Paper>\n </Popper>\n);\n\ninterface NavigationListItemProps {\n item: NavigationPageItem;\n isOpen?: boolean;\n selected?: boolean;\n disabled?: boolean;\n collapsed?: boolean;\n isSidebarFullyExpanded?: boolean;\n isSidebarFullyCollapsed?: boolean;\n onClick?: (item: NavigationPageItem) => void;\n renderNested?: (sub: Array<NavigationItem>) => ReactNode;\n onClose?: () => void;\n}\n\nexport const NavigationListItem: FC<NavigationListItemProps> = ({ item, isOpen, selected, disabled, collapsed, isSidebarFullyExpanded = true, isSidebarFullyCollapsed, onClick, renderNested, onClose }) => {\n const [hoveredPopoverItem, setHoveredPopoverItem] = useState<string | null>(null);\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n\n const chevronSx: SxProps<Theme> = () => {\n if (collapsed && isSidebarFullyCollapsed && item.children) {\n return {\n fontSize: 18,\n position: \"absolute\",\n top: \"41.5%\",\n right: \"2px\",\n transform: \"translateY(-50%) rotate(-90deg)\",\n };\n }\n if (!collapsed && isSidebarFullyExpanded && item.children) {\n return {\n ml: 0.5,\n transform: `rotate(${isOpen ? 0 : -90}deg)`,\n };\n }\n return { display: \"none\" };\n };\n\n const shouldJustExpand = item.children && !collapsed;\n\n const buttonProps = {\n selected,\n disabled,\n sx: { px: 1.4, height: collapsed ? 60 : 48 }\n };\n\n const buttonContent = (\n <>\n <IconOrAvatar item={item} collapsed={collapsed} />\n {!collapsed && (\n <ListItemText\n primary={item.title}\n slotProps={{ primary: { noWrap: true, title: item.title } }}\n sx={{ ml: 1.2, flex: 1, minWidth: 0, \"& .MuiTypography-root\": { whiteSpace: \"nowrap\", overflow: \"hidden\", textOverflow: \"ellipsis\" } }}\n />\n )}\n {item.children ? <ExpandMoreIcon sx={chevronSx} /> : null}\n </>\n );\n\n const listItem = (\n <ListItem\n {...(item.children && collapsed\n ? {\n onMouseEnter: (event: React.MouseEvent<HTMLElement>) => {\n setAnchorElement(event.currentTarget);\n setHoveredPopoverItem(item.title);\n },\n onMouseLeave: () => {\n setHoveredPopoverItem(null);\n },\n }\n : {})}\n sx={{ py: 0, px: 1, overflowX: \"hidden\" }}\n >\n {shouldJustExpand ? (\n <StyledNavButton {...buttonProps} onClick={() => onClick?.(item)}>\n {buttonContent}\n </StyledNavButton>\n ) : (\n <StyledRouterButton\n {...buttonProps}\n to={item.to}\n href={item.href}\n params={item.params as any}\n search={item.search as any}\n onClick={onClose}\n >\n {buttonContent}\n </StyledRouterButton>\n )}\n\n {item.children && collapsed ? (\n <MiniPopover open={item.title === hoveredPopoverItem} anchorEl={anchorElement}>\n {renderNested?.(item.children)}\n </MiniPopover>\n ) : null}\n </ListItem>\n );\n\n return (\n <Fragment key={item.to}>\n {listItem}\n {item.children && !collapsed ? (\n <Collapse in={isOpen} timeout=\"auto\" unmountOnExit>\n {renderNested?.(item.children)}\n </Collapse>\n ) : null}\n </Fragment>\n );\n};\n","import Divider from \"@mui/material/Divider\";\nimport List from \"@mui/material/List\";\nimport ListSubheader from \"@mui/material/ListSubheader\";\nimport { Fragment, useEffect, useState } from \"react\";\nimport { NavigationListItem } from \"./NavigationListItem\";\nimport { EXPANDED_WIDTH, MINI_WIDTH } from \"./NavigationRail\";\nimport type { FC, ReactNode } from \"react\";\nimport type { Navigation, NavigationDivider, NavigationHeader, NavigationItem, NavigationPageItem } from \"~/models/Navigation\";\n\nexport const isPageItem = (item: NavigationItem): item is NavigationPageItem => !(\"kind\" in item);\nexport const isDivider = (item: NavigationItem): item is NavigationDivider => \"kind\" in item && item.kind === \"divider\";\nexport const isHeader = (item: NavigationItem): item is NavigationHeader => \"kind\" in item && item.kind === \"header\";\n\ninterface NavigationListProps {\n subNavigation: Navigation;\n depth?: number;\n collapsed?: boolean;\n isPopover?: boolean;\n isSidebarFullyExpanded?: boolean;\n isSidebarFullyCollapsed?: boolean;\n expandedWidth: number | string;\n renderItem?: (item: NavigationPageItem, context: { collapsed: boolean }) => ReactNode;\n activePath?: string | null;\n onNavigate: (item: NavigationPageItem) => void;\n onClose?: () => void;\n}\n\nexport const NavigationList: FC<NavigationListProps> = ({ subNavigation, depth = 0, collapsed, isPopover, isSidebarFullyExpanded = true, isSidebarFullyCollapsed, expandedWidth, renderItem, activePath, onNavigate, onClose }) => {\n const [openKeys, setOpenKeys] = useState<Array<string>>([]);\n\n useEffect(() => {\n if (collapsed) setOpenKeys([]);\n }, [collapsed]);\n\n const toggleKey = (key: string) =>\n setOpenKeys((previous) => (previous.includes(key) ? previous.filter((k) => k !== key) : [...previous, key]));\n\n const renderNested = (children: Array<NavigationItem>) => <NavigationList\n subNavigation={children}\n depth={depth + 1}\n isPopover={collapsed}\n expandedWidth={expandedWidth}\n activePath={activePath}\n onNavigate={onNavigate}\n onClose={onClose}\n />;\n\n const filteredNavigation = subNavigation.filter(nav => !nav.hidden);\n\n return (\n <List\n sx={{\n padding: 0,\n mt: isPopover && depth === 1 ? 0.5 : 0,\n mb: depth === 0 && !isPopover ? 4 : 0.5,\n pl: (isPopover ? 1 : 2) * (isPopover ? depth - 1 : depth),\n minWidth: isPopover && depth === 1 ? EXPANDED_WIDTH : \"auto\",\n width: collapsed ? MINI_WIDTH : \"auto\",\n }}\n >\n {filteredNavigation.map((navItem, index) => {\n if (isHeader(navItem)) {\n return (\n <ListSubheader\n key={`subheader-${depth}-${index}`}\n sx={{\n fontSize: 12,\n fontWeight: \"700\",\n height: collapsed ? 0 : 40,\n px: 2,\n minWidth: expandedWidth,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n zIndex: 2,\n bgcolor: \"transparent\",\n position: \"static\"\n }}\n >\n {navItem.title}\n </ListSubheader>\n );\n }\n\n if (isDivider(navItem)) {\n const nextItem = filteredNavigation[index + 1];\n return (\n <li key={`divider-${depth}-${index}`}>\n <Divider sx={{ mx: 1, mt: 1, mb: isHeader(nextItem) && !collapsed ? 0 : 1 }} />\n </li>\n );\n }\n\n if (!isPageItem(navItem)) return null;\n\n const key = `item-${depth}-${index}`;\n const uniqueItemKey = `${depth}-${index}-${navItem.title}`;\n\n if (renderItem) return <Fragment key={key}>{renderItem(navItem, { collapsed: !!collapsed })}</Fragment>;\n\n return <NavigationListItem\n key={key}\n item={navItem}\n isOpen={openKeys.includes(uniqueItemKey)}\n selected={activePath === navItem.to}\n collapsed={collapsed}\n isSidebarFullyExpanded={isSidebarFullyExpanded}\n isSidebarFullyCollapsed={isSidebarFullyCollapsed}\n onClick={navItem.children && !collapsed ? () => toggleKey(uniqueItemKey) : undefined}\n renderNested={renderNested}\n onClose={onClose}\n />;\n })}\n </List>\n );\n};","import { useMediaQuery } from \"@mui/material\";\nimport Box from \"@mui/material/Box\";\nimport Drawer from \"@mui/material/Drawer\";\nimport { useTheme } from \"@mui/material/styles\";\nimport { useNavigate, useRouterState } from \"@tanstack/react-router\";\nimport { NavigationList, isHeader } from \"./NavigationList\";\nimport type { FC } from \"react\";\nimport type { Navigation } from \"~/models/Navigation\";\n\nexport const MINI_WIDTH = 84;\nexport const EXPANDED_WIDTH = 320;\nexport const TOOLBAR_HEIGHT = 64;\n\ninterface NavigationRailProps {\n navigation: Navigation;\n expanded: boolean;\n setExpanded: (open: boolean) => void;\n}\n\nexport const NavigationRail: FC<NavigationRailProps> = ({ navigation, expanded, setExpanded }) => {\n const navigate = useNavigate();\n const routerState = useRouterState();\n const theme = useTheme();\n const showPermanent = useMediaQuery(theme.breakpoints.up(\"sm\"));\n\n const drawerContent = (collapsed: boolean) => (\n <Box\n component=\"nav\"\n sx={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"space-between\",\n overflow: \"auto\",\n scrollbarGutter: collapsed ? \"stable\" : \"auto\",\n overflowX: \"hidden\",\n pt: navigation[0] && isHeader(navigation[0]) && !collapsed ? 0 : 2,\n }}\n >\n <NavigationList\n subNavigation={navigation}\n collapsed={collapsed}\n isSidebarFullyExpanded={expanded}\n isSidebarFullyCollapsed={!expanded}\n expandedWidth={EXPANDED_WIDTH}\n activePath={routerState.location.pathname}\n onNavigate={navigate}\n onClose={!showPermanent ? () => setExpanded(false) : undefined}\n />\n </Box>\n );\n\n if (showPermanent)\n return (\n <Drawer\n variant=\"permanent\"\n sx={{\n width: expanded ? EXPANDED_WIDTH : MINI_WIDTH,\n [\"& .MuiDrawer-paper\"]: {\n position: \"absolute\",\n top: `${TOOLBAR_HEIGHT}px`,\n height: `calc(100% - ${TOOLBAR_HEIGHT}px)`,\n width: expanded ? EXPANDED_WIDTH : MINI_WIDTH,\n borderTop: \"1px solid\",\n borderColor: theme.vars?.palette.divider,\n },\n }}\n >\n {drawerContent(!expanded)}\n </Drawer>\n );\n\n return (\n <Drawer open={expanded} onClose={() => setExpanded(false)}>\n {drawerContent(!expanded)}\n </Drawer>\n );\n};\n","import AccountCircle from \"@mui/icons-material/AccountCircle\";\nimport ArrowBack from \"@mui/icons-material/ArrowBack\";\nimport Brightness4 from \"@mui/icons-material/Brightness4\";\nimport ChevronRight from \"@mui/icons-material/ChevronRight\";\nimport DarkMode from \"@mui/icons-material/DarkMode\";\nimport LightMode from \"@mui/icons-material/LightMode\";\nimport Login from \"@mui/icons-material/Login\";\nimport Logout from \"@mui/icons-material/Logout\";\nimport SettingsBrightness from \"@mui/icons-material/SettingsBrightness\";\nimport Translate from \"@mui/icons-material/Translate\";\nimport { Avatar, Box, IconButton, List, ListItem, ListItemButton, ListItemIcon, ListItemText, ListSubheader, Menu, Typography, useColorScheme } from \"@mui/material\";\nimport { Fragment, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport Done from \"@mui/icons-material/Done\";\nimport type { FC } from \"react\";\nimport type { User } from \"~/models/User\";\nimport { authClient } from \"~/lib/auth/auth-client\";\nimport { useDialogs } from \"~/hooks/DialogsHooks\";\n\ntype TabType = \"settings\" | \"theme\" | \"language\";\n\nconst capitalize = (value: string | undefined) => value && value.charAt(0).toUpperCase() + value.slice(1);\n\nexport const ToolbarAccount: FC = () => {\n const [anchorElement, setAnchorElement] = useState<HTMLElement>();\n const [tab, setTab] = useState<TabType>(\"settings\");\n const open = Boolean(anchorElement);\n const { t, i18n } = useTranslation();\n const { mode, setMode } = useColorScheme();\n const { data: session } = authClient.useSession();\n const { alert } = useDialogs();\n\n const supportedLanguages = (Array.isArray(i18n.options.supportedLngs) ? i18n.options.supportedLngs : []).filter(lng => lng !== \"cimode\");\n const languageDisplayNames = new Intl.DisplayNames([i18n.language], { type: \"language\" });\n\n const colorModes: Array<{ mode: \"light\" | \"dark\" | \"system\"; icon: typeof LightMode; label: string }> = [\n { mode: \"light\", icon: LightMode, label: t(\"Layout.Light\") },\n { mode: \"dark\", icon: DarkMode, label: t(\"Layout.Dark\") },\n { mode: \"system\", icon: SettingsBrightness, label: t(\"Layout.System\") },\n ];\n\n const user = {\n name: \"Dalibor Homola\",\n employeeId: \"C2503017\",\n department: \"IT\",\n } as User;\n\n const usernameInitials = () => {\n if (!user.name) return \"\";\n const splittedName: Array<string> = user.name.split(\" \");\n return `${splittedName[0][0]}${splittedName.length > 1 ? splittedName[1][0] : \"\"}`;\n };\n\n const openMenu = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => setAnchorElement(event.currentTarget);\n const closeMenu = () => { setAnchorElement(undefined); setTimeout(() => setTab(\"settings\"), 300); };\n\n const changeTab = (newTab: TabType) => () => setTab(newTab);\n\n const settings = (\n <List component=\"nav\" subheader={<ListSubheader sx={{ backgroundColor: \"transparent\" }}>{t(\"Layout.Settings\")}</ListSubheader>}>\n <ListItemButton onClick={changeTab(\"theme\")} sx={{ py: 0.3 }}>\n <ListItemIcon>\n <Brightness4 />\n </ListItemIcon>\n <ListItemText primary={t(\"Layout.Appearance\")} secondary={colorModes.find((m) => m.mode === mode)?.label} />\n <ChevronRight />\n </ListItemButton>\n\n <ListItemButton onClick={changeTab(\"language\")} sx={{ py: 0.3 }}>\n <ListItemIcon>\n <Translate />\n </ListItemIcon>\n <ListItemText primary={t(\"Layout.Language\")} secondary={capitalize(languageDisplayNames.of(i18n.language))} />\n <ChevronRight />\n </ListItemButton>\n </List>\n );\n\n const theme = (\n <List subheader={\n <ListSubheader onClick={changeTab(\"settings\")} sx={{ backgroundColor: \"transparent\", display: \"flex\", alignItems: \"center\", px: 1, cursor: \"pointer\" }}>\n <IconButton size=\"small\" sx={{ mr: 0.5 }}>\n <ArrowBack fontSize=\"small\" />\n </IconButton> {t(\"Layout.Appearance\")}\n </ListSubheader>\n }>\n {colorModes.map(({ mode: modeValue, icon: Icon, label }) => (\n <ListItemButton\n key={modeValue}\n onClick={() => {\n setMode(modeValue);\n closeMenu();\n }}\n selected={mode === modeValue}\n >\n <ListItemIcon>\n <Icon />\n </ListItemIcon>\n <ListItemText primary={label} />\n </ListItemButton>\n ))}\n </List>\n );\n\n const language = (\n <List subheader={\n <ListSubheader onClick={changeTab(\"settings\")} sx={{ backgroundColor: \"transparent\", display: \"flex\", alignItems: \"center\", px: 1, cursor: \"pointer\" }}>\n <IconButton size=\"small\" sx={{ mr: 0.5 }}>\n <ArrowBack fontSize=\"small\" />\n </IconButton> {t(\"Layout.Language\")}\n </ListSubheader>\n }>\n {supportedLanguages.map((languageCode) =>\n <ListItemButton\n key={languageCode}\n onClick={() => i18n.changeLanguage(languageCode).finally(() => closeMenu())}\n selected={i18n.resolvedLanguage === languageCode}\n >\n <ListItemIcon>\n {i18n.resolvedLanguage === languageCode && <Done />}\n </ListItemIcon>\n <ListItemText primary={capitalize(languageDisplayNames.of(languageCode))} />\n </ListItemButton>\n )}\n </List>\n );\n\n return (\n <Fragment>\n <IconButton size=\"small\" edge=\"end\" onClick={openMenu}>\n {user.name ?\n <Avatar sx={{ width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 }, bgcolor: \"primary.main\" }}>\n <Typography variant=\"subtitle2\" sx={{ fontWeight: \"bold\", lineHeight: 0 }}>\n {usernameInitials()}\n </Typography>\n </Avatar>\n :\n <AccountCircle fontSize=\"large\" />\n }\n </IconButton>\n\n <Menu anchorEl={anchorElement} open={open} onClose={closeMenu}>\n <Box sx={{ width: 240 }}>\n <List>\n {session ?\n <Fragment>\n <ListItem>\n <ListItemText primary={user.name} secondary={\n <span>\n <span>{user.employeeId}</span>\n <br />\n <span>{user.department}</span>\n </span>\n } />\n </ListItem>\n\n <ListItemButton\n onClick={() =>\n authClient.signOut({}, {\n onSuccess: () => closeMenu(),\n onError: ({ error }) => alert(error.message)\n })\n }\n >\n <ListItemIcon><Logout color=\"error\" /></ListItemIcon>\n <ListItemText primary={t(\"Layout.Logout\")} />\n </ListItemButton>\n </Fragment>\n :\n <ListItemButton\n onClick={() =>\n authClient.signIn.social({ provider: \"microsoft\" }, {\n onSuccess: () => closeMenu(),\n onError: ({ error }) => alert(error.message)\n })\n }\n >\n <ListItemIcon><Login color=\"success\" /></ListItemIcon>\n <ListItemText primary={t(\"Layout.LogIn\")} />\n </ListItemButton>\n }\n </List>\n\n {tab === \"settings\" && settings}\n {tab === \"theme\" && theme}\n {tab === \"language\" && language}\n </Box>\n </Menu>\n </Fragment>\n );\n};\n","import Menu from \"@mui/icons-material/Menu\";\nimport MenuOpen from \"@mui/icons-material/MenuOpen\";\nimport { AppBar, Box, CssBaseline, IconButton, InitColorSchemeScript, LinearProgress, Toolbar } from \"@mui/material\";\nimport { styled } from \"@mui/material/styles\";\nimport { useIsFetching, useIsMutating } from \"@tanstack/react-query\";\nimport { Fragment, useState } from \"react\";\nimport { createIsomorphicFn } from \"@tanstack/react-start\";\nimport { getCookie } from \"@tanstack/react-start/server\";\nimport { AppTitle } from \"./AppTitle\";\nimport { NavigationRail } from \"./navigation/NavigationRail\";\nimport { ToolbarAccount } from \"./ToolbarAccount\";\nimport type { FC, ReactNode } from \"react\";\nimport type { Navigation } from \"~/models/Navigation\";\n\nconst YEAR_IN_SECONDS = 60 * 60 * 24 * 365;\n\nconst getNavigationOpenStatus = createIsomorphicFn()\n .server(() => {\n const cookie = getCookie(\"navigationOpen\");\n return cookie === \"true\";\n })\n .client(() => {\n const cookie = document.cookie\n .split(\"; \")\n .find(row => row.startsWith(\"navigationOpen=\"));\n return cookie ? cookie.split(\"=\")[1] === \"true\" : false;\n });\n\nconst DrawerHeader = styled(\"div\")(({ theme }) => ({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n padding: theme.spacing(0, 1),\n ...theme.mixins.toolbar,\n}));\n\ninterface LayoutProps {\n navigation: Navigation | undefined;\n children: ReactNode;\n}\n\nexport const Layout: FC<LayoutProps> = (props) => {\n const [navigationOpen, setNavigationOpen] = useState(getNavigationOpenStatus);\n const isFetching = !!useIsFetching();\n const isMutating = !!useIsMutating();\n\n return (\n <Fragment>\n <InitColorSchemeScript />\n <CssBaseline />\n\n <Box sx={{ display: \"flex\", height: \"100dvh\", maxHeight: \"100dvh\", overflow: \"hidden\", width: \"100%\" }}>\n <AppBar\n color=\"transparent\"\n position=\"fixed\"\n sx={theme => ({\n borderBottom: \"1px solid\",\n borderColor: theme.vars?.palette.divider,\n boxShadow: \"none\",\n })}>\n <Toolbar>\n {props.navigation &&\n <IconButton\n onClick={() => {\n setNavigationOpen(previous => {\n const newValue = !previous;\n document.cookie = `navigationOpen=${newValue}; max-age=${YEAR_IN_SECONDS}; path=/`;\n return newValue;\n });\n }}\n sx={{ marginRight: 2 }}\n >\n {navigationOpen ? <MenuOpen /> : <Menu />}\n </IconButton>\n }\n\n <AppTitle />\n\n <ToolbarAccount />\n </Toolbar>\n </AppBar>\n\n {props.navigation &&\n <NavigationRail\n navigation={props.navigation}\n expanded={navigationOpen}\n setExpanded={newValue => {\n setNavigationOpen(newValue);\n document.cookie = `navigationOpen=${newValue}; max-age=${YEAR_IN_SECONDS}; path=/`;\n }}\n />\n }\n\n <Box component=\"main\" sx={{ flexGrow: 1, display: \"flex\", flexDirection: \"column\", minWidth: 0, height: \"100%\", overflow: \"hidden\" }}>\n <DrawerHeader />\n <Box sx={{ flex: 1, overflow: \"auto\", position: \"relative\" }}>\n {props.children}\n </Box>\n </Box>\n </Box>\n\n {(isFetching || isMutating) && <LinearProgress sx={{ position: \"fixed\", top: { xs: 56, sm: 64 }, left: 0, right: 0 }} />}\n </Fragment>\n );\n};\n","import { ThemeProvider } from \"@mui/material\";\nimport { LocalizationProvider } from \"@mui/x-date-pickers\";\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\nimport { createServerFn } from \"@tanstack/react-start\";\nimport { getCookie } from \"@tanstack/react-start/server\";\nimport dayjs from \"dayjs\";\nimport i18n from \"i18next\";\nimport LanguageDetector from \"i18next-browser-languagedetector\";\nimport { useEffect, useEffectEvent } from \"react\";\nimport { initReactI18next } from \"react-i18next\";\nimport { resources } from \"virtual:wcz-layout\";\nimport z from \"zod\";\nimport { DialogsProvider } from \"./DialogsProvider\";\nimport type { CssVarsThemeOptions } from \"@mui/material\";\nimport type { Navigation } from \"~/models/Navigation\";\nimport type { FC, ReactNode } from \"react\";\nimport { useGetTheme } from \"~/hooks/ThemeHook\";\nimport { Layout } from \"~/components/core/Layout\";\n\nconst YEAR_IN_MINUTES = 60 * 24 * 365;\n\ni18n\n .use(LanguageDetector)\n .use(initReactI18next)\n .init({\n resources,\n fallbackLng: \"en\",\n supportedLngs: Object.keys(resources),\n detection: {\n caches: [\"cookie\"],\n cookieMinutes: YEAR_IN_MINUTES,\n },\n interpolation: { escapeValue: false },\n });\n\ninterface ProvidersProps {\n navigation?: Navigation;\n theme?: Pick<CssVarsThemeOptions, \"colorSchemes\" | \"components\">;\n children: ReactNode;\n}\n\nexport const LayoutProvider: FC<ProvidersProps> = ({ navigation, theme, children }) => {\n const createdTheme = useGetTheme(theme);\n\n const languageChangedHandler = useEffectEvent(() => {\n z.config(z.core.locales[i18n.language as keyof typeof z.core.locales]());\n dayjs.locale(i18n.language);\n });\n\n useEffect(() => {\n languageChangedHandler();\n\n i18n.on(\"languageChanged\", languageChangedHandler);\n return () => { i18n.off(\"languageChanged\", languageChangedHandler); };\n }, []);\n\n return (\n <ThemeProvider theme={createdTheme}>\n <LocalizationProvider key={i18n.language} dateAdapter={AdapterDayjs} adapterLocale={i18n.language}>\n <DialogsProvider>\n <Layout navigation={navigation}>\n {children}\n </Layout>\n </DialogsProvider>\n </LocalizationProvider>\n </ThemeProvider>\n );\n};\n\nexport const setSSRLanguage = createServerFn().handler(async () => {\n const language = getCookie(i18n.services.languageDetector.options.lookupCookie) || \"en\";\n dayjs.locale(language);\n z.config(z.core.locales[language as keyof typeof z.core.locales]());\n await i18n.changeLanguage(language);\n});\n"],"names":["closeDialogUi","closeDialog","jsxs","jsx","Typography","Fragment","i18n","List","ListSubheader","ListItemButton","ListItemIcon","ListItemText","Avatar","Box","ListItem","Menu","z"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/providers/DialogsProvider.tsx","../src/lib/auth/index.ts","../src/queries/UserHooks.ts","../src/providers/UserProvider.tsx","../src/components/core/AppTitle.tsx","../src/components/core/navigation/NavigationListItem.tsx","../src/components/core/navigation/NavigationList.tsx","../src/components/core/navigation/NavigationRail.tsx","../src/components/core/ToolbarAccount.tsx","../src/components/core/Layout.tsx","../src/providers/LayoutProvider.tsx"],"sourcesContent":["import useEventCallback from \"@mui/utils/useEventCallback\";\nimport { useId, useRef, useState } from \"react\";\nimport { DialogsContext } from \"../contexts/DialogsContext\";\nimport type { DialogComponent, OpenDialog, OpenDialogOptions } from \"../hooks/DialogsHooks\";\n\ninterface DialogStackEntry<TPayload, TResult> {\n key: string;\n open: boolean;\n promise: Promise<TResult>;\n Component: DialogComponent<TPayload, TResult>;\n payload: TPayload;\n onClose: (result: TResult) => Promise<void>;\n resolve: (result: TResult) => void;\n}\n\nexport interface DialogProviderProps {\n children?: React.ReactNode;\n}\n\nfunction DialogsProvider({ children }: Readonly<DialogProviderProps>) {\n const [stack, setStack] = useState<Array<DialogStackEntry<any, any>>>([]);\n const keyPrefix = useId();\n const nextId = useRef(0);\n const dialogMetadata = useRef(new WeakMap<Promise<any>, DialogStackEntry<any, any>>());\n\n const requestDialog = useEventCallback<OpenDialog>(function open<TPayload, TResult>(\n Component: DialogComponent<TPayload, TResult>,\n payload: TPayload,\n options: OpenDialogOptions<TResult> = {},\n ) {\n const { onClose = async () => { } } = options;\n\n let resolve: (result: TResult) => void;\n const promise = new Promise<TResult>((resolveImpl) => {\n resolve = resolveImpl;\n });\n\n const key = `${keyPrefix}-${nextId.current}`;\n nextId.current += 1;\n\n const newEntry: DialogStackEntry<TPayload, TResult> = {\n key,\n open: true,\n promise,\n Component,\n payload,\n onClose,\n resolve: resolve!,\n };\n\n dialogMetadata.current.set(promise, newEntry);\n\n setStack((previousStack) => [...previousStack, newEntry]);\n\n return promise;\n });\n\n const removeDialogFromStack = (dialog: Promise<any>) => {\n setStack((previousStack) => previousStack.filter((entry) => entry.promise !== dialog));\n dialogMetadata.current.delete(dialog);\n };\n\n const closeDialogUi = useEventCallback(function closeDialogUi<TResult>(dialog: Promise<TResult>) {\n setStack((previousStack) =>\n previousStack.map((entry) => (entry.promise === dialog ? { ...entry, open: false } : entry)),\n );\n\n setTimeout(() => removeDialogFromStack(dialog), 1000);\n });\n\n const closeDialog = useEventCallback(async function closeDialog<TResult>(\n dialog: Promise<TResult>,\n result: TResult,\n ) {\n const entryToClose = dialogMetadata.current.get(dialog);\n if (!entryToClose) {\n throw new Error(\"Dialog not found in stack\");\n }\n\n try {\n await entryToClose.onClose(result);\n } finally {\n entryToClose.resolve(result);\n closeDialogUi(dialog);\n }\n\n return dialog;\n });\n\n return (\n <DialogsContext.Provider value={{ open: requestDialog, close: closeDialog }}>\n {children}\n {stack.map(({ key, open, Component, payload, promise }) => (\n <Component\n key={key}\n payload={payload}\n open={open}\n onClose={async (result) => {\n await closeDialog(promise, result);\n }}\n />\n ))}\n </DialogsContext.Provider>\n );\n}\n\nexport { DialogsProvider };\n\n","import { EventType, NavigationClient, PublicClientApplication } from \"@azure/msal-browser\";\r\nimport type { AuthenticationResult, Configuration, EventMessage, NavigationOptions } from \"@azure/msal-browser\";\r\nimport type { UseNavigateResult } from \"@tanstack/react-router\";\r\nimport { clientEnv } from \"~/env\";\r\n\r\nconst msalConfig: Configuration = {\r\n auth: {\r\n clientId: clientEnv.VITE_MICROSOFT_CLIENT_ID,\r\n authority: `https://login.microsoftonline.com/${clientEnv.VITE_MICROSOFT_TENANT_ID}`,\r\n },\r\n};\r\n\r\nexport const msalInstance = new PublicClientApplication(msalConfig);\r\n\r\nmsalInstance.initialize().then(() => {\r\n if (!msalInstance.getActiveAccount() && msalInstance.getAllAccounts().length > 0) {\r\n msalInstance.setActiveAccount(msalInstance.getAllAccounts()[0]);\r\n }\r\n\r\n msalInstance.enableAccountStorageEvents();\r\n\r\n msalInstance.addEventCallback((event: EventMessage) => {\r\n if (event.eventType === EventType.LOGIN_SUCCESS && event.payload) {\r\n const payload = event.payload as AuthenticationResult;\r\n const account = payload.account;\r\n msalInstance.setActiveAccount(account);\r\n }\r\n });\r\n});\r\n\r\nexport class CustomNavigationClient extends NavigationClient {\r\n private readonly navigate: UseNavigateResult<string>;\r\n\r\n constructor(navigate: UseNavigateResult<string>) {\r\n super();\r\n this.navigate = navigate;\r\n }\r\n\r\n async navigateInternal(url: string, options: NavigationOptions) {\r\n const relativePath = url.replace(location.origin, \"\");\r\n if (options.noHistory) {\r\n this.navigate({ to: relativePath, replace: true });\r\n } else {\r\n this.navigate({ to: relativePath });\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\nexport const acquireAccessToken = async () => {\r\n const account = msalInstance.getActiveAccount();\r\n if (!account) {\r\n throw new Error(\"No active account! Verify a user has been signed in and setActiveAccount has been called.\");\r\n }\r\n\r\n const response = await msalInstance.acquireTokenSilent({\r\n scopes: [\"User.Read\"],\r\n account: account\r\n });\r\n\r\n return response.accessToken;\r\n};\r\n","import { useQuery } from \"@tanstack/react-query\";\r\nimport axios from \"axios\";\r\nimport type { User } from \"~/models/User\";\r\nimport { acquireAccessToken } from \"~/lib/auth\";\r\n\r\nconst QUERY_KEY = \"user\";\r\nconst DAY = 1000 * 60 * 60 * 24;\r\n\r\nconst api = axios.create({\r\n baseURL: \"https://graph.microsoft.com/v1.0/\",\r\n});\r\n\r\napi.interceptors.request.use(async (config) => {\r\n config.headers.Authorization = `Bearer ${await acquireAccessToken()}`;\r\n return config;\r\n});\r\n\r\ninterface GraphUserResponse {\r\n data: {\r\n id: string;\r\n displayName: string;\r\n jobTitle: string;\r\n mail: string;\r\n mobilePhone: string;\r\n };\r\n}\r\n\r\nexport const useGetUser = (enabled: boolean = true) => {\r\n return useQuery<GraphUserResponse, Error, User>({\r\n queryKey: [QUERY_KEY, \"me\"],\r\n queryFn: ({ signal }) => api.request({\r\n method: \"GET\",\r\n url: \"me?$select=id,displayName,jobTitle,mail,mobilePhone\",\r\n signal,\r\n }),\r\n select: response => ({\r\n id: response.data.id,\r\n name: response.data.displayName.split(\"/\")[0],\r\n jobTitle: response.data.jobTitle,\r\n email: response.data.mail,\r\n mobilePhone: response.data.mobilePhone,\r\n photo: null,\r\n groups: [],\r\n }),\r\n staleTime: DAY,\r\n gcTime: DAY,\r\n refetchOnWindowFocus: false,\r\n enabled,\r\n });\r\n};\r\n\r\nexport const useGetUserPhoto = (enabled: boolean = true) => {\r\n return useQuery<{ data: Blob }, Error, string>({\r\n queryKey: [QUERY_KEY, \"me\", \"photo\"],\r\n queryFn: ({ signal }) => api.request({\r\n method: \"GET\",\r\n url: \"me/photo/$value\",\r\n signal,\r\n responseType: \"blob\",\r\n }),\r\n select: response => URL.createObjectURL(response.data),\r\n staleTime: DAY,\r\n gcTime: DAY,\r\n refetchOnWindowFocus: false,\r\n enabled,\r\n });\r\n};\r\n\r\ninterface GraphGroupsResponse {\r\n data: {\r\n value: Array<{ displayName: string }>;\r\n };\r\n}\r\n\r\nexport const useGetUserGroups = (enabled: boolean = true) => {\r\n return useQuery<GraphGroupsResponse, Error, Array<string>>({\r\n queryKey: [QUERY_KEY, \"me\", \"memberOf\"],\r\n queryFn: ({ signal }) => api.request({\r\n method: \"GET\",\r\n url: \"me/memberOf?$select=displayName\",\r\n signal,\r\n }),\r\n select: response => response.data.value.map((group) => group.displayName),\r\n staleTime: DAY,\r\n gcTime: DAY,\r\n refetchOnWindowFocus: false,\r\n enabled,\r\n });\r\n};\r\n","import { InteractionType } from \"@azure/msal-browser\";\r\nimport { useMsalAuthentication } from \"@azure/msal-react\";\r\nimport { useEffect, useState } from \"react\";\r\nimport type { User } from \"~/models/User\";\r\nimport { UserContext } from \"~/contexts/UserContext\";\r\nimport { useGetUser, useGetUserGroups, useGetUserPhoto } from \"~/queries/UserHooks\";\r\n\r\nexport interface UserProviderProps {\r\n children?: React.ReactNode;\r\n}\r\n\r\nfunction UserProvider({ children }: Readonly<UserProviderProps>) {\r\n const { result } = useMsalAuthentication(InteractionType.Redirect);\r\n const [user, setUser] = useState<User>({} as User);\r\n\r\n const { data } = useGetUser(!!result);\r\n const { data: photo } = useGetUserPhoto(!!result);\r\n const { data: groups } = useGetUserGroups(!!result);\r\n\r\n useEffect(() => {\r\n setUser(prevUser => ({\r\n ...data,\r\n ...(photo && { photo }),\r\n ...(groups && { groups }),\r\n ...prevUser,\r\n }));\r\n }, [data, photo, groups]);\r\n\r\n return (\r\n <UserContext.Provider value={{ user, setUser }}>\r\n {children}\r\n </UserContext.Provider>\r\n );\r\n}\r\n\r\nexport { UserProvider };\r\n\r\n","import { Chip, Stack, Typography } from \"@mui/material\";\nimport type { FC } from \"react\";\nimport { clientEnv } from \"~/env\";\n\nexport const AppTitle: FC = () => {\n return (\n <Stack direction=\"row\" alignItems=\"center\" spacing={2} flexGrow={1}>\n <img src=\"/favicon-32x32.png\" alt=\"app-logo\" loading=\"lazy\" />\n <Typography variant=\"h6\">{clientEnv.VITE_APP_TITLE}</Typography>\n {import.meta.env.DEV && <Chip size=\"small\" label=\"TEST\" color=\"info\" />}\n </Stack>\n );\n};\n","import ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\nimport { Collapse } from \"@mui/material\";\nimport Avatar from \"@mui/material/Avatar\";\nimport Box from \"@mui/material/Box\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemButton from \"@mui/material/ListItemButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport Paper from \"@mui/material/Paper\";\nimport Popper from \"@mui/material/Popper\";\nimport { styled } from \"@mui/material/styles\";\nimport Typography from \"@mui/material/Typography\";\nimport { Fragment, useState } from \"react\";\nimport { MINI_WIDTH } from \"./NavigationRail\";\nimport type { NavigationItem, NavigationPageItem } from \"~/models/Navigation\";\nimport type { FC, ReactNode } from \"react\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport { RouterListItemButton } from \"~/components/router/RouterListItemButton\";\n\nconst ICON_SIZE = 34;\n\nconst StyledNavButton = styled(ListItemButton)(({ theme }) => ({\n borderRadius: 8,\n \"&.Mui-selected\": {\n \"& .MuiListItemIcon-root, & .MuiTypography-root, & .MuiSvgIcon-root\": {\n color: (theme.vars ?? theme).palette.primary.dark,\n },\n \"& .MuiAvatar-root\": {\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\n },\n \"& .MuiTouchRipple-child\": {\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\n },\n },\n \"& .MuiSvgIcon-root\": {\n color: (theme.vars ?? theme).palette.action.active,\n },\n \"& .MuiAvatar-root\": {\n backgroundColor: (theme.vars ?? theme).palette.action.active,\n },\n}));\n\nconst StyledRouterButton = styled(RouterListItemButton)(({ theme }) => ({\n borderRadius: 8,\n \"&.Mui-selected\": {\n \"& .MuiListItemIcon-root, & .MuiTypography-root, & .MuiSvgIcon-root\": {\n color: (theme.vars ?? theme).palette.primary.dark,\n },\n \"& .MuiAvatar-root\": {\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\n },\n \"& .MuiTouchRipple-child\": {\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\n },\n },\n \"& .MuiSvgIcon-root\": {\n color: (theme.vars ?? theme).palette.action.active,\n },\n \"& .MuiAvatar-root\": {\n backgroundColor: (theme.vars ?? theme).palette.action.active,\n },\n}));\n\nconst IconOrAvatar: FC<{ item: NavigationPageItem; collapsed?: boolean }> = ({ item, collapsed }) => {\n if (item.icon || collapsed) {\n return (\n <Box sx={collapsed ? { position: \"absolute\", left: \"50%\", top: \"calc(50% - 6px)\", transform: \"translate(-50%, -50%)\" } : {}}>\n <ListItemIcon sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", minWidth: ICON_SIZE }}>\n {item.icon ?? null}\n {!item.icon && collapsed ? (\n <Avatar sx={{ width: ICON_SIZE - 7, height: ICON_SIZE - 7, fontSize: 12 }}>{item.title}</Avatar>\n ) : null}\n </ListItemIcon>\n {collapsed ? (\n <Typography\n variant=\"caption\"\n sx={{\n position: \"absolute\",\n bottom: -18,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n fontSize: 10,\n fontWeight: 500,\n textAlign: \"center\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n maxWidth: MINI_WIDTH - 28,\n }}\n >\n {item.title}\n </Typography>\n ) : null}\n </Box>\n );\n }\n return null;\n};\n\ninterface MiniPopoverProps {\n open: boolean;\n anchorEl: HTMLElement | null;\n children?: ReactNode;\n}\n\nconst MiniPopover: FC<MiniPopoverProps> = ({ open, anchorEl, children }) => (\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement=\"right-start\"\n modifiers={[\n { name: \"offset\", options: { offset: [6, 0] } },\n { name: \"preventOverflow\", options: { padding: 8 } },\n { name: \"flip\", options: { fallbackPlacements: [\"right-end\", \"left-start\"] } },\n ]}\n >\n <Paper\n sx={{\n pt: 0.5,\n pb: 0.5,\n maxHeight: \"min(calc(100vh - 100px), 560px)\",\n overflowY: \"auto\",\n overscrollBehavior: \"contain\",\n }}\n >\n {children}\n </Paper>\n </Popper>\n);\n\ninterface NavigationListItemProps {\n item: NavigationPageItem;\n isOpen?: boolean;\n selected?: boolean;\n disabled?: boolean;\n collapsed?: boolean;\n isSidebarFullyExpanded?: boolean;\n isSidebarFullyCollapsed?: boolean;\n onClick?: (item: NavigationPageItem) => void;\n renderNested?: (sub: Array<NavigationItem>) => ReactNode;\n onClose?: () => void;\n}\n\nexport const NavigationListItem: FC<NavigationListItemProps> = ({ item, isOpen, selected, disabled, collapsed, isSidebarFullyExpanded = true, isSidebarFullyCollapsed, onClick, renderNested, onClose }) => {\n const [hoveredPopoverItem, setHoveredPopoverItem] = useState<string | null>(null);\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n\n const chevronSx: SxProps<Theme> = () => {\n if (collapsed && isSidebarFullyCollapsed && item.children) {\n return {\n fontSize: 18,\n position: \"absolute\",\n top: \"41.5%\",\n right: \"2px\",\n transform: \"translateY(-50%) rotate(-90deg)\",\n };\n }\n if (!collapsed && isSidebarFullyExpanded && item.children) {\n return {\n ml: 0.5,\n transform: `rotate(${isOpen ? 0 : -90}deg)`,\n };\n }\n return { display: \"none\" };\n };\n\n const shouldJustExpand = item.children && !collapsed;\n\n const buttonProps = {\n selected,\n disabled,\n sx: { px: 1.4, height: collapsed ? 60 : 48 }\n };\n\n const buttonContent = (\n <>\n <IconOrAvatar item={item} collapsed={collapsed} />\n {!collapsed && (\n <ListItemText\n primary={item.title}\n slotProps={{ primary: { noWrap: true, title: item.title } }}\n sx={{ ml: 1.2, flex: 1, minWidth: 0, \"& .MuiTypography-root\": { whiteSpace: \"nowrap\", overflow: \"hidden\", textOverflow: \"ellipsis\" } }}\n />\n )}\n {item.children ? <ExpandMoreIcon sx={chevronSx} /> : null}\n </>\n );\n\n const listItem = (\n <ListItem\n {...(item.children && collapsed\n ? {\n onMouseEnter: (event: React.MouseEvent<HTMLElement>) => {\n setAnchorElement(event.currentTarget);\n setHoveredPopoverItem(item.title);\n },\n onMouseLeave: () => {\n setHoveredPopoverItem(null);\n },\n }\n : {})}\n sx={{ py: 0, px: 1, overflowX: \"hidden\" }}\n >\n {shouldJustExpand ? (\n <StyledNavButton {...buttonProps} onClick={() => onClick?.(item)}>\n {buttonContent}\n </StyledNavButton>\n ) : (\n <StyledRouterButton\n {...buttonProps}\n to={item.to}\n href={item.href}\n params={item.params as any}\n search={item.search as any}\n onClick={onClose}\n >\n {buttonContent}\n </StyledRouterButton>\n )}\n\n {item.children && collapsed ? (\n <MiniPopover open={item.title === hoveredPopoverItem} anchorEl={anchorElement}>\n {renderNested?.(item.children)}\n </MiniPopover>\n ) : null}\n </ListItem>\n );\n\n return (\n <Fragment key={item.to}>\n {listItem}\n {item.children && !collapsed ? (\n <Collapse in={isOpen} timeout=\"auto\" unmountOnExit>\n {renderNested?.(item.children)}\n </Collapse>\n ) : null}\n </Fragment>\n );\n};\n","import Divider from \"@mui/material/Divider\";\nimport List from \"@mui/material/List\";\nimport ListSubheader from \"@mui/material/ListSubheader\";\nimport { Fragment, useEffect, useState } from \"react\";\nimport { NavigationListItem } from \"./NavigationListItem\";\nimport { EXPANDED_WIDTH, MINI_WIDTH } from \"./NavigationRail\";\nimport type { FC, ReactNode } from \"react\";\nimport type { Navigation, NavigationDivider, NavigationHeader, NavigationItem, NavigationPageItem } from \"~/models/Navigation\";\n\nexport const isPageItem = (item: NavigationItem): item is NavigationPageItem => !(\"kind\" in item);\nexport const isDivider = (item: NavigationItem): item is NavigationDivider => \"kind\" in item && item.kind === \"divider\";\nexport const isHeader = (item: NavigationItem): item is NavigationHeader => \"kind\" in item && item.kind === \"header\";\n\ninterface NavigationListProps {\n subNavigation: Navigation;\n depth?: number;\n collapsed?: boolean;\n isPopover?: boolean;\n isSidebarFullyExpanded?: boolean;\n isSidebarFullyCollapsed?: boolean;\n expandedWidth: number | string;\n renderItem?: (item: NavigationPageItem, context: { collapsed: boolean }) => ReactNode;\n activePath?: string | null;\n onNavigate: (item: NavigationPageItem) => void;\n onClose?: () => void;\n}\n\nexport const NavigationList: FC<NavigationListProps> = ({ subNavigation, depth = 0, collapsed, isPopover, isSidebarFullyExpanded = true, isSidebarFullyCollapsed, expandedWidth, renderItem, activePath, onNavigate, onClose }) => {\n const [openKeys, setOpenKeys] = useState<Array<string>>([]);\n\n useEffect(() => {\n if (collapsed) setOpenKeys([]);\n }, [collapsed]);\n\n const toggleKey = (key: string) =>\n setOpenKeys((previous) => (previous.includes(key) ? previous.filter((k) => k !== key) : [...previous, key]));\n\n const renderNested = (children: Array<NavigationItem>) => <NavigationList\n subNavigation={children}\n depth={depth + 1}\n isPopover={collapsed}\n expandedWidth={expandedWidth}\n activePath={activePath}\n onNavigate={onNavigate}\n onClose={onClose}\n />;\n\n const filteredNavigation = subNavigation.filter(nav => !nav.hidden);\n\n return (\n <List\n sx={{\n padding: 0,\n mt: isPopover && depth === 1 ? 0.5 : 0,\n mb: depth === 0 && !isPopover ? 4 : 0.5,\n pl: (isPopover ? 1 : 2) * (isPopover ? depth - 1 : depth),\n minWidth: isPopover && depth === 1 ? EXPANDED_WIDTH : \"auto\",\n width: collapsed ? MINI_WIDTH : \"auto\",\n }}\n >\n {filteredNavigation.map((navItem, index) => {\n if (isHeader(navItem)) {\n return (\n <ListSubheader\n key={`subheader-${depth}-${index}`}\n sx={{\n fontSize: 12,\n fontWeight: \"700\",\n height: collapsed ? 0 : 40,\n px: 2,\n minWidth: expandedWidth,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n zIndex: 2,\n bgcolor: \"transparent\",\n position: \"static\"\n }}\n >\n {navItem.title}\n </ListSubheader>\n );\n }\n\n if (isDivider(navItem)) {\n const nextItem = filteredNavigation[index + 1];\n return (\n <li key={`divider-${depth}-${index}`}>\n <Divider sx={{ mx: 1, mt: 1, mb: isHeader(nextItem) && !collapsed ? 0 : 1 }} />\n </li>\n );\n }\n\n if (!isPageItem(navItem)) return null;\n\n const key = `item-${depth}-${index}`;\n const uniqueItemKey = `${depth}-${index}-${navItem.title}`;\n\n if (renderItem) return <Fragment key={key}>{renderItem(navItem, { collapsed: !!collapsed })}</Fragment>;\n\n return <NavigationListItem\n key={key}\n item={navItem}\n isOpen={openKeys.includes(uniqueItemKey)}\n selected={activePath === navItem.to}\n collapsed={collapsed}\n isSidebarFullyExpanded={isSidebarFullyExpanded}\n isSidebarFullyCollapsed={isSidebarFullyCollapsed}\n onClick={navItem.children && !collapsed ? () => toggleKey(uniqueItemKey) : undefined}\n renderNested={renderNested}\n onClose={onClose}\n />;\n })}\n </List>\n );\n};","import { useMediaQuery } from \"@mui/material\";\nimport Box from \"@mui/material/Box\";\nimport Drawer from \"@mui/material/Drawer\";\nimport { useTheme } from \"@mui/material/styles\";\nimport { useNavigate, useRouterState } from \"@tanstack/react-router\";\nimport { NavigationList, isHeader } from \"./NavigationList\";\nimport type { FC } from \"react\";\nimport type { Navigation } from \"~/models/Navigation\";\n\nexport const MINI_WIDTH = 84;\nexport const EXPANDED_WIDTH = 320;\nexport const TOOLBAR_HEIGHT = 64;\n\ninterface NavigationRailProps {\n navigation: Navigation;\n expanded: boolean;\n setExpanded: (open: boolean) => void;\n}\n\nexport const NavigationRail: FC<NavigationRailProps> = ({ navigation, expanded, setExpanded }) => {\n const navigate = useNavigate();\n const routerState = useRouterState();\n const theme = useTheme();\n const showPermanent = useMediaQuery(theme.breakpoints.up(\"sm\"));\n\n const drawerContent = (collapsed: boolean) => (\n <Box\n component=\"nav\"\n sx={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"space-between\",\n overflow: \"auto\",\n scrollbarGutter: collapsed ? \"stable\" : \"auto\",\n overflowX: \"hidden\",\n pt: navigation[0] && isHeader(navigation[0]) && !collapsed ? 0 : 2,\n }}\n >\n <NavigationList\n subNavigation={navigation}\n collapsed={collapsed}\n isSidebarFullyExpanded={expanded}\n isSidebarFullyCollapsed={!expanded}\n expandedWidth={EXPANDED_WIDTH}\n activePath={routerState.location.pathname}\n onNavigate={navigate}\n onClose={!showPermanent ? () => setExpanded(false) : undefined}\n />\n </Box>\n );\n\n if (showPermanent)\n return (\n <Drawer\n variant=\"permanent\"\n sx={{\n width: expanded ? EXPANDED_WIDTH : MINI_WIDTH,\n [\"& .MuiDrawer-paper\"]: {\n position: \"absolute\",\n top: `${TOOLBAR_HEIGHT}px`,\n height: `calc(100% - ${TOOLBAR_HEIGHT}px)`,\n width: expanded ? EXPANDED_WIDTH : MINI_WIDTH,\n borderTop: \"1px solid\",\n borderColor: \"var(--mui-palette-divider)\",\n },\n }}\n >\n {drawerContent(!expanded)}\n </Drawer>\n );\n\n return (\n <Drawer open={expanded} onClose={() => setExpanded(false)}>\n {drawerContent(!expanded)}\n </Drawer>\n );\n};\n","import { useMsal } from \"@azure/msal-react\";\r\nimport AccountCircle from \"@mui/icons-material/AccountCircle\";\r\nimport ArrowBack from \"@mui/icons-material/ArrowBack\";\r\nimport Brightness4 from \"@mui/icons-material/Brightness4\";\r\nimport ChevronRight from \"@mui/icons-material/ChevronRight\";\r\nimport DarkMode from \"@mui/icons-material/DarkMode\";\r\nimport Done from \"@mui/icons-material/Done\";\r\nimport LightMode from \"@mui/icons-material/LightMode\";\r\nimport Logout from \"@mui/icons-material/Logout\";\r\nimport SettingsBrightness from \"@mui/icons-material/SettingsBrightness\";\r\nimport Translate from \"@mui/icons-material/Translate\";\r\nimport { Avatar, Box, IconButton, List, ListItem, ListItemButton, ListItemIcon, ListItemText, ListSubheader, Menu, useColorScheme } from \"@mui/material\";\r\nimport { Fragment, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport type { FC } from \"react\";\r\nimport { useUser } from \"~/hooks/UseHook\";\r\n\r\ntype TabType = \"settings\" | \"theme\" | \"language\";\r\n\r\nconst capitalize = (value: string | undefined) => value && value.charAt(0).toUpperCase() + value.slice(1);\r\n\r\nexport const ToolbarAccount: FC = () => {\r\n const [anchorElement, setAnchorElement] = useState<HTMLElement>();\r\n const [tab, setTab] = useState<TabType>(\"settings\");\r\n const open = Boolean(anchorElement);\r\n const { t, i18n } = useTranslation();\r\n const { mode, setMode } = useColorScheme();\r\n const { instance } = useMsal();\r\n const user = useUser();\r\n\r\n const supportedLanguages = (Array.isArray(i18n.options.supportedLngs) ? i18n.options.supportedLngs : []).filter(lng => lng !== \"cimode\");\r\n const languageDisplayNames = new Intl.DisplayNames([i18n.language], { type: \"language\" });\r\n\r\n const colorModes: Array<{ mode: \"light\" | \"dark\" | \"system\"; icon: typeof LightMode; label: string }> = [\r\n { mode: \"light\", icon: LightMode, label: t(\"Layout.Light\") },\r\n { mode: \"dark\", icon: DarkMode, label: t(\"Layout.Dark\") },\r\n { mode: \"system\", icon: SettingsBrightness, label: t(\"Layout.System\") },\r\n ];\r\n\r\n const openMenu = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => setAnchorElement(event.currentTarget);\r\n const closeMenu = () => { setAnchorElement(undefined); setTimeout(() => setTab(\"settings\"), 300); };\r\n\r\n const changeTab = (newTab: TabType) => () => setTab(newTab);\r\n\r\n const settings = (\r\n <List component=\"nav\" subheader={<ListSubheader sx={{ backgroundColor: \"transparent\" }}>{t(\"Layout.Settings\")}</ListSubheader>}>\r\n <ListItemButton onClick={changeTab(\"theme\")} sx={{ py: 0.3 }}>\r\n <ListItemIcon>\r\n <Brightness4 />\r\n </ListItemIcon>\r\n <ListItemText primary={t(\"Layout.Appearance\")} secondary={colorModes.find((m) => m.mode === mode)?.label} />\r\n <ChevronRight />\r\n </ListItemButton>\r\n\r\n <ListItemButton onClick={changeTab(\"language\")} sx={{ py: 0.3 }}>\r\n <ListItemIcon>\r\n <Translate />\r\n </ListItemIcon>\r\n <ListItemText primary={t(\"Layout.Language\")} secondary={capitalize(languageDisplayNames.of(i18n.language))} />\r\n <ChevronRight />\r\n </ListItemButton>\r\n </List>\r\n );\r\n\r\n const theme = (\r\n <List subheader={\r\n <ListSubheader onClick={changeTab(\"settings\")} sx={{ backgroundColor: \"transparent\", display: \"flex\", alignItems: \"center\", px: 1, cursor: \"pointer\" }}>\r\n <IconButton size=\"small\" sx={{ mr: 0.5 }}>\r\n <ArrowBack fontSize=\"small\" />\r\n </IconButton> {t(\"Layout.Appearance\")}\r\n </ListSubheader>\r\n }>\r\n {colorModes.map(({ mode: modeValue, icon: Icon, label }) => (\r\n <ListItemButton\r\n key={modeValue}\r\n onClick={() => {\r\n setMode(modeValue);\r\n closeMenu();\r\n }}\r\n selected={mode === modeValue}\r\n >\r\n <ListItemIcon>\r\n <Icon />\r\n </ListItemIcon>\r\n <ListItemText primary={label} />\r\n </ListItemButton>\r\n ))}\r\n </List>\r\n );\r\n\r\n const language = (\r\n <List subheader={\r\n <ListSubheader onClick={changeTab(\"settings\")} sx={{ backgroundColor: \"transparent\", display: \"flex\", alignItems: \"center\", px: 1, cursor: \"pointer\" }}>\r\n <IconButton size=\"small\" sx={{ mr: 0.5 }}>\r\n <ArrowBack fontSize=\"small\" />\r\n </IconButton> {t(\"Layout.Language\")}\r\n </ListSubheader>\r\n }>\r\n {supportedLanguages.map((languageCode) =>\r\n <ListItemButton\r\n key={languageCode}\r\n onClick={() => i18n.changeLanguage(languageCode).finally(() => closeMenu())}\r\n selected={i18n.resolvedLanguage === languageCode}\r\n >\r\n <ListItemIcon>\r\n {i18n.resolvedLanguage === languageCode && <Done />}\r\n </ListItemIcon>\r\n <ListItemText primary={capitalize(languageDisplayNames.of(languageCode))} />\r\n </ListItemButton>\r\n )}\r\n </List>\r\n );\r\n\r\n return (\r\n <Fragment>\r\n <IconButton size=\"small\" edge=\"end\" onClick={openMenu}>\r\n {user.photo ?\r\n <Avatar\r\n src={user.photo}\r\n sx={{ width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 } }}\r\n />\r\n :\r\n <AccountCircle sx={{ width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 } }} />\r\n }\r\n </IconButton>\r\n\r\n <Menu anchorEl={anchorElement} open={open} onClose={closeMenu}>\r\n <Box sx={{ width: 240 }}>\r\n <List disablePadding>\r\n <ListItem>\r\n <ListItemText primary={user.name} secondary={user.jobTitle} />\r\n </ListItem>\r\n\r\n <ListItemButton\r\n onClick={() =>\r\n instance.logoutRedirect({\r\n postLogoutRedirectUri: \"/\",\r\n })\r\n }\r\n >\r\n <ListItemIcon><Logout color=\"error\" /></ListItemIcon>\r\n <ListItemText primary={t(\"Layout.Logout\")} />\r\n </ListItemButton>\r\n </List>\r\n\r\n {tab === \"settings\" && settings}\r\n {tab === \"theme\" && theme}\r\n {tab === \"language\" && language}\r\n </Box>\r\n </Menu>\r\n </Fragment>\r\n );\r\n};\r\n","import { AuthenticatedTemplate } from \"@azure/msal-react\";\r\nimport Menu from \"@mui/icons-material/Menu\";\r\nimport MenuOpen from \"@mui/icons-material/MenuOpen\";\r\nimport { AppBar, Box, CssBaseline, IconButton, InitColorSchemeScript, LinearProgress, Toolbar } from \"@mui/material\";\r\nimport { styled } from \"@mui/material/styles\";\r\nimport { useIsFetching, useIsMutating } from \"@tanstack/react-query\";\r\nimport { createIsomorphicFn } from \"@tanstack/react-start\";\r\nimport { getCookie } from \"@tanstack/react-start/server\";\r\nimport { Fragment, useState } from \"react\";\r\nimport { AppTitle } from \"./AppTitle\";\r\nimport { NavigationRail } from \"./navigation/NavigationRail\";\r\nimport { ToolbarAccount } from \"./ToolbarAccount\";\r\nimport type { Navigation } from \"~/models/Navigation\";\r\nimport type { FC, ReactNode } from \"react\";\r\n\r\nconst YEAR_IN_SECONDS = 60 * 60 * 24 * 365;\r\n\r\nconst getNavigationOpenStatus = createIsomorphicFn()\r\n .server(() => {\r\n const cookie = getCookie(\"navigationOpen\");\r\n return cookie === \"true\";\r\n })\r\n .client(() => {\r\n const cookie = document.cookie\r\n .split(\"; \")\r\n .find(row => row.startsWith(\"navigationOpen=\"));\r\n return cookie ? cookie.split(\"=\")[1] === \"true\" : false;\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 ...theme.mixins.toolbar,\r\n}));\r\n\r\ninterface LayoutProps {\r\n navigation: Navigation | undefined;\r\n children: ReactNode;\r\n}\r\n\r\nexport const Layout: FC<LayoutProps> = (props) => {\r\n const [navigationOpen, setNavigationOpen] = useState(getNavigationOpenStatus);\r\n const isFetching = !!useIsFetching();\r\n const isMutating = !!useIsMutating();\r\n\r\n return (\r\n <Fragment>\r\n <InitColorSchemeScript />\r\n <CssBaseline />\r\n\r\n <Box sx={{ display: \"flex\", height: \"100dvh\", maxHeight: \"100dvh\", overflow: \"hidden\", width: \"100%\" }}>\r\n <AppBar\r\n color=\"transparent\"\r\n position=\"fixed\"\r\n sx={{\r\n borderBottom: \"1px solid\",\r\n borderColor: \"var(--mui-palette-divider)\",\r\n boxShadow: \"none\",\r\n }}>\r\n <Toolbar>\r\n {props.navigation &&\r\n <IconButton\r\n onClick={() => {\r\n setNavigationOpen(previous => {\r\n const newValue = !previous;\r\n document.cookie = `navigationOpen=${newValue}; max-age=${YEAR_IN_SECONDS}; path=/`;\r\n return newValue;\r\n });\r\n }}\r\n sx={{ marginRight: 2 }}\r\n >\r\n {navigationOpen ? <MenuOpen /> : <Menu />}\r\n </IconButton>\r\n }\r\n\r\n <AppTitle />\r\n\r\n <ToolbarAccount />\r\n </Toolbar>\r\n </AppBar>\r\n\r\n {props.navigation &&\r\n <NavigationRail\r\n navigation={props.navigation}\r\n expanded={navigationOpen}\r\n setExpanded={newValue => {\r\n setNavigationOpen(newValue);\r\n document.cookie = `navigationOpen=${newValue}; max-age=${YEAR_IN_SECONDS}; path=/`;\r\n }}\r\n />\r\n }\r\n\r\n <Box component=\"main\" sx={{ flexGrow: 1, display: \"flex\", flexDirection: \"column\", minWidth: 0, height: \"100%\", overflow: \"hidden\" }}>\r\n <DrawerHeader />\r\n <Box sx={{ flex: 1, overflow: \"auto\", position: \"relative\" }}>\r\n <AuthenticatedTemplate>\r\n {props.children}\r\n </AuthenticatedTemplate>\r\n </Box>\r\n </Box>\r\n </Box>\r\n\r\n {(isFetching || isMutating) && <LinearProgress sx={{ position: \"fixed\", top: { xs: 56, sm: 64 }, left: 0, right: 0 }} />}\r\n </Fragment>\r\n );\r\n};\r\n","import { MsalProvider } from \"@azure/msal-react\";\r\nimport { ThemeProvider } from \"@mui/material\";\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers\";\r\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\r\nimport { createServerFn } from \"@tanstack/react-start\";\r\nimport { getCookie } from \"@tanstack/react-start/server\";\r\nimport dayjs from \"dayjs\";\r\nimport i18n from \"i18next\";\r\nimport LanguageDetector from \"i18next-browser-languagedetector\";\r\nimport { useEffect, useEffectEvent } from \"react\";\r\nimport { initReactI18next } from \"react-i18next\";\r\nimport { resources } from \"virtual:wcz-layout\";\r\nimport z from \"zod\";\r\nimport { DialogsProvider } from \"./DialogsProvider\";\r\nimport { UserProvider } from \"./UserProvider\";\r\nimport type { Navigation } from \"~/models/Navigation\";\r\nimport type { FC, ReactNode } from \"react\";\r\nimport type { Theme } from \"@mui/material\";\r\nimport { msalInstance } from \"~/lib/auth\";\r\nimport { Layout } from \"~/components/core/Layout\";\r\n\r\nconst YEAR_IN_MINUTES = 60 * 24 * 365;\r\n\r\ni18n\r\n .use(LanguageDetector)\r\n .use(initReactI18next)\r\n .init({\r\n resources,\r\n fallbackLng: \"en\",\r\n supportedLngs: Object.keys(resources),\r\n detection: {\r\n caches: [\"cookie\"],\r\n cookieMinutes: YEAR_IN_MINUTES,\r\n },\r\n interpolation: { escapeValue: false },\r\n });\r\n\r\ninterface ProvidersProps {\r\n navigation?: Navigation;\r\n theme: Theme;\r\n children: ReactNode;\r\n}\r\n\r\nexport const LayoutProvider: FC<ProvidersProps> = ({ navigation, theme, children }) => {\r\n\r\n const languageChangedHandler = useEffectEvent(() => {\r\n z.config(z.core.locales[i18n.language as keyof typeof z.core.locales]());\r\n dayjs.locale(i18n.language);\r\n });\r\n\r\n useEffect(() => {\r\n languageChangedHandler();\r\n\r\n i18n.on(\"languageChanged\", languageChangedHandler);\r\n return () => { i18n.off(\"languageChanged\", languageChangedHandler); };\r\n }, []);\r\n\r\n return (\r\n <MsalProvider instance={msalInstance}>\r\n <UserProvider>\r\n <ThemeProvider theme={theme}>\r\n <LocalizationProvider key={i18n.language} dateAdapter={AdapterDayjs} adapterLocale={i18n.language}>\r\n <DialogsProvider>\r\n <Layout navigation={navigation}>\r\n {children}\r\n </Layout>\r\n </DialogsProvider>\r\n </LocalizationProvider>\r\n </ThemeProvider>\r\n </UserProvider>\r\n </MsalProvider>\r\n );\r\n};\r\n\r\nexport const setSSRLanguage = createServerFn().handler(async () => {\r\n const language = getCookie(i18n.services.languageDetector.options.lookupCookie) || \"en\";\r\n z.config(z.core.locales[language as keyof typeof z.core.locales]());\r\n dayjs.locale(language);\r\n await i18n.changeLanguage(language);\r\n});\r\n"],"names":["closeDialogUi","closeDialog","jsxs","jsx","Typography","Fragment","i18n","List","ListSubheader","ListItemButton","ListItemIcon","ListItemText","Avatar","Box","ListItem","Menu","z"],"mappings":"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"}