namirasoft-account-react 1.5.38 → 1.5.39

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 (145) hide show
  1. package/.env.template +15 -15
  2. package/SKILL.md +514 -514
  3. package/config-overrides.js +72 -72
  4. package/dist/App.d.ts +1 -1
  5. package/dist/FieldCacheService.js +4 -0
  6. package/dist/FieldCacheService.js.map +1 -1
  7. package/dist/NSARouterMaker.js +1 -1
  8. package/dist/NSARouterMaker.js.map +1 -1
  9. package/dist/Router.d.ts +1 -1
  10. package/dist/UseParams.d.ts +1 -1
  11. package/dist/components/NSAAccessListDialog.d.ts +2 -2
  12. package/dist/components/NSAAccessListDialog.module.css +71 -71
  13. package/dist/components/NSABoxSecret.d.ts +1 -1
  14. package/dist/components/NSABoxSecret.module.css +23 -23
  15. package/dist/components/NSAMasterMenu.d.ts +1 -1
  16. package/dist/components/NSAMasterMenu.js +4 -0
  17. package/dist/components/NSAMasterMenu.js.map +1 -1
  18. package/dist/components/NSAMasterMenu.module.css +250 -250
  19. package/dist/components/NSAMasterMenuItem.d.ts +1 -1
  20. package/dist/components/NSAMessageListDialog.d.ts +1 -1
  21. package/dist/components/NSAMessageListDialog.module.css +99 -99
  22. package/dist/components/NSANavigationGuard.d.ts +1 -1
  23. package/dist/components/NSAProductListDialog.d.ts +1 -1
  24. package/dist/components/NSAProductListDialog.module.css +44 -44
  25. package/dist/components/NSATaskBar.d.ts +1 -1
  26. package/dist/components/NSATaskBar.module.css +57 -57
  27. package/dist/components/NSAUserDialog.d.ts +1 -1
  28. package/dist/components/NSAUserDialog.module.css +67 -67
  29. package/dist/components/NSAWorkspaceListDialog.d.ts +1 -1
  30. package/dist/components/NSAWorkspaceListDialog.module.css +41 -41
  31. package/dist/components/NSFBoxCategoryScope.d.ts +1 -1
  32. package/dist/components/NSFBoxField.d.ts +1 -1
  33. package/dist/components/NSFBoxSlot.d.ts +1 -1
  34. package/dist/components/NSFBoxWrapper.d.ts +1 -1
  35. package/dist/components/NSLabelSecret.d.ts +1 -1
  36. package/dist/components/quickfilter/NSAFilterBoxEnum.module.css +51 -51
  37. package/dist/components/quickfilter/NSAQuickFilterBar.d.ts +1 -1
  38. package/dist/components/quickfilter/NSAQuickFilterBar.module.css +20 -20
  39. package/dist/components/quickfilter/NSAQuickFilterDialog.d.ts +1 -1
  40. package/dist/components/quickfilter/NSAQuickFilterDialog.module.css +74 -74
  41. package/dist/layouts/NSALayout.d.ts +1 -1
  42. package/dist/layouts/NSASectionEdit.d.ts +1 -1
  43. package/dist/layouts/NSASectionEditTabPage.d.ts +1 -1
  44. package/dist/layouts/NSASectionEditTabPage.module.css +4 -4
  45. package/dist/layouts/NSASectionList.d.ts +1 -1
  46. package/dist/layouts/NSASectionList.module.css +24 -24
  47. package/dist/layouts/NSASectionView.d.ts +1 -1
  48. package/dist/layouts/NSASectionViewTabMore.d.ts +1 -1
  49. package/dist/layouts/NSASectionViewTabPage.d.ts +1 -1
  50. package/dist/layouts/NSASectionViewTabPage.module.css +47 -47
  51. package/dist/pages/NSAConsentPage.module.css +26 -26
  52. package/dist/pages/NSAEmailVerificationPage.d.ts +1 -1
  53. package/dist/pages/NSAHomePage.d.ts +1 -1
  54. package/dist/pages/NSAHomePage.module.css +41 -41
  55. package/dist/pages/NSALoginPage.d.ts +1 -1
  56. package/dist/pages/NSALoginPage.module.css +26 -26
  57. package/dist/pages/NSAPhoneVerificationPage.d.ts +1 -1
  58. package/dist/pages/NSAVerificationPage.d.ts +1 -1
  59. package/dist/pages/NSAVerificationPage.module.css +31 -31
  60. package/package.json +94 -94
  61. package/public/index.html +21 -21
  62. package/src/App.tsx +72 -72
  63. package/src/CTFRow.ts +7 -7
  64. package/src/FieldCacheService.tsx +113 -108
  65. package/src/IEntityInfo.ts +33 -33
  66. package/src/NSACacheService.ts +126 -126
  67. package/src/NSAFilterOperators.ts +94 -94
  68. package/src/NSARouterMaker.tsx +141 -141
  69. package/src/NSARouterMakerProps.ts +23 -23
  70. package/src/NSARouterMakerResult.ts +24 -24
  71. package/src/NSFRouterMaker.tsx +35 -35
  72. package/src/NSFRouterProps.ts +7 -7
  73. package/src/NSFRoutes.ts +30 -30
  74. package/src/Router.tsx +48 -48
  75. package/src/UseParams.tsx +17 -17
  76. package/src/components/NSAAccessListDialog.module.css +71 -71
  77. package/src/components/NSAAccessListDialog.tsx +178 -178
  78. package/src/components/NSABoxSecret.module.css +23 -23
  79. package/src/components/NSABoxSecret.tsx +264 -264
  80. package/src/components/NSAMasterMenu.module.css +250 -250
  81. package/src/components/NSAMasterMenu.tsx +174 -169
  82. package/src/components/NSAMasterMenuItem.tsx +250 -250
  83. package/src/components/NSAMessageListDialog.module.css +99 -99
  84. package/src/components/NSAMessageListDialog.tsx +144 -144
  85. package/src/components/NSANavigationGuard.tsx +79 -79
  86. package/src/components/NSAProductListDialog.module.css +44 -44
  87. package/src/components/NSAProductListDialog.tsx +88 -88
  88. package/src/components/NSATable.tsx +494 -494
  89. package/src/components/NSATaskBar.module.css +57 -57
  90. package/src/components/NSATaskBar.tsx +193 -193
  91. package/src/components/NSAUserDialog.module.css +67 -67
  92. package/src/components/NSAUserDialog.tsx +122 -122
  93. package/src/components/NSAWorkspaceListDialog.module.css +41 -41
  94. package/src/components/NSAWorkspaceListDialog.tsx +147 -147
  95. package/src/components/NSFBoxCategoryScope.tsx +52 -52
  96. package/src/components/NSFBoxField.tsx +37 -37
  97. package/src/components/NSFBoxSlot.tsx +73 -73
  98. package/src/components/NSFBoxWrapper.tsx +69 -69
  99. package/src/components/NSLabelSecret.tsx +37 -37
  100. package/src/components/quickfilter/NSAFilterBoxBase.tsx +110 -110
  101. package/src/components/quickfilter/NSAFilterBoxBoolean.tsx +72 -72
  102. package/src/components/quickfilter/NSAFilterBoxDate.tsx +110 -110
  103. package/src/components/quickfilter/NSAFilterBoxDateTime.tsx +110 -110
  104. package/src/components/quickfilter/NSAFilterBoxEnum.module.css +51 -51
  105. package/src/components/quickfilter/NSAFilterBoxEnum.tsx +103 -103
  106. package/src/components/quickfilter/NSAFilterBoxNumber.tsx +145 -145
  107. package/src/components/quickfilter/NSAFilterBoxString.tsx +83 -83
  108. package/src/components/quickfilter/NSAFilterBoxTime.tsx +106 -106
  109. package/src/components/quickfilter/NSAQuickFilterBar.module.css +20 -20
  110. package/src/components/quickfilter/NSAQuickFilterBar.tsx +142 -142
  111. package/src/components/quickfilter/NSAQuickFilterDialog.module.css +74 -74
  112. package/src/components/quickfilter/NSAQuickFilterDialog.tsx +297 -297
  113. package/src/css.d.ts +13 -13
  114. package/src/formatters/SecretFormatter.tsx +24 -24
  115. package/src/index.tsx +27 -27
  116. package/src/layouts/Actions.ts +146 -146
  117. package/src/layouts/CFTUtil.ts +18 -18
  118. package/src/layouts/NSALayout.tsx +750 -750
  119. package/src/layouts/NSALayout_Field.ts +125 -125
  120. package/src/layouts/NSASectionEdit.tsx +279 -279
  121. package/src/layouts/NSASectionEditTabPage.module.css +4 -4
  122. package/src/layouts/NSASectionEditTabPage.tsx +256 -256
  123. package/src/layouts/NSASectionList.module.css +24 -24
  124. package/src/layouts/NSASectionList.tsx +165 -165
  125. package/src/layouts/NSASectionView.tsx +98 -98
  126. package/src/layouts/NSASectionViewTabMore.tsx +78 -78
  127. package/src/layouts/NSASectionViewTabPage.module.css +47 -47
  128. package/src/layouts/NSASectionViewTabPage.tsx +400 -400
  129. package/src/main.ts +52 -52
  130. package/src/pages/NSAConsentPage.module.css +26 -26
  131. package/src/pages/NSAConsentPage.tsx +120 -120
  132. package/src/pages/NSAEmailVerificationPage.tsx +30 -30
  133. package/src/pages/NSAHomePage.module.css +41 -41
  134. package/src/pages/NSAHomePage.tsx +113 -113
  135. package/src/pages/NSALoginPage.module.css +26 -26
  136. package/src/pages/NSALoginPage.tsx +87 -87
  137. package/src/pages/NSAPhoneVerificationPage.tsx +106 -106
  138. package/src/pages/NSAVerificationPage.module.css +31 -31
  139. package/src/pages/NSAVerificationPage.tsx +185 -185
  140. package/src/pages/NSFCategoryEditPage.tsx +87 -87
  141. package/src/pages/NSFCategoryListPage.tsx +23 -23
  142. package/src/pages/NSFCategoryViewPage.tsx +23 -23
  143. package/src/pages/NSFEntities.ts +58 -58
  144. package/src/pages/PaymentRequired.tsx +80 -80
  145. package/tsconfig.json +43 -43
@@ -1,114 +1,114 @@
1
- import { ProductFullRow } from 'namirasoft-api-product';
2
- import { SetTimeouService } from 'namirasoft-core';
3
- import { IBaseComponentProps, NSBox, NSBoxSearch, NSLine, NSListProduct, NSListProductCardProps, NSLoading, NSSpace, NSSpaceSizeType, NSTitle, ProductCacheService } from 'namirasoft-site-react';
4
- import { ReactNode, useEffect, useState } from 'react';
5
- import { NSARouterMakerResult } from '../NSARouterMakerResult';
6
- import Styles from './NSAHomePage.module.css';
7
-
8
- export interface NSAHomePageProps extends IBaseComponentProps, NSARouterMakerResult
9
- {
10
- custom?: {
11
- scope?: string;
12
- headline?: string;
13
- logo?: string;
14
- description?: string;
15
- };
16
- show_image?: boolean;
17
- getChildren?: {
18
- getChildrenBeforeTitle?: () => ReactNode;
19
- getChildrenAfterTitle?: () => ReactNode;
20
- };
21
- product?: {
22
- search?: boolean;
23
- getChildrenBefore?: () => NSListProductCardProps[];
24
- getChildrenAfter?: () => NSListProductCardProps[];
25
- }
26
- }
27
-
28
- export interface NSAHomePageState
29
- {
30
- product: ProductFullRow | null;
31
- search_text?: string;
32
- }
33
-
34
- export function NSAHomePage(props: NSAHomePageProps)
35
- {
36
- let cache = ProductCacheService.get(props.product_id, props.notifier.onError);
37
- let [state, setState] = useState<NSAHomePageState>({ product: null });
38
-
39
- useEffect(() =>
40
- {
41
- cache.get().then(product =>
42
- {
43
- setState({ product });
44
- });
45
- // eslint-disable-next-line
46
- }, []);
47
-
48
- if (!state.product)
49
- return <NSLoading title="Loading Namirasoft Product ..." />;
50
-
51
- let scope = props.custom?.scope ?? `${state.product.name} Console`;
52
- let headline = props.custom?.headline ?? state.product.headline ?? "";
53
- let logo = props.custom?.logo ?? state.product.logo ?? "";
54
- let description = props.custom?.description ?? state.product.description ?? "";
55
-
56
- return (
57
- <div className={Styles.nsa_home_container}>
58
- {
59
- props.show_image &&
60
- <img
61
- src={logo}
62
- alt={state.product.name}
63
- width={256}
64
- height={256}
65
- />
66
- }
67
-
68
- {props.getChildren?.getChildrenBeforeTitle?.()}
69
-
70
- <NSSpace size={NSSpaceSizeType.MICRO} />
71
- <h2>{headline}</h2>
72
- <NSSpace size={NSSpaceSizeType.MICRO} />
73
- <p>{description}</p>
74
- <NSSpace size={NSSpaceSizeType.SMALL} />
75
-
76
- {props.getChildren?.getChildrenAfterTitle?.()}
77
-
78
- <NSSpace size={NSSpaceSizeType.NORMAL} />
79
- <NSLine />
80
- <NSSpace size={NSSpaceSizeType.SMALL} />
81
-
82
- <NSTitle title="Related Products" style={{ fontSize: 32, marginBottom: props.product?.search ? 16 : 32 }} />
83
- {
84
- props.product?.search &&
85
- <>
86
- <NSBoxSearch
87
- title=""
88
- required={false}
89
- hideHeader
90
- placeholder="Search products . . ."
91
- classList={[Styles.nsa_home_search_wrapper]}
92
- style={{ width: NSBox.width.double }}
93
- input={{ classList: [Styles.nsa_home_search_box] }}
94
- onChanged={(box) =>
95
- {
96
- new SetTimeouService().setTimeoutIfNotCalledAgain(() =>
97
- {
98
- setState((prev) => ({ ...prev, search_text: box.getValue() ?? "" }));
99
- }, 1500);
100
- }}
101
- />
102
- <NSSpace size={NSSpaceSizeType.SMALL} />
103
- </>
104
- }
105
- <NSListProduct
106
- scope={scope}
107
- name="Home"
108
- search={state.search_text}
109
- getChildrenBefore={props.product?.getChildrenBefore}
110
- getChildrenAfter={props.product?.getChildrenAfter}
111
- />
112
- </div>
113
- );
1
+ import { ProductFullRow } from 'namirasoft-api-product';
2
+ import { SetTimeouService } from 'namirasoft-core';
3
+ import { IBaseComponentProps, NSBox, NSBoxSearch, NSLine, NSListProduct, NSListProductCardProps, NSLoading, NSSpace, NSSpaceSizeType, NSTitle, ProductCacheService } from 'namirasoft-site-react';
4
+ import { ReactNode, useEffect, useState } from 'react';
5
+ import { NSARouterMakerResult } from '../NSARouterMakerResult';
6
+ import Styles from './NSAHomePage.module.css';
7
+
8
+ export interface NSAHomePageProps extends IBaseComponentProps, NSARouterMakerResult
9
+ {
10
+ custom?: {
11
+ scope?: string;
12
+ headline?: string;
13
+ logo?: string;
14
+ description?: string;
15
+ };
16
+ show_image?: boolean;
17
+ getChildren?: {
18
+ getChildrenBeforeTitle?: () => ReactNode;
19
+ getChildrenAfterTitle?: () => ReactNode;
20
+ };
21
+ product?: {
22
+ search?: boolean;
23
+ getChildrenBefore?: () => NSListProductCardProps[];
24
+ getChildrenAfter?: () => NSListProductCardProps[];
25
+ }
26
+ }
27
+
28
+ export interface NSAHomePageState
29
+ {
30
+ product: ProductFullRow | null;
31
+ search_text?: string;
32
+ }
33
+
34
+ export function NSAHomePage(props: NSAHomePageProps)
35
+ {
36
+ let cache = ProductCacheService.get(props.product_id, props.notifier.onError);
37
+ let [state, setState] = useState<NSAHomePageState>({ product: null });
38
+
39
+ useEffect(() =>
40
+ {
41
+ cache.get().then(product =>
42
+ {
43
+ setState({ product });
44
+ });
45
+ // eslint-disable-next-line
46
+ }, []);
47
+
48
+ if (!state.product)
49
+ return <NSLoading title="Loading Namirasoft Product ..." />;
50
+
51
+ let scope = props.custom?.scope ?? `${state.product.name} Console`;
52
+ let headline = props.custom?.headline ?? state.product.headline ?? "";
53
+ let logo = props.custom?.logo ?? state.product.logo ?? "";
54
+ let description = props.custom?.description ?? state.product.description ?? "";
55
+
56
+ return (
57
+ <div className={Styles.nsa_home_container}>
58
+ {
59
+ props.show_image &&
60
+ <img
61
+ src={logo}
62
+ alt={state.product.name}
63
+ width={256}
64
+ height={256}
65
+ />
66
+ }
67
+
68
+ {props.getChildren?.getChildrenBeforeTitle?.()}
69
+
70
+ <NSSpace size={NSSpaceSizeType.MICRO} />
71
+ <h2>{headline}</h2>
72
+ <NSSpace size={NSSpaceSizeType.MICRO} />
73
+ <p>{description}</p>
74
+ <NSSpace size={NSSpaceSizeType.SMALL} />
75
+
76
+ {props.getChildren?.getChildrenAfterTitle?.()}
77
+
78
+ <NSSpace size={NSSpaceSizeType.NORMAL} />
79
+ <NSLine />
80
+ <NSSpace size={NSSpaceSizeType.SMALL} />
81
+
82
+ <NSTitle title="Related Products" style={{ fontSize: 32, marginBottom: props.product?.search ? 16 : 32 }} />
83
+ {
84
+ props.product?.search &&
85
+ <>
86
+ <NSBoxSearch
87
+ title=""
88
+ required={false}
89
+ hideHeader
90
+ placeholder="Search products . . ."
91
+ classList={[Styles.nsa_home_search_wrapper]}
92
+ style={{ width: NSBox.width.double }}
93
+ input={{ classList: [Styles.nsa_home_search_box] }}
94
+ onChanged={(box) =>
95
+ {
96
+ new SetTimeouService().setTimeoutIfNotCalledAgain(() =>
97
+ {
98
+ setState((prev) => ({ ...prev, search_text: box.getValue() ?? "" }));
99
+ }, 1500);
100
+ }}
101
+ />
102
+ <NSSpace size={NSSpaceSizeType.SMALL} />
103
+ </>
104
+ }
105
+ <NSListProduct
106
+ scope={scope}
107
+ name="Home"
108
+ search={state.search_text}
109
+ getChildrenBefore={props.product?.getChildrenBefore}
110
+ getChildrenAfter={props.product?.getChildrenAfter}
111
+ />
112
+ </div>
113
+ );
114
114
  }
@@ -1,27 +1,27 @@
1
- .nsa_login_page_container {
2
- display: flex;
3
- flex-direction: column;
4
- align-items: center;
5
- justify-content: center;
6
- min-height: 100vh;
7
- }
8
-
9
- .nsa_login_page_logo {
10
- text-align: center;
11
- }
12
-
13
- .nsa_login_page_title {
14
- font-size: 32px;
15
- font-weight: 700;
16
- text-align: center;
17
- }
18
-
19
- .nsa_login_page_button {
20
- text-align: center;
21
- }
22
-
23
- .nsa_login_page_version {
24
- position: fixed;
25
- left: 16px;
26
- bottom: 16px;
1
+ .nsa_login_page_container {
2
+ display: flex;
3
+ flex-direction: column;
4
+ align-items: center;
5
+ justify-content: center;
6
+ min-height: 100vh;
7
+ }
8
+
9
+ .nsa_login_page_logo {
10
+ text-align: center;
11
+ }
12
+
13
+ .nsa_login_page_title {
14
+ font-size: 32px;
15
+ font-weight: 700;
16
+ text-align: center;
17
+ }
18
+
19
+ .nsa_login_page_button {
20
+ text-align: center;
21
+ }
22
+
23
+ .nsa_login_page_version {
24
+ position: fixed;
25
+ left: 16px;
26
+ bottom: 16px;
27
27
  }
@@ -1,88 +1,88 @@
1
- import { useEffect, useState } from 'react';
2
- import { EnvService, PackageService } from 'namirasoft-core';
3
- import { NSSpace, NSSpaceSizeType, NSButtonBlue, IBackgroundProps, NSLoading, ProductCacheService } from 'namirasoft-site-react';
4
- import Styles from './NSALoginPage.module.css';
5
- import { NamirasoftAccountClient } from 'namirasoft-account-client';
6
- import { ProductFullRow } from 'namirasoft-api-product';
7
-
8
- export interface NSALoginPageProps
9
- {
10
- product_id: string;
11
- custom?: {
12
- name?: string;
13
- logo?: string;
14
- background?: IBackgroundProps;
15
- };
16
- children?: React.JSX.Element;
17
- }
18
- export interface NSALoginPageState
19
- {
20
- product: ProductFullRow | null;
21
- }
22
-
23
- let REACT_APP_BASE_URL_ACCOUNT_CONSOLE = new EnvService("REACT_APP_BASE_URL_ACCOUNT_CONSOLE").getString();
24
- let client = new NamirasoftAccountClient(REACT_APP_BASE_URL_ACCOUNT_CONSOLE);
25
-
26
- export function NSALoginPage(props: NSALoginPageProps)
27
- {
28
- let cache = ProductCacheService.get(props.product_id, console.error);
29
- let [state, setState] = useState<NSALoginPageState>({ product: null });
30
-
31
- useEffect(() =>
32
- {
33
- cache.get().then(product =>
34
- {
35
- setState({ product });
36
- })
37
-
38
- client.onLoggedin = () => { window.location.reload(); };
39
- client.onLoggedout = () => { window.location.reload(); };
40
-
41
- client.start();
42
-
43
- return () => { client.stop(); };
44
-
45
- // eslint-disable-next-line
46
- }, []);
47
-
48
- if (!state.product)
49
- return <NSLoading title="Loading Namirasoft Product ..." />;
50
-
51
- let name = props.custom?.name ?? state.product.name ?? "";
52
- let logo = props.custom?.logo ?? state.product.logo ?? "";
53
- let background = props.custom?.background ?? state.product.background;
54
-
55
- return (
56
- <div
57
- style={{
58
- width: '100%',
59
- background: background ? `url(${background})` : "",
60
- backgroundSize: props.custom?.background?.size ?? "cover",
61
- backgroundAttachment: props.custom?.background?.attachment ?? "fixed"
62
- }}
63
- >
64
- <div className={`container ${Styles.nsa_login_page_container}`}>
65
- <div className={Styles.nsa_login_page_logo}>
66
- <img width={256} height={256} src={logo} alt={`${name} Logo`} />
67
- </div>
68
- <NSSpace size={NSSpaceSizeType.SMALL} />
69
- <div>
70
- <h1 className={Styles.nsa_login_page_title}>{name}</h1>
71
- </div>
72
- <NSSpace size={NSSpaceSizeType.LARGE} />
73
- <NSButtonBlue
74
- title="Login"
75
- onClick={{
76
- action: () =>
77
- {
78
- client.login();
79
- },
80
- showLoading: false
81
- }}
82
- />
83
- {props.children}
84
- </div>
85
- <span className={Styles.nsa_login_page_version}>Version: {PackageService.MainJson?.version}</span>
86
- </div>
87
- );
1
+ import { useEffect, useState } from 'react';
2
+ import { EnvService, PackageService } from 'namirasoft-core';
3
+ import { NSSpace, NSSpaceSizeType, NSButtonBlue, IBackgroundProps, NSLoading, ProductCacheService } from 'namirasoft-site-react';
4
+ import Styles from './NSALoginPage.module.css';
5
+ import { NamirasoftAccountClient } from 'namirasoft-account-client';
6
+ import { ProductFullRow } from 'namirasoft-api-product';
7
+
8
+ export interface NSALoginPageProps
9
+ {
10
+ product_id: string;
11
+ custom?: {
12
+ name?: string;
13
+ logo?: string;
14
+ background?: IBackgroundProps;
15
+ };
16
+ children?: React.JSX.Element;
17
+ }
18
+ export interface NSALoginPageState
19
+ {
20
+ product: ProductFullRow | null;
21
+ }
22
+
23
+ let REACT_APP_BASE_URL_ACCOUNT_CONSOLE = new EnvService("REACT_APP_BASE_URL_ACCOUNT_CONSOLE").getString();
24
+ let client = new NamirasoftAccountClient(REACT_APP_BASE_URL_ACCOUNT_CONSOLE);
25
+
26
+ export function NSALoginPage(props: NSALoginPageProps)
27
+ {
28
+ let cache = ProductCacheService.get(props.product_id, console.error);
29
+ let [state, setState] = useState<NSALoginPageState>({ product: null });
30
+
31
+ useEffect(() =>
32
+ {
33
+ cache.get().then(product =>
34
+ {
35
+ setState({ product });
36
+ })
37
+
38
+ client.onLoggedin = () => { window.location.reload(); };
39
+ client.onLoggedout = () => { window.location.reload(); };
40
+
41
+ client.start();
42
+
43
+ return () => { client.stop(); };
44
+
45
+ // eslint-disable-next-line
46
+ }, []);
47
+
48
+ if (!state.product)
49
+ return <NSLoading title="Loading Namirasoft Product ..." />;
50
+
51
+ let name = props.custom?.name ?? state.product.name ?? "";
52
+ let logo = props.custom?.logo ?? state.product.logo ?? "";
53
+ let background = props.custom?.background ?? state.product.background;
54
+
55
+ return (
56
+ <div
57
+ style={{
58
+ width: '100%',
59
+ background: background ? `url(${background})` : "",
60
+ backgroundSize: props.custom?.background?.size ?? "cover",
61
+ backgroundAttachment: props.custom?.background?.attachment ?? "fixed"
62
+ }}
63
+ >
64
+ <div className={`container ${Styles.nsa_login_page_container}`}>
65
+ <div className={Styles.nsa_login_page_logo}>
66
+ <img width={256} height={256} src={logo} alt={`${name} Logo`} />
67
+ </div>
68
+ <NSSpace size={NSSpaceSizeType.SMALL} />
69
+ <div>
70
+ <h1 className={Styles.nsa_login_page_title}>{name}</h1>
71
+ </div>
72
+ <NSSpace size={NSSpaceSizeType.LARGE} />
73
+ <NSButtonBlue
74
+ title="Login"
75
+ onClick={{
76
+ action: () =>
77
+ {
78
+ client.login();
79
+ },
80
+ showLoading: false
81
+ }}
82
+ />
83
+ {props.children}
84
+ </div>
85
+ <span className={Styles.nsa_login_page_version}>Version: {PackageService.MainJson?.version}</span>
86
+ </div>
87
+ );
88
88
  }
@@ -1,107 +1,107 @@
1
- import { NSDialogBoxPhone } from "namirasoft-site-react";
2
- import { useEffect, useState } from "react";
3
- import { NSARouterMakerResult } from "../NSARouterMakerResult";
4
- import { NSAVerificationPage } from "./NSAVerificationPage";
5
-
6
- interface NSAPhoneVerificationPageProps extends NSARouterMakerResult
7
- {
8
- callback: string;
9
- }
10
-
11
- interface NSAPhoneVerificationPageState
12
- {
13
- show_dialog: boolean;
14
- }
15
-
16
- export function NSAPhoneVerificationPage(props: NSAPhoneVerificationPageProps)
17
- {
18
- const [state, setState] = useState<NSAPhoneVerificationPageState>({ show_dialog: false });
19
-
20
- let is_phone_exist = !!props.account.token_manager.get()?.user?.phone;
21
-
22
- useEffect(() =>
23
- {
24
- if (is_phone_exist)
25
- return;
26
-
27
- props.notifier.onWarning("Please enter your phone number before verifying.");
28
- let timer = setTimeout(() => setDialog(true), 2500);
29
-
30
- return () =>
31
- {
32
- clearTimeout(timer);
33
- };
34
- // eslint-disable-next-line
35
- }, []);
36
-
37
- const setDialog = (show: boolean) =>
38
- {
39
- setState((prev) => ({ ...prev, show_dialog: show }));
40
- };
41
-
42
- return (
43
- <>
44
- <NSAVerificationPage
45
- {...props}
46
- contact_type="SMS"
47
- contact_value_name="Phone Number"
48
- getContactValue={() => props.account.token_manager.get()?.user?.phone || ""}
49
- onRequest={async () =>
50
- {
51
- await props.account.server.phone.Request();
52
- }}
53
- onVerify={async (code) =>
54
- {
55
- await props.account.server.phone.Verify({ code });
56
- }}
57
- onChange={() => setDialog(true)}
58
- onFinished={() => props.url.redirect(props.callback, {})}
59
- />
60
- {
61
- state.show_dialog &&
62
- <NSDialogBoxPhone
63
- box={{
64
- required: true,
65
- title: "Phone Number",
66
- defaultValue: props.account.token_manager.get()?.user?.phone ?? ""
67
- }}
68
- closeButton={{ show: is_phone_exist }}
69
- onClose={() => is_phone_exist ? setDialog(false) : undefined}
70
- button={{
71
- title: "Apply",
72
- onClick: {
73
- action: async (onFinished, box) =>
74
- {
75
- let phone: string;
76
- try
77
- {
78
- phone = box?.getValue() ?? "";
79
- } catch (error)
80
- {
81
- // Input validation errors are not reported by the server, so notify here.
82
- props.notifier.onError(error as Error);
83
- onFinished();
84
- return;
85
- }
86
-
87
- try
88
- {
89
- await props.account.server.phone.Set({ phone });
90
- props.notifier.onSuccess("Your phone number has been added successfully.");
91
- setDialog(false);
92
- } catch
93
- {
94
- // The server already reported the error through the notifier.
95
- onFinished();
96
- }
97
- }
98
- }
99
- }}
100
-
101
- >
102
- <></>
103
- </NSDialogBoxPhone >
104
- }
105
- </>
106
- );
1
+ import { NSDialogBoxPhone } from "namirasoft-site-react";
2
+ import { useEffect, useState } from "react";
3
+ import { NSARouterMakerResult } from "../NSARouterMakerResult";
4
+ import { NSAVerificationPage } from "./NSAVerificationPage";
5
+
6
+ interface NSAPhoneVerificationPageProps extends NSARouterMakerResult
7
+ {
8
+ callback: string;
9
+ }
10
+
11
+ interface NSAPhoneVerificationPageState
12
+ {
13
+ show_dialog: boolean;
14
+ }
15
+
16
+ export function NSAPhoneVerificationPage(props: NSAPhoneVerificationPageProps)
17
+ {
18
+ const [state, setState] = useState<NSAPhoneVerificationPageState>({ show_dialog: false });
19
+
20
+ let is_phone_exist = !!props.account.token_manager.get()?.user?.phone;
21
+
22
+ useEffect(() =>
23
+ {
24
+ if (is_phone_exist)
25
+ return;
26
+
27
+ props.notifier.onWarning("Please enter your phone number before verifying.");
28
+ let timer = setTimeout(() => setDialog(true), 2500);
29
+
30
+ return () =>
31
+ {
32
+ clearTimeout(timer);
33
+ };
34
+ // eslint-disable-next-line
35
+ }, []);
36
+
37
+ const setDialog = (show: boolean) =>
38
+ {
39
+ setState((prev) => ({ ...prev, show_dialog: show }));
40
+ };
41
+
42
+ return (
43
+ <>
44
+ <NSAVerificationPage
45
+ {...props}
46
+ contact_type="SMS"
47
+ contact_value_name="Phone Number"
48
+ getContactValue={() => props.account.token_manager.get()?.user?.phone || ""}
49
+ onRequest={async () =>
50
+ {
51
+ await props.account.server.phone.Request();
52
+ }}
53
+ onVerify={async (code) =>
54
+ {
55
+ await props.account.server.phone.Verify({ code });
56
+ }}
57
+ onChange={() => setDialog(true)}
58
+ onFinished={() => props.url.redirect(props.callback, {})}
59
+ />
60
+ {
61
+ state.show_dialog &&
62
+ <NSDialogBoxPhone
63
+ box={{
64
+ required: true,
65
+ title: "Phone Number",
66
+ defaultValue: props.account.token_manager.get()?.user?.phone ?? ""
67
+ }}
68
+ closeButton={{ show: is_phone_exist }}
69
+ onClose={() => is_phone_exist ? setDialog(false) : undefined}
70
+ button={{
71
+ title: "Apply",
72
+ onClick: {
73
+ action: async (onFinished, box) =>
74
+ {
75
+ let phone: string;
76
+ try
77
+ {
78
+ phone = box?.getValue() ?? "";
79
+ } catch (error)
80
+ {
81
+ // Input validation errors are not reported by the server, so notify here.
82
+ props.notifier.onError(error as Error);
83
+ onFinished();
84
+ return;
85
+ }
86
+
87
+ try
88
+ {
89
+ await props.account.server.phone.Set({ phone });
90
+ props.notifier.onSuccess("Your phone number has been added successfully.");
91
+ setDialog(false);
92
+ } catch
93
+ {
94
+ // The server already reported the error through the notifier.
95
+ onFinished();
96
+ }
97
+ }
98
+ }
99
+ }}
100
+
101
+ >
102
+ <></>
103
+ </NSDialogBoxPhone >
104
+ }
105
+ </>
106
+ );
107
107
  };