@oneblink/apps-react 4.0.0-beta.4 → 4.0.0-beta.6

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 (107) hide show
  1. package/README.md +2 -8
  2. package/dist/OneBlinkAutoSaveForm.d.ts +24 -5
  3. package/dist/OneBlinkAutoSaveForm.js +11 -0
  4. package/dist/OneBlinkAutoSaveForm.js.map +1 -1
  5. package/dist/OneBlinkForm.d.ts +556 -8
  6. package/dist/OneBlinkForm.js +544 -0
  7. package/dist/OneBlinkForm.js.map +1 -1
  8. package/dist/OneBlinkFormBase.d.ts +51 -6
  9. package/dist/OneBlinkFormBase.js.map +1 -1
  10. package/dist/OneBlinkReadOnlyForm.d.ts +82 -6
  11. package/dist/OneBlinkReadOnlyForm.js +78 -0
  12. package/dist/OneBlinkReadOnlyForm.js.map +1 -1
  13. package/dist/PaymentReceipt.d.ts +55 -0
  14. package/dist/PaymentReceipt.js +45 -0
  15. package/dist/PaymentReceipt.js.map +1 -1
  16. package/dist/components/formStore/FormStoreTableProvider.js +23 -1
  17. package/dist/components/formStore/FormStoreTableProvider.js.map +1 -1
  18. package/dist/components/renderer/LookupNotification.js +11 -2
  19. package/dist/components/renderer/LookupNotification.js.map +1 -1
  20. package/dist/components/renderer/OneBlinkFormElements.d.ts +3 -3
  21. package/dist/components/renderer/OneBlinkFormElements.js.map +1 -1
  22. package/dist/components/renderer/PageFormElements.d.ts +3 -3
  23. package/dist/components/renderer/PageFormElements.js.map +1 -1
  24. package/dist/components/renderer/ProgressBar.d.ts +2 -3
  25. package/dist/components/renderer/ProgressBar.js.map +1 -1
  26. package/dist/form-elements/FormElementCalculation.js.map +1 -1
  27. package/dist/form-elements/FormElementForm.d.ts +4 -4
  28. package/dist/form-elements/FormElementForm.js.map +1 -1
  29. package/dist/form-elements/FormElementRepeatableSet.d.ts +4 -4
  30. package/dist/form-elements/FormElementRepeatableSet.js.map +1 -1
  31. package/dist/form-elements/FormElementSummary.js.map +1 -1
  32. package/dist/hooks/useAuth.d.ts +79 -6
  33. package/dist/hooks/useAuth.js +52 -0
  34. package/dist/hooks/useAuth.js.map +1 -1
  35. package/dist/hooks/useBooleanState.d.ts +41 -5
  36. package/dist/hooks/useBooleanState.js +35 -0
  37. package/dist/hooks/useBooleanState.js.map +1 -1
  38. package/dist/hooks/useClickOutsideElement.d.ts +39 -0
  39. package/dist/hooks/useClickOutsideElement.js +39 -0
  40. package/dist/hooks/useClickOutsideElement.js.map +1 -1
  41. package/dist/hooks/useConditionalLogic.d.ts +2 -3
  42. package/dist/hooks/useConditionalLogic.js.map +1 -1
  43. package/dist/hooks/useDrafts.d.ts +80 -0
  44. package/dist/hooks/useDrafts.js +202 -0
  45. package/dist/hooks/useDrafts.js.map +1 -0
  46. package/dist/hooks/useFormSubmissionAutoSaveState.d.ts +17 -5
  47. package/dist/hooks/useFormSubmissionAutoSaveState.js +9 -0
  48. package/dist/hooks/useFormSubmissionAutoSaveState.js.map +1 -1
  49. package/dist/hooks/useFormSubmissionModelContext.d.ts +4 -4
  50. package/dist/hooks/useFormSubmissionModelContext.js.map +1 -1
  51. package/dist/hooks/useFormSubmissionState.d.ts +44 -5
  52. package/dist/hooks/useFormSubmissionState.js +36 -0
  53. package/dist/hooks/useFormSubmissionState.js.map +1 -1
  54. package/dist/hooks/useFormValidation.d.ts +3 -3
  55. package/dist/hooks/useFormValidation.js.map +1 -1
  56. package/dist/hooks/useInjectPages.d.ts +2 -3
  57. package/dist/hooks/useInjectPages.js.map +1 -1
  58. package/dist/hooks/useIsMounted.d.ts +19 -0
  59. package/dist/hooks/useIsMounted.js +18 -0
  60. package/dist/hooks/useIsMounted.js.map +1 -1
  61. package/dist/hooks/useIsOffline.d.ts +49 -0
  62. package/dist/hooks/useIsOffline.js +49 -0
  63. package/dist/hooks/useIsOffline.js.map +1 -1
  64. package/dist/hooks/useLoadDataState.d.ts +44 -3
  65. package/dist/hooks/useLoadDataState.js +39 -0
  66. package/dist/hooks/useLoadDataState.js.map +1 -1
  67. package/dist/hooks/useLogin.d.ts +396 -11
  68. package/dist/hooks/useLogin.js +299 -0
  69. package/dist/hooks/useLogin.js.map +1 -1
  70. package/dist/hooks/useLookups.d.ts +3 -3
  71. package/dist/hooks/useLookups.js.map +1 -1
  72. package/dist/hooks/useNullableState.d.ts +44 -1
  73. package/dist/hooks/useNullableState.js +40 -1
  74. package/dist/hooks/useNullableState.js.map +1 -1
  75. package/dist/hooks/usePendingSubmissions.d.ts +95 -0
  76. package/dist/hooks/usePendingSubmissions.js +192 -0
  77. package/dist/hooks/usePendingSubmissions.js.map +1 -0
  78. package/dist/index.d.ts +6 -3
  79. package/dist/index.js +5 -2
  80. package/dist/index.js.map +1 -1
  81. package/dist/services/checkBsbsAreInvalid.d.ts +2 -3
  82. package/dist/services/checkBsbsAreInvalid.js.map +1 -1
  83. package/dist/services/checkIfAttachmentsExist.d.ts +2 -3
  84. package/dist/services/checkIfAttachmentsExist.js.map +1 -1
  85. package/dist/services/checkIfBsbsAreValidating.d.ts +2 -3
  86. package/dist/services/checkIfBsbsAreValidating.js.map +1 -1
  87. package/dist/services/cleanFormSubmissionModel.d.ts +4 -4
  88. package/dist/services/cleanFormSubmissionModel.js +2 -1
  89. package/dist/services/cleanFormSubmissionModel.js.map +1 -1
  90. package/dist/services/form-validation.d.ts +3 -3
  91. package/dist/services/form-validation.js.map +1 -1
  92. package/dist/services/generate-default-data.d.ts +2 -3
  93. package/dist/services/generate-default-data.js +3 -1
  94. package/dist/services/generate-default-data.js.map +1 -1
  95. package/dist/services/generateFreshdeskDependentFieldElements.js.map +1 -1
  96. package/dist/services/getDateRangeConfiguration.d.ts +2 -3
  97. package/dist/services/getDateRangeConfiguration.js.map +1 -1
  98. package/dist/services/getRepeatableSetEntriesConfiguration.d.ts +2 -3
  99. package/dist/services/getRepeatableSetEntriesConfiguration.js.map +1 -1
  100. package/dist/styles/receipt.scss +1 -1
  101. package/dist/styles/repeatable-set.scss +2 -2
  102. package/dist/typedoc.d.ts +2 -0
  103. package/dist/typedoc.js +3 -0
  104. package/dist/typedoc.js.map +1 -0
  105. package/dist/types/form.d.ts +5 -6
  106. package/dist/types/form.js.map +1 -1
  107. package/package.json +9 -3
@@ -1,49 +1,434 @@
1
+ /**
2
+ * This function is a react hook to help writing your own login screen.
3
+ *
4
+ * ## Example
5
+ *
6
+ * ```jsx
7
+ * import * as React from 'react'
8
+ * import { useHistory } from 'react-router-dom'
9
+ * import { useLogin } from '@oneblink/apps-react'
10
+ *
11
+ * function App() {
12
+ * const history = useHistory()
13
+ *
14
+ * const [username, setUsername] = React.useState('')
15
+ * const [password, setPassword] = React.useState('')
16
+ * const [newPasswordConfirmed, setNewPasswordConfirmed] = React.useState('')
17
+ * const [newPassword, setNewPassword] = React.useState('')
18
+ * const [code, setCode] = React.useState('')
19
+ *
20
+ * const onLogin = React.useCallback(() => {
21
+ * history.push('/')
22
+ * }, [history])
23
+ *
24
+ * const {
25
+ * // Login
26
+ * loginWithGoogle,
27
+ * loginWithUsernamePassword,
28
+ * isLoggingIn,
29
+ * // Reset Temp Password
30
+ * isPasswordTemporary,
31
+ * isResettingTemporaryPassword,
32
+ * resetTemporaryPassword,
33
+ * // MFA Password
34
+ * isMfaCodeRequired,
35
+ * isSubmittingMfaCode,
36
+ * submitMfaCode,
37
+ * // Login Errors
38
+ * loginError,
39
+ * clearLoginError,
40
+ * // Showing Forgot Password
41
+ * isShowingForgotPassword,
42
+ * showForgotPassword,
43
+ * hideForgotPassword,
44
+ * // Sending Forgot Password Code
45
+ * isSendingForgotPasswordCode,
46
+ * sendForgotPasswordCode,
47
+ * // Resetting Forgotten Password
48
+ * hasSentForgotPasswordCode,
49
+ * isResettingForgottenPassword,
50
+ * resetForgottenPassword,
51
+ * // Forgot Password Errors
52
+ * forgotPasswordError,
53
+ * clearForgotPasswordError,
54
+ * // Validation
55
+ * usernameValidation,
56
+ * passwordValidation,
57
+ * codeValidation,
58
+ * newPasswordValidation,
59
+ * newPasswordConfirmedValidation,
60
+ * } = useLogin({
61
+ * username,
62
+ * password,
63
+ * newPassword,
64
+ * newPasswordConfirmed,
65
+ * code,
66
+ * onLogin,
67
+ * })
68
+ *
69
+ * if (hasSentForgotPasswordCode) {
70
+ * return (
71
+ * <form
72
+ * onSubmit={(e) => {
73
+ * e.preventDefault()
74
+ * resetForgottenPassword()
75
+ * }}
76
+ * >
77
+ * <p>We have sent you a password reset code via email. Enter it below to reset your password.</p>
78
+ *
79
+ * <input
80
+ * type="password"
81
+ * placeholder="Code"
82
+ * value={code}
83
+ * onChange={(e) => setCode(e.target.value)}
84
+ * />
85
+ *
86
+ * <input
87
+ * type="password"
88
+ * placeholder="New Password"
89
+ * value={newPassword}
90
+ * onChange={(e) => setNewPassword(e.target.value)}
91
+ * />
92
+ *
93
+ * <input
94
+ * type="password"
95
+ * placeholder="Confirm Password"
96
+ * value={newPassword}
97
+ * onChange={(e) => setNewPasswordConfirmed(e.target.value)}
98
+ * />
99
+ *
100
+ * <button
101
+ * type="submit"
102
+ * disabled={isResettingForgottenPassword || codeValidation.isInvalid || newPasswordValidation.isInvalid || newPasswordConfirmedValidation.isInvalid}
103
+ * >
104
+ * Change Password
105
+ * </button>
106
+ *
107
+ * <p>Password Requirements</p>
108
+ * <p>Contains a lowercase letter: {validation.hasLowercaseLetter ? 'Yes' : 'No'}</p>
109
+ * <p>Contains an upper case letter: {validation.hasUpperCaseLetter ? 'Yes' : 'No'}</p>
110
+ * <p>Contains a number: {validation.hasNumber ? 'Yes' : 'No'}</p>
111
+ * <p>Contains a special character: {validation.hasSpecialCharacter ? 'Yes' : 'No'}</p>
112
+ * <p>Contains at least 8 characters: {validation.hasMinLength ? 'Yes' : 'No'}</p>
113
+ *
114
+ * {forgotPasswordError && (
115
+ * <p>{forgotPasswordError.message}</p>
116
+ * <button type="button" onClick={clearForgotPasswordError}>Clear Error</button>
117
+ * )}
118
+ * </form>
119
+ * )
120
+ * }
121
+ *
122
+ * if (isShowingForgotPassword) {
123
+ * return (
124
+ * <form
125
+ * onSubmit={(e) => {
126
+ * e.preventDefault()
127
+ * sendForgotPasswordCode()
128
+ * }}
129
+ * >
130
+ * <p>Enter your email address and we will send you a code to reset your password.</p>
131
+ *
132
+ * <input
133
+ * type="email"
134
+ * placeholder="Email Address"
135
+ * value={username}
136
+ * onChange={(e) => setUsername(e.target.value)}
137
+ * />
138
+ *
139
+ * <p>
140
+ * <a onClick={hideForgotPassword}>Remembered your password?</a>
141
+ * </p>
142
+ *
143
+ * <button
144
+ * type="submit"
145
+ * disabled={isSendingForgotPasswordCode || usernameValidation.isInvalid}
146
+ * >
147
+ * Reset Password
148
+ * </button>
149
+ *
150
+ * {forgotPasswordError && (
151
+ * <p>{forgotPasswordError.message}</p>
152
+ * <button type="button" onClick={clearForgotPasswordError}>Clear Error</button>
153
+ * )}
154
+ * </form>
155
+ * )
156
+ * }
157
+ *
158
+ * if (isPasswordTemporary) {
159
+ * return (
160
+ * <form
161
+ * onSubmit={(e) => {
162
+ * e.preventDefault()
163
+ * resetTemporaryPassword()
164
+ * }}
165
+ * >
166
+ * <p>The password you entered was only temporary and must be reset for security purposes. Please enter your new password below to continue.</p>
167
+ *
168
+ * <input
169
+ * type="password"
170
+ * placeholder="New Password"
171
+ * value={newPassword}
172
+ * onChange={(e) => setNewPassword(e.target.value)}
173
+ * />
174
+ *
175
+ * <input
176
+ * type="password"
177
+ * placeholder="Confirm Password"
178
+ * value={newPassword}
179
+ * onChange={(e) => setNewPasswordConfirmed(e.target.value)}
180
+ * />
181
+ *
182
+ * <button
183
+ * type="submit"
184
+ * disabled={isResettingTemporaryPassword || newPasswordValidation.isInvalid || newPasswordConfirmedValidation.isInvalid}
185
+ * >
186
+ * Change Password &amp; Sign In
187
+ * </button>
188
+ *
189
+ * <p>Password Requirements</p>
190
+ * <p>Contains a lowercase letter: {validation.hasLowercaseLetter ? 'Yes' : 'No'}</p>
191
+ * <p>Contains an upper case letter: {validation.hasUpperCaseLetter ? 'Yes' : 'No'}</p>
192
+ * <p>Contains a number: {validation.hasNumber ? 'Yes' : 'No'}</p>
193
+ * <p>Contains a special character: {validation.hasSpecialCharacter ? 'Yes' : 'No'}</p>
194
+ * <p>Contains at least 8 characters: {validation.hasMinLength ? 'Yes' : 'No'}</p>
195
+ *
196
+ * {loginError && (
197
+ * <p>{loginError.message}</p>
198
+ * <button type="button" onClick={clearLoginError}>Clear Error</button>
199
+ * )}
200
+ * </form>
201
+ * )
202
+ * }
203
+ *
204
+ * if (isMfaCodeRequired) {
205
+ * return (
206
+ * <form
207
+ * onSubmit={(e) => {
208
+ * e.preventDefault()
209
+ * submitMfaCode()
210
+ * }}
211
+ * >
212
+ * <p>Enter the 6-digit code found in your authenticator app.</p>
213
+ *
214
+ * <input
215
+ * type="password"
216
+ * placeholder="Code"
217
+ * value={code}
218
+ * onChange={(e) => setCode(e.target.value)}
219
+ * />
220
+ *
221
+ * <button
222
+ * type="submit"
223
+ * disabled={isSubmittingMfaCode || codeValidation.isInvalid}
224
+ * >
225
+ * Sign In
226
+ * </button>
227
+ *
228
+ * {loginError && (
229
+ * <p>{loginError.message}</p>
230
+ * <button type="button" onClick={clearLoginError}>Clear Error</button>
231
+ * )}
232
+ * </form>
233
+ * )
234
+ * }
235
+ *
236
+ * return (
237
+ * <form
238
+ * onSubmit={(e) => {
239
+ * e.preventDefault()
240
+ * loginWithUsernamePassword()
241
+ * }}
242
+ * >
243
+ * <p>Sign in with your email address and password.</p>
244
+ * <input
245
+ * type="email"
246
+ * placeholder="Email Address"
247
+ * value={username}
248
+ * onChange={(e) => setUsername(e.target.value)}
249
+ * />
250
+ *
251
+ * <input
252
+ * type="password"
253
+ * placeholder="New Password"
254
+ * value={newPassword}
255
+ * onChange={(e) => setNewPassword(e.target.value)}
256
+ * />
257
+ *
258
+ * <p>
259
+ * <a onClick={showForgotPassword}>Forgot your password?</a>
260
+ * </p>
261
+ *
262
+ * <button
263
+ * type="submit"
264
+ * disabled={isLoggingIn || usernameValidation.isInvalid || passwordValidation.isInvalid}
265
+ * >
266
+ * {children}
267
+ * </button>
268
+ *
269
+ * <p>or</p>
270
+ *
271
+ * <button
272
+ * type="button"
273
+ * onClick={loginWithGoogle}
274
+ * >
275
+ * <img
276
+ * alt="Google"
277
+ * src="google-sign-in.png"
278
+ * />
279
+ * <span>Sign in with Google</span>
280
+ * </button>
281
+ *
282
+ * {loginError && (
283
+ * <p>{loginError.message}</p>
284
+ * <button type="button" onClick={clearLoginError}>Clear Error</button>
285
+ * )}
286
+ * </form>
287
+ * )
288
+ * }
289
+ *
290
+ * const root = document.getElementById('root')
291
+ * if (root) {
292
+ * ReactDOM.render(<App />, root)
293
+ * }
294
+ * ```
295
+ *
296
+ * @param options
297
+ * @returns
298
+ */
1
299
  export default function useLogin({ username, password, newPassword, newPasswordConfirmed, code, }: {
300
+ /** The email address entered by the user. */
2
301
  username: string;
302
+ /** The password entered by the user. */
3
303
  password: string;
304
+ /** The new password entered by the user if changing their password. */
4
305
  newPassword: string;
306
+ /**
307
+ * The new password repeated by the user if changing their password to ensure
308
+ * they do type it in wrong.
309
+ */
5
310
  newPasswordConfirmed: string;
311
+ /**
312
+ * The code sent to the user after requesting a password reset by starting the
313
+ * "forgot password" process.
314
+ */
6
315
  code: string;
7
316
  }): {
317
+ /** Open redirect user to the Google sign-in page. */
8
318
  loginWithGoogle: () => void;
9
- loginWithUsernamePassword: () => Promise<void>;
319
+ /**
320
+ * Attempt to use the `username` and `password` arguments to create a session.
321
+ * Will call `onLogin()` if successful, otherwise will set `loginError`.
322
+ */
323
+ loginWithUsernamePassword: () => void;
324
+ /** `true` while processing `loginWithUsernamePassword()`. */
10
325
  isLoggingIn: boolean;
326
+ /**
327
+ * `true` if the user logged in using a temporary password. Prompt the user
328
+ * for a new password and call `resetTemporaryPassword()`.
329
+ */
330
+ isPasswordTemporary: boolean;
331
+ /**
332
+ * Attempt to use `newPassword` and `newPasswordConfirmed` arguments to reset
333
+ * the user's password and create a session. Will call `onLogin()` if
334
+ * successful, otherwise will set `loginError`.
335
+ */
336
+ resetTemporaryPassword: () => void;
337
+ /**
338
+ * Set if an error occurs while processing `loginWithUsernamePassword()` or
339
+ * `resetTemporaryPassword()`.
340
+ */
11
341
  loginError: Error | null;
342
+ /** Set `loginError` back to `null`. */
12
343
  clearLoginError: () => void;
13
- isPasswordTemporary: boolean;
344
+ /** `true` while processing `resetTemporaryPassword()`. */
14
345
  isResettingTemporaryPassword: boolean;
15
- resetTemporaryPassword: () => Promise<void>;
16
- isMfaCodeRequired: boolean;
17
- isSubmittingMfaCode: boolean;
18
- submitMfaCode: () => Promise<void>;
346
+ /** `true` when showing the forgot password flow. */
19
347
  isShowingForgotPassword: boolean;
348
+ /** Set `isShowingForgotPassword` to `true`. */
20
349
  showForgotPassword: () => void;
350
+ /** Set `isShowingForgotPassword` to `false`. */
21
351
  hideForgotPassword: () => void;
22
- forgotPasswordError: Error | null;
23
- clearForgotPasswordError: () => void;
352
+ /**
353
+ * Attempt to use the `username` argument to start the forgot password
354
+ * process. This will send the user an email with a code to enter. A failed
355
+ * request will set `forgotPasswordError`.
356
+ */
357
+ sendForgotPasswordCode: () => void;
358
+ /** `true` while processing `sendForgotPasswordCode()`. */
24
359
  isSendingForgotPasswordCode: boolean;
25
- sendForgotPasswordCode: () => Promise<void>;
360
+ /** `true` if the forgot password code has been successfully sent to the user. */
26
361
  hasSentForgotPasswordCode: boolean;
362
+ /**
363
+ * Attempt to use the `code`, `newPassword`, and `newPasswordConfirmed`
364
+ * arguments to reset the user's password. A failed request will set
365
+ * `forgotPasswordError`.
366
+ */
367
+ resetForgottenPassword: () => void;
368
+ /** `true` while processing `resetForgottenPassword()`. */
27
369
  isResettingForgottenPassword: boolean;
28
- resetForgottenPassword: () => Promise<void>;
370
+ /**
371
+ * Set if an error occurs while processing `sendForgotPasswordCode()` or
372
+ * `resetForgottenPassword()`.
373
+ */
374
+ forgotPasswordError: Error | null;
375
+ /** Set `forgotPasswordError` back to `null`. */
376
+ clearForgotPasswordError: () => void;
29
377
  usernameValidation: {
378
+ /** `true` if the `username` argument is invalid. */
30
379
  isInvalid: boolean;
31
380
  };
32
381
  passwordValidation: {
382
+ /** `true` if the `password` argument is invalid. */
33
383
  isInvalid: boolean;
34
384
  };
35
385
  codeValidation: {
386
+ /** `true` if the `code` argument is invalid. */
36
387
  isInvalid: boolean;
37
388
  };
38
389
  newPasswordValidation: {
390
+ /** `true` if the `newPassword` argument is invalid. */
391
+ isInvalid: boolean;
392
+ /**
393
+ * `true` if the `newPassword` argument has a lowercase letter (required to
394
+ * be valid).
395
+ */
39
396
  hasLowercaseLetter: boolean;
397
+ /**
398
+ * `true` if the `newPassword` argument has an uppercase letter (required to
399
+ * be valid).
400
+ */
40
401
  hasUpperCaseLetter: boolean;
402
+ /** `true` if the `newPassword` argument has a number (required to be valid). */
41
403
  hasNumber: boolean;
404
+ /**
405
+ * `true` if the `newPassword` argument has a special character (required to
406
+ * be valid).
407
+ */
42
408
  hasSpecialCharacter: boolean;
409
+ /**
410
+ * `true` if the `newPassword` argument has at least the minimum number of
411
+ * characters (required to be valid).
412
+ */
43
413
  hasMinLength: boolean;
44
- isInvalid: boolean;
45
414
  };
46
415
  newPasswordConfirmedValidation: {
416
+ /**
417
+ * `true` if the `newPasswordConfirmed` argument is invalid (must match the
418
+ * `newPassword` argument).
419
+ */
47
420
  isInvalid: boolean;
48
421
  };
422
+ /**
423
+ * `true` if the user logged in using MFA and a code is required to finish the
424
+ * login attempt. Prompt the user for a code and call `submitMfaCode()`.
425
+ */
426
+ isMfaCodeRequired: boolean;
427
+ /** `true` while processing `submitMfaCode()`. */
428
+ isSubmittingMfaCode: boolean;
429
+ /**
430
+ * Attempt to use `code` argument to submit the MFA code and create a session.
431
+ * Will call `onLogin()` if successful, otherwise will set `loginError`.
432
+ */
433
+ submitMfaCode: () => void;
49
434
  };