@beinformed/ui 1.65.1 → 1.65.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
4
4
 
5
+ ## [1.65.2](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/compare/v1.65.1...v1.65.2) (2025-12-19)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * **hooks:** modularui basic hook, add removeOnUnmount ([137c86c](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/commit/137c86ca5bf9b4c934b16ef4477e3d6f6fddf657))
11
+ * **hooks:** refactor key generation and reload handling for modular UI hooks ([11f3131](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/commit/11f3131cadf4b79139f0ad8d8dd1357c429367f4))
12
+ * **login:** handle failing login attempt ([1ace402](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/commit/1ace402589fdfe9270feec9d342452358edbac59))
13
+ * **use-panel:** improve panel key in store ([79e55fb](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/commit/79e55fb932db26e6a2112f182d9ff4741003565e))
14
+
5
15
  ## [1.65.1](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/compare/v1.65.0...v1.65.1) (2025-12-18)
6
16
 
7
17
 
@@ -4,17 +4,10 @@ import { useLocation } from "react-router";
4
4
  import { HTTP_METHODS } from "../constants";
5
5
  import { loadModularUI, removeModelByKey } from "../redux/_modularui/ModularUIActions";
6
6
  import useDeepCompareEffect from "./useDeepCompareEffect";
7
- import { useLocale } from "./useI18n";
7
+ import { useModularUIKey } from "./useModularUIKey";
8
8
  import Href from "../models/href/Href";
9
9
  /**
10
- */
11
- const useKeyForHook = (modelKey, url) => {
12
- const locale = useLocale();
13
- return useMemo(() => `${modelKey}(${url.split("?")[0]})(${locale})`, [modelKey, url, locale]);
14
- };
15
-
16
- /**
17
- * Use redux action and selector to retrieve the correct modular ui service model
10
+ * Core hook to retrieve information for a Be Informed modular ui resource
18
11
  */
19
12
  export const useModularUI = (modelKey, url, options = {
20
13
  method: HTTP_METHODS.GET,
@@ -22,7 +15,7 @@ export const useModularUI = (modelKey, url, options = {
22
15
  }) => {
23
16
  const dispatch = useDispatch();
24
17
  const href = useMemo(() => url?.toString() || "", [url]);
25
- const key = useKeyForHook(modelKey, href);
18
+ const key = useModularUIKey(modelKey, href);
26
19
  const modelSelector = useMemo(() => state => state.modularui[key], [key]);
27
20
  const model = useSelector(modelSelector);
28
21
  if (url instanceof Href) {
@@ -10,24 +10,13 @@ import {
10
10
  } from "../redux/_modularui/ModularUIActions";
11
11
 
12
12
  import useDeepCompareEffect from "./useDeepCompareEffect";
13
+ import { useModularUIKey } from "./useModularUIKey";
13
14
 
14
- import { useLocale } from "./useI18n";
15
15
  import Href from "../models/href/Href";
16
-
17
16
  import type { RequestModularUIOptions } from "../utils";
18
17
 
19
18
  /**
20
- */
21
- const useKeyForHook = (modelKey: string, url: string) => {
22
- const locale = useLocale();
23
- return useMemo(
24
- () => `${modelKey}(${url.split("?")[0]})(${locale})`,
25
- [modelKey, url, locale],
26
- );
27
- };
28
-
29
- /**
30
- * Use redux action and selector to retrieve the correct modular ui service model
19
+ * Core hook to retrieve information for a Be Informed modular ui resource
31
20
  */
32
21
  export const useModularUI = (
33
22
  modelKey: string,
@@ -39,7 +28,7 @@ export const useModularUI = (
39
28
  ): any => {
40
29
  const dispatch = useDispatch();
41
30
  const href = useMemo(() => url?.toString() || "", [url]);
42
- const key = useKeyForHook(modelKey, href);
31
+ const key = useModularUIKey(modelKey, href);
43
32
 
44
33
  const modelSelector = useMemo(() => (state) => state.modularui[key], [key]);
45
34
  const model = useSelector(modelSelector);
@@ -1 +1 @@
1
- {"version":3,"file":"useModularUI.js","names":["useEffect","useRef","useMemo","useDispatch","useSelector","useLocation","HTTP_METHODS","loadModularUI","removeModelByKey","useDeepCompareEffect","useLocale","Href","useKeyForHook","modelKey","url","locale","split","useModularUI","options","method","GET","removeOnUnmount","dispatch","href","toString","key","modelSelector","state","modularui","model","origin","contextPath","location","redirectLocation","forceLoad","equals","prevOptions","prevHref","prevForceLoad","isOldReload","current","isReload","doForceLoad"],"sources":["../../src/hooks/useModularUI.js"],"sourcesContent":["// @flow\nimport { useEffect, useRef, useMemo } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useLocation } from \"react-router\";\n\nimport { HTTP_METHODS } from \"../constants\";\nimport {\n loadModularUI,\n removeModelByKey,\n} from \"../redux/_modularui/ModularUIActions\";\n\nimport useDeepCompareEffect from \"./useDeepCompareEffect\";\n\nimport { useLocale } from \"./useI18n\";\nimport Href from \"../models/href/Href\";\n\nimport type { RequestModularUIOptions } from \"../utils\";\n\n/**\n */\nconst useKeyForHook = (modelKey: string, url: string) => {\n const locale = useLocale();\n return useMemo(\n () => `${modelKey}(${url.split(\"?\")[0]})(${locale})`,\n [modelKey, url, locale],\n );\n};\n\n/**\n * Use redux action and selector to retrieve the correct modular ui service model\n */\nexport const useModularUI = (\n modelKey: string,\n url: string | Href,\n options: RequestModularUIOptions = {\n method: HTTP_METHODS.GET,\n removeOnUnmount: false,\n },\n): any => {\n const dispatch = useDispatch();\n const href = useMemo(() => url?.toString() || \"\", [url]);\n const key = useKeyForHook(modelKey, href);\n\n const modelSelector = useMemo(() => (state) => state.modularui[key], [key]);\n const model = useSelector(modelSelector);\n\n if (url instanceof Href) {\n options.origin = options.origin ?? url.origin;\n options.contextPath = options.contextPath ?? url.contextPath;\n }\n\n const location = useLocation();\n const redirectLocation = location.state?.redirectLocation;\n const forceLoad =\n model == null ||\n (redirectLocation instanceof Href ? redirectLocation?.equals(href) : false);\n\n const prevOptions = useRef(options);\n const prevHref = useRef(href);\n const prevForceLoad = useRef(forceLoad);\n\n // dispatch loadModularUI\n useDeepCompareEffect(() => {\n // prevent reloads when previous option had the isReload, but the new options not\n const isOldReload =\n prevHref.current === href &&\n prevOptions.current.isReload &&\n !options.isReload;\n\n const doForceLoad = forceLoad && !prevForceLoad.current;\n\n if (href !== \"\" && (doForceLoad || !isOldReload)) {\n dispatch(loadModularUI(key, href, options));\n }\n\n prevOptions.current = options;\n prevHref.current = href;\n prevForceLoad.current = forceLoad;\n }, [key, href, options, forceLoad]);\n\n useEffect(() => {\n if (options.removeOnUnmount) {\n return () => {\n dispatch(removeModelByKey(key));\n };\n }\n }, [dispatch, key, options.removeOnUnmount]);\n\n return model;\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"useModularUI.js","names":["useEffect","useRef","useMemo","useDispatch","useSelector","useLocation","HTTP_METHODS","loadModularUI","removeModelByKey","useDeepCompareEffect","useModularUIKey","Href","useModularUI","modelKey","url","options","method","GET","removeOnUnmount","dispatch","href","toString","key","modelSelector","state","modularui","model","origin","contextPath","location","redirectLocation","forceLoad","equals","prevOptions","prevHref","prevForceLoad","isOldReload","current","isReload","doForceLoad"],"sources":["../../src/hooks/useModularUI.js"],"sourcesContent":["// @flow\nimport { useEffect, useRef, useMemo } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useLocation } from \"react-router\";\n\nimport { HTTP_METHODS } from \"../constants\";\nimport {\n loadModularUI,\n removeModelByKey,\n} from \"../redux/_modularui/ModularUIActions\";\n\nimport useDeepCompareEffect from \"./useDeepCompareEffect\";\nimport { useModularUIKey } from \"./useModularUIKey\";\n\nimport Href from \"../models/href/Href\";\nimport type { RequestModularUIOptions } from \"../utils\";\n\n/**\n * Core hook to retrieve information for a Be Informed modular ui resource\n */\nexport const useModularUI = (\n modelKey: string,\n url: string | Href,\n options: RequestModularUIOptions = {\n method: HTTP_METHODS.GET,\n removeOnUnmount: false,\n },\n): any => {\n const dispatch = useDispatch();\n const href = useMemo(() => url?.toString() || \"\", [url]);\n const key = useModularUIKey(modelKey, href);\n\n const modelSelector = useMemo(() => (state) => state.modularui[key], [key]);\n const model = useSelector(modelSelector);\n\n if (url instanceof Href) {\n options.origin = options.origin ?? url.origin;\n options.contextPath = options.contextPath ?? url.contextPath;\n }\n\n const location = useLocation();\n const redirectLocation = location.state?.redirectLocation;\n const forceLoad =\n model == null ||\n (redirectLocation instanceof Href ? redirectLocation?.equals(href) : false);\n\n const prevOptions = useRef(options);\n const prevHref = useRef(href);\n const prevForceLoad = useRef(forceLoad);\n\n // dispatch loadModularUI\n useDeepCompareEffect(() => {\n // prevent reloads when previous option had the isReload, but the new options not\n const isOldReload =\n prevHref.current === href &&\n prevOptions.current.isReload &&\n !options.isReload;\n\n const doForceLoad = forceLoad && !prevForceLoad.current;\n\n if (href !== \"\" && (doForceLoad || !isOldReload)) {\n dispatch(loadModularUI(key, href, options));\n }\n\n prevOptions.current = options;\n prevHref.current = href;\n prevForceLoad.current = forceLoad;\n }, [key, href, options, forceLoad]);\n\n useEffect(() => {\n if (options.removeOnUnmount) {\n return () => {\n dispatch(removeModelByKey(key));\n };\n }\n }, [dispatch, key, options.removeOnUnmount]);\n\n return model;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,17 +1,19 @@
1
- import _startsWithInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/starts-with";
2
1
  import { useLocation } from "react-router";
2
+ import { useSelector } from "react-redux";
3
3
  import { useMemo } from "react";
4
4
  import { useModularUI } from "./useModularUI";
5
+ import { MODULARUI_STATUS } from "../constants";
6
+ import { useModularUIKey } from "./useModularUIKey";
5
7
  // Helper to create useModularUI options
6
- const createUseModularUIOptions = (options, href, location) => {
7
- var _context;
8
+ const createUseModularUIOptions = (options, href, mustReload) => {
8
9
  const baseOptions = {
9
10
  targetModel: undefined,
10
11
  forceTargetModel: undefined,
11
12
  isReload: false,
12
13
  origin: undefined,
13
14
  contextPath: undefined,
14
- cache: false
15
+ cache: false,
16
+ removeOnUnmount: false
15
17
  };
16
18
 
17
19
  // Handle targetModel and forceTargetModel
@@ -24,11 +26,12 @@ const createUseModularUIOptions = (options, href, location) => {
24
26
  if (options.cache) {
25
27
  baseOptions.cache = options.cache;
26
28
  }
27
-
28
- // Check for reload if location matches href
29
- if (location.state?.reload && _startsWithInstanceProperty(_context = location.pathname).call(_context, href)) {
29
+ if (mustReload) {
30
30
  baseOptions.isReload = true;
31
31
  }
32
+ if (options.removeOnUnmount) {
33
+ baseOptions.removeOnUnmount = true;
34
+ }
32
35
 
33
36
  // Handle origin and contextPath options
34
37
  baseOptions.origin = options.origin ?? baseOptions.origin;
@@ -49,17 +52,19 @@ const validateModel = (model, expectedModels) => {
49
52
  /**
50
53
  * useModularUIBasic Hook
51
54
  */
52
- export const useModularUIBasic = (key, href, options = {
55
+ export const useModularUIBasic = (defaultKey, href, options = {
53
56
  expectedModels: [],
54
57
  targetModel: undefined,
55
58
  forceTargetModel: false,
56
59
  origin: undefined,
57
- contextPath: undefined
60
+ contextPath: undefined,
61
+ key: undefined
58
62
  }) => {
59
- const location = useLocation();
60
63
  const memoizedHref = useMemo(() => href.toString(), [href]);
61
- const useModularUIOptions = useMemo(() => createUseModularUIOptions(options, memoizedHref, location), [options, memoizedHref, location]);
62
- const modularUI = useModularUI(key, href, useModularUIOptions);
64
+ const key = options.key ?? defaultKey;
65
+ const mustReload = useReload(key, memoizedHref);
66
+ const modularUIOptions = useMemo(() => createUseModularUIOptions(options, memoizedHref, mustReload), [options, memoizedHref, mustReload]);
67
+ const modularUI = useModularUI(key, href, modularUIOptions);
63
68
  const expectedModels = useMemo(() => options.expectedModels ?? [], [options.expectedModels]);
64
69
  return useMemo(() => {
65
70
  if (modularUI?.model) {
@@ -69,4 +74,24 @@ export const useModularUIBasic = (key, href, options = {
69
74
  return null;
70
75
  }, [expectedModels, modularUI]);
71
76
  };
77
+
78
+ /**
79
+ * Check if the model corresponding to a modular ui service should be reloaded
80
+ */
81
+ export const useReload = (modelKey, url) => {
82
+ const location = useLocation();
83
+ const key = useModularUIKey(modelKey, url);
84
+ const modelEntry = useSelector(state => state.modularui[key]);
85
+ if (modelEntry) {
86
+ const reload = location.state?.reload || 0;
87
+ if (reload > 0) {
88
+ const isFullyLoaded = modelEntry?.status === MODULARUI_STATUS.FINISHED;
89
+ const lastModification = modelEntry?.lastModification ?? 0;
90
+ if (isFullyLoaded && lastModification < reload) {
91
+ return true;
92
+ }
93
+ }
94
+ }
95
+ return false;
96
+ };
72
97
  //# sourceMappingURL=useModularUIBasic.js.map
@@ -1,12 +1,18 @@
1
1
  // @flow
2
- import type { ModularUIModel, Href } from "../models";
3
2
  import { useLocation } from "react-router";
3
+ import { useSelector } from "react-redux";
4
4
  import { useMemo } from "react";
5
5
  import { useModularUI } from "./useModularUI";
6
6
 
7
+ import { MODULARUI_STATUS } from "../constants";
8
+ import { useModularUIKey } from "./useModularUIKey";
9
+
10
+ import type { ModularUIModel, Href } from "../models";
7
11
  export type HookOptions = {
12
+ key?: string,
8
13
  origin?: string,
9
14
  contextPath?: string,
15
+ removeOnUnmount?: boolean,
10
16
  };
11
17
 
12
18
  export type UseModularUIBasicOptions<T: ModularUIModel> = {
@@ -16,13 +22,16 @@ export type UseModularUIBasicOptions<T: ModularUIModel> = {
16
22
  origin?: string,
17
23
  contextPath?: string,
18
24
  cache?: boolean,
25
+ key?: string,
26
+ isReload?: boolean,
27
+ removeOnUnmount?: boolean,
19
28
  };
20
29
 
21
30
  // Helper to create useModularUI options
22
31
  const createUseModularUIOptions = <T: ModularUIModel>(
23
32
  options: UseModularUIBasicOptions<T>,
24
33
  href: string,
25
- location: any,
34
+ mustReload: boolean,
26
35
  ): Object => {
27
36
  const baseOptions = {
28
37
  targetModel: undefined,
@@ -31,6 +40,7 @@ const createUseModularUIOptions = <T: ModularUIModel>(
31
40
  origin: undefined,
32
41
  contextPath: undefined,
33
42
  cache: false,
43
+ removeOnUnmount: false,
34
44
  };
35
45
 
36
46
  // Handle targetModel and forceTargetModel
@@ -44,11 +54,14 @@ const createUseModularUIOptions = <T: ModularUIModel>(
44
54
  baseOptions.cache = options.cache;
45
55
  }
46
56
 
47
- // Check for reload if location matches href
48
- if (location.state?.reload && location.pathname.startsWith(href)) {
57
+ if (mustReload) {
49
58
  baseOptions.isReload = true;
50
59
  }
51
60
 
61
+ if (options.removeOnUnmount) {
62
+ baseOptions.removeOnUnmount = true;
63
+ }
64
+
52
65
  // Handle origin and contextPath options
53
66
  baseOptions.origin = options.origin ?? baseOptions.origin;
54
67
  baseOptions.contextPath = options.contextPath ?? baseOptions.contextPath;
@@ -72,7 +85,7 @@ const validateModel = (model: any, expectedModels: Array<string>) => {
72
85
  * useModularUIBasic Hook
73
86
  */
74
87
  export const useModularUIBasic = <T: ModularUIModel>(
75
- key: string,
88
+ defaultKey: string,
76
89
  href: string | Href,
77
90
  options: UseModularUIBasicOptions<T> = {
78
91
  expectedModels: [],
@@ -80,16 +93,19 @@ export const useModularUIBasic = <T: ModularUIModel>(
80
93
  forceTargetModel: false,
81
94
  origin: undefined,
82
95
  contextPath: undefined,
96
+ key: undefined,
83
97
  },
84
98
  ): T | null => {
85
- const location = useLocation();
86
99
  const memoizedHref = useMemo(() => href.toString(), [href]);
87
- const useModularUIOptions = useMemo(
88
- () => createUseModularUIOptions(options, memoizedHref, location),
89
- [options, memoizedHref, location],
100
+ const key = options.key ?? defaultKey;
101
+
102
+ const mustReload = useReload(key, memoizedHref);
103
+ const modularUIOptions = useMemo(
104
+ () => createUseModularUIOptions(options, memoizedHref, mustReload),
105
+ [options, memoizedHref, mustReload],
90
106
  );
91
107
 
92
- const modularUI = useModularUI(key, href, useModularUIOptions);
108
+ const modularUI = useModularUI(key, href, modularUIOptions);
93
109
  const expectedModels = useMemo(
94
110
  () => options.expectedModels ?? [],
95
111
  [options.expectedModels],
@@ -103,3 +119,24 @@ export const useModularUIBasic = <T: ModularUIModel>(
103
119
  return null;
104
120
  }, [expectedModels, modularUI]);
105
121
  };
122
+
123
+ /**
124
+ * Check if the model corresponding to a modular ui service should be reloaded
125
+ */
126
+ export const useReload = (modelKey: string, url: string): boolean => {
127
+ const location = useLocation();
128
+ const key = useModularUIKey(modelKey, url);
129
+ const modelEntry = useSelector((state) => state.modularui[key]);
130
+
131
+ if (modelEntry) {
132
+ const reload = location.state?.reload || 0;
133
+ if (reload > 0) {
134
+ const isFullyLoaded = modelEntry?.status === MODULARUI_STATUS.FINISHED;
135
+ const lastModification = modelEntry?.lastModification ?? 0;
136
+ if (isFullyLoaded && lastModification < reload) {
137
+ return true;
138
+ }
139
+ }
140
+ }
141
+ return false;
142
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"useModularUIBasic.js","names":["useLocation","useMemo","useModularUI","createUseModularUIOptions","options","href","location","_context","baseOptions","targetModel","undefined","forceTargetModel","isReload","origin","contextPath","cache","state","reload","_startsWithInstanceProperty","pathname","call","validateModel","model","expectedModels","length","isCorrectModel","some","expectedModel","type","console","warn","useModularUIBasic","key","memoizedHref","toString","useModularUIOptions","modularUI"],"sources":["../../src/hooks/useModularUIBasic.js"],"sourcesContent":["// @flow\nimport type { ModularUIModel, Href } from \"../models\";\nimport { useLocation } from \"react-router\";\nimport { useMemo } from \"react\";\nimport { useModularUI } from \"./useModularUI\";\n\nexport type HookOptions = {\n origin?: string,\n contextPath?: string,\n};\n\nexport type UseModularUIBasicOptions<T: ModularUIModel> = {\n expectedModels?: Array<string>,\n targetModel?: Class<T> | Array<Class<T>>,\n forceTargetModel?: boolean,\n origin?: string,\n contextPath?: string,\n cache?: boolean,\n};\n\n// Helper to create useModularUI options\nconst createUseModularUIOptions = <T: ModularUIModel>(\n options: UseModularUIBasicOptions<T>,\n href: string,\n location: any,\n): Object => {\n const baseOptions = {\n targetModel: undefined,\n forceTargetModel: undefined,\n isReload: false,\n origin: undefined,\n contextPath: undefined,\n cache: false,\n };\n\n // Handle targetModel and forceTargetModel\n if (options.targetModel) {\n baseOptions.targetModel = options.targetModel;\n baseOptions.forceTargetModel = options.forceTargetModel;\n }\n\n // Handle cache option\n if (options.cache) {\n baseOptions.cache = options.cache;\n }\n\n // Check for reload if location matches href\n if (location.state?.reload && location.pathname.startsWith(href)) {\n baseOptions.isReload = true;\n }\n\n // Handle origin and contextPath options\n baseOptions.origin = options.origin ?? baseOptions.origin;\n baseOptions.contextPath = options.contextPath ?? baseOptions.contextPath;\n\n return baseOptions;\n};\n\n// Helper to validate the model against expectedModels\nconst validateModel = (model: any, expectedModels: Array<string>) => {\n if (expectedModels.length > 0) {\n const isCorrectModel = expectedModels.some(\n (expectedModel) => model.type === expectedModel,\n );\n if (!isCorrectModel) {\n console.warn(model, \"is not of instance\", expectedModels);\n }\n }\n};\n\n/**\n * useModularUIBasic Hook\n */\nexport const useModularUIBasic = <T: ModularUIModel>(\n key: string,\n href: string | Href,\n options: UseModularUIBasicOptions<T> = {\n expectedModels: [],\n targetModel: undefined,\n forceTargetModel: false,\n origin: undefined,\n contextPath: undefined,\n },\n): T | null => {\n const location = useLocation();\n const memoizedHref = useMemo(() => href.toString(), [href]);\n const useModularUIOptions = useMemo(\n () => createUseModularUIOptions(options, memoizedHref, location),\n [options, memoizedHref, location],\n );\n\n const modularUI = useModularUI(key, href, useModularUIOptions);\n const expectedModels = useMemo(\n () => options.expectedModels ?? [],\n [options.expectedModels],\n );\n\n return useMemo((): T | null => {\n if (modularUI?.model) {\n validateModel(modularUI.model, expectedModels);\n return modularUI.model;\n }\n return null;\n }, [expectedModels, modularUI]);\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"useModularUIBasic.js","names":["useLocation","useSelector","useMemo","useModularUI","MODULARUI_STATUS","useModularUIKey","createUseModularUIOptions","options","href","mustReload","baseOptions","targetModel","undefined","forceTargetModel","isReload","origin","contextPath","cache","removeOnUnmount","validateModel","model","expectedModels","length","isCorrectModel","some","expectedModel","type","console","warn","useModularUIBasic","defaultKey","key","memoizedHref","toString","useReload","modularUIOptions","modularUI","modelKey","url","location","modelEntry","state","modularui","reload","isFullyLoaded","status","FINISHED","lastModification"],"sources":["../../src/hooks/useModularUIBasic.js"],"sourcesContent":["// @flow\nimport { useLocation } from \"react-router\";\nimport { useSelector } from \"react-redux\";\nimport { useMemo } from \"react\";\nimport { useModularUI } from \"./useModularUI\";\n\nimport { MODULARUI_STATUS } from \"../constants\";\nimport { useModularUIKey } from \"./useModularUIKey\";\n\nimport type { ModularUIModel, Href } from \"../models\";\nexport type HookOptions = {\n key?: string,\n origin?: string,\n contextPath?: string,\n removeOnUnmount?: boolean,\n};\n\nexport type UseModularUIBasicOptions<T: ModularUIModel> = {\n expectedModels?: Array<string>,\n targetModel?: Class<T> | Array<Class<T>>,\n forceTargetModel?: boolean,\n origin?: string,\n contextPath?: string,\n cache?: boolean,\n key?: string,\n isReload?: boolean,\n removeOnUnmount?: boolean,\n};\n\n// Helper to create useModularUI options\nconst createUseModularUIOptions = <T: ModularUIModel>(\n options: UseModularUIBasicOptions<T>,\n href: string,\n mustReload: boolean,\n): Object => {\n const baseOptions = {\n targetModel: undefined,\n forceTargetModel: undefined,\n isReload: false,\n origin: undefined,\n contextPath: undefined,\n cache: false,\n removeOnUnmount: false,\n };\n\n // Handle targetModel and forceTargetModel\n if (options.targetModel) {\n baseOptions.targetModel = options.targetModel;\n baseOptions.forceTargetModel = options.forceTargetModel;\n }\n\n // Handle cache option\n if (options.cache) {\n baseOptions.cache = options.cache;\n }\n\n if (mustReload) {\n baseOptions.isReload = true;\n }\n\n if (options.removeOnUnmount) {\n baseOptions.removeOnUnmount = true;\n }\n\n // Handle origin and contextPath options\n baseOptions.origin = options.origin ?? baseOptions.origin;\n baseOptions.contextPath = options.contextPath ?? baseOptions.contextPath;\n\n return baseOptions;\n};\n\n// Helper to validate the model against expectedModels\nconst validateModel = (model: any, expectedModels: Array<string>) => {\n if (expectedModels.length > 0) {\n const isCorrectModel = expectedModels.some(\n (expectedModel) => model.type === expectedModel,\n );\n if (!isCorrectModel) {\n console.warn(model, \"is not of instance\", expectedModels);\n }\n }\n};\n\n/**\n * useModularUIBasic Hook\n */\nexport const useModularUIBasic = <T: ModularUIModel>(\n defaultKey: string,\n href: string | Href,\n options: UseModularUIBasicOptions<T> = {\n expectedModels: [],\n targetModel: undefined,\n forceTargetModel: false,\n origin: undefined,\n contextPath: undefined,\n key: undefined,\n },\n): T | null => {\n const memoizedHref = useMemo(() => href.toString(), [href]);\n const key = options.key ?? defaultKey;\n\n const mustReload = useReload(key, memoizedHref);\n const modularUIOptions = useMemo(\n () => createUseModularUIOptions(options, memoizedHref, mustReload),\n [options, memoizedHref, mustReload],\n );\n\n const modularUI = useModularUI(key, href, modularUIOptions);\n const expectedModels = useMemo(\n () => options.expectedModels ?? [],\n [options.expectedModels],\n );\n\n return useMemo((): T | null => {\n if (modularUI?.model) {\n validateModel(modularUI.model, expectedModels);\n return modularUI.model;\n }\n return null;\n }, [expectedModels, modularUI]);\n};\n\n/**\n * Check if the model corresponding to a modular ui service should be reloaded\n */\nexport const useReload = (modelKey: string, url: string): boolean => {\n const location = useLocation();\n const key = useModularUIKey(modelKey, url);\n const modelEntry = useSelector((state) => state.modularui[key]);\n\n if (modelEntry) {\n const reload = location.state?.reload || 0;\n if (reload > 0) {\n const isFullyLoaded = modelEntry?.status === MODULARUI_STATUS.FINISHED;\n const lastModification = modelEntry?.lastModification ?? 0;\n if (isFullyLoaded && lastModification < reload) {\n return true;\n }\n }\n }\n return false;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,11 @@
1
+ import { useLocale } from "./useI18n";
2
+ import { useMemo } from "react";
3
+
4
+ /**
5
+ * Generates the key that is used in the modular ui reducer of redux
6
+ */
7
+ export const useModularUIKey = (modelKey, url) => {
8
+ const locale = useLocale();
9
+ return useMemo(() => `${modelKey}(${url.split("?")[0]})(${locale})`, [modelKey, url, locale]);
10
+ };
11
+ //# sourceMappingURL=useModularUIKey.js.map
@@ -0,0 +1,14 @@
1
+ // @flow
2
+ import { useLocale } from "./useI18n";
3
+ import { useMemo } from "react";
4
+
5
+ /**
6
+ * Generates the key that is used in the modular ui reducer of redux
7
+ */
8
+ export const useModularUIKey = (modelKey: string, url: string): string => {
9
+ const locale = useLocale();
10
+ return useMemo(
11
+ () => `${modelKey}(${url.split("?")[0]})(${locale})`,
12
+ [modelKey, url, locale],
13
+ );
14
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useModularUIKey.js","names":["useLocale","useMemo","useModularUIKey","modelKey","url","locale","split"],"sources":["../../src/hooks/useModularUIKey.js"],"sourcesContent":["// @flow\nimport { useLocale } from \"./useI18n\";\nimport { useMemo } from \"react\";\n\n/**\n * Generates the key that is used in the modular ui reducer of redux\n */\nexport const useModularUIKey = (modelKey: string, url: string): string => {\n const locale = useLocale();\n return useMemo(\n () => `${modelKey}(${url.split(\"?\")[0]})(${locale})`,\n [modelKey, url, locale],\n );\n};\n"],"mappings":"AACA,SAASA,SAAS,QAAQ,WAAW;AACrC,SAASC,OAAO,QAAQ,OAAO;;AAE/B;AACA;AACA;AACA,OAAO,MAAMC,eAAe,GAAGA,CAACC,QAAgB,EAAEC,GAAW,KAAa;EACxE,MAAMC,MAAM,GAAGL,SAAS,CAAC,CAAC;EAC1B,OAAOC,OAAO,CACZ,MAAM,GAAGE,QAAQ,IAAIC,GAAG,CAACE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAKD,MAAM,GAAG,EACpD,CAACF,QAAQ,EAAEC,GAAG,EAAEC,MAAM,CACxB,CAAC;AACH,CAAC","ignoreList":[]}
@@ -38,11 +38,16 @@ const useUrl = (href, fromRoute = false) => {
38
38
  /**
39
39
  */
40
40
  export const usePanel = (href, options) => {
41
- const url = useUrl(href, options?.fromRoute || false);
41
+ const {
42
+ fromRoute,
43
+ ...hookOptions
44
+ } = options || {
45
+ fromRoute: false
46
+ };
47
+ const url = useUrl(href, fromRoute || false);
42
48
  const basicOptions = {
43
49
  expectedModels: ["List", "GroupingPanel", "Detail"],
44
- origin: options?.origin,
45
- contextPath: options?.contextPath
50
+ ...hookOptions
46
51
  };
47
52
  return useModularUIBasic("panel", url, basicOptions);
48
53
  };
@@ -65,11 +65,12 @@ export const usePanel = (
65
65
  href?: string | Href,
66
66
  options?: HookOptions & { fromRoute?: boolean },
67
67
  ): ListModel | GroupingPanelModel | DetailModel | null => {
68
- const url = useUrl(href, options?.fromRoute || false);
68
+ const { fromRoute, ...hookOptions } = options || { fromRoute: false };
69
+
70
+ const url = useUrl(href, fromRoute || false);
69
71
  const basicOptions = {
70
72
  expectedModels: ["List", "GroupingPanel", "Detail"],
71
- origin: options?.origin,
72
- contextPath: options?.contextPath,
73
+ ...(hookOptions: HookOptions),
73
74
  };
74
75
 
75
76
  return useModularUIBasic("panel", url, basicOptions);
@@ -1 +1 @@
1
- {"version":3,"file":"usePanel.js","names":["useState","useMemo","useLocation","useRouteMatch","Href","useModularUIBasic","useUrl","href","fromRoute","previousUrl","setPreviousUrl","previousExact","setPreviousExact","match","location","_context","url","isExact","addParametersFromString","search","equalsWithParameters","shouldUpdate","Function","call","bind","_startsWithInstanceProperty","usePanel","options","basicOptions","expectedModels","origin","contextPath"],"sources":["../../src/hooks/usePanel.js"],"sourcesContent":["// @flow\nimport { useState, useMemo } from \"react\";\nimport { useLocation, useRouteMatch } from \"react-router\";\nimport Href from \"../models/href/Href\";\nimport { useModularUIBasic } from \"./useModularUIBasic\";\n\nimport type { HookOptions } from \"./useModularUIBasic\";\nimport type GroupingPanelModel from \"../models/panels/GroupingPanelModel\";\nimport type ListModel from \"../models/list/ListModel\";\nimport type DetailModel from \"../models/detail/DetailModel\";\n\nconst useUrl = (href?: string | Href, fromRoute: boolean = false) => {\n const [previousUrl, setPreviousUrl] = useState(null);\n const [previousExact, setPreviousExact] = useState(false);\n\n const match = useRouteMatch();\n const location = useLocation();\n\n return useMemo(() => {\n if (href == null && previousUrl == null) {\n return new Href(\"\");\n }\n\n const url = href instanceof Href ? href : new Href(href);\n\n if (!fromRoute) {\n return url;\n }\n\n if (match.isExact) {\n url.addParametersFromString(location.search);\n }\n\n // Check equality to prevent unnecessary state updates\n if (url.equalsWithParameters(previousUrl)) {\n return previousUrl || url;\n }\n\n const shouldUpdate =\n match.isExact === true ||\n previousExact === match.isExact ||\n !previousUrl?.startsWith(match.url);\n\n if (shouldUpdate) {\n setPreviousUrl(url);\n setPreviousExact(match.isExact);\n return url;\n }\n\n return previousUrl || new Href(\"\");\n }, [\n href,\n previousUrl,\n fromRoute,\n match.isExact,\n match.url,\n previousExact,\n location.search,\n ]);\n};\n\n/**\n */\nexport const usePanel = (\n href?: string | Href,\n options?: HookOptions & { fromRoute?: boolean },\n): ListModel | GroupingPanelModel | DetailModel | null => {\n const url = useUrl(href, options?.fromRoute || false);\n const basicOptions = {\n expectedModels: [\"List\", \"GroupingPanel\", \"Detail\"],\n origin: options?.origin,\n contextPath: options?.contextPath,\n };\n\n return useModularUIBasic(\"panel\", url, basicOptions);\n};\n"],"mappings":";AACA,SAASA,QAAQ,EAAEC,OAAO,QAAQ,OAAO;AACzC,SAASC,WAAW,EAAEC,aAAa,QAAQ,cAAc;AACzD,OAAOC,IAAI,MAAM,qBAAqB;AACtC,SAASC,iBAAiB,QAAQ,qBAAqB;AAOvD,MAAMC,MAAM,GAAGA,CAACC,IAAoB,EAAEC,SAAkB,GAAG,KAAK,KAAK;EACnE,MAAM,CAACC,WAAW,EAAEC,cAAc,CAAC,GAAGV,QAAQ,CAAC,IAAI,CAAC;EACpD,MAAM,CAACW,aAAa,EAAEC,gBAAgB,CAAC,GAAGZ,QAAQ,CAAC,KAAK,CAAC;EAEzD,MAAMa,KAAK,GAAGV,aAAa,CAAC,CAAC;EAC7B,MAAMW,QAAQ,GAAGZ,WAAW,CAAC,CAAC;EAE9B,OAAOD,OAAO,CAAC,MAAM;IAAA,IAAAc,QAAA;IACnB,IAAIR,IAAI,IAAI,IAAI,IAAIE,WAAW,IAAI,IAAI,EAAE;MACvC,OAAO,IAAIL,IAAI,CAAC,EAAE,CAAC;IACrB;IAEA,MAAMY,GAAG,GAAGT,IAAI,YAAYH,IAAI,GAAGG,IAAI,GAAG,IAAIH,IAAI,CAACG,IAAI,CAAC;IAExD,IAAI,CAACC,SAAS,EAAE;MACd,OAAOQ,GAAG;IACZ;IAEA,IAAIH,KAAK,CAACI,OAAO,EAAE;MACjBD,GAAG,CAACE,uBAAuB,CAACJ,QAAQ,CAACK,MAAM,CAAC;IAC9C;;IAEA;IACA,IAAIH,GAAG,CAACI,oBAAoB,CAACX,WAAW,CAAC,EAAE;MACzC,OAAOA,WAAW,IAAIO,GAAG;IAC3B;IAEA,MAAMK,YAAY,GAChBR,KAAK,CAACI,OAAO,KAAK,IAAI,IACtBN,aAAa,KAAKE,KAAK,CAACI,OAAO,IAC/B,CAAC,EAAAF,QAAA,GAAAN,WAAW,qBAAAa,QAAA,CAAAC,IAAA,CAAAC,IAAA,CAAAC,2BAAA,CAAAV,QAAA,GAAAA,QAAA,KAAaF,KAAK,CAACG,GAAG,CAAC;IAErC,IAAIK,YAAY,EAAE;MAChBX,cAAc,CAACM,GAAG,CAAC;MACnBJ,gBAAgB,CAACC,KAAK,CAACI,OAAO,CAAC;MAC/B,OAAOD,GAAG;IACZ;IAEA,OAAOP,WAAW,IAAI,IAAIL,IAAI,CAAC,EAAE,CAAC;EACpC,CAAC,EAAE,CACDG,IAAI,EACJE,WAAW,EACXD,SAAS,EACTK,KAAK,CAACI,OAAO,EACbJ,KAAK,CAACG,GAAG,EACTL,aAAa,EACbG,QAAQ,CAACK,MAAM,CAChB,CAAC;AACJ,CAAC;;AAED;AACA;AACA,OAAO,MAAMO,QAAQ,GAAGA,CACtBnB,IAAoB,EACpBoB,OAA+C,KACS;EACxD,MAAMX,GAAG,GAAGV,MAAM,CAACC,IAAI,EAAEoB,OAAO,EAAEnB,SAAS,IAAI,KAAK,CAAC;EACrD,MAAMoB,YAAY,GAAG;IACnBC,cAAc,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,CAAC;IACnDC,MAAM,EAAEH,OAAO,EAAEG,MAAM;IACvBC,WAAW,EAAEJ,OAAO,EAAEI;EACxB,CAAC;EAED,OAAO1B,iBAAiB,CAAC,OAAO,EAAEW,GAAG,EAAEY,YAAY,CAAC;AACtD,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"usePanel.js","names":["useState","useMemo","useLocation","useRouteMatch","Href","useModularUIBasic","useUrl","href","fromRoute","previousUrl","setPreviousUrl","previousExact","setPreviousExact","match","location","_context","url","isExact","addParametersFromString","search","equalsWithParameters","shouldUpdate","Function","call","bind","_startsWithInstanceProperty","usePanel","options","hookOptions","basicOptions","expectedModels"],"sources":["../../src/hooks/usePanel.js"],"sourcesContent":["// @flow\nimport { useState, useMemo } from \"react\";\nimport { useLocation, useRouteMatch } from \"react-router\";\nimport Href from \"../models/href/Href\";\nimport { useModularUIBasic } from \"./useModularUIBasic\";\n\nimport type { HookOptions } from \"./useModularUIBasic\";\nimport type GroupingPanelModel from \"../models/panels/GroupingPanelModel\";\nimport type ListModel from \"../models/list/ListModel\";\nimport type DetailModel from \"../models/detail/DetailModel\";\n\nconst useUrl = (href?: string | Href, fromRoute: boolean = false) => {\n const [previousUrl, setPreviousUrl] = useState(null);\n const [previousExact, setPreviousExact] = useState(false);\n\n const match = useRouteMatch();\n const location = useLocation();\n\n return useMemo(() => {\n if (href == null && previousUrl == null) {\n return new Href(\"\");\n }\n\n const url = href instanceof Href ? href : new Href(href);\n\n if (!fromRoute) {\n return url;\n }\n\n if (match.isExact) {\n url.addParametersFromString(location.search);\n }\n\n // Check equality to prevent unnecessary state updates\n if (url.equalsWithParameters(previousUrl)) {\n return previousUrl || url;\n }\n\n const shouldUpdate =\n match.isExact === true ||\n previousExact === match.isExact ||\n !previousUrl?.startsWith(match.url);\n\n if (shouldUpdate) {\n setPreviousUrl(url);\n setPreviousExact(match.isExact);\n return url;\n }\n\n return previousUrl || new Href(\"\");\n }, [\n href,\n previousUrl,\n fromRoute,\n match.isExact,\n match.url,\n previousExact,\n location.search,\n ]);\n};\n\n/**\n */\nexport const usePanel = (\n href?: string | Href,\n options?: HookOptions & { fromRoute?: boolean },\n): ListModel | GroupingPanelModel | DetailModel | null => {\n const { fromRoute, ...hookOptions } = options || { fromRoute: false };\n\n const url = useUrl(href, fromRoute || false);\n const basicOptions = {\n expectedModels: [\"List\", \"GroupingPanel\", \"Detail\"],\n ...(hookOptions: HookOptions),\n };\n\n return useModularUIBasic(\"panel\", url, basicOptions);\n};\n"],"mappings":";AACA,SAASA,QAAQ,EAAEC,OAAO,QAAQ,OAAO;AACzC,SAASC,WAAW,EAAEC,aAAa,QAAQ,cAAc;AACzD,OAAOC,IAAI,MAAM,qBAAqB;AACtC,SAASC,iBAAiB,QAAQ,qBAAqB;AAOvD,MAAMC,MAAM,GAAGA,CAACC,IAAoB,EAAEC,SAAkB,GAAG,KAAK,KAAK;EACnE,MAAM,CAACC,WAAW,EAAEC,cAAc,CAAC,GAAGV,QAAQ,CAAC,IAAI,CAAC;EACpD,MAAM,CAACW,aAAa,EAAEC,gBAAgB,CAAC,GAAGZ,QAAQ,CAAC,KAAK,CAAC;EAEzD,MAAMa,KAAK,GAAGV,aAAa,CAAC,CAAC;EAC7B,MAAMW,QAAQ,GAAGZ,WAAW,CAAC,CAAC;EAE9B,OAAOD,OAAO,CAAC,MAAM;IAAA,IAAAc,QAAA;IACnB,IAAIR,IAAI,IAAI,IAAI,IAAIE,WAAW,IAAI,IAAI,EAAE;MACvC,OAAO,IAAIL,IAAI,CAAC,EAAE,CAAC;IACrB;IAEA,MAAMY,GAAG,GAAGT,IAAI,YAAYH,IAAI,GAAGG,IAAI,GAAG,IAAIH,IAAI,CAACG,IAAI,CAAC;IAExD,IAAI,CAACC,SAAS,EAAE;MACd,OAAOQ,GAAG;IACZ;IAEA,IAAIH,KAAK,CAACI,OAAO,EAAE;MACjBD,GAAG,CAACE,uBAAuB,CAACJ,QAAQ,CAACK,MAAM,CAAC;IAC9C;;IAEA;IACA,IAAIH,GAAG,CAACI,oBAAoB,CAACX,WAAW,CAAC,EAAE;MACzC,OAAOA,WAAW,IAAIO,GAAG;IAC3B;IAEA,MAAMK,YAAY,GAChBR,KAAK,CAACI,OAAO,KAAK,IAAI,IACtBN,aAAa,KAAKE,KAAK,CAACI,OAAO,IAC/B,CAAC,EAAAF,QAAA,GAAAN,WAAW,qBAAAa,QAAA,CAAAC,IAAA,CAAAC,IAAA,CAAAC,2BAAA,CAAAV,QAAA,GAAAA,QAAA,KAAaF,KAAK,CAACG,GAAG,CAAC;IAErC,IAAIK,YAAY,EAAE;MAChBX,cAAc,CAACM,GAAG,CAAC;MACnBJ,gBAAgB,CAACC,KAAK,CAACI,OAAO,CAAC;MAC/B,OAAOD,GAAG;IACZ;IAEA,OAAOP,WAAW,IAAI,IAAIL,IAAI,CAAC,EAAE,CAAC;EACpC,CAAC,EAAE,CACDG,IAAI,EACJE,WAAW,EACXD,SAAS,EACTK,KAAK,CAACI,OAAO,EACbJ,KAAK,CAACG,GAAG,EACTL,aAAa,EACbG,QAAQ,CAACK,MAAM,CAChB,CAAC;AACJ,CAAC;;AAED;AACA;AACA,OAAO,MAAMO,QAAQ,GAAGA,CACtBnB,IAAoB,EACpBoB,OAA+C,KACS;EACxD,MAAM;IAAEnB,SAAS;IAAE,GAAGoB;EAAY,CAAC,GAAGD,OAAO,IAAI;IAAEnB,SAAS,EAAE;EAAM,CAAC;EAErE,MAAMQ,GAAG,GAAGV,MAAM,CAACC,IAAI,EAAEC,SAAS,IAAI,KAAK,CAAC;EAC5C,MAAMqB,YAAY,GAAG;IACnBC,cAAc,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,CAAC;IACnD,GAAIF;EACN,CAAC;EAED,OAAOvB,iBAAiB,CAAC,OAAO,EAAEW,GAAG,EAAEa,YAAY,CAAC;AACtD,CAAC","ignoreList":[]}
@@ -1,8 +1,6 @@
1
- import _Promise from "@babel/runtime-corejs3/core-js-stable/promise";
2
1
  import Cache from "../../utils/browser/Cache";
3
2
  import Authenticate from "../../modularui/Authenticate";
4
3
  import { getApplication } from "../_modularui/ModularUISelectors";
5
- import { handleError } from "./Error";
6
4
  import { reloadApplication } from "./Application";
7
5
  import { startProgress, finishProgress } from "./ProgressIndicator";
8
6
  import { push } from "../_router/RouterActions";
@@ -51,9 +49,11 @@ export const changePassword = () => (dispatch, getState) => {
51
49
 
52
50
  /**
53
51
  */
54
- export const login = (username, password) => (dispatch, getState) => {
52
+ export const login = (username, password) => async (dispatch, getState) => {
55
53
  dispatch(startProgress());
56
- return new Authenticate().login(username, password).then(() => dispatch(reloadApplication())).then(() => {
54
+ try {
55
+ const response = await new Authenticate().login(username, password);
56
+ await dispatch(reloadApplication());
57
57
  Cache.addItem("auth", true);
58
58
  const application = getApplication(getState());
59
59
  if (application?.userMustChangePassword) {
@@ -61,18 +61,18 @@ export const login = (username, password) => (dispatch, getState) => {
61
61
  } else {
62
62
  dispatch(loginSuccess());
63
63
  }
64
- return dispatch(finishProgress());
65
- }).catch(error => {
64
+ dispatch(finishProgress());
65
+ return response;
66
+ } catch (error) {
66
67
  if (error.id === "Error.ChangePasswordRequired") {
67
- const dispatchedReloadApplication = dispatch(reloadApplication());
68
- return _Promise.resolve(dispatchedReloadApplication).then(() => {
69
- Cache.addItem("auth", true);
70
- dispatch(changePassword());
71
- return dispatch(finishProgress());
72
- });
68
+ await dispatch(reloadApplication());
69
+ Cache.addItem("auth", true);
70
+ dispatch(changePassword());
71
+ } else {
72
+ dispatch(loginFailed(error.id));
73
73
  }
74
- dispatch(loginFailed(error.id));
75
- return dispatch(handleError(error));
76
- });
74
+ dispatch(finishProgress());
75
+ return error;
76
+ }
77
77
  };
78
78
  //# sourceMappingURL=SignIn.js.map
@@ -3,7 +3,6 @@ import Cache from "../../utils/browser/Cache";
3
3
  import Authenticate from "../../modularui/Authenticate";
4
4
  import { getApplication } from "../_modularui/ModularUISelectors";
5
5
 
6
- import { handleError } from "./Error";
7
6
  import { reloadApplication } from "./Application";
8
7
  import { startProgress, finishProgress } from "./ProgressIndicator";
9
8
 
@@ -70,34 +69,34 @@ export const changePassword = (): ThunkAction => (dispatch, getState) => {
70
69
  */
71
70
  export const login =
72
71
  (username: string, password: string): ThunkAction =>
73
- (dispatch, getState) => {
72
+ async (dispatch, getState) => {
74
73
  dispatch(startProgress());
75
74
 
76
- return new Authenticate()
77
- .login(username, password)
78
- .then(() => dispatch(reloadApplication()))
79
- .then(() => {
80
- Cache.addItem("auth", true);
81
- const application = getApplication(getState());
82
- if (application?.userMustChangePassword) {
83
- dispatch(changePassword());
84
- } else {
85
- dispatch(loginSuccess());
86
- }
87
- return dispatch(finishProgress());
88
- })
89
- .catch((error) => {
90
- if (error.id === "Error.ChangePasswordRequired") {
91
- const dispatchedReloadApplication = dispatch(reloadApplication());
75
+ try {
76
+ const response = await new Authenticate().login(username, password);
77
+
78
+ await dispatch(reloadApplication());
92
79
 
93
- return Promise.resolve(dispatchedReloadApplication).then(() => {
94
- Cache.addItem("auth", true);
95
- dispatch(changePassword());
96
- return dispatch(finishProgress());
97
- });
98
- }
80
+ Cache.addItem("auth", true);
81
+ const application = getApplication(getState());
99
82
 
83
+ if (application?.userMustChangePassword) {
84
+ dispatch(changePassword());
85
+ } else {
86
+ dispatch(loginSuccess());
87
+ }
88
+
89
+ dispatch(finishProgress());
90
+ return response;
91
+ } catch (error) {
92
+ if (error.id === "Error.ChangePasswordRequired") {
93
+ await dispatch(reloadApplication());
94
+ Cache.addItem("auth", true);
95
+ dispatch(changePassword());
96
+ } else {
100
97
  dispatch(loginFailed(error.id));
101
- return dispatch(handleError(error));
102
- });
98
+ }
99
+ dispatch(finishProgress());
100
+ return error;
101
+ }
103
102
  };
@@ -1 +1 @@
1
- {"version":3,"file":"SignIn.js","names":["Cache","Authenticate","getApplication","handleError","reloadApplication","startProgress","finishProgress","push","CHANGEPASSWORD_PATH","loginFailed","errorMessage","sendAuthenticationError","type","payload","resetAuthErrors","loginSuccess","changePassword","dispatch","getState","isModal","router","location","state","modal","locationFrom","from","login","username","password","then","addItem","application","userMustChangePassword","catch","error","id","dispatchedReloadApplication","_Promise","resolve"],"sources":["../../../src/redux/actions/SignIn.js"],"sourcesContent":["// @flow\nimport Cache from \"../../utils/browser/Cache\";\nimport Authenticate from \"../../modularui/Authenticate\";\nimport { getApplication } from \"../_modularui/ModularUISelectors\";\n\nimport { handleError } from \"./Error\";\nimport { reloadApplication } from \"./Application\";\nimport { startProgress, finishProgress } from \"./ProgressIndicator\";\n\nimport { push } from \"../_router/RouterActions\";\nimport { CHANGEPASSWORD_PATH } from \"../../constants/Constants\";\n\nimport type {\n SendAuthenticationErrorAction,\n ResetAuthErrorsAction,\n LoginSuccessAction,\n ThunkAction,\n} from \"../types\";\n\n/**\n * Send login failed action\n */\nexport const loginFailed = (\n errorMessage: string,\n): SendAuthenticationErrorAction => sendAuthenticationError(errorMessage);\n\n/**\n * Send authentication error action\n */\nexport const sendAuthenticationError = (\n errorMessage: string,\n): SendAuthenticationErrorAction => ({\n type: \"AUTHENTICATION_ERROR\",\n payload: errorMessage,\n});\n\n/**\n * Resets any authentication errors\n */\nexport const resetAuthErrors = (): ResetAuthErrorsAction => ({\n type: \"AUTHENTICATION_RESET_ERRORS\",\n});\n\n/**\n * Send login success action\n */\nexport const loginSuccess = (): LoginSuccessAction => ({\n type: \"AUTHENTICATION_SUCCESS\",\n});\n\n/**\n * Send change password action\n */\nexport const changePassword = (): ThunkAction => (dispatch, getState) => {\n dispatch({\n type: \"CHANGE_PASSWORD\",\n });\n\n const isModal = getState().router.location?.state?.modal;\n const locationFrom = getState().router.location?.state?.from;\n return dispatch(\n push(CHANGEPASSWORD_PATH, {\n from: locationFrom ? locationFrom : getState().router.location,\n modal: isModal,\n }),\n );\n};\n\n/**\n */\nexport const login =\n (username: string, password: string): ThunkAction =>\n (dispatch, getState) => {\n dispatch(startProgress());\n\n return new Authenticate()\n .login(username, password)\n .then(() => dispatch(reloadApplication()))\n .then(() => {\n Cache.addItem(\"auth\", true);\n const application = getApplication(getState());\n if (application?.userMustChangePassword) {\n dispatch(changePassword());\n } else {\n dispatch(loginSuccess());\n }\n return dispatch(finishProgress());\n })\n .catch((error) => {\n if (error.id === \"Error.ChangePasswordRequired\") {\n const dispatchedReloadApplication = dispatch(reloadApplication());\n\n return Promise.resolve(dispatchedReloadApplication).then(() => {\n Cache.addItem(\"auth\", true);\n dispatch(changePassword());\n return dispatch(finishProgress());\n });\n }\n\n dispatch(loginFailed(error.id));\n return dispatch(handleError(error));\n });\n };\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"SignIn.js","names":["Cache","Authenticate","getApplication","reloadApplication","startProgress","finishProgress","push","CHANGEPASSWORD_PATH","loginFailed","errorMessage","sendAuthenticationError","type","payload","resetAuthErrors","loginSuccess","changePassword","dispatch","getState","isModal","router","location","state","modal","locationFrom","from","login","username","password","response","addItem","application","userMustChangePassword","error","id"],"sources":["../../../src/redux/actions/SignIn.js"],"sourcesContent":["// @flow\nimport Cache from \"../../utils/browser/Cache\";\nimport Authenticate from \"../../modularui/Authenticate\";\nimport { getApplication } from \"../_modularui/ModularUISelectors\";\n\nimport { reloadApplication } from \"./Application\";\nimport { startProgress, finishProgress } from \"./ProgressIndicator\";\n\nimport { push } from \"../_router/RouterActions\";\nimport { CHANGEPASSWORD_PATH } from \"../../constants/Constants\";\n\nimport type {\n SendAuthenticationErrorAction,\n ResetAuthErrorsAction,\n LoginSuccessAction,\n ThunkAction,\n} from \"../types\";\n\n/**\n * Send login failed action\n */\nexport const loginFailed = (\n errorMessage: string,\n): SendAuthenticationErrorAction => sendAuthenticationError(errorMessage);\n\n/**\n * Send authentication error action\n */\nexport const sendAuthenticationError = (\n errorMessage: string,\n): SendAuthenticationErrorAction => ({\n type: \"AUTHENTICATION_ERROR\",\n payload: errorMessage,\n});\n\n/**\n * Resets any authentication errors\n */\nexport const resetAuthErrors = (): ResetAuthErrorsAction => ({\n type: \"AUTHENTICATION_RESET_ERRORS\",\n});\n\n/**\n * Send login success action\n */\nexport const loginSuccess = (): LoginSuccessAction => ({\n type: \"AUTHENTICATION_SUCCESS\",\n});\n\n/**\n * Send change password action\n */\nexport const changePassword = (): ThunkAction => (dispatch, getState) => {\n dispatch({\n type: \"CHANGE_PASSWORD\",\n });\n\n const isModal = getState().router.location?.state?.modal;\n const locationFrom = getState().router.location?.state?.from;\n return dispatch(\n push(CHANGEPASSWORD_PATH, {\n from: locationFrom ? locationFrom : getState().router.location,\n modal: isModal,\n }),\n );\n};\n\n/**\n */\nexport const login =\n (username: string, password: string): ThunkAction =>\n async (dispatch, getState) => {\n dispatch(startProgress());\n\n try {\n const response = await new Authenticate().login(username, password);\n\n await dispatch(reloadApplication());\n\n Cache.addItem(\"auth\", true);\n const application = getApplication(getState());\n\n if (application?.userMustChangePassword) {\n dispatch(changePassword());\n } else {\n dispatch(loginSuccess());\n }\n\n dispatch(finishProgress());\n return response;\n } catch (error) {\n if (error.id === \"Error.ChangePasswordRequired\") {\n await dispatch(reloadApplication());\n Cache.addItem(\"auth\", true);\n dispatch(changePassword());\n } else {\n dispatch(loginFailed(error.id));\n }\n dispatch(finishProgress());\n return error;\n }\n };\n"],"mappings":"AACA,OAAOA,KAAK,MAAM,2BAA2B;AAC7C,OAAOC,YAAY,MAAM,8BAA8B;AACvD,SAASC,cAAc,QAAQ,kCAAkC;AAEjE,SAASC,iBAAiB,QAAQ,eAAe;AACjD,SAASC,aAAa,EAAEC,cAAc,QAAQ,qBAAqB;AAEnE,SAASC,IAAI,QAAQ,0BAA0B;AAC/C,SAASC,mBAAmB,QAAQ,2BAA2B;AAS/D;AACA;AACA;AACA,OAAO,MAAMC,WAAW,GACtBC,YAAoB,IACcC,uBAAuB,CAACD,YAAY,CAAC;;AAEzE;AACA;AACA;AACA,OAAO,MAAMC,uBAAuB,GAClCD,YAAoB,KACe;EACnCE,IAAI,EAAE,sBAAsB;EAC5BC,OAAO,EAAEH;AACX,CAAC,CAAC;;AAEF;AACA;AACA;AACA,OAAO,MAAMI,eAAe,GAAGA,CAAA,MAA8B;EAC3DF,IAAI,EAAE;AACR,CAAC,CAAC;;AAEF;AACA;AACA;AACA,OAAO,MAAMG,YAAY,GAAGA,CAAA,MAA2B;EACrDH,IAAI,EAAE;AACR,CAAC,CAAC;;AAEF;AACA;AACA;AACA,OAAO,MAAMI,cAAc,GAAGA,CAAA,KAAmB,CAACC,QAAQ,EAAEC,QAAQ,KAAK;EACvED,QAAQ,CAAC;IACPL,IAAI,EAAE;EACR,CAAC,CAAC;EAEF,MAAMO,OAAO,GAAGD,QAAQ,CAAC,CAAC,CAACE,MAAM,CAACC,QAAQ,EAAEC,KAAK,EAAEC,KAAK;EACxD,MAAMC,YAAY,GAAGN,QAAQ,CAAC,CAAC,CAACE,MAAM,CAACC,QAAQ,EAAEC,KAAK,EAAEG,IAAI;EAC5D,OAAOR,QAAQ,CACbV,IAAI,CAACC,mBAAmB,EAAE;IACxBiB,IAAI,EAAED,YAAY,GAAGA,YAAY,GAAGN,QAAQ,CAAC,CAAC,CAACE,MAAM,CAACC,QAAQ;IAC9DE,KAAK,EAAEJ;EACT,CAAC,CACH,CAAC;AACH,CAAC;;AAED;AACA;AACA,OAAO,MAAMO,KAAK,GAChBA,CAACC,QAAgB,EAAEC,QAAgB,KACnC,OAAOX,QAAQ,EAAEC,QAAQ,KAAK;EAC5BD,QAAQ,CAACZ,aAAa,CAAC,CAAC,CAAC;EAEzB,IAAI;IACF,MAAMwB,QAAQ,GAAG,MAAM,IAAI3B,YAAY,CAAC,CAAC,CAACwB,KAAK,CAACC,QAAQ,EAAEC,QAAQ,CAAC;IAEnE,MAAMX,QAAQ,CAACb,iBAAiB,CAAC,CAAC,CAAC;IAEnCH,KAAK,CAAC6B,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;IAC3B,MAAMC,WAAW,GAAG5B,cAAc,CAACe,QAAQ,CAAC,CAAC,CAAC;IAE9C,IAAIa,WAAW,EAAEC,sBAAsB,EAAE;MACvCf,QAAQ,CAACD,cAAc,CAAC,CAAC,CAAC;IAC5B,CAAC,MAAM;MACLC,QAAQ,CAACF,YAAY,CAAC,CAAC,CAAC;IAC1B;IAEAE,QAAQ,CAACX,cAAc,CAAC,CAAC,CAAC;IAC1B,OAAOuB,QAAQ;EACjB,CAAC,CAAC,OAAOI,KAAK,EAAE;IACd,IAAIA,KAAK,CAACC,EAAE,KAAK,8BAA8B,EAAE;MAC/C,MAAMjB,QAAQ,CAACb,iBAAiB,CAAC,CAAC,CAAC;MACnCH,KAAK,CAAC6B,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;MAC3Bb,QAAQ,CAACD,cAAc,CAAC,CAAC,CAAC;IAC5B,CAAC,MAAM;MACLC,QAAQ,CAACR,WAAW,CAACwB,KAAK,CAACC,EAAE,CAAC,CAAC;IACjC;IACAjB,QAAQ,CAACX,cAAc,CAAC,CAAC,CAAC;IAC1B,OAAO2B,KAAK;EACd;AACF,CAAC","ignoreList":[]}