@wavemaker/app-rn-runtime 11.14.1-32.647748 → 11.14.1-33.647787

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 (184) hide show
  1. package/components/advanced/carousel/carousel.component.js +1 -1
  2. package/components/advanced/carousel/carousel.component.js.map +1 -1
  3. package/components/advanced/webview/webview.component.js +1 -1
  4. package/components/advanced/webview/webview.component.js.map +1 -1
  5. package/components/basic/bottomsheet/bottomsheet.component.js +240 -33
  6. package/components/basic/bottomsheet/bottomsheet.component.js.map +1 -1
  7. package/components/basic/bottomsheet/bottomsheet.styles.js +0 -3
  8. package/components/basic/bottomsheet/bottomsheet.styles.js.map +1 -1
  9. package/components/basic/label/label.component.js +13 -24
  10. package/components/basic/label/label.component.js.map +1 -1
  11. package/components/basic/label/label.props.js +1 -0
  12. package/components/basic/label/label.props.js.map +1 -1
  13. package/components/basic/progress-circle/progress-circle.component.js +3 -3
  14. package/components/basic/progress-circle/progress-circle.component.js.map +1 -1
  15. package/components/chart/area-chart/area-chart.component.js +27 -10
  16. package/components/chart/area-chart/area-chart.component.js.map +1 -1
  17. package/components/chart/bar-chart/bar-chart.component.js +39 -7
  18. package/components/chart/bar-chart/bar-chart.component.js.map +1 -1
  19. package/components/chart/bar-chart/bar-chart.props.js +1 -0
  20. package/components/chart/bar-chart/bar-chart.props.js.map +1 -1
  21. package/components/chart/basechart.component.js +8 -15
  22. package/components/chart/basechart.component.js.map +1 -1
  23. package/components/chart/basechart.props.js +1 -0
  24. package/components/chart/basechart.props.js.map +1 -1
  25. package/components/chart/bubble-chart/bubble-chart.component.js +23 -6
  26. package/components/chart/bubble-chart/bubble-chart.component.js.map +1 -1
  27. package/components/chart/line-chart/line-chart.component.js +22 -5
  28. package/components/chart/line-chart/line-chart.component.js.map +1 -1
  29. package/components/chart/pie-chart/pie-chart.component.js +15 -4
  30. package/components/chart/pie-chart/pie-chart.component.js.map +1 -1
  31. package/components/chart/stack-chart/stack-chart.component.js +1 -1
  32. package/components/chart/stack-chart/stack-chart.component.js.map +1 -1
  33. package/components/container/accordion/accordionpane/accordionpane.component.js +6 -4
  34. package/components/container/accordion/accordionpane/accordionpane.component.js.map +1 -1
  35. package/components/container/container.component.js +207 -14
  36. package/components/container/container.component.js.map +1 -1
  37. package/components/container/container.props.js +6 -0
  38. package/components/container/container.props.js.map +1 -1
  39. package/components/container/linearlayout/linearlayoutitem/linearlayoutitem.component.js +32 -4
  40. package/components/container/linearlayout/linearlayoutitem/linearlayoutitem.component.js.map +1 -1
  41. package/components/container/linearlayout/linearlayoutitem/linearlayoutitem.props.js +1 -0
  42. package/components/container/linearlayout/linearlayoutitem/linearlayoutitem.props.js.map +1 -1
  43. package/components/container/panel/panel.component.js +1 -1
  44. package/components/container/panel/panel.component.js.map +1 -1
  45. package/components/container/tabs/tabpane/tabpane.component.js +1 -1
  46. package/components/container/tabs/tabpane/tabpane.component.js.map +1 -1
  47. package/components/container/tabs/tabs.component.js +62 -29
  48. package/components/container/tabs/tabs.component.js.map +1 -1
  49. package/components/container/tabs/tabs.props.js +1 -0
  50. package/components/container/tabs/tabs.props.js.map +1 -1
  51. package/components/container/wizard/wizard.component.js +3 -5
  52. package/components/container/wizard/wizard.component.js.map +1 -1
  53. package/components/container/wizard/wizard.props.js +0 -1
  54. package/components/container/wizard/wizard.props.js.map +1 -1
  55. package/components/container/wizard/wizard.styles.js +3 -1
  56. package/components/container/wizard/wizard.styles.js.map +1 -1
  57. package/components/container/wizard/wizardstep/wizardstep.component.js +4 -23
  58. package/components/container/wizard/wizardstep/wizardstep.component.js.map +1 -1
  59. package/components/container/wizard/wizardstep/wizardstep.props.js +0 -2
  60. package/components/container/wizard/wizardstep/wizardstep.props.js.map +1 -1
  61. package/components/data/form/form-field/form-field.component.js +26 -1
  62. package/components/data/form/form-field/form-field.component.js.map +1 -1
  63. package/components/data/form/form-field/form-field.props.js +3 -0
  64. package/components/data/form/form-field/form-field.props.js.map +1 -1
  65. package/components/data/form/form.component.js +11 -3
  66. package/components/data/form/form.component.js.map +1 -1
  67. package/components/data/form/form.props.js +1 -0
  68. package/components/data/form/form.props.js.map +1 -1
  69. package/components/data/list/list.component.js +6 -3
  70. package/components/data/list/list.component.js.map +1 -1
  71. package/components/dialogs/dialog/dialog.component.js +1 -1
  72. package/components/dialogs/dialog/dialog.component.js.map +1 -1
  73. package/components/dialogs/dialogcontent/dialogcontent.component.js +1 -2
  74. package/components/dialogs/dialogcontent/dialogcontent.component.js.map +1 -1
  75. package/components/input/baseinput/baseinput.component.js +30 -3
  76. package/components/input/baseinput/baseinput.component.js.map +1 -1
  77. package/components/input/baseinput/baseinput.props.js +1 -0
  78. package/components/input/baseinput/baseinput.props.js.map +1 -1
  79. package/components/input/basenumber/basenumber.component.js +18 -3
  80. package/components/input/basenumber/basenumber.component.js.map +1 -1
  81. package/components/input/basenumber/basenumber.props.js +2 -0
  82. package/components/input/basenumber/basenumber.props.js.map +1 -1
  83. package/components/input/calendar/calendar.component.js +5 -1
  84. package/components/input/calendar/calendar.component.js.map +1 -1
  85. package/components/input/calendar/views/month-view.js +8 -1
  86. package/components/input/calendar/views/month-view.js.map +1 -1
  87. package/components/input/checkboxset/checkboxset.component.js +2 -2
  88. package/components/input/checkboxset/checkboxset.component.js.map +1 -1
  89. package/components/input/currency/currency.component.js +2 -0
  90. package/components/input/currency/currency.component.js.map +1 -1
  91. package/components/input/currency/currency.styles.js +10 -1
  92. package/components/input/currency/currency.styles.js.map +1 -1
  93. package/components/input/epoch/wheelpickermodal/date/date-picker-modal.component.js +6 -1
  94. package/components/input/epoch/wheelpickermodal/date/date-picker-modal.component.js.map +1 -1
  95. package/components/input/epoch/wheelpickermodal/time/time-picker-modal.component.js +6 -1
  96. package/components/input/epoch/wheelpickermodal/time/time-picker-modal.component.js.map +1 -1
  97. package/components/input/number/number.component.js +2 -0
  98. package/components/input/number/number.component.js.map +1 -1
  99. package/components/input/number/number.styles.js +4 -0
  100. package/components/input/number/number.styles.js.map +1 -1
  101. package/components/input/radioset/radioset.component.js +4 -6
  102. package/components/input/radioset/radioset.component.js.map +1 -1
  103. package/components/input/text/text.component.js +13 -2
  104. package/components/input/text/text.component.js.map +1 -1
  105. package/components/input/text/text.props.js +1 -1
  106. package/components/input/text/text.props.js.map +1 -1
  107. package/components/input/text/text.styles.js +17 -0
  108. package/components/input/text/text.styles.js.map +1 -1
  109. package/components/input/textarea/textarea.component.js +3 -2
  110. package/components/input/textarea/textarea.component.js.map +1 -1
  111. package/components/input/textarea/textarea.styles.js +4 -0
  112. package/components/input/textarea/textarea.styles.js.map +1 -1
  113. package/components/page/left-panel/left-panel.component.js +1 -1
  114. package/components/page/left-panel/left-panel.component.js.map +1 -1
  115. package/components/page/page-content/page-content.component.js +157 -17
  116. package/components/page/page-content/page-content.component.js.map +1 -1
  117. package/components/page/page-content/page-content.props.js +4 -0
  118. package/components/page/page-content/page-content.props.js.map +1 -1
  119. package/components/page/page-content/pull-to-refresh.component.js +288 -0
  120. package/components/page/page-content/pull-to-refresh.component.js.map +1 -0
  121. package/core/AppConfig.js.map +1 -1
  122. package/core/base.component.js +37 -5
  123. package/core/base.component.js.map +1 -1
  124. package/core/components/error-fallback/error-fallback.component.js +18 -50
  125. package/core/components/error-fallback/error-fallback.component.js.map +1 -1
  126. package/core/components/error-fallback/error-fallback.styles.js +1 -4
  127. package/core/components/error-fallback/error-fallback.styles.js.map +1 -1
  128. package/core/components/textinput.component.js +27 -8
  129. package/core/components/textinput.component.js.map +1 -1
  130. package/core/environment.js +25 -0
  131. package/core/environment.js.map +1 -0
  132. package/core/error-boundary.component.js +2 -46
  133. package/core/error-boundary.component.js.map +1 -1
  134. package/core/fixed-view.component.js +19 -2
  135. package/core/fixed-view.component.js.map +1 -1
  136. package/core/sticky-wrapper.js +37 -34
  137. package/core/sticky-wrapper.js.map +1 -1
  138. package/core/tappable.component.js +110 -16
  139. package/core/tappable.component.js.map +1 -1
  140. package/core/viewport.js +13 -8
  141. package/core/viewport.js.map +1 -1
  142. package/gestures/carousel-swipe.animation.js +1 -1
  143. package/gestures/carousel-swipe.animation.js.map +1 -1
  144. package/npm-shrinkwrap.json +383 -219
  145. package/package-lock.json +383 -219
  146. package/package.json +5 -6
  147. package/runtime/App.js +31 -181
  148. package/runtime/App.js.map +1 -1
  149. package/runtime/App.navigator.js +1 -4
  150. package/runtime/App.navigator.js.map +1 -1
  151. package/runtime/base-fragment.component.js +29 -5
  152. package/runtime/base-fragment.component.js.map +1 -1
  153. package/runtime/base-page.component.js +4 -12
  154. package/runtime/base-page.component.js.map +1 -1
  155. package/runtime/navigator/drawer.navigator.js +2 -0
  156. package/runtime/navigator/drawer.navigator.js.map +1 -1
  157. package/runtime/navigator/stack.navigator.js +17 -2
  158. package/runtime/navigator/stack.navigator.js.map +1 -1
  159. package/runtime/services/app-security.service.js +19 -40
  160. package/runtime/services/app-security.service.js.map +1 -1
  161. package/runtime/services/device/scan-service.js +12 -34
  162. package/runtime/services/device/scan-service.js.map +1 -1
  163. package/runtime/services/webprocess.service.js +3 -8
  164. package/runtime/services/webprocess.service.js.map +1 -1
  165. package/styles/background.component.js +61 -2
  166. package/styles/background.component.js.map +1 -1
  167. package/styles/style-prop.validator.js +4 -0
  168. package/styles/style-prop.validator.js.map +1 -1
  169. package/styles/style-props.js +2 -0
  170. package/styles/style-props.js.map +1 -1
  171. package/styles/theme.js +27 -2
  172. package/styles/theme.js.map +1 -1
  173. package/styles/theme.variables.js +2 -0
  174. package/styles/theme.variables.js.map +1 -1
  175. package/core/advanced-promise-rejection-tracker.js +0 -207
  176. package/core/advanced-promise-rejection-tracker.js.map +0 -1
  177. package/core/global-error-handler.service.js +0 -177
  178. package/core/global-error-handler.service.js.map +0 -1
  179. package/runtime/services/browser.constants.js +0 -3
  180. package/runtime/services/browser.constants.js.map +0 -1
  181. package/runtime/services/browser.service.js +0 -321
  182. package/runtime/services/browser.service.js.map +0 -1
  183. package/runtime/services/external-auth-callback.service.js +0 -44
  184. package/runtime/services/external-auth-callback.service.js.map +0 -1
@@ -1,321 +0,0 @@
1
- import React from 'react';
2
- import { Dimensions, Linking, Text, TouchableOpacity, View } from 'react-native';
3
- import * as WebBrowser from 'expo-web-browser';
4
- import WmWebview from '@wavemaker/app-rn-runtime/components/advanced/webview/webview.component';
5
- import injector from '@wavemaker/app-rn-runtime/core/injector';
6
- import { isWebPreviewMode } from '@wavemaker/app-rn-runtime/core/utils';
7
- import AppDisplayManagerService from './app-display-manager.service';
8
- import { AUTH_CALLBACK_PATH } from './browser.constants';
9
- import ExternalAuthCallbackService from './external-auth-callback.service';
10
-
11
- /** Where native SSO login runs: private/persistent in-app WebView, or auth_session (system browser, needed to share login with other apps). */
12
-
13
- /** Friendly keys for the widget's Target property (_blank/_self/_top/_parent) — see TARGET_LABELS. */
14
-
15
- /** Maps the widget's raw Target property value to targetMapping's friendly key. */
16
- export const TARGET_LABELS = {
17
- '_blank': 'newWindow',
18
- '_self': 'sameWindow',
19
- '_top': 'topWindow',
20
- '_parent': 'parentWindow'
21
- };
22
- // Default auth_session timeout. Plain JS setTimeout — doesn't tick while the app is
23
- // backgrounded, so it only "expires" once the user returns to the app.
24
- export const EXTERNAL_AUTH_TIMEOUT_MS = 120000;
25
-
26
- // Matches pre-existing behavior: only newWindow (_blank) used custom_tabs; everything else defaulted to external.
27
- export const DEFAULT_BROWSER_CONFIG = {
28
- defaultLinkMode: 'external',
29
- authMode: 'in_app_webview_private',
30
- shareAuthSessionWithLinks: false,
31
- targetMapping: {
32
- newWindow: 'custom_tabs',
33
- sameWindow: 'external',
34
- topWindow: 'external',
35
- parentWindow: 'external'
36
- },
37
- authTimeoutMs: EXTERNAL_AUTH_TIMEOUT_MS
38
- };
39
- try {
40
- var _WebBrowser$maybeComp;
41
- (_WebBrowser$maybeComp = WebBrowser.maybeCompleteAuthSession) === null || _WebBrowser$maybeComp === void 0 || _WebBrowser$maybeComp.call(WebBrowser);
42
- } catch (e) {
43
- // Native builds do not need this; web auth-session completion is best-effort.
44
- }
45
- export function normalizeOpenOptions(params = {}) {
46
- if (typeof params === 'string') {
47
- return {
48
- target: params
49
- };
50
- }
51
- return params || {};
52
- }
53
- export function getBrowserConfig(appConfig) {
54
- var _preferences, _raw$shareAuthSession;
55
- const raw = (appConfig === null || appConfig === void 0 ? void 0 : appConfig.browserConfig) || (appConfig === null || appConfig === void 0 || (_preferences = appConfig.preferences) === null || _preferences === void 0 ? void 0 : _preferences.browserConfig) || {};
56
- return {
57
- defaultLinkMode: raw.defaultLinkMode || DEFAULT_BROWSER_CONFIG.defaultLinkMode,
58
- authMode: raw.authMode || DEFAULT_BROWSER_CONFIG.authMode,
59
- shareAuthSessionWithLinks: (_raw$shareAuthSession = raw.shareAuthSessionWithLinks) !== null && _raw$shareAuthSession !== void 0 ? _raw$shareAuthSession : raw.authMode === 'auth_session',
60
- targetMapping: {
61
- ...DEFAULT_BROWSER_CONFIG.targetMapping,
62
- ...(raw.targetMapping || {})
63
- },
64
- authTimeoutMs: raw.authTimeoutMs || DEFAULT_BROWSER_CONFIG.authTimeoutMs
65
- };
66
- }
67
-
68
- /** Flags passed to WebProcessService.execute for native SSO. */
69
- export function getSsoBrowserFlags(config = DEFAULT_BROWSER_CONFIG) {
70
- return {
71
- useSystemBrowser: config.authMode === 'auth_session',
72
- incognito: config.authMode === 'in_app_webview_private'
73
- };
74
- }
75
-
76
- /** True when SSO should leave the app (Safari/Chrome) instead of Custom Tabs. */
77
- export function shouldOpenAuthInExternalBrowser(config = DEFAULT_BROWSER_CONFIG) {
78
- return config.authMode === 'auth_session' && config.defaultLinkMode === 'external';
79
- }
80
- export function resolveLinkMode(options = {}, config = DEFAULT_BROWSER_CONFIG) {
81
- if (options.mode && options.mode !== 'auth_session') {
82
- return coerceSharedJar(options.mode, config);
83
- }
84
- const target = options.target;
85
- const label = target && TARGET_LABELS[target];
86
- if (label) {
87
- const mapped = config.targetMapping[label];
88
- if (mapped) {
89
- return coerceSharedJar(mapped, config);
90
- }
91
- }
92
- return coerceSharedJar(config.defaultLinkMode, config);
93
- }
94
- function coerceSharedJar(mode, config) {
95
- if (config.shareAuthSessionWithLinks && config.authMode === 'auth_session' && mode === 'in_app_webview') {
96
- return 'custom_tabs';
97
- }
98
- return mode;
99
- }
100
- export function extractProcessOutput(callbackUrl) {
101
- if (!callbackUrl) {
102
- return null;
103
- }
104
- const readParam = name => {
105
- const match = callbackUrl.match(new RegExp('[?&#]' + name + '=([^&#]*)', 'i'));
106
- if (!match) {
107
- return null;
108
- }
109
- return decodeURIComponent(match[1].replace(/\+/g, ' '));
110
- };
111
- return readParam('process_output') || readParam('encodedProcessdata') || readParam('encodedProcessData');
112
- }
113
-
114
- /** Builds `{appId}://services/webprocess/{process}` — the only callback shape WM Server produces. */
115
- export function getAuthReturnUrl(appConfig, override, process) {
116
- if (override) {
117
- return override;
118
- }
119
- if (!(appConfig !== null && appConfig !== void 0 && appConfig.appId)) {
120
- console.warn('[BrowserService] appConfig.appId is missing; the SSO callback scheme will not match this app. Check bootstrap ordering or project config.');
121
- }
122
- const appId = (appConfig === null || appConfig === void 0 ? void 0 : appConfig.appId) || 'app';
123
- return `${appId}://${AUTH_CALLBACK_PATH}${process || ''}`;
124
- }
125
- export function matchesAuthCallbackUrl(callbackUrl, returnUrl) {
126
- if (!callbackUrl) {
127
- return false;
128
- }
129
- if (!returnUrl) {
130
- // No specific attempt to compare against; recognize any webprocess callback by prefix.
131
- const path = callbackUrl.split(/[?#]/)[0].replace(/^[^:]+:\/\//, '');
132
- return path.startsWith(AUTH_CALLBACK_PATH);
133
- }
134
- // Exact path match (ignoring query/fragment) so a similar-prefixed URL isn't mismatched.
135
- const normalizedReturnUrl = returnUrl.split(/[?#]/)[0];
136
- const normalizedCallbackUrl = callbackUrl.split(/[?#]/)[0];
137
- return normalizedCallbackUrl === normalizedReturnUrl;
138
- }
139
- /** Classify a root Linking URL so the app entry can decide how to use it. */
140
- export function classifyExternalLaunchUrl(url, appConfig) {
141
- if (!url || /^https?:/i.test(url)) {
142
- return {
143
- type: 'none'
144
- };
145
- }
146
- // No process known yet (cold-boot launch); recognize any webprocess callback by prefix.
147
- if (matchesAuthCallbackUrl(url)) {
148
- return {
149
- type: 'auth-callback',
150
- url,
151
- processOutput: extractProcessOutput(url)
152
- };
153
- }
154
- return {
155
- type: 'deep-link',
156
- url
157
- };
158
- }
159
-
160
- /** Forward a root launch URL into the shared auth callback store. */
161
- export function captureExternalLaunchUrl(url, appConfig) {
162
- const launch = classifyExternalLaunchUrl(url, appConfig);
163
- if (launch.type !== 'none') {
164
- ExternalAuthCallbackService.capture(url);
165
- }
166
- return launch;
167
- }
168
- class BrowserService {
169
- getAppConfig() {
170
- try {
171
- return injector.get('APP_CONFIG');
172
- } catch (e) {
173
- return null;
174
- }
175
- }
176
- getConfig() {
177
- return getBrowserConfig(this.getAppConfig());
178
- }
179
- open(url, params = {}) {
180
- if (!url) {
181
- return Promise.resolve();
182
- }
183
- const options = normalizeOpenOptions(params);
184
- if (isWebPreviewMode()) {
185
- if (typeof window !== 'undefined') {
186
- window.open(url, '_blank');
187
- }
188
- return Promise.resolve();
189
- }
190
- if (options.mode === 'auth_session') {
191
- return this.openAuthSession(url, options.returnUrl);
192
- }
193
- if (!/^https?:/i.test(url)) {
194
- return Linking.openURL(url);
195
- }
196
- const mode = resolveLinkMode(options, this.getConfig());
197
- switch (mode) {
198
- case 'external':
199
- return Linking.openURL(url);
200
- case 'in_app_webview':
201
- return this.openInAppWebView(url, !!options.incognito);
202
- case 'custom_tabs':
203
- default:
204
- return WebBrowser.openBrowserAsync(url);
205
- }
206
- }
207
- openAuthSession(startUrl, returnUrl, process) {
208
- const appConfig = this.getAppConfig();
209
- const redirectUrl = getAuthReturnUrl(appConfig, returnUrl, process);
210
- const config = this.getConfig();
211
- if (shouldOpenAuthInExternalBrowser(config)) {
212
- return this.openAuthSessionInExternalBrowser(startUrl, redirectUrl, config.authTimeoutMs);
213
- }
214
- return WebBrowser.openAuthSessionAsync(startUrl, redirectUrl, {
215
- preferEphemeralSession: false
216
- }).then(result => {
217
- if ((result === null || result === void 0 ? void 0 : result.type) === 'success' && result.url) {
218
- const output = extractProcessOutput(result.url);
219
- if (!output) {
220
- return Promise.reject(new Error('Authentication completed without process output'));
221
- }
222
- return output;
223
- }
224
- return Promise.reject(new Error('Authentication session cancelled'));
225
- });
226
- }
227
-
228
- /** Full Safari/Chrome via Linking.openURL, completes via redirectUrl (already resolved to this attempt's specific process). */
229
- openAuthSessionInExternalBrowser(startUrl, redirectUrl, timeoutMs = EXTERNAL_AUTH_TIMEOUT_MS) {
230
- // Only accept callbacks captured after this attempt started, so a stale callback from an abandoned attempt isn't reused.
231
- const attemptStartedAt = Date.now();
232
- const cachedUrl = ExternalAuthCallbackService.takeUrl((url, capturedAt) => matchesAuthCallbackUrl(url, redirectUrl) && capturedAt >= attemptStartedAt, timeoutMs);
233
- if (cachedUrl) {
234
- const cachedOutput = extractProcessOutput(cachedUrl);
235
- if (cachedOutput) {
236
- return Promise.resolve(cachedOutput);
237
- }
238
- }
239
- return new Promise((resolve, reject) => {
240
- let settled = false;
241
- const timeoutId = setTimeout(() => {
242
- finish(new Error(`Authentication session timed out after ${timeoutMs}ms`));
243
- }, timeoutMs);
244
- const finish = (error, output) => {
245
- if (settled) {
246
- return;
247
- }
248
- settled = true;
249
- clearTimeout(timeoutId);
250
- subscription.remove();
251
- externalSubscription();
252
- if (error) {
253
- reject(error);
254
- } else {
255
- resolve(output);
256
- }
257
- };
258
- const handleUrl = url => {
259
- if (!matchesAuthCallbackUrl(url, redirectUrl)) {
260
- return;
261
- }
262
- const output = extractProcessOutput(url);
263
- if (!output) {
264
- finish(new Error('Authentication completed without process output'));
265
- return;
266
- }
267
- finish(undefined, output);
268
- };
269
- const subscription = Linking.addEventListener('url', ({
270
- url
271
- }) => handleUrl(url));
272
- const externalSubscription = ExternalAuthCallbackService.subscribe(url => handleUrl(url));
273
- Linking.openURL(startUrl).catch(e => finish(e instanceof Error ? e : new Error(String(e))));
274
- });
275
- }
276
- openInAppWebView(url, incognito) {
277
- const {
278
- width,
279
- height
280
- } = Dimensions.get('window');
281
- return new Promise(resolve => {
282
- let destroyFn = () => {};
283
- destroyFn = AppDisplayManagerService.show({
284
- content: /*#__PURE__*/React.createElement(View, {
285
- style: {
286
- width,
287
- height,
288
- backgroundColor: '#000'
289
- }
290
- }, /*#__PURE__*/React.createElement(TouchableOpacity, {
291
- onPress: () => {
292
- destroyFn.call(AppDisplayManagerService);
293
- resolve();
294
- },
295
- style: {
296
- paddingHorizontal: 16,
297
- paddingVertical: 12
298
- },
299
- accessibilityRole: "button",
300
- accessibilityLabel: "Close"
301
- }, /*#__PURE__*/React.createElement(Text, {
302
- style: {
303
- color: '#fff',
304
- fontSize: 16
305
- }
306
- }, "Done")), /*#__PURE__*/React.createElement(WmWebview, {
307
- src: url,
308
- incognito: incognito,
309
- styles: {
310
- root: {
311
- width: '100%',
312
- flex: 1
313
- }
314
- }
315
- }))
316
- });
317
- });
318
- }
319
- }
320
- export default new BrowserService();
321
- //# sourceMappingURL=browser.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["React","Dimensions","Linking","Text","TouchableOpacity","View","WebBrowser","WmWebview","injector","isWebPreviewMode","AppDisplayManagerService","AUTH_CALLBACK_PATH","ExternalAuthCallbackService","TARGET_LABELS","EXTERNAL_AUTH_TIMEOUT_MS","DEFAULT_BROWSER_CONFIG","defaultLinkMode","authMode","shareAuthSessionWithLinks","targetMapping","newWindow","sameWindow","topWindow","parentWindow","authTimeoutMs","_WebBrowser$maybeComp","maybeCompleteAuthSession","call","e","normalizeOpenOptions","params","target","getBrowserConfig","appConfig","_preferences","_raw$shareAuthSession","raw","browserConfig","preferences","getSsoBrowserFlags","config","useSystemBrowser","incognito","shouldOpenAuthInExternalBrowser","resolveLinkMode","options","mode","coerceSharedJar","label","mapped","extractProcessOutput","callbackUrl","readParam","name","match","RegExp","decodeURIComponent","replace","getAuthReturnUrl","override","process","appId","console","warn","matchesAuthCallbackUrl","returnUrl","path","split","startsWith","normalizedReturnUrl","normalizedCallbackUrl","classifyExternalLaunchUrl","url","test","type","processOutput","captureExternalLaunchUrl","launch","capture","BrowserService","getAppConfig","get","getConfig","open","Promise","resolve","window","openAuthSession","openURL","openInAppWebView","openBrowserAsync","startUrl","redirectUrl","openAuthSessionInExternalBrowser","openAuthSessionAsync","preferEphemeralSession","then","result","output","reject","Error","timeoutMs","attemptStartedAt","Date","now","cachedUrl","takeUrl","capturedAt","cachedOutput","settled","timeoutId","setTimeout","finish","error","clearTimeout","subscription","remove","externalSubscription","handleUrl","undefined","addEventListener","subscribe","catch","String","width","height","destroyFn","show","content","createElement","style","backgroundColor","onPress","paddingHorizontal","paddingVertical","accessibilityRole","accessibilityLabel","color","fontSize","src","styles","root","flex"],"sources":["browser.service.tsx"],"sourcesContent":["import React from 'react';\nimport { Dimensions, Linking, Text, TouchableOpacity, View } from 'react-native';\nimport * as WebBrowser from 'expo-web-browser';\n\nimport WmWebview from '@wavemaker/app-rn-runtime/components/advanced/webview/webview.component';\nimport AppConfig from '@wavemaker/app-rn-runtime/core/AppConfig';\nimport injector from '@wavemaker/app-rn-runtime/core/injector';\nimport { isWebPreviewMode } from '@wavemaker/app-rn-runtime/core/utils';\n\nimport AppDisplayManagerService from './app-display-manager.service';\nimport { AUTH_CALLBACK_PATH } from './browser.constants';\nimport ExternalAuthCallbackService from './external-auth-callback.service';\n\nexport type LinkBrowserMode = 'custom_tabs' | 'external' | 'in_app_webview';\n/** Where native SSO login runs: private/persistent in-app WebView, or auth_session (system browser, needed to share login with other apps). */\nexport type AuthBrowserMode = 'in_app_webview_private' | 'in_app_webview_persistent' | 'auth_session';\nexport type BrowserMode = LinkBrowserMode | 'auth_session';\n\n/** Friendly keys for the widget's Target property (_blank/_self/_top/_parent) — see TARGET_LABELS. */\nexport type LinkTarget = 'newWindow' | 'sameWindow' | 'topWindow' | 'parentWindow';\n\nexport interface BrowserConfig {\n defaultLinkMode?: LinkBrowserMode;\n authMode?: AuthBrowserMode;\n shareAuthSessionWithLinks?: boolean;\n targetMapping?: Partial<Record<LinkTarget, LinkBrowserMode>>;\n /** How long the external-browser auth_session flow waits for its callback before giving up. Defaults to EXTERNAL_AUTH_TIMEOUT_MS (2 minutes). */\n authTimeoutMs?: number;\n}\n\n/** Maps the widget's raw Target property value to targetMapping's friendly key. */\nexport const TARGET_LABELS: Record<string, LinkTarget> = {\n '_blank': 'newWindow',\n '_self': 'sameWindow',\n '_top': 'topWindow',\n '_parent': 'parentWindow',\n};\n\nexport interface BrowserOpenOptions {\n mode?: BrowserMode;\n target?: string;\n incognito?: boolean;\n reason?: 'link' | 'sso' | 'webprocess' | 'logout';\n returnUrl?: string;\n}\n\n// Default auth_session timeout. Plain JS setTimeout — doesn't tick while the app is\n// backgrounded, so it only \"expires\" once the user returns to the app.\nexport const EXTERNAL_AUTH_TIMEOUT_MS = 120000;\n\n// Matches pre-existing behavior: only newWindow (_blank) used custom_tabs; everything else defaulted to external.\nexport const DEFAULT_BROWSER_CONFIG: Required<BrowserConfig> = {\n defaultLinkMode: 'external',\n authMode: 'in_app_webview_private',\n shareAuthSessionWithLinks: false,\n targetMapping: {\n newWindow: 'custom_tabs',\n sameWindow: 'external',\n topWindow: 'external',\n parentWindow: 'external',\n },\n authTimeoutMs: EXTERNAL_AUTH_TIMEOUT_MS,\n};\n\ntry {\n WebBrowser.maybeCompleteAuthSession?.();\n} catch (e) {\n // Native builds do not need this; web auth-session completion is best-effort.\n}\n\nexport function normalizeOpenOptions(params: BrowserOpenOptions | string = {}): BrowserOpenOptions {\n if (typeof params === 'string') {\n return { target: params };\n }\n return params || {};\n}\n\nexport function getBrowserConfig(appConfig?: Partial<AppConfig> | null): Required<BrowserConfig> {\n const raw = (appConfig as any)?.browserConfig\n || (appConfig as any)?.preferences?.browserConfig\n || {};\n return {\n defaultLinkMode: raw.defaultLinkMode || DEFAULT_BROWSER_CONFIG.defaultLinkMode,\n authMode: raw.authMode || DEFAULT_BROWSER_CONFIG.authMode,\n shareAuthSessionWithLinks: raw.shareAuthSessionWithLinks\n ?? (raw.authMode === 'auth_session'),\n targetMapping: {\n ...DEFAULT_BROWSER_CONFIG.targetMapping,\n ...(raw.targetMapping || {}),\n },\n authTimeoutMs: raw.authTimeoutMs || DEFAULT_BROWSER_CONFIG.authTimeoutMs,\n };\n}\n\n/** Flags passed to WebProcessService.execute for native SSO. */\nexport function getSsoBrowserFlags(config: Required<BrowserConfig> = DEFAULT_BROWSER_CONFIG): {\n useSystemBrowser: boolean;\n incognito: boolean;\n} {\n return {\n useSystemBrowser: config.authMode === 'auth_session',\n incognito: config.authMode === 'in_app_webview_private',\n };\n}\n\n/** True when SSO should leave the app (Safari/Chrome) instead of Custom Tabs. */\nexport function shouldOpenAuthInExternalBrowser(\n config: Required<BrowserConfig> = DEFAULT_BROWSER_CONFIG\n): boolean {\n return config.authMode === 'auth_session' && config.defaultLinkMode === 'external';\n}\n\nexport function resolveLinkMode(\n options: BrowserOpenOptions = {},\n config: Required<BrowserConfig> = DEFAULT_BROWSER_CONFIG\n): LinkBrowserMode {\n if (options.mode && options.mode !== 'auth_session') {\n return coerceSharedJar(options.mode, config);\n }\n const target = options.target;\n const label = target && TARGET_LABELS[target];\n if (label) {\n const mapped = config.targetMapping[label];\n if (mapped) {\n return coerceSharedJar(mapped, config);\n }\n }\n return coerceSharedJar(config.defaultLinkMode, config);\n}\n\nfunction coerceSharedJar(mode: LinkBrowserMode, config: Required<BrowserConfig>): LinkBrowserMode {\n if (config.shareAuthSessionWithLinks\n && config.authMode === 'auth_session'\n && mode === 'in_app_webview') {\n return 'custom_tabs';\n }\n return mode;\n}\n\nexport function extractProcessOutput(callbackUrl: string): string | null {\n if (!callbackUrl) {\n return null;\n }\n const readParam = (name: string) => {\n const match = callbackUrl.match(new RegExp('[?&#]' + name + '=([^&#]*)', 'i'));\n if (!match) {\n return null;\n }\n return decodeURIComponent(match[1].replace(/\\+/g, ' '));\n };\n return readParam('process_output')\n || readParam('encodedProcessdata')\n || readParam('encodedProcessData');\n}\n\n/** Builds `{appId}://services/webprocess/{process}` — the only callback shape WM Server produces. */\nexport function getAuthReturnUrl(appConfig?: Partial<AppConfig> | null, override?: string, process?: string): string {\n if (override) {\n return override;\n }\n if (!appConfig?.appId) {\n console.warn('[BrowserService] appConfig.appId is missing; the SSO callback scheme will not match this app. Check bootstrap ordering or project config.');\n }\n const appId = appConfig?.appId || 'app';\n return `${appId}://${AUTH_CALLBACK_PATH}${process || ''}`;\n}\n\nexport function matchesAuthCallbackUrl(callbackUrl: string | null | undefined, returnUrl?: string): boolean {\n if (!callbackUrl) {\n return false;\n }\n if (!returnUrl) {\n // No specific attempt to compare against; recognize any webprocess callback by prefix.\n const path = callbackUrl.split(/[?#]/)[0].replace(/^[^:]+:\\/\\//, '');\n return path.startsWith(AUTH_CALLBACK_PATH);\n }\n // Exact path match (ignoring query/fragment) so a similar-prefixed URL isn't mismatched.\n const normalizedReturnUrl = returnUrl.split(/[?#]/)[0];\n const normalizedCallbackUrl = callbackUrl.split(/[?#]/)[0];\n return normalizedCallbackUrl === normalizedReturnUrl;\n}\n\nexport type ExternalLaunchInfo =\n | { type: 'none' }\n | { type: 'auth-callback'; url: string; processOutput: string | null }\n | { type: 'deep-link'; url: string };\n\n/** Classify a root Linking URL so the app entry can decide how to use it. */\nexport function classifyExternalLaunchUrl(\n url: string | null | undefined,\n appConfig?: Partial<AppConfig> | null\n): ExternalLaunchInfo {\n if (!url || /^https?:/i.test(url)) {\n return { type: 'none' };\n }\n // No process known yet (cold-boot launch); recognize any webprocess callback by prefix.\n if (matchesAuthCallbackUrl(url)) {\n return {\n type: 'auth-callback',\n url,\n processOutput: extractProcessOutput(url),\n };\n }\n return { type: 'deep-link', url };\n}\n\n/** Forward a root launch URL into the shared auth callback store. */\nexport function captureExternalLaunchUrl(\n url: string | null | undefined,\n appConfig?: Partial<AppConfig> | null\n): ExternalLaunchInfo {\n const launch = classifyExternalLaunchUrl(url, appConfig);\n if (launch.type !== 'none') {\n ExternalAuthCallbackService.capture(url);\n }\n return launch;\n}\n\nclass BrowserService {\n private getAppConfig(): AppConfig | null {\n try {\n return injector.get<AppConfig>('APP_CONFIG');\n } catch (e) {\n return null;\n }\n }\n\n public getConfig(): Required<BrowserConfig> {\n return getBrowserConfig(this.getAppConfig());\n }\n\n public open(url: string, params: BrowserOpenOptions | string = {}): Promise<any> {\n if (!url) {\n return Promise.resolve();\n }\n const options = normalizeOpenOptions(params);\n\n if (isWebPreviewMode()) {\n if (typeof window !== 'undefined') {\n window.open(url, '_blank');\n }\n return Promise.resolve();\n }\n\n if (options.mode === 'auth_session') {\n return this.openAuthSession(url, options.returnUrl);\n }\n\n if (!/^https?:/i.test(url)) {\n return Linking.openURL(url);\n }\n\n const mode = resolveLinkMode(options, this.getConfig());\n switch (mode) {\n case 'external':\n return Linking.openURL(url);\n case 'in_app_webview':\n return this.openInAppWebView(url, !!options.incognito);\n case 'custom_tabs':\n default:\n return WebBrowser.openBrowserAsync(url);\n }\n }\n\n public openAuthSession(startUrl: string, returnUrl?: string, process?: string): Promise<string> {\n const appConfig = this.getAppConfig();\n const redirectUrl = getAuthReturnUrl(appConfig, returnUrl, process);\n const config = this.getConfig();\n if (shouldOpenAuthInExternalBrowser(config)) {\n return this.openAuthSessionInExternalBrowser(startUrl, redirectUrl, config.authTimeoutMs);\n }\n return WebBrowser.openAuthSessionAsync(startUrl, redirectUrl, {\n preferEphemeralSession: false,\n }).then((result: any) => {\n if (result?.type === 'success' && result.url) {\n const output = extractProcessOutput(result.url);\n if (!output) {\n return Promise.reject(new Error('Authentication completed without process output'));\n }\n return output;\n }\n return Promise.reject(new Error('Authentication session cancelled'));\n });\n }\n\n /** Full Safari/Chrome via Linking.openURL, completes via redirectUrl (already resolved to this attempt's specific process). */\n private openAuthSessionInExternalBrowser(startUrl: string, redirectUrl: string, timeoutMs: number = EXTERNAL_AUTH_TIMEOUT_MS): Promise<string> {\n // Only accept callbacks captured after this attempt started, so a stale callback from an abandoned attempt isn't reused.\n const attemptStartedAt = Date.now();\n const cachedUrl = ExternalAuthCallbackService.takeUrl(\n (url, capturedAt) => matchesAuthCallbackUrl(url, redirectUrl) && capturedAt >= attemptStartedAt,\n timeoutMs\n );\n if (cachedUrl) {\n const cachedOutput = extractProcessOutput(cachedUrl);\n if (cachedOutput) {\n return Promise.resolve(cachedOutput);\n }\n }\n\n return new Promise((resolve, reject) => {\n let settled = false;\n const timeoutId = setTimeout(() => {\n finish(new Error(`Authentication session timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n const finish = (error?: Error, output?: string) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeoutId);\n subscription.remove();\n externalSubscription();\n if (error) {\n reject(error);\n } else {\n resolve(output as string);\n }\n };\n\n const handleUrl = (url?: string | null) => {\n if (!matchesAuthCallbackUrl(url, redirectUrl)) {\n return;\n }\n const output = extractProcessOutput(url as string);\n if (!output) {\n finish(new Error('Authentication completed without process output'));\n return;\n }\n finish(undefined, output);\n };\n\n const subscription = Linking.addEventListener('url', ({ url }) => handleUrl(url));\n const externalSubscription = ExternalAuthCallbackService.subscribe((url) => handleUrl(url));\n Linking.openURL(startUrl).catch((e) => finish(e instanceof Error ? e : new Error(String(e))));\n });\n }\n\n private openInAppWebView(url: string, incognito: boolean): Promise<void> {\n const { width, height } = Dimensions.get('window');\n return new Promise((resolve) => {\n let destroyFn = () => {};\n destroyFn = AppDisplayManagerService.show({\n content: (\n <View style={{ width, height, backgroundColor: '#000' }}>\n <TouchableOpacity\n onPress={() => {\n destroyFn.call(AppDisplayManagerService);\n resolve();\n }}\n style={{ paddingHorizontal: 16, paddingVertical: 12 }}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Close\">\n <Text style={{ color: '#fff', fontSize: 16 }}>Done</Text>\n </TouchableOpacity>\n <WmWebview\n src={url}\n incognito={incognito}\n styles={{\n root: {\n width: '100%',\n flex: 1,\n },\n }}\n />\n </View>\n ),\n });\n });\n }\n}\n\nexport default new BrowserService();\n"],"mappings":"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","ignoreList":[]}
@@ -1,44 +0,0 @@
1
- function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
2
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
3
- function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
4
- /** Captures custom-scheme URLs from app boot / external browser return, so BrowserService can consume matching SSO callbacks. */
5
- class ExternalAuthCallbackService {
6
- constructor() {
7
- _defineProperty(this, "urls", []);
8
- _defineProperty(this, "listeners", new Set());
9
- }
10
- /** Store a non-http(s) launch/deep-link URL for later auth or routing use. */
11
- capture(url) {
12
- if (!url || /^https?:/i.test(url)) {
13
- return;
14
- }
15
- if (this.urls.some(entry => entry.url === url)) {
16
- return;
17
- }
18
- this.urls.push({
19
- url,
20
- capturedAt: Date.now()
21
- });
22
- this.listeners.forEach(listener => listener(url));
23
- }
24
-
25
- /** Purges entries older than maxAgeMs, then removes and returns the first URL the matcher accepts. */
26
- takeUrl(matcher, maxAgeMs) {
27
- const now = Date.now();
28
- this.urls = this.urls.filter(entry => now - entry.capturedAt <= maxAgeMs);
29
- const index = this.urls.findIndex(entry => matcher(entry.url, entry.capturedAt));
30
- if (index < 0) {
31
- return undefined;
32
- }
33
- const taken = this.urls.splice(index, 1)[0];
34
- return taken.url;
35
- }
36
- subscribe(listener) {
37
- this.listeners.add(listener);
38
- return () => {
39
- this.listeners.delete(listener);
40
- };
41
- }
42
- }
43
- export default new ExternalAuthCallbackService();
44
- //# sourceMappingURL=external-auth-callback.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["ExternalAuthCallbackService","constructor","_defineProperty","Set","capture","url","test","urls","some","entry","push","capturedAt","Date","now","listeners","forEach","listener","takeUrl","matcher","maxAgeMs","filter","index","findIndex","undefined","taken","splice","subscribe","add","delete"],"sources":["external-auth-callback.service.ts"],"sourcesContent":["interface CapturedUrl {\n url: string;\n capturedAt: number;\n}\n\n/** Captures custom-scheme URLs from app boot / external browser return, so BrowserService can consume matching SSO callbacks. */\nclass ExternalAuthCallbackService {\n private urls: CapturedUrl[] = [];\n private listeners = new Set<(url: string) => void>();\n\n /** Store a non-http(s) launch/deep-link URL for later auth or routing use. */\n public capture(url?: string | null): void {\n if (!url || /^https?:/i.test(url)) {\n return;\n }\n if (this.urls.some((entry) => entry.url === url)) {\n return;\n }\n this.urls.push({ url, capturedAt: Date.now() });\n this.listeners.forEach((listener) => listener(url));\n }\n\n /** Purges entries older than maxAgeMs, then removes and returns the first URL the matcher accepts. */\n public takeUrl(matcher: (url: string, capturedAt: number) => boolean, maxAgeMs: number): string | undefined {\n const now = Date.now();\n this.urls = this.urls.filter((entry) => now - entry.capturedAt <= maxAgeMs);\n const index = this.urls.findIndex((entry) => matcher(entry.url, entry.capturedAt));\n if (index < 0) {\n return undefined;\n }\n const taken = this.urls.splice(index, 1)[0];\n return taken.url;\n }\n\n public subscribe(listener: (url: string) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n}\n\nexport default new ExternalAuthCallbackService();\n"],"mappings":";;;AAKA;AACA,MAAMA,2BAA2B,CAAC;EAAAC,YAAA;IAAAC,eAAA,eACF,EAAE;IAAAA,eAAA,oBACZ,IAAIC,GAAG,CAAwB,CAAC;EAAA;EAEpD;EACOC,OAAOA,CAACC,GAAmB,EAAQ;IACxC,IAAI,CAACA,GAAG,IAAI,WAAW,CAACC,IAAI,CAACD,GAAG,CAAC,EAAE;MACjC;IACF;IACA,IAAI,IAAI,CAACE,IAAI,CAACC,IAAI,CAAEC,KAAK,IAAKA,KAAK,CAACJ,GAAG,KAAKA,GAAG,CAAC,EAAE;MAChD;IACF;IACA,IAAI,CAACE,IAAI,CAACG,IAAI,CAAC;MAAEL,GAAG;MAAEM,UAAU,EAAEC,IAAI,CAACC,GAAG,CAAC;IAAE,CAAC,CAAC;IAC/C,IAAI,CAACC,SAAS,CAACC,OAAO,CAAEC,QAAQ,IAAKA,QAAQ,CAACX,GAAG,CAAC,CAAC;EACrD;;EAEA;EACOY,OAAOA,CAACC,OAAqD,EAAEC,QAAgB,EAAsB;IAC1G,MAAMN,GAAG,GAAGD,IAAI,CAACC,GAAG,CAAC,CAAC;IACtB,IAAI,CAACN,IAAI,GAAG,IAAI,CAACA,IAAI,CAACa,MAAM,CAAEX,KAAK,IAAKI,GAAG,GAAGJ,KAAK,CAACE,UAAU,IAAIQ,QAAQ,CAAC;IAC3E,MAAME,KAAK,GAAG,IAAI,CAACd,IAAI,CAACe,SAAS,CAAEb,KAAK,IAAKS,OAAO,CAACT,KAAK,CAACJ,GAAG,EAAEI,KAAK,CAACE,UAAU,CAAC,CAAC;IAClF,IAAIU,KAAK,GAAG,CAAC,EAAE;MACb,OAAOE,SAAS;IAClB;IACA,MAAMC,KAAK,GAAG,IAAI,CAACjB,IAAI,CAACkB,MAAM,CAACJ,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,OAAOG,KAAK,CAACnB,GAAG;EAClB;EAEOqB,SAASA,CAACV,QAA+B,EAAc;IAC5D,IAAI,CAACF,SAAS,CAACa,GAAG,CAACX,QAAQ,CAAC;IAC5B,OAAO,MAAM;MACX,IAAI,CAACF,SAAS,CAACc,MAAM,CAACZ,QAAQ,CAAC;IACjC,CAAC;EACH;AACF;AAEA,eAAe,IAAIhB,2BAA2B,CAAC,CAAC","ignoreList":[]}