@contember/react-client-tenant 2.0.0-alpha.14 → 2.0.0-alpha.15

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 (182) hide show
  1. package/dist/development/index.cjs +18 -0
  2. package/dist/development/index.cjs.map +1 -1
  3. package/dist/development/index.js +18 -0
  4. package/dist/development/index.js.map +1 -1
  5. package/dist/development/src/components/forms/LoginForm.cjs +1 -1
  6. package/dist/development/src/components/forms/LoginForm.cjs.map +1 -1
  7. package/dist/development/src/components/forms/LoginForm.js +1 -1
  8. package/dist/development/src/components/forms/LoginForm.js.map +1 -1
  9. package/dist/development/src/components/forms/PasswordResetForm.cjs +2 -1
  10. package/dist/development/src/components/forms/PasswordResetForm.cjs.map +1 -1
  11. package/dist/development/src/components/forms/PasswordResetForm.js +2 -1
  12. package/dist/development/src/components/forms/PasswordResetForm.js.map +1 -1
  13. package/dist/development/src/components/forms/PasswordlessSignInForm.cjs +79 -0
  14. package/dist/development/src/components/forms/PasswordlessSignInForm.cjs.map +1 -0
  15. package/dist/development/src/components/forms/PasswordlessSignInForm.js +79 -0
  16. package/dist/development/src/components/forms/PasswordlessSignInForm.js.map +1 -0
  17. package/dist/development/src/components/forms/PasswordlessSignInInitForm.cjs +54 -0
  18. package/dist/development/src/components/forms/PasswordlessSignInInitForm.cjs.map +1 -0
  19. package/dist/development/src/components/forms/PasswordlessSignInInitForm.js +54 -0
  20. package/dist/development/src/components/forms/PasswordlessSignInInitForm.js.map +1 -0
  21. package/dist/development/src/consts.cjs +5 -0
  22. package/dist/development/src/consts.cjs.map +1 -0
  23. package/dist/development/src/consts.js +5 -0
  24. package/dist/development/src/consts.js.map +1 -0
  25. package/dist/development/src/hooks/mutations/passwordless/useActivatePasswordlessOtpMutation.cjs +31 -0
  26. package/dist/development/src/hooks/mutations/passwordless/useActivatePasswordlessOtpMutation.cjs.map +1 -0
  27. package/dist/development/src/hooks/mutations/passwordless/useActivatePasswordlessOtpMutation.js +14 -0
  28. package/dist/development/src/hooks/mutations/passwordless/useActivatePasswordlessOtpMutation.js.map +1 -0
  29. package/dist/development/src/hooks/mutations/passwordless/useDisableMyPasswordlessMutation.cjs +28 -0
  30. package/dist/development/src/hooks/mutations/passwordless/useDisableMyPasswordlessMutation.cjs.map +1 -0
  31. package/dist/development/src/hooks/mutations/passwordless/useDisableMyPasswordlessMutation.js +11 -0
  32. package/dist/development/src/hooks/mutations/passwordless/useDisableMyPasswordlessMutation.js.map +1 -0
  33. package/dist/development/src/hooks/mutations/passwordless/useEnableMyPasswordlessMutation.cjs +28 -0
  34. package/dist/development/src/hooks/mutations/passwordless/useEnableMyPasswordlessMutation.cjs.map +1 -0
  35. package/dist/development/src/hooks/mutations/passwordless/useEnableMyPasswordlessMutation.js +11 -0
  36. package/dist/development/src/hooks/mutations/passwordless/useEnableMyPasswordlessMutation.js.map +1 -0
  37. package/dist/development/src/hooks/mutations/passwordless/useInitSignInPasswordlessMutation.cjs +32 -0
  38. package/dist/development/src/hooks/mutations/passwordless/useInitSignInPasswordlessMutation.cjs.map +1 -0
  39. package/dist/development/src/hooks/mutations/passwordless/useInitSignInPasswordlessMutation.js +15 -0
  40. package/dist/development/src/hooks/mutations/passwordless/useInitSignInPasswordlessMutation.js.map +1 -0
  41. package/dist/development/src/hooks/mutations/passwordless/useSignInPasswordlessMutation.cjs +32 -0
  42. package/dist/development/src/hooks/mutations/passwordless/useSignInPasswordlessMutation.cjs.map +1 -0
  43. package/dist/development/src/hooks/mutations/passwordless/useSignInPasswordlessMutation.js +15 -0
  44. package/dist/development/src/hooks/mutations/passwordless/useSignInPasswordlessMutation.js.map +1 -0
  45. package/dist/development/src/hooks/usePasswordlessOtpActivator.cjs +53 -0
  46. package/dist/development/src/hooks/usePasswordlessOtpActivator.cjs.map +1 -0
  47. package/dist/development/src/hooks/usePasswordlessOtpActivator.js +53 -0
  48. package/dist/development/src/hooks/usePasswordlessOtpActivator.js.map +1 -0
  49. package/dist/development/src/internal/hooks/useHandleIDPResponse.cjs +1 -1
  50. package/dist/development/src/internal/hooks/useHandleIDPResponse.cjs.map +1 -1
  51. package/dist/development/src/internal/hooks/useHandleIDPResponse.js +1 -1
  52. package/dist/development/src/internal/hooks/useHandleIDPResponse.js.map +1 -1
  53. package/dist/development/src/internal/utils/hashing.cjs +8 -0
  54. package/dist/development/src/internal/utils/hashing.cjs.map +1 -0
  55. package/dist/development/src/internal/utils/hashing.js +8 -0
  56. package/dist/development/src/internal/utils/hashing.js.map +1 -0
  57. package/dist/development/src/internal/utils/randomInt.cjs +29 -0
  58. package/dist/development/src/internal/utils/randomInt.cjs.map +1 -0
  59. package/dist/development/src/internal/utils/randomInt.js +29 -0
  60. package/dist/development/src/internal/utils/randomInt.js.map +1 -0
  61. package/dist/production/index.cjs +18 -0
  62. package/dist/production/index.cjs.map +1 -1
  63. package/dist/production/index.js +18 -0
  64. package/dist/production/index.js.map +1 -1
  65. package/dist/production/src/components/forms/LoginForm.cjs +1 -1
  66. package/dist/production/src/components/forms/LoginForm.cjs.map +1 -1
  67. package/dist/production/src/components/forms/LoginForm.js +1 -1
  68. package/dist/production/src/components/forms/LoginForm.js.map +1 -1
  69. package/dist/production/src/components/forms/PasswordResetForm.cjs +2 -1
  70. package/dist/production/src/components/forms/PasswordResetForm.cjs.map +1 -1
  71. package/dist/production/src/components/forms/PasswordResetForm.js +2 -1
  72. package/dist/production/src/components/forms/PasswordResetForm.js.map +1 -1
  73. package/dist/production/src/components/forms/PasswordlessSignInForm.cjs +71 -0
  74. package/dist/production/src/components/forms/PasswordlessSignInForm.cjs.map +1 -0
  75. package/dist/production/src/components/forms/PasswordlessSignInForm.js +71 -0
  76. package/dist/production/src/components/forms/PasswordlessSignInForm.js.map +1 -0
  77. package/dist/production/src/components/forms/PasswordlessSignInInitForm.cjs +46 -0
  78. package/dist/production/src/components/forms/PasswordlessSignInInitForm.cjs.map +1 -0
  79. package/dist/production/src/components/forms/PasswordlessSignInInitForm.js +46 -0
  80. package/dist/production/src/components/forms/PasswordlessSignInInitForm.js.map +1 -0
  81. package/dist/production/src/consts.cjs +5 -0
  82. package/dist/production/src/consts.cjs.map +1 -0
  83. package/dist/production/src/consts.js +5 -0
  84. package/dist/production/src/consts.js.map +1 -0
  85. package/dist/production/src/hooks/mutations/passwordless/useActivatePasswordlessOtpMutation.cjs +31 -0
  86. package/dist/production/src/hooks/mutations/passwordless/useActivatePasswordlessOtpMutation.cjs.map +1 -0
  87. package/dist/production/src/hooks/mutations/passwordless/useActivatePasswordlessOtpMutation.js +14 -0
  88. package/dist/production/src/hooks/mutations/passwordless/useActivatePasswordlessOtpMutation.js.map +1 -0
  89. package/dist/production/src/hooks/mutations/passwordless/useDisableMyPasswordlessMutation.cjs +28 -0
  90. package/dist/production/src/hooks/mutations/passwordless/useDisableMyPasswordlessMutation.cjs.map +1 -0
  91. package/dist/production/src/hooks/mutations/passwordless/useDisableMyPasswordlessMutation.js +11 -0
  92. package/dist/production/src/hooks/mutations/passwordless/useDisableMyPasswordlessMutation.js.map +1 -0
  93. package/dist/production/src/hooks/mutations/passwordless/useEnableMyPasswordlessMutation.cjs +28 -0
  94. package/dist/production/src/hooks/mutations/passwordless/useEnableMyPasswordlessMutation.cjs.map +1 -0
  95. package/dist/production/src/hooks/mutations/passwordless/useEnableMyPasswordlessMutation.js +11 -0
  96. package/dist/production/src/hooks/mutations/passwordless/useEnableMyPasswordlessMutation.js.map +1 -0
  97. package/dist/production/src/hooks/mutations/passwordless/useInitSignInPasswordlessMutation.cjs +32 -0
  98. package/dist/production/src/hooks/mutations/passwordless/useInitSignInPasswordlessMutation.cjs.map +1 -0
  99. package/dist/production/src/hooks/mutations/passwordless/useInitSignInPasswordlessMutation.js +15 -0
  100. package/dist/production/src/hooks/mutations/passwordless/useInitSignInPasswordlessMutation.js.map +1 -0
  101. package/dist/production/src/hooks/mutations/passwordless/useSignInPasswordlessMutation.cjs +32 -0
  102. package/dist/production/src/hooks/mutations/passwordless/useSignInPasswordlessMutation.cjs.map +1 -0
  103. package/dist/production/src/hooks/mutations/passwordless/useSignInPasswordlessMutation.js +15 -0
  104. package/dist/production/src/hooks/mutations/passwordless/useSignInPasswordlessMutation.js.map +1 -0
  105. package/dist/production/src/hooks/usePasswordlessOtpActivator.cjs +53 -0
  106. package/dist/production/src/hooks/usePasswordlessOtpActivator.cjs.map +1 -0
  107. package/dist/production/src/hooks/usePasswordlessOtpActivator.js +53 -0
  108. package/dist/production/src/hooks/usePasswordlessOtpActivator.js.map +1 -0
  109. package/dist/production/src/internal/hooks/useHandleIDPResponse.cjs +1 -1
  110. package/dist/production/src/internal/hooks/useHandleIDPResponse.cjs.map +1 -1
  111. package/dist/production/src/internal/hooks/useHandleIDPResponse.js +1 -1
  112. package/dist/production/src/internal/hooks/useHandleIDPResponse.js.map +1 -1
  113. package/dist/production/src/internal/utils/hashing.cjs +8 -0
  114. package/dist/production/src/internal/utils/hashing.cjs.map +1 -0
  115. package/dist/production/src/internal/utils/hashing.js +8 -0
  116. package/dist/production/src/internal/utils/hashing.js.map +1 -0
  117. package/dist/production/src/internal/utils/randomInt.cjs +29 -0
  118. package/dist/production/src/internal/utils/randomInt.cjs.map +1 -0
  119. package/dist/production/src/internal/utils/randomInt.js +29 -0
  120. package/dist/production/src/internal/utils/randomInt.js.map +1 -0
  121. package/dist/types/components/forms/PasswordlessSignInForm.d.ts +22 -0
  122. package/dist/types/components/forms/PasswordlessSignInForm.d.ts.map +1 -0
  123. package/dist/types/components/forms/PasswordlessSignInInitForm.d.ts +20 -0
  124. package/dist/types/components/forms/PasswordlessSignInInitForm.d.ts.map +1 -0
  125. package/dist/types/components/forms/index.d.ts +2 -0
  126. package/dist/types/components/forms/index.d.ts.map +1 -1
  127. package/dist/types/consts.d.ts +2 -0
  128. package/dist/types/consts.d.ts.map +1 -0
  129. package/dist/types/hooks/index.d.ts +1 -0
  130. package/dist/types/hooks/index.d.ts.map +1 -1
  131. package/dist/types/hooks/mutations/apiKey/useCreateSessionTokenMutation.d.ts +6 -0
  132. package/dist/types/hooks/mutations/apiKey/useCreateSessionTokenMutation.d.ts.map +1 -1
  133. package/dist/types/hooks/mutations/auth/useSignInMutation.d.ts +6 -0
  134. package/dist/types/hooks/mutations/auth/useSignInMutation.d.ts.map +1 -1
  135. package/dist/types/hooks/mutations/idp/useSignInIdpMutation.d.ts +6 -0
  136. package/dist/types/hooks/mutations/idp/useSignInIdpMutation.d.ts.map +1 -1
  137. package/dist/types/hooks/mutations/index.d.ts +1 -0
  138. package/dist/types/hooks/mutations/index.d.ts.map +1 -1
  139. package/dist/types/hooks/mutations/invite/useInviteMutation.d.ts +6 -0
  140. package/dist/types/hooks/mutations/invite/useInviteMutation.d.ts.map +1 -1
  141. package/dist/types/hooks/mutations/passwordless/index.d.ts +6 -0
  142. package/dist/types/hooks/mutations/passwordless/index.d.ts.map +1 -0
  143. package/dist/types/hooks/mutations/passwordless/useActivatePasswordlessOtpMutation.d.ts +8 -0
  144. package/dist/types/hooks/mutations/passwordless/useActivatePasswordlessOtpMutation.d.ts.map +1 -0
  145. package/dist/types/hooks/mutations/passwordless/useDisableMyPasswordlessMutation.d.ts +3 -0
  146. package/dist/types/hooks/mutations/passwordless/useDisableMyPasswordlessMutation.d.ts.map +1 -0
  147. package/dist/types/hooks/mutations/passwordless/useEnableMyPasswordlessMutation.d.ts +3 -0
  148. package/dist/types/hooks/mutations/passwordless/useEnableMyPasswordlessMutation.d.ts.map +1 -0
  149. package/dist/types/hooks/mutations/passwordless/useInitSignInPasswordlessMutation.d.ts +19 -0
  150. package/dist/types/hooks/mutations/passwordless/useInitSignInPasswordlessMutation.d.ts.map +1 -0
  151. package/dist/types/hooks/mutations/passwordless/useSignInPasswordlessMutation.d.ts +42 -0
  152. package/dist/types/hooks/mutations/passwordless/useSignInPasswordlessMutation.d.ts.map +1 -0
  153. package/dist/types/hooks/queries/useMeQuery.d.ts +2 -0
  154. package/dist/types/hooks/queries/useMeQuery.d.ts.map +1 -1
  155. package/dist/types/hooks/queries/useProjectMembersQuery.d.ts +2 -0
  156. package/dist/types/hooks/queries/useProjectMembersQuery.d.ts.map +1 -1
  157. package/dist/types/hooks/usePasswordlessOtpActivator.d.ts +19 -0
  158. package/dist/types/hooks/usePasswordlessOtpActivator.d.ts.map +1 -0
  159. package/dist/types/internal/utils/hashing.d.ts +2 -0
  160. package/dist/types/internal/utils/hashing.d.ts.map +1 -0
  161. package/dist/types/internal/utils/randomInt.d.ts +3 -0
  162. package/dist/types/internal/utils/randomInt.d.ts.map +1 -0
  163. package/dist/types/tsconfig.tsbuildinfo +1 -1
  164. package/package.json +4 -4
  165. package/src/components/forms/LoginForm.tsx +1 -1
  166. package/src/components/forms/PasswordResetForm.tsx +1 -0
  167. package/src/components/forms/PasswordlessSignInForm.tsx +102 -0
  168. package/src/components/forms/PasswordlessSignInInitForm.tsx +68 -0
  169. package/src/components/forms/index.ts +2 -0
  170. package/src/consts.ts +1 -0
  171. package/src/hooks/index.ts +1 -0
  172. package/src/hooks/mutations/index.ts +1 -0
  173. package/src/hooks/mutations/passwordless/index.ts +5 -0
  174. package/src/hooks/mutations/passwordless/useActivatePasswordlessOtpMutation.ts +19 -0
  175. package/src/hooks/mutations/passwordless/useDisableMyPasswordlessMutation.ts +14 -0
  176. package/src/hooks/mutations/passwordless/useEnableMyPasswordlessMutation.ts +14 -0
  177. package/src/hooks/mutations/passwordless/useInitSignInPasswordlessMutation.ts +22 -0
  178. package/src/hooks/mutations/passwordless/useSignInPasswordlessMutation.ts +24 -0
  179. package/src/hooks/usePasswordlessOtpActivator.ts +66 -0
  180. package/src/internal/hooks/useHandleIDPResponse.ts +1 -1
  181. package/src/internal/utils/hashing.ts +4 -0
  182. package/src/internal/utils/randomInt.ts +30 -0
@@ -10,6 +10,8 @@ const InviteForm = require("./src/components/forms/InviteForm.cjs");
10
10
  const LoginForm = require("./src/components/forms/LoginForm.cjs");
11
11
  const PasswordResetForm = require("./src/components/forms/PasswordResetForm.cjs");
12
12
  const PasswordResetRequestForm = require("./src/components/forms/PasswordResetRequestForm.cjs");
13
+ const PasswordlessSignInForm = require("./src/components/forms/PasswordlessSignInForm.cjs");
14
+ const PasswordlessSignInInitForm = require("./src/components/forms/PasswordlessSignInInitForm.cjs");
13
15
  const OtpPrepareForm = require("./src/components/forms/OtpPrepareForm.cjs");
14
16
  const OtpConfirmForm = require("./src/components/forms/OtpConfirmForm.cjs");
15
17
  const UpdateProjectMemberForm = require("./src/components/forms/UpdateProjectMemberForm.cjs");
@@ -32,6 +34,11 @@ const useSignInIdpMutation = require("./src/hooks/mutations/idp/useSignInIdpMuta
32
34
  const useRemoveProjectMemberMutation = require("./src/hooks/mutations/memberships/useRemoveProjectMemberMutation.cjs");
33
35
  const useAddProjectMemberMutation = require("./src/hooks/mutations/memberships/useAddProjectMemberMutation.cjs");
34
36
  const useUpdateProjectMemberMutation = require("./src/hooks/mutations/memberships/useUpdateProjectMemberMutation.cjs");
37
+ const useActivatePasswordlessOtpMutation = require("./src/hooks/mutations/passwordless/useActivatePasswordlessOtpMutation.cjs");
38
+ const useDisableMyPasswordlessMutation = require("./src/hooks/mutations/passwordless/useDisableMyPasswordlessMutation.cjs");
39
+ const useEnableMyPasswordlessMutation = require("./src/hooks/mutations/passwordless/useEnableMyPasswordlessMutation.cjs");
40
+ const useSignInPasswordlessMutation = require("./src/hooks/mutations/passwordless/useSignInPasswordlessMutation.cjs");
41
+ const useInitSignInPasswordlessMutation = require("./src/hooks/mutations/passwordless/useInitSignInPasswordlessMutation.cjs");
35
42
  const useConfirmOtpMutation = require("./src/hooks/mutations/otp/useConfirmOtpMutation.cjs");
36
43
  const useDisableOtpMutation = require("./src/hooks/mutations/otp/useDisableOtpMutation.cjs");
37
44
  const usePrepareOtpMutation = require("./src/hooks/mutations/otp/usePrepareOtpMutation.cjs");
@@ -46,6 +53,7 @@ const useLogout = require("./src/hooks/useLogout.cjs");
46
53
  const useTenantApi = require("./src/hooks/useTenantApi.cjs");
47
54
  const useTenantQueryLoader = require("./src/hooks/useTenantQueryLoader.cjs");
48
55
  const useTenantMutation = require("./src/hooks/useTenantMutation.cjs");
56
+ const usePasswordlessOtpActivator = require("./src/hooks/usePasswordlessOtpActivator.cjs");
49
57
  exports.FormContext = contexts.FormContext;
50
58
  exports.IDPMethodsContextProvider = contexts.IDPMethodsContextProvider;
51
59
  exports.IDPStateContextProvider = contexts.IDPStateContextProvider;
@@ -74,6 +82,10 @@ exports.PasswordResetForm = PasswordResetForm.PasswordResetForm;
74
82
  exports.usePasswordResetForm = PasswordResetForm.usePasswordResetForm;
75
83
  exports.PasswordResetRequestForm = PasswordResetRequestForm.PasswordResetRequestForm;
76
84
  exports.usePasswordResetRequestForm = PasswordResetRequestForm.usePasswordResetRequestForm;
85
+ exports.PasswordlessSignInForm = PasswordlessSignInForm.PasswordlessSignInForm;
86
+ exports.usePasswordlessSignInForm = PasswordlessSignInForm.usePasswordlessSignInForm;
87
+ exports.PasswordlessSignInInitForm = PasswordlessSignInInitForm.PasswordlessSignInInitForm;
88
+ exports.usePasswordlessSignInInitForm = PasswordlessSignInInitForm.usePasswordlessSignInInitForm;
77
89
  exports.OtpPrepareForm = OtpPrepareForm.OtpPrepareForm;
78
90
  exports.useOtpPrepareForm = OtpPrepareForm.useOtpPrepareForm;
79
91
  exports.OtpConfirmForm = OtpConfirmForm.OtpConfirmForm;
@@ -111,6 +123,11 @@ exports.addProjectMemberMutation = useAddProjectMemberMutation.addProjectMemberM
111
123
  exports.useAddProjectMemberMutation = useAddProjectMemberMutation.useAddProjectMemberMutation;
112
124
  exports.updateProjectMemberMutation = useUpdateProjectMemberMutation.updateProjectMemberMutation;
113
125
  exports.useUpdateProjectMemberMutation = useUpdateProjectMemberMutation.useUpdateProjectMemberMutation;
126
+ exports.useActivatePasswordlessOtpMutation = useActivatePasswordlessOtpMutation.useActivatePasswordlessOtpMutation;
127
+ exports.useDisableMyPasswordlessMutation = useDisableMyPasswordlessMutation.useDisableMyPasswordlessMutation;
128
+ exports.useEnableMyPasswordlessMutation = useEnableMyPasswordlessMutation.useEnableMyPasswordlessMutation;
129
+ exports.useSignInPasswordlessMutation = useSignInPasswordlessMutation.useSignInPasswordlessMutation;
130
+ exports.useInitSignInPasswordlessMutation = useInitSignInPasswordlessMutation.useInitSignInPasswordlessMutation;
114
131
  exports.confirmOtpMutation = useConfirmOtpMutation.confirmOtpMutation;
115
132
  exports.useConfirmOtpMutation = useConfirmOtpMutation.useConfirmOtpMutation;
116
133
  exports.disableOtpMutation = useDisableOtpMutation.disableOtpMutation;
@@ -132,4 +149,5 @@ exports.useTenantApi = useTenantApi.useTenantApi;
132
149
  exports.useTenantQueryLoader = useTenantQueryLoader.useTenantQueryLoader;
133
150
  exports.createTenantMutation = useTenantMutation.createTenantMutation;
134
151
  exports.useTenantMutation = useTenantMutation.useTenantMutation;
152
+ exports.usePasswordlessOtpActivator = usePasswordlessOtpActivator.usePasswordlessOtpActivator;
135
153
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -8,6 +8,8 @@ import { InviteForm, useInviteForm } from "./src/components/forms/InviteForm.js"
8
8
  import { LoginForm, useLoginForm } from "./src/components/forms/LoginForm.js";
9
9
  import { PasswordResetForm, usePasswordResetForm } from "./src/components/forms/PasswordResetForm.js";
10
10
  import { PasswordResetRequestForm, usePasswordResetRequestForm } from "./src/components/forms/PasswordResetRequestForm.js";
11
+ import { PasswordlessSignInForm, usePasswordlessSignInForm } from "./src/components/forms/PasswordlessSignInForm.js";
12
+ import { PasswordlessSignInInitForm, usePasswordlessSignInInitForm } from "./src/components/forms/PasswordlessSignInInitForm.js";
11
13
  import { OtpPrepareForm, useOtpPrepareForm } from "./src/components/forms/OtpPrepareForm.js";
12
14
  import { OtpConfirmForm, useOtpConfirmForm } from "./src/components/forms/OtpConfirmForm.js";
13
15
  import { UpdateProjectMemberForm, useUpdateProjectMemberForm } from "./src/components/forms/UpdateProjectMemberForm.js";
@@ -30,6 +32,11 @@ import { signInIDPMutation, useSignInIDPMutation } from "./src/hooks/mutations/i
30
32
  import { removeProjectMemberMutation, useRemoveProjectMemberMutation } from "./src/hooks/mutations/memberships/useRemoveProjectMemberMutation.js";
31
33
  import { addProjectMemberMutation, useAddProjectMemberMutation } from "./src/hooks/mutations/memberships/useAddProjectMemberMutation.js";
32
34
  import { updateProjectMemberMutation, useUpdateProjectMemberMutation } from "./src/hooks/mutations/memberships/useUpdateProjectMemberMutation.js";
35
+ import { useActivatePasswordlessOtpMutation } from "./src/hooks/mutations/passwordless/useActivatePasswordlessOtpMutation.js";
36
+ import { useDisableMyPasswordlessMutation } from "./src/hooks/mutations/passwordless/useDisableMyPasswordlessMutation.js";
37
+ import { useEnableMyPasswordlessMutation } from "./src/hooks/mutations/passwordless/useEnableMyPasswordlessMutation.js";
38
+ import { useSignInPasswordlessMutation } from "./src/hooks/mutations/passwordless/useSignInPasswordlessMutation.js";
39
+ import { useInitSignInPasswordlessMutation } from "./src/hooks/mutations/passwordless/useInitSignInPasswordlessMutation.js";
33
40
  import { confirmOtpMutation, useConfirmOtpMutation } from "./src/hooks/mutations/otp/useConfirmOtpMutation.js";
34
41
  import { disableOtpMutation, useDisableOtpMutation } from "./src/hooks/mutations/otp/useDisableOtpMutation.js";
35
42
  import { prepareOtpMutation, usePrepareOtpMutation } from "./src/hooks/mutations/otp/usePrepareOtpMutation.js";
@@ -44,6 +51,7 @@ import { useLogout } from "./src/hooks/useLogout.js";
44
51
  import { LoginToken, useTenantApi } from "./src/hooks/useTenantApi.js";
45
52
  import { useTenantQueryLoader } from "./src/hooks/useTenantQueryLoader.js";
46
53
  import { createTenantMutation, useTenantMutation } from "./src/hooks/useTenantMutation.js";
54
+ import { usePasswordlessOtpActivator } from "./src/hooks/usePasswordlessOtpActivator.js";
47
55
  export {
48
56
  ChangeMyPasswordForm,
49
57
  CreateApiKeyForm,
@@ -68,6 +76,8 @@ export {
68
76
  OtpPrepareForm,
69
77
  PasswordResetForm,
70
78
  PasswordResetRequestForm,
79
+ PasswordlessSignInForm,
80
+ PasswordlessSignInInitForm,
71
81
  RemoveProjectMemberTrigger,
72
82
  UpdateProjectMemberForm,
73
83
  addProjectMemberMutation,
@@ -88,6 +98,7 @@ export {
88
98
  signInMutation,
89
99
  signOutMutation,
90
100
  updateProjectMemberMutation,
101
+ useActivatePasswordlessOtpMutation,
91
102
  useAddProjectMemberMutation,
92
103
  useChangeMyPasswordForm,
93
104
  useChangeMyPasswordMutation,
@@ -99,7 +110,9 @@ export {
99
110
  useCreateSessionTokenForm,
100
111
  useCreateSessionTokenMutation,
101
112
  useDisableApiKeyMutation,
113
+ useDisableMyPasswordlessMutation,
102
114
  useDisableOtpMutation,
115
+ useEnableMyPasswordlessMutation,
103
116
  useFetchIdentity,
104
117
  useForm,
105
118
  useIDPMethods,
@@ -108,6 +121,7 @@ export {
108
121
  useIdentityMethods,
109
122
  useIdentityState,
110
123
  useInitSignInIDPMutation,
124
+ useInitSignInPasswordlessMutation,
111
125
  useInviteForm,
112
126
  useInviteMutation,
113
127
  useLoginForm,
@@ -117,6 +131,9 @@ export {
117
131
  useOtpPrepareForm,
118
132
  usePasswordResetForm,
119
133
  usePasswordResetRequestForm,
134
+ usePasswordlessOtpActivator,
135
+ usePasswordlessSignInForm,
136
+ usePasswordlessSignInInitForm,
120
137
  usePrepareOtpMutation,
121
138
  useProjectMembersQuery,
122
139
  useProjectMembershipsQuery,
@@ -125,6 +142,7 @@ export {
125
142
  useResetPasswordMutation,
126
143
  useSignInIDPMutation,
127
144
  useSignInMutation,
145
+ useSignInPasswordlessMutation,
128
146
  useSignOutMutation,
129
147
  useTenantApi,
130
148
  useTenantMutation,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -10,7 +10,7 @@ const useLoginForm = contexts.useForm;
10
10
  const headers = {
11
11
  "X-Contember-Token-Path": "data.mutation.result.token"
12
12
  };
13
- const DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 3600;
13
+ const DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 60;
14
14
  const LoginForm = ({ children, expiration = DEFAULT_LOGIN_EXPIRATION, onSuccess }) => {
15
15
  const login = useSignInMutation.useSignInMutation({ headers });
16
16
  const redirectToBacklink = useRedirectToBacklink.useRedirectToBacklinkCallback();
@@ -1 +1 @@
1
- {"version":3,"file":"LoginForm.cjs","sources":["../../../../../../packages/react-client-tenant/src/components/forms/LoginForm.tsx"],"sourcesContent":["import { ReactElement, useCallback, useMemo } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { SignInErrorCode } from '@contember/graphql-client-tenant'\nimport { FormContextValue, FormError, FormState } from '../../types'\nimport { useForm } from '../../contexts'\nimport { useSetSessionToken } from '@contember/react-client'\nimport { SignInMutationResult, useSignInMutation } from '../../hooks'\nimport { useRedirectToBacklinkCallback } from '../../internal/hooks/useRedirectToBacklink'\n\n\nexport type LoginFormValues = {\n\temail: string\n\tpassword: string\n\totpToken: string\n}\n\nexport type LoginFormErrorCode =\n\t| SignInErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'UNKNOWN_ERROR'\n\nexport type LoginFormState =\n\t| FormState\n\t| 'otp-required'\n\nexport type LoginFormError = FormError<LoginFormValues, LoginFormErrorCode>\n\nexport type LoginFormContextValue = FormContextValue<LoginFormValues, LoginFormErrorCode, LoginFormState>\n\nexport interface LoginFormProps {\n\texpiration?: number\n\tchildren: ReactElement\n\tonSuccess?: () => void\n}\n\nexport const useLoginForm = useForm as () => LoginFormContextValue\n\nconst headers = {\n\t'X-Contember-Token-Path': 'data.mutation.result.token',\n}\n\nconst DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 3600 // 14 days\n\nexport const LoginForm = ({ children, expiration = DEFAULT_LOGIN_EXPIRATION, onSuccess }: LoginFormProps) => {\n\tconst login = useSignInMutation({ headers })\n\tconst redirectToBacklink = useRedirectToBacklinkCallback()\n\tconst setSessionToken = useSetSessionToken()\n\treturn (\n\t\t<TenantForm<LoginFormContextValue, SignInMutationResult>\n\t\t\tonSuccess={args => {\n\t\t\t\tonSuccess?.()\n\t\t\t\tsetSessionToken(args.result.token)\n\t\t\t\tredirectToBacklink()\n\t\t\t}}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={{\n\t\t\t\temail: '',\n\t\t\t\tpassword: '',\n\t\t\t\totpToken: '',\n\t\t\t}}\n\t\t\tvalidate={({ values, state }) => {\n\t\t\t\tconst errors: LoginFormError[] = []\n\t\t\t\tif (!values.email) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'email' })\n\t\t\t\t} else if (!values.email.match(/^.+@.+$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'email' })\n\t\t\t\t}\n\n\t\t\t\tif (!values.password) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'password' })\n\t\t\t\t} else if (values.password.length < 6) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'password' })\n\t\t\t\t}\n\t\t\t\tif (!values.otpToken && state === 'otp-required') {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'otpToken' })\n\t\t\t\t} else if (values.otpToken && !values.otpToken.match(/^\\d{6}$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'otpToken' })\n\t\t\t\t}\n\t\t\t\treturn errors\n\t\t\t}}\n\t\t\texecute={async ({ values }) => {\n\t\t\t\tconst result = await login({\n\t\t\t\t\temail: values.email!,\n\t\t\t\t\tpassword: values.password!,\n\t\t\t\t\totpToken: values.otpToken || undefined,\n\t\t\t\t\texpiration: expiration,\n\t\t\t\t})\n\n\t\t\t\tif (!result.ok && result.error === 'OTP_REQUIRED') {\n\t\t\t\t\treturn { ...result, state: 'otp-required' }\n\t\t\t\t}\n\n\t\t\t\treturn result\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.SignInErrorCode, keyof LoginFormValues | undefined> = {\n\t'INVALID_PASSWORD': 'password',\n\t'NO_PASSWORD_SET': 'password',\n\t'UNKNOWN_EMAIL': 'email',\n\t'PERSON_DISABLED': 'email',\n\t'INVALID_OTP_TOKEN': 'otpToken',\n\t'OTP_REQUIRED': undefined,\n}\n"],"names":["useForm","useSignInMutation","useRedirectToBacklinkCallback","useSetSessionToken","jsxDEV","TenantForm","this"],"mappings":";;;;;;;;AAqCO,MAAM,eAAeA,SAAA;AAE5B,MAAM,UAAU;AAAA,EACf,0BAA0B;AAC3B;AAEA,MAAM,2BAA2B,KAAK,KAAK;AAEpC,MAAM,YAAY,CAAC,EAAE,UAAU,aAAa,0BAA0B,gBAAgC;AAC5G,QAAM,QAAQC,kBAAAA,kBAAkB,EAAE,QAAS,CAAA;AAC3C,QAAM,qBAAqBC,sBAAAA;AAC3B,QAAM,kBAAkBC,YAAAA;AAEvB,SAAAC,8BAAA;AAAA,IAACC,WAAA;AAAA,IAAA;AAAA,MACA,WAAW,CAAQ,SAAA;AACN;AACI,wBAAA,KAAK,OAAO,KAAK;AACd;MACpB;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,QACd,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,MACX;AAAA,MACA,UAAU,CAAC,EAAE,QAAQ,YAAY;AAChC,cAAM,SAA2B,CAAA;AAC7B,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,SAAS;AAAA,mBAC5C,CAAC,OAAO,MAAM,MAAM,SAAS,GAAG;AAC1C,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,SAAS;AAAA,QACtD;AAEI,YAAA,CAAC,OAAO,UAAU;AACrB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAC/C,WAAA,OAAO,SAAS,SAAS,GAAG;AACtC,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QACzD;AACA,YAAI,CAAC,OAAO,YAAY,UAAU,gBAAgB;AACjD,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAAA,WAC/C,OAAO,YAAY,CAAC,OAAO,SAAS,MAAM,SAAS,GAAG;AAChE,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QACzD;AACO,eAAA;AAAA,MACR;AAAA,MACA,SAAS,OAAO,EAAE,aAAa;AACxB,cAAA,SAAS,MAAM,MAAM;AAAA,UAC1B,OAAO,OAAO;AAAA,UACd,UAAU,OAAO;AAAA,UACjB,UAAU,OAAO,YAAY;AAAA,UAC7B;AAAA,QAAA,CACA;AAED,YAAI,CAAC,OAAO,MAAM,OAAO,UAAU,gBAAgB;AAClD,iBAAO,EAAE,GAAG,QAAQ,OAAO,eAAe;AAAA,QAC3C;AAEO,eAAA;AAAA,MACR;AAAA,MAEC;AAAA,IAAA;AAAA,IA/CF;AAAA,IAAA;AAAA,IAAA;AAAA,MAAA,UAAA;AAAA,MAAA,YAAA;AAAA,MAAA,cAAA;AAAA,IAAA;AAAA,IAAAC;AAAAA,EAAA;AAmDF;AACA,MAAM,eAAqF;AAAA,EAC1F,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,gBAAgB;AACjB;;;"}
1
+ {"version":3,"file":"LoginForm.cjs","sources":["../../../../../../packages/react-client-tenant/src/components/forms/LoginForm.tsx"],"sourcesContent":["import { ReactElement, useCallback, useMemo } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { SignInErrorCode } from '@contember/graphql-client-tenant'\nimport { FormContextValue, FormError, FormState } from '../../types'\nimport { useForm } from '../../contexts'\nimport { useSetSessionToken } from '@contember/react-client'\nimport { SignInMutationResult, useSignInMutation } from '../../hooks'\nimport { useRedirectToBacklinkCallback } from '../../internal/hooks/useRedirectToBacklink'\n\n\nexport type LoginFormValues = {\n\temail: string\n\tpassword: string\n\totpToken: string\n}\n\nexport type LoginFormErrorCode =\n\t| SignInErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'UNKNOWN_ERROR'\n\nexport type LoginFormState =\n\t| FormState\n\t| 'otp-required'\n\nexport type LoginFormError = FormError<LoginFormValues, LoginFormErrorCode>\n\nexport type LoginFormContextValue = FormContextValue<LoginFormValues, LoginFormErrorCode, LoginFormState>\n\nexport interface LoginFormProps {\n\texpiration?: number\n\tchildren: ReactElement\n\tonSuccess?: () => void\n}\n\nexport const useLoginForm = useForm as () => LoginFormContextValue\n\nconst headers = {\n\t'X-Contember-Token-Path': 'data.mutation.result.token',\n}\n\nconst DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 60 // 14 days\n\nexport const LoginForm = ({ children, expiration = DEFAULT_LOGIN_EXPIRATION, onSuccess }: LoginFormProps) => {\n\tconst login = useSignInMutation({ headers })\n\tconst redirectToBacklink = useRedirectToBacklinkCallback()\n\tconst setSessionToken = useSetSessionToken()\n\treturn (\n\t\t<TenantForm<LoginFormContextValue, SignInMutationResult>\n\t\t\tonSuccess={args => {\n\t\t\t\tonSuccess?.()\n\t\t\t\tsetSessionToken(args.result.token)\n\t\t\t\tredirectToBacklink()\n\t\t\t}}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={{\n\t\t\t\temail: '',\n\t\t\t\tpassword: '',\n\t\t\t\totpToken: '',\n\t\t\t}}\n\t\t\tvalidate={({ values, state }) => {\n\t\t\t\tconst errors: LoginFormError[] = []\n\t\t\t\tif (!values.email) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'email' })\n\t\t\t\t} else if (!values.email.match(/^.+@.+$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'email' })\n\t\t\t\t}\n\n\t\t\t\tif (!values.password) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'password' })\n\t\t\t\t} else if (values.password.length < 6) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'password' })\n\t\t\t\t}\n\t\t\t\tif (!values.otpToken && state === 'otp-required') {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'otpToken' })\n\t\t\t\t} else if (values.otpToken && !values.otpToken.match(/^\\d{6}$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'otpToken' })\n\t\t\t\t}\n\t\t\t\treturn errors\n\t\t\t}}\n\t\t\texecute={async ({ values }) => {\n\t\t\t\tconst result = await login({\n\t\t\t\t\temail: values.email!,\n\t\t\t\t\tpassword: values.password!,\n\t\t\t\t\totpToken: values.otpToken || undefined,\n\t\t\t\t\texpiration: expiration,\n\t\t\t\t})\n\n\t\t\t\tif (!result.ok && result.error === 'OTP_REQUIRED') {\n\t\t\t\t\treturn { ...result, state: 'otp-required' }\n\t\t\t\t}\n\n\t\t\t\treturn result\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.SignInErrorCode, keyof LoginFormValues | undefined> = {\n\t'INVALID_PASSWORD': 'password',\n\t'NO_PASSWORD_SET': 'password',\n\t'UNKNOWN_EMAIL': 'email',\n\t'PERSON_DISABLED': 'email',\n\t'INVALID_OTP_TOKEN': 'otpToken',\n\t'OTP_REQUIRED': undefined,\n}\n"],"names":["useForm","useSignInMutation","useRedirectToBacklinkCallback","useSetSessionToken","jsxDEV","TenantForm","this"],"mappings":";;;;;;;;AAqCO,MAAM,eAAeA,SAAA;AAE5B,MAAM,UAAU;AAAA,EACf,0BAA0B;AAC3B;AAEA,MAAM,2BAA2B,KAAK,KAAK;AAEpC,MAAM,YAAY,CAAC,EAAE,UAAU,aAAa,0BAA0B,gBAAgC;AAC5G,QAAM,QAAQC,kBAAAA,kBAAkB,EAAE,QAAS,CAAA;AAC3C,QAAM,qBAAqBC,sBAAAA;AAC3B,QAAM,kBAAkBC,YAAAA;AAEvB,SAAAC,8BAAA;AAAA,IAACC,WAAA;AAAA,IAAA;AAAA,MACA,WAAW,CAAQ,SAAA;AACN;AACI,wBAAA,KAAK,OAAO,KAAK;AACd;MACpB;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,QACd,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,MACX;AAAA,MACA,UAAU,CAAC,EAAE,QAAQ,YAAY;AAChC,cAAM,SAA2B,CAAA;AAC7B,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,SAAS;AAAA,mBAC5C,CAAC,OAAO,MAAM,MAAM,SAAS,GAAG;AAC1C,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,SAAS;AAAA,QACtD;AAEI,YAAA,CAAC,OAAO,UAAU;AACrB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAC/C,WAAA,OAAO,SAAS,SAAS,GAAG;AACtC,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QACzD;AACA,YAAI,CAAC,OAAO,YAAY,UAAU,gBAAgB;AACjD,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAAA,WAC/C,OAAO,YAAY,CAAC,OAAO,SAAS,MAAM,SAAS,GAAG;AAChE,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QACzD;AACO,eAAA;AAAA,MACR;AAAA,MACA,SAAS,OAAO,EAAE,aAAa;AACxB,cAAA,SAAS,MAAM,MAAM;AAAA,UAC1B,OAAO,OAAO;AAAA,UACd,UAAU,OAAO;AAAA,UACjB,UAAU,OAAO,YAAY;AAAA,UAC7B;AAAA,QAAA,CACA;AAED,YAAI,CAAC,OAAO,MAAM,OAAO,UAAU,gBAAgB;AAClD,iBAAO,EAAE,GAAG,QAAQ,OAAO,eAAe;AAAA,QAC3C;AAEO,eAAA;AAAA,MACR;AAAA,MAEC;AAAA,IAAA;AAAA,IA/CF;AAAA,IAAA;AAAA,IAAA;AAAA,MAAA,UAAA;AAAA,MAAA,YAAA;AAAA,MAAA,cAAA;AAAA,IAAA;AAAA,IAAAC;AAAAA,EAAA;AAmDF;AACA,MAAM,eAAqF;AAAA,EAC1F,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,gBAAgB;AACjB;;;"}
@@ -8,7 +8,7 @@ const useLoginForm = useForm;
8
8
  const headers = {
9
9
  "X-Contember-Token-Path": "data.mutation.result.token"
10
10
  };
11
- const DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 3600;
11
+ const DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 60;
12
12
  const LoginForm = ({ children, expiration = DEFAULT_LOGIN_EXPIRATION, onSuccess }) => {
13
13
  const login = useSignInMutation({ headers });
14
14
  const redirectToBacklink = useRedirectToBacklinkCallback();
@@ -1 +1 @@
1
- {"version":3,"file":"LoginForm.js","sources":["../../../../../../packages/react-client-tenant/src/components/forms/LoginForm.tsx"],"sourcesContent":["import { ReactElement, useCallback, useMemo } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { SignInErrorCode } from '@contember/graphql-client-tenant'\nimport { FormContextValue, FormError, FormState } from '../../types'\nimport { useForm } from '../../contexts'\nimport { useSetSessionToken } from '@contember/react-client'\nimport { SignInMutationResult, useSignInMutation } from '../../hooks'\nimport { useRedirectToBacklinkCallback } from '../../internal/hooks/useRedirectToBacklink'\n\n\nexport type LoginFormValues = {\n\temail: string\n\tpassword: string\n\totpToken: string\n}\n\nexport type LoginFormErrorCode =\n\t| SignInErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'UNKNOWN_ERROR'\n\nexport type LoginFormState =\n\t| FormState\n\t| 'otp-required'\n\nexport type LoginFormError = FormError<LoginFormValues, LoginFormErrorCode>\n\nexport type LoginFormContextValue = FormContextValue<LoginFormValues, LoginFormErrorCode, LoginFormState>\n\nexport interface LoginFormProps {\n\texpiration?: number\n\tchildren: ReactElement\n\tonSuccess?: () => void\n}\n\nexport const useLoginForm = useForm as () => LoginFormContextValue\n\nconst headers = {\n\t'X-Contember-Token-Path': 'data.mutation.result.token',\n}\n\nconst DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 3600 // 14 days\n\nexport const LoginForm = ({ children, expiration = DEFAULT_LOGIN_EXPIRATION, onSuccess }: LoginFormProps) => {\n\tconst login = useSignInMutation({ headers })\n\tconst redirectToBacklink = useRedirectToBacklinkCallback()\n\tconst setSessionToken = useSetSessionToken()\n\treturn (\n\t\t<TenantForm<LoginFormContextValue, SignInMutationResult>\n\t\t\tonSuccess={args => {\n\t\t\t\tonSuccess?.()\n\t\t\t\tsetSessionToken(args.result.token)\n\t\t\t\tredirectToBacklink()\n\t\t\t}}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={{\n\t\t\t\temail: '',\n\t\t\t\tpassword: '',\n\t\t\t\totpToken: '',\n\t\t\t}}\n\t\t\tvalidate={({ values, state }) => {\n\t\t\t\tconst errors: LoginFormError[] = []\n\t\t\t\tif (!values.email) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'email' })\n\t\t\t\t} else if (!values.email.match(/^.+@.+$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'email' })\n\t\t\t\t}\n\n\t\t\t\tif (!values.password) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'password' })\n\t\t\t\t} else if (values.password.length < 6) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'password' })\n\t\t\t\t}\n\t\t\t\tif (!values.otpToken && state === 'otp-required') {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'otpToken' })\n\t\t\t\t} else if (values.otpToken && !values.otpToken.match(/^\\d{6}$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'otpToken' })\n\t\t\t\t}\n\t\t\t\treturn errors\n\t\t\t}}\n\t\t\texecute={async ({ values }) => {\n\t\t\t\tconst result = await login({\n\t\t\t\t\temail: values.email!,\n\t\t\t\t\tpassword: values.password!,\n\t\t\t\t\totpToken: values.otpToken || undefined,\n\t\t\t\t\texpiration: expiration,\n\t\t\t\t})\n\n\t\t\t\tif (!result.ok && result.error === 'OTP_REQUIRED') {\n\t\t\t\t\treturn { ...result, state: 'otp-required' }\n\t\t\t\t}\n\n\t\t\t\treturn result\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.SignInErrorCode, keyof LoginFormValues | undefined> = {\n\t'INVALID_PASSWORD': 'password',\n\t'NO_PASSWORD_SET': 'password',\n\t'UNKNOWN_EMAIL': 'email',\n\t'PERSON_DISABLED': 'email',\n\t'INVALID_OTP_TOKEN': 'otpToken',\n\t'OTP_REQUIRED': undefined,\n}\n"],"names":["this"],"mappings":";;;;;;AAqCO,MAAM,eAAe;AAE5B,MAAM,UAAU;AAAA,EACf,0BAA0B;AAC3B;AAEA,MAAM,2BAA2B,KAAK,KAAK;AAEpC,MAAM,YAAY,CAAC,EAAE,UAAU,aAAa,0BAA0B,gBAAgC;AAC5G,QAAM,QAAQ,kBAAkB,EAAE,QAAS,CAAA;AAC3C,QAAM,qBAAqB;AAC3B,QAAM,kBAAkB;AAEvB,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,WAAW,CAAQ,SAAA;AACN;AACI,wBAAA,KAAK,OAAO,KAAK;AACd;MACpB;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,QACd,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,MACX;AAAA,MACA,UAAU,CAAC,EAAE,QAAQ,YAAY;AAChC,cAAM,SAA2B,CAAA;AAC7B,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,SAAS;AAAA,mBAC5C,CAAC,OAAO,MAAM,MAAM,SAAS,GAAG;AAC1C,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,SAAS;AAAA,QACtD;AAEI,YAAA,CAAC,OAAO,UAAU;AACrB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAC/C,WAAA,OAAO,SAAS,SAAS,GAAG;AACtC,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QACzD;AACA,YAAI,CAAC,OAAO,YAAY,UAAU,gBAAgB;AACjD,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAAA,WAC/C,OAAO,YAAY,CAAC,OAAO,SAAS,MAAM,SAAS,GAAG;AAChE,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QACzD;AACO,eAAA;AAAA,MACR;AAAA,MACA,SAAS,OAAO,EAAE,aAAa;AACxB,cAAA,SAAS,MAAM,MAAM;AAAA,UAC1B,OAAO,OAAO;AAAA,UACd,UAAU,OAAO;AAAA,UACjB,UAAU,OAAO,YAAY;AAAA,UAC7B;AAAA,QAAA,CACA;AAED,YAAI,CAAC,OAAO,MAAM,OAAO,UAAU,gBAAgB;AAClD,iBAAO,EAAE,GAAG,QAAQ,OAAO,eAAe;AAAA,QAC3C;AAEO,eAAA;AAAA,MACR;AAAA,MAEC;AAAA,IAAA;AAAA,IA/CF;AAAA,IAAA;AAAA,IAAA;AAAA,MAAA,UAAA;AAAA,MAAA,YAAA;AAAA,MAAA,cAAA;AAAA,IAAA;AAAA,IAAAA;AAAAA,EAAA;AAmDF;AACA,MAAM,eAAqF;AAAA,EAC1F,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,gBAAgB;AACjB;"}
1
+ {"version":3,"file":"LoginForm.js","sources":["../../../../../../packages/react-client-tenant/src/components/forms/LoginForm.tsx"],"sourcesContent":["import { ReactElement, useCallback, useMemo } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { SignInErrorCode } from '@contember/graphql-client-tenant'\nimport { FormContextValue, FormError, FormState } from '../../types'\nimport { useForm } from '../../contexts'\nimport { useSetSessionToken } from '@contember/react-client'\nimport { SignInMutationResult, useSignInMutation } from '../../hooks'\nimport { useRedirectToBacklinkCallback } from '../../internal/hooks/useRedirectToBacklink'\n\n\nexport type LoginFormValues = {\n\temail: string\n\tpassword: string\n\totpToken: string\n}\n\nexport type LoginFormErrorCode =\n\t| SignInErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'UNKNOWN_ERROR'\n\nexport type LoginFormState =\n\t| FormState\n\t| 'otp-required'\n\nexport type LoginFormError = FormError<LoginFormValues, LoginFormErrorCode>\n\nexport type LoginFormContextValue = FormContextValue<LoginFormValues, LoginFormErrorCode, LoginFormState>\n\nexport interface LoginFormProps {\n\texpiration?: number\n\tchildren: ReactElement\n\tonSuccess?: () => void\n}\n\nexport const useLoginForm = useForm as () => LoginFormContextValue\n\nconst headers = {\n\t'X-Contember-Token-Path': 'data.mutation.result.token',\n}\n\nconst DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 60 // 14 days\n\nexport const LoginForm = ({ children, expiration = DEFAULT_LOGIN_EXPIRATION, onSuccess }: LoginFormProps) => {\n\tconst login = useSignInMutation({ headers })\n\tconst redirectToBacklink = useRedirectToBacklinkCallback()\n\tconst setSessionToken = useSetSessionToken()\n\treturn (\n\t\t<TenantForm<LoginFormContextValue, SignInMutationResult>\n\t\t\tonSuccess={args => {\n\t\t\t\tonSuccess?.()\n\t\t\t\tsetSessionToken(args.result.token)\n\t\t\t\tredirectToBacklink()\n\t\t\t}}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={{\n\t\t\t\temail: '',\n\t\t\t\tpassword: '',\n\t\t\t\totpToken: '',\n\t\t\t}}\n\t\t\tvalidate={({ values, state }) => {\n\t\t\t\tconst errors: LoginFormError[] = []\n\t\t\t\tif (!values.email) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'email' })\n\t\t\t\t} else if (!values.email.match(/^.+@.+$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'email' })\n\t\t\t\t}\n\n\t\t\t\tif (!values.password) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'password' })\n\t\t\t\t} else if (values.password.length < 6) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'password' })\n\t\t\t\t}\n\t\t\t\tif (!values.otpToken && state === 'otp-required') {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'otpToken' })\n\t\t\t\t} else if (values.otpToken && !values.otpToken.match(/^\\d{6}$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'otpToken' })\n\t\t\t\t}\n\t\t\t\treturn errors\n\t\t\t}}\n\t\t\texecute={async ({ values }) => {\n\t\t\t\tconst result = await login({\n\t\t\t\t\temail: values.email!,\n\t\t\t\t\tpassword: values.password!,\n\t\t\t\t\totpToken: values.otpToken || undefined,\n\t\t\t\t\texpiration: expiration,\n\t\t\t\t})\n\n\t\t\t\tif (!result.ok && result.error === 'OTP_REQUIRED') {\n\t\t\t\t\treturn { ...result, state: 'otp-required' }\n\t\t\t\t}\n\n\t\t\t\treturn result\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.SignInErrorCode, keyof LoginFormValues | undefined> = {\n\t'INVALID_PASSWORD': 'password',\n\t'NO_PASSWORD_SET': 'password',\n\t'UNKNOWN_EMAIL': 'email',\n\t'PERSON_DISABLED': 'email',\n\t'INVALID_OTP_TOKEN': 'otpToken',\n\t'OTP_REQUIRED': undefined,\n}\n"],"names":["this"],"mappings":";;;;;;AAqCO,MAAM,eAAe;AAE5B,MAAM,UAAU;AAAA,EACf,0BAA0B;AAC3B;AAEA,MAAM,2BAA2B,KAAK,KAAK;AAEpC,MAAM,YAAY,CAAC,EAAE,UAAU,aAAa,0BAA0B,gBAAgC;AAC5G,QAAM,QAAQ,kBAAkB,EAAE,QAAS,CAAA;AAC3C,QAAM,qBAAqB;AAC3B,QAAM,kBAAkB;AAEvB,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,WAAW,CAAQ,SAAA;AACN;AACI,wBAAA,KAAK,OAAO,KAAK;AACd;MACpB;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,QACd,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,MACX;AAAA,MACA,UAAU,CAAC,EAAE,QAAQ,YAAY;AAChC,cAAM,SAA2B,CAAA;AAC7B,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,SAAS;AAAA,mBAC5C,CAAC,OAAO,MAAM,MAAM,SAAS,GAAG;AAC1C,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,SAAS;AAAA,QACtD;AAEI,YAAA,CAAC,OAAO,UAAU;AACrB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAC/C,WAAA,OAAO,SAAS,SAAS,GAAG;AACtC,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QACzD;AACA,YAAI,CAAC,OAAO,YAAY,UAAU,gBAAgB;AACjD,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAAA,WAC/C,OAAO,YAAY,CAAC,OAAO,SAAS,MAAM,SAAS,GAAG;AAChE,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QACzD;AACO,eAAA;AAAA,MACR;AAAA,MACA,SAAS,OAAO,EAAE,aAAa;AACxB,cAAA,SAAS,MAAM,MAAM;AAAA,UAC1B,OAAO,OAAO;AAAA,UACd,UAAU,OAAO;AAAA,UACjB,UAAU,OAAO,YAAY;AAAA,UAC7B;AAAA,QAAA,CACA;AAED,YAAI,CAAC,OAAO,MAAM,OAAO,UAAU,gBAAgB;AAClD,iBAAO,EAAE,GAAG,QAAQ,OAAO,eAAe;AAAA,QAC3C;AAEO,eAAA;AAAA,MACR;AAAA,MAEC;AAAA,IAAA;AAAA,IA/CF;AAAA,IAAA;AAAA,IAAA;AAAA,MAAA,UAAA;AAAA,MAAA,YAAA;AAAA,MAAA,cAAA;AAAA,IAAA;AAAA,IAAAA;AAAAA,EAAA;AAmDF;AACA,MAAM,eAAqF;AAAA,EAC1F,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,gBAAgB;AACjB;"}
@@ -55,7 +55,8 @@ const errorToField = {
55
55
  PASSWORD_TOO_WEAK: "password",
56
56
  TOKEN_EXPIRED: "token",
57
57
  TOKEN_NOT_FOUND: "token",
58
- TOKEN_USED: "token"
58
+ TOKEN_USED: "token",
59
+ TOKEN_INVALID: "token"
59
60
  };
60
61
  exports.PasswordResetForm = PasswordResetForm;
61
62
  exports.usePasswordResetForm = usePasswordResetForm;
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordResetForm.cjs","sources":["../../../../../../packages/react-client-tenant/src/components/forms/PasswordResetForm.tsx"],"sourcesContent":["import { ReactElement } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { ResetPasswordErrorCode } from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { FormContextValue, FormError, FormState } from '../../types'\nimport { useForm } from '../../contexts'\nimport { useResetPasswordMutation } from '../../hooks'\n\nexport type PasswordResetFormValues = {\n\ttoken: string\n\tpassword: string\n\tpasswordConfirmation: string\n}\n\nexport type PasswordResetFormErrorCode =\n\t| ResetPasswordErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'PASSWORD_MISMATCH'\n\t| 'UNKNOWN_ERROR'\n\nexport type PasswordResetFormState = FormState\n\nexport type PasswordResetFormError = FormError<PasswordResetFormValues, PasswordResetFormErrorCode>\n\nexport type PasswordResetFormContextValue = FormContextValue<PasswordResetFormValues, PasswordResetFormErrorCode>\n\nexport interface PasswordResetFormProps {\n\tchildren: ReactElement\n\tonSuccess?: () => void\n\ttoken?: string\n}\n\nexport const usePasswordResetForm = useForm as () => PasswordResetFormContextValue\n\nexport const PasswordResetForm = ({ children, onSuccess, token }: PasswordResetFormProps) => {\n\tconst createReset = useResetPasswordMutation()\n\treturn (\n\t\t<TenantForm<PasswordResetFormContextValue>\n\t\t\tonSuccess={onSuccess}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={{\n\t\t\t\ttoken: token ?? '',\n\t\t\t\tpassword: '',\n\t\t\t\tpasswordConfirmation: '',\n\t\t\t}}\n\t\t\tvalidate={({ values }) => {\n\t\t\t\tconst errors: PasswordResetFormError[] = []\n\t\t\t\tif (!values.token) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'token' })\n\t\t\t\t}\n\t\t\t\tif (!values.password) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'password' })\n\t\t\t\t} else if (values.password.length < 6) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'password' })\n\t\t\t\t} else if (!values.passwordConfirmation) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'passwordConfirmation' })\n\t\t\t\t} else if (values.password !== values.passwordConfirmation) {\n\t\t\t\t\terrors.push({ code: 'PASSWORD_MISMATCH', field: 'passwordConfirmation' })\n\t\t\t\t}\n\t\t\t\treturn errors\n\t\t\t}}\n\t\t\texecute={async ({ values }) => {\n\t\t\t\treturn await createReset({\n\t\t\t\t\tpassword: values.password,\n\t\t\t\t\ttoken: values.token,\n\t\t\t\t})\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.ResetPasswordErrorCode, keyof PasswordResetFormValues | undefined> = {\n\tPASSWORD_TOO_WEAK: 'password',\n\tTOKEN_EXPIRED: 'token',\n\tTOKEN_NOT_FOUND: 'token',\n\tTOKEN_USED: 'token',\n}\n"],"names":["useForm","useResetPasswordMutation","jsxDEV","TenantForm","this"],"mappings":";;;;;;AAiCO,MAAM,uBAAuBA,SAAA;AAE7B,MAAM,oBAAoB,CAAC,EAAE,UAAU,WAAW,YAAoC;AAC5F,QAAM,cAAcC,yBAAAA;AAEnB,SAAAC,8BAAA;AAAA,IAACC,WAAA;AAAA,IAAA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,QACd,OAAO,SAAS;AAAA,QAChB,UAAU;AAAA,QACV,sBAAsB;AAAA,MACvB;AAAA,MACA,UAAU,CAAC,EAAE,aAAa;AACzB,cAAM,SAAmC,CAAA;AACrC,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,SAAS;AAAA,QACvD;AACI,YAAA,CAAC,OAAO,UAAU;AACrB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAC/C,WAAA,OAAO,SAAS,SAAS,GAAG;AACtC,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA,WAC9C,CAAC,OAAO,sBAAsB;AACxC,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,wBAAwB;AAAA,QAC3D,WAAA,OAAO,aAAa,OAAO,sBAAsB;AAC3D,iBAAO,KAAK,EAAE,MAAM,qBAAqB,OAAO,wBAAwB;AAAA,QACzE;AACO,eAAA;AAAA,MACR;AAAA,MACA,SAAS,OAAO,EAAE,aAAa;AAC9B,eAAO,MAAM,YAAY;AAAA,UACxB,UAAU,OAAO;AAAA,UACjB,OAAO,OAAO;AAAA,QAAA,CACd;AAAA,MACF;AAAA,MAEC;AAAA,IAAA;AAAA,IA/BF;AAAA,IAAA;AAAA,IAAA;AAAA,MAAA,UAAA;AAAA,MAAA,YAAA;AAAA,MAAA,cAAA;AAAA,IAAA;AAAA,IAAAC;AAAAA,EAAA;AAmCF;AACA,MAAM,eAAoG;AAAA,EACzG,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,YAAY;AACb;;;"}
1
+ {"version":3,"file":"PasswordResetForm.cjs","sources":["../../../../../../packages/react-client-tenant/src/components/forms/PasswordResetForm.tsx"],"sourcesContent":["import { ReactElement } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { ResetPasswordErrorCode } from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { FormContextValue, FormError, FormState } from '../../types'\nimport { useForm } from '../../contexts'\nimport { useResetPasswordMutation } from '../../hooks'\n\nexport type PasswordResetFormValues = {\n\ttoken: string\n\tpassword: string\n\tpasswordConfirmation: string\n}\n\nexport type PasswordResetFormErrorCode =\n\t| ResetPasswordErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'PASSWORD_MISMATCH'\n\t| 'UNKNOWN_ERROR'\n\nexport type PasswordResetFormState = FormState\n\nexport type PasswordResetFormError = FormError<PasswordResetFormValues, PasswordResetFormErrorCode>\n\nexport type PasswordResetFormContextValue = FormContextValue<PasswordResetFormValues, PasswordResetFormErrorCode>\n\nexport interface PasswordResetFormProps {\n\tchildren: ReactElement\n\tonSuccess?: () => void\n\ttoken?: string\n}\n\nexport const usePasswordResetForm = useForm as () => PasswordResetFormContextValue\n\nexport const PasswordResetForm = ({ children, onSuccess, token }: PasswordResetFormProps) => {\n\tconst createReset = useResetPasswordMutation()\n\treturn (\n\t\t<TenantForm<PasswordResetFormContextValue>\n\t\t\tonSuccess={onSuccess}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={{\n\t\t\t\ttoken: token ?? '',\n\t\t\t\tpassword: '',\n\t\t\t\tpasswordConfirmation: '',\n\t\t\t}}\n\t\t\tvalidate={({ values }) => {\n\t\t\t\tconst errors: PasswordResetFormError[] = []\n\t\t\t\tif (!values.token) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'token' })\n\t\t\t\t}\n\t\t\t\tif (!values.password) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'password' })\n\t\t\t\t} else if (values.password.length < 6) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'password' })\n\t\t\t\t} else if (!values.passwordConfirmation) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'passwordConfirmation' })\n\t\t\t\t} else if (values.password !== values.passwordConfirmation) {\n\t\t\t\t\terrors.push({ code: 'PASSWORD_MISMATCH', field: 'passwordConfirmation' })\n\t\t\t\t}\n\t\t\t\treturn errors\n\t\t\t}}\n\t\t\texecute={async ({ values }) => {\n\t\t\t\treturn await createReset({\n\t\t\t\t\tpassword: values.password,\n\t\t\t\t\ttoken: values.token,\n\t\t\t\t})\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.ResetPasswordErrorCode, keyof PasswordResetFormValues | undefined> = {\n\tPASSWORD_TOO_WEAK: 'password',\n\tTOKEN_EXPIRED: 'token',\n\tTOKEN_NOT_FOUND: 'token',\n\tTOKEN_USED: 'token',\n\tTOKEN_INVALID: 'token',\n}\n"],"names":["useForm","useResetPasswordMutation","jsxDEV","TenantForm","this"],"mappings":";;;;;;AAiCO,MAAM,uBAAuBA,SAAA;AAE7B,MAAM,oBAAoB,CAAC,EAAE,UAAU,WAAW,YAAoC;AAC5F,QAAM,cAAcC,yBAAAA;AAEnB,SAAAC,8BAAA;AAAA,IAACC,WAAA;AAAA,IAAA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,QACd,OAAO,SAAS;AAAA,QAChB,UAAU;AAAA,QACV,sBAAsB;AAAA,MACvB;AAAA,MACA,UAAU,CAAC,EAAE,aAAa;AACzB,cAAM,SAAmC,CAAA;AACrC,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,SAAS;AAAA,QACvD;AACI,YAAA,CAAC,OAAO,UAAU;AACrB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAC/C,WAAA,OAAO,SAAS,SAAS,GAAG;AACtC,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA,WAC9C,CAAC,OAAO,sBAAsB;AACxC,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,wBAAwB;AAAA,QAC3D,WAAA,OAAO,aAAa,OAAO,sBAAsB;AAC3D,iBAAO,KAAK,EAAE,MAAM,qBAAqB,OAAO,wBAAwB;AAAA,QACzE;AACO,eAAA;AAAA,MACR;AAAA,MACA,SAAS,OAAO,EAAE,aAAa;AAC9B,eAAO,MAAM,YAAY;AAAA,UACxB,UAAU,OAAO;AAAA,UACjB,OAAO,OAAO;AAAA,QAAA,CACd;AAAA,MACF;AAAA,MAEC;AAAA,IAAA;AAAA,IA/BF;AAAA,IAAA;AAAA,IAAA;AAAA,MAAA,UAAA;AAAA,MAAA,YAAA;AAAA,MAAA,cAAA;AAAA,IAAA;AAAA,IAAAC;AAAAA,EAAA;AAmCF;AACA,MAAM,eAAoG;AAAA,EACzG,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,eAAe;AAChB;;;"}
@@ -53,7 +53,8 @@ const errorToField = {
53
53
  PASSWORD_TOO_WEAK: "password",
54
54
  TOKEN_EXPIRED: "token",
55
55
  TOKEN_NOT_FOUND: "token",
56
- TOKEN_USED: "token"
56
+ TOKEN_USED: "token",
57
+ TOKEN_INVALID: "token"
57
58
  };
58
59
  export {
59
60
  PasswordResetForm,
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordResetForm.js","sources":["../../../../../../packages/react-client-tenant/src/components/forms/PasswordResetForm.tsx"],"sourcesContent":["import { ReactElement } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { ResetPasswordErrorCode } from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { FormContextValue, FormError, FormState } from '../../types'\nimport { useForm } from '../../contexts'\nimport { useResetPasswordMutation } from '../../hooks'\n\nexport type PasswordResetFormValues = {\n\ttoken: string\n\tpassword: string\n\tpasswordConfirmation: string\n}\n\nexport type PasswordResetFormErrorCode =\n\t| ResetPasswordErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'PASSWORD_MISMATCH'\n\t| 'UNKNOWN_ERROR'\n\nexport type PasswordResetFormState = FormState\n\nexport type PasswordResetFormError = FormError<PasswordResetFormValues, PasswordResetFormErrorCode>\n\nexport type PasswordResetFormContextValue = FormContextValue<PasswordResetFormValues, PasswordResetFormErrorCode>\n\nexport interface PasswordResetFormProps {\n\tchildren: ReactElement\n\tonSuccess?: () => void\n\ttoken?: string\n}\n\nexport const usePasswordResetForm = useForm as () => PasswordResetFormContextValue\n\nexport const PasswordResetForm = ({ children, onSuccess, token }: PasswordResetFormProps) => {\n\tconst createReset = useResetPasswordMutation()\n\treturn (\n\t\t<TenantForm<PasswordResetFormContextValue>\n\t\t\tonSuccess={onSuccess}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={{\n\t\t\t\ttoken: token ?? '',\n\t\t\t\tpassword: '',\n\t\t\t\tpasswordConfirmation: '',\n\t\t\t}}\n\t\t\tvalidate={({ values }) => {\n\t\t\t\tconst errors: PasswordResetFormError[] = []\n\t\t\t\tif (!values.token) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'token' })\n\t\t\t\t}\n\t\t\t\tif (!values.password) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'password' })\n\t\t\t\t} else if (values.password.length < 6) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'password' })\n\t\t\t\t} else if (!values.passwordConfirmation) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'passwordConfirmation' })\n\t\t\t\t} else if (values.password !== values.passwordConfirmation) {\n\t\t\t\t\terrors.push({ code: 'PASSWORD_MISMATCH', field: 'passwordConfirmation' })\n\t\t\t\t}\n\t\t\t\treturn errors\n\t\t\t}}\n\t\t\texecute={async ({ values }) => {\n\t\t\t\treturn await createReset({\n\t\t\t\t\tpassword: values.password,\n\t\t\t\t\ttoken: values.token,\n\t\t\t\t})\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.ResetPasswordErrorCode, keyof PasswordResetFormValues | undefined> = {\n\tPASSWORD_TOO_WEAK: 'password',\n\tTOKEN_EXPIRED: 'token',\n\tTOKEN_NOT_FOUND: 'token',\n\tTOKEN_USED: 'token',\n}\n"],"names":["this"],"mappings":";;;;AAiCO,MAAM,uBAAuB;AAE7B,MAAM,oBAAoB,CAAC,EAAE,UAAU,WAAW,YAAoC;AAC5F,QAAM,cAAc;AAEnB,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,QACd,OAAO,SAAS;AAAA,QAChB,UAAU;AAAA,QACV,sBAAsB;AAAA,MACvB;AAAA,MACA,UAAU,CAAC,EAAE,aAAa;AACzB,cAAM,SAAmC,CAAA;AACrC,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,SAAS;AAAA,QACvD;AACI,YAAA,CAAC,OAAO,UAAU;AACrB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAC/C,WAAA,OAAO,SAAS,SAAS,GAAG;AACtC,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA,WAC9C,CAAC,OAAO,sBAAsB;AACxC,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,wBAAwB;AAAA,QAC3D,WAAA,OAAO,aAAa,OAAO,sBAAsB;AAC3D,iBAAO,KAAK,EAAE,MAAM,qBAAqB,OAAO,wBAAwB;AAAA,QACzE;AACO,eAAA;AAAA,MACR;AAAA,MACA,SAAS,OAAO,EAAE,aAAa;AAC9B,eAAO,MAAM,YAAY;AAAA,UACxB,UAAU,OAAO;AAAA,UACjB,OAAO,OAAO;AAAA,QAAA,CACd;AAAA,MACF;AAAA,MAEC;AAAA,IAAA;AAAA,IA/BF;AAAA,IAAA;AAAA,IAAA;AAAA,MAAA,UAAA;AAAA,MAAA,YAAA;AAAA,MAAA,cAAA;AAAA,IAAA;AAAA,IAAAA;AAAAA,EAAA;AAmCF;AACA,MAAM,eAAoG;AAAA,EACzG,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,YAAY;AACb;"}
1
+ {"version":3,"file":"PasswordResetForm.js","sources":["../../../../../../packages/react-client-tenant/src/components/forms/PasswordResetForm.tsx"],"sourcesContent":["import { ReactElement } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { ResetPasswordErrorCode } from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { FormContextValue, FormError, FormState } from '../../types'\nimport { useForm } from '../../contexts'\nimport { useResetPasswordMutation } from '../../hooks'\n\nexport type PasswordResetFormValues = {\n\ttoken: string\n\tpassword: string\n\tpasswordConfirmation: string\n}\n\nexport type PasswordResetFormErrorCode =\n\t| ResetPasswordErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'PASSWORD_MISMATCH'\n\t| 'UNKNOWN_ERROR'\n\nexport type PasswordResetFormState = FormState\n\nexport type PasswordResetFormError = FormError<PasswordResetFormValues, PasswordResetFormErrorCode>\n\nexport type PasswordResetFormContextValue = FormContextValue<PasswordResetFormValues, PasswordResetFormErrorCode>\n\nexport interface PasswordResetFormProps {\n\tchildren: ReactElement\n\tonSuccess?: () => void\n\ttoken?: string\n}\n\nexport const usePasswordResetForm = useForm as () => PasswordResetFormContextValue\n\nexport const PasswordResetForm = ({ children, onSuccess, token }: PasswordResetFormProps) => {\n\tconst createReset = useResetPasswordMutation()\n\treturn (\n\t\t<TenantForm<PasswordResetFormContextValue>\n\t\t\tonSuccess={onSuccess}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={{\n\t\t\t\ttoken: token ?? '',\n\t\t\t\tpassword: '',\n\t\t\t\tpasswordConfirmation: '',\n\t\t\t}}\n\t\t\tvalidate={({ values }) => {\n\t\t\t\tconst errors: PasswordResetFormError[] = []\n\t\t\t\tif (!values.token) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'token' })\n\t\t\t\t}\n\t\t\t\tif (!values.password) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'password' })\n\t\t\t\t} else if (values.password.length < 6) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'password' })\n\t\t\t\t} else if (!values.passwordConfirmation) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'passwordConfirmation' })\n\t\t\t\t} else if (values.password !== values.passwordConfirmation) {\n\t\t\t\t\terrors.push({ code: 'PASSWORD_MISMATCH', field: 'passwordConfirmation' })\n\t\t\t\t}\n\t\t\t\treturn errors\n\t\t\t}}\n\t\t\texecute={async ({ values }) => {\n\t\t\t\treturn await createReset({\n\t\t\t\t\tpassword: values.password,\n\t\t\t\t\ttoken: values.token,\n\t\t\t\t})\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.ResetPasswordErrorCode, keyof PasswordResetFormValues | undefined> = {\n\tPASSWORD_TOO_WEAK: 'password',\n\tTOKEN_EXPIRED: 'token',\n\tTOKEN_NOT_FOUND: 'token',\n\tTOKEN_USED: 'token',\n\tTOKEN_INVALID: 'token',\n}\n"],"names":["this"],"mappings":";;;;AAiCO,MAAM,uBAAuB;AAE7B,MAAM,oBAAoB,CAAC,EAAE,UAAU,WAAW,YAAoC;AAC5F,QAAM,cAAc;AAEnB,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,QACd,OAAO,SAAS;AAAA,QAChB,UAAU;AAAA,QACV,sBAAsB;AAAA,MACvB;AAAA,MACA,UAAU,CAAC,EAAE,aAAa;AACzB,cAAM,SAAmC,CAAA;AACrC,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,SAAS;AAAA,QACvD;AACI,YAAA,CAAC,OAAO,UAAU;AACrB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAC/C,WAAA,OAAO,SAAS,SAAS,GAAG;AACtC,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA,WAC9C,CAAC,OAAO,sBAAsB;AACxC,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,wBAAwB;AAAA,QAC3D,WAAA,OAAO,aAAa,OAAO,sBAAsB;AAC3D,iBAAO,KAAK,EAAE,MAAM,qBAAqB,OAAO,wBAAwB;AAAA,QACzE;AACO,eAAA;AAAA,MACR;AAAA,MACA,SAAS,OAAO,EAAE,aAAa;AAC9B,eAAO,MAAM,YAAY;AAAA,UACxB,UAAU,OAAO;AAAA,UACjB,OAAO,OAAO;AAAA,QAAA,CACd;AAAA,MACF;AAAA,MAEC;AAAA,IAAA;AAAA,IA/BF;AAAA,IAAA;AAAA,IAAA;AAAA,MAAA,UAAA;AAAA,MAAA,YAAA;AAAA,MAAA,cAAA;AAAA,IAAA;AAAA,IAAAA;AAAAA,EAAA;AAmCF;AACA,MAAM,eAAoG;AAAA,EACzG,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,eAAe;AAChB;"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxDevRuntime = require("react/jsx-dev-runtime");
4
+ const React = require("react");
5
+ const TenantForm = require("./TenantForm.cjs");
6
+ const contexts = require("../../contexts.cjs");
7
+ const useRedirectToBacklink = require("../../internal/hooks/useRedirectToBacklink.cjs");
8
+ const reactClient = require("@contember/react-client");
9
+ const useSignInPasswordlessMutation = require("../../hooks/mutations/passwordless/useSignInPasswordlessMutation.cjs");
10
+ const usePasswordlessSignInForm = contexts.useForm;
11
+ const headers = {
12
+ "X-Contember-Token-Path": "data.mutation.result.token"
13
+ };
14
+ const DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 60;
15
+ const PasswordlessSignInForm = ({ children, onSuccess, requestId, validationType, token, expiration = DEFAULT_LOGIN_EXPIRATION }) => {
16
+ const signIn = useSignInPasswordlessMutation.useSignInPasswordlessMutation({ headers });
17
+ const redirectToBacklink = useRedirectToBacklink.useRedirectToBacklinkCallback();
18
+ const setSessionToken = reactClient.useSetSessionToken();
19
+ return /* @__PURE__ */ jsxDevRuntime.jsxDEV(
20
+ TenantForm.TenantForm,
21
+ {
22
+ onSuccess: (args) => {
23
+ onSuccess?.();
24
+ setSessionToken(args.result.token);
25
+ redirectToBacklink();
26
+ },
27
+ errorMapping: errorToField,
28
+ initialValues: React.useMemo(() => ({
29
+ token: token ?? "",
30
+ otpToken: ""
31
+ }), [token]),
32
+ validate: ({ values, state }) => {
33
+ if (!values.token) {
34
+ return [{ code: "FIELD_REQUIRED", field: "token" }];
35
+ }
36
+ if (!values.otpToken && state === "otp-required") {
37
+ return [{ code: "FIELD_REQUIRED", field: "otpToken" }];
38
+ } else if (values.otpToken && !values.otpToken.match(/^\d{6}$/)) {
39
+ return [{ code: "INVALID_VALUE", field: "otpToken" }];
40
+ }
41
+ return [];
42
+ },
43
+ execute: React.useCallback(async ({ values }) => {
44
+ const result = await signIn({
45
+ requestId,
46
+ expiration,
47
+ token: values.token,
48
+ mfaOtp: values.otpToken || void 0,
49
+ validationType
50
+ });
51
+ if (!result.ok && result.error === "OTP_REQUIRED") {
52
+ return { ...result, state: "otp-required" };
53
+ }
54
+ return result;
55
+ }, [expiration, requestId, signIn, validationType]),
56
+ children
57
+ },
58
+ void 0,
59
+ false,
60
+ {
61
+ fileName: "/home/runner/work/contember/contember/packages/react-client-tenant/src/components/forms/PasswordlessSignInForm.tsx",
62
+ lineNumber: 52,
63
+ columnNumber: 3
64
+ },
65
+ void 0
66
+ );
67
+ };
68
+ const errorToField = {
69
+ PERSON_DISABLED: void 0,
70
+ TOKEN_EXPIRED: "token",
71
+ TOKEN_NOT_FOUND: "token",
72
+ TOKEN_USED: "token",
73
+ TOKEN_INVALID: "token",
74
+ INVALID_OTP_TOKEN: "otpToken",
75
+ OTP_REQUIRED: void 0
76
+ };
77
+ exports.PasswordlessSignInForm = PasswordlessSignInForm;
78
+ exports.usePasswordlessSignInForm = usePasswordlessSignInForm;
79
+ //# sourceMappingURL=PasswordlessSignInForm.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PasswordlessSignInForm.cjs","sources":["../../../../../../packages/react-client-tenant/src/components/forms/PasswordlessSignInForm.tsx"],"sourcesContent":["import { ReactElement, useCallback, useMemo } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { FormContextValue, FormError, FormState } from '../../types/forms'\nimport { useForm } from '../../contexts'\nimport { SignInPasswordlessMutationResult, useSignInPasswordlessMutation } from '../../hooks'\nimport { useRedirectToBacklinkCallback } from '../../internal/hooks/useRedirectToBacklink'\nimport { useSetSessionToken } from '@contember/react-client'\n\nexport type PasswordlessSignInFormValues = {\n\ttoken: string\n\totpToken: string\n}\n\nexport type PasswordlessSignInFormErrorCode =\n\t| TenantApi.SignInPasswordlessErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'UNKNOWN_ERROR'\n\nexport type PasswordlessSignInFormState =\n\t| FormState\n\t| 'otp-required'\n\nexport type PasswordlessSignInFormError = FormError<PasswordlessSignInFormValues, PasswordlessSignInFormErrorCode>\n\nexport type PasswordlessSignInFormContextValue = FormContextValue<PasswordlessSignInFormValues, PasswordlessSignInFormErrorCode, PasswordlessSignInFormState>\n\n\nexport interface PasswordlessSignInFormProps {\n\trequestId: string\n\tvalidationType: TenantApi.PasswordlessValidationType\n\ttoken?: string\n\texpiration?: number\n\tchildren: ReactElement\n\tonSuccess?: () => void\n}\n\nexport const usePasswordlessSignInForm = useForm as () => PasswordlessSignInFormContextValue\n\nconst headers = {\n\t'X-Contember-Token-Path': 'data.mutation.result.token',\n}\nconst DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 60 // 14 days\n\nexport const PasswordlessSignInForm = ({ children, onSuccess, requestId, validationType, token, expiration = DEFAULT_LOGIN_EXPIRATION }: PasswordlessSignInFormProps) => {\n\n\tconst signIn = useSignInPasswordlessMutation({ headers })\n\tconst redirectToBacklink = useRedirectToBacklinkCallback()\n\tconst setSessionToken = useSetSessionToken()\n\treturn (\n\t\t<TenantForm<PasswordlessSignInFormContextValue, SignInPasswordlessMutationResult>\n\t\t\tonSuccess={args => {\n\t\t\t\tonSuccess?.()\n\t\t\t\tsetSessionToken(args.result.token)\n\t\t\t\tredirectToBacklink()\n\t\t\t}}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={useMemo(() => ({\n\t\t\t\ttoken: token ?? '',\n\t\t\t\totpToken: '',\n\t\t\t}), [token])}\n\t\t\tvalidate={({ values, state }) => {\n\t\t\t\tif (!values.token) {\n\t\t\t\t\treturn [{ code: 'FIELD_REQUIRED', field: 'token' }]\n\t\t\t\t}\n\t\t\t\tif (!values.otpToken && state === 'otp-required') {\n\t\t\t\t\treturn [{ code: 'FIELD_REQUIRED', field: 'otpToken' }]\n\t\t\t\t} else if (values.otpToken && !values.otpToken.match(/^\\d{6}$/)) {\n\t\t\t\t\treturn [{ code: 'INVALID_VALUE', field: 'otpToken' }]\n\t\t\t\t}\n\t\t\t\treturn []\n\t\t\t}}\n\t\t\texecute={useCallback(async ({ values }) => {\n\t\t\t\tconst result = await signIn({\n\t\t\t\t\trequestId,\n\t\t\t\t\texpiration,\n\t\t\t\t\ttoken: values.token,\n\t\t\t\t\tmfaOtp: values.otpToken || undefined,\n\t\t\t\t\tvalidationType,\n\t\t\t\t})\n\t\t\t\tif (!result.ok && result.error === 'OTP_REQUIRED') {\n\t\t\t\t\treturn { ...result, state: 'otp-required' }\n\t\t\t\t}\n\n\t\t\t\treturn result\n\t\t\t}, [expiration, requestId, signIn, validationType])}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.SignInPasswordlessErrorCode, keyof PasswordlessSignInFormValues | undefined> = {\n\tPERSON_DISABLED: undefined,\n\tTOKEN_EXPIRED: 'token',\n\tTOKEN_NOT_FOUND: 'token',\n\tTOKEN_USED: 'token',\n\tTOKEN_INVALID: 'token',\n\tINVALID_OTP_TOKEN: 'otpToken',\n\tOTP_REQUIRED: undefined,\n}\n"],"names":["useForm","useSignInPasswordlessMutation","useRedirectToBacklinkCallback","useSetSessionToken","jsxDEV","TenantForm","useMemo","useCallback","this"],"mappings":";;;;;;;;;AAsCO,MAAM,4BAA4BA,SAAA;AAEzC,MAAM,UAAU;AAAA,EACf,0BAA0B;AAC3B;AACA,MAAM,2BAA2B,KAAK,KAAK;AAE9B,MAAA,yBAAyB,CAAC,EAAE,UAAU,WAAW,WAAW,gBAAgB,OAAO,aAAa,+BAA4D;AAExK,QAAM,SAASC,8BAAAA,8BAA8B,EAAE,QAAS,CAAA;AACxD,QAAM,qBAAqBC,sBAAAA;AAC3B,QAAM,kBAAkBC,YAAAA;AAEvB,SAAAC,8BAAA;AAAA,IAACC,WAAA;AAAA,IAAA;AAAA,MACA,WAAW,CAAQ,SAAA;AACN;AACI,wBAAA,KAAK,OAAO,KAAK;AACd;MACpB;AAAA,MACA,cAAc;AAAA,MACd,eAAeC,cAAQ,OAAO;AAAA,QAC7B,OAAO,SAAS;AAAA,QAChB,UAAU;AAAA,MAAA,IACP,CAAC,KAAK,CAAC;AAAA,MACX,UAAU,CAAC,EAAE,QAAQ,YAAY;AAC5B,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,CAAC,EAAE,MAAM,kBAAkB,OAAO,QAAS,CAAA;AAAA,QACnD;AACA,YAAI,CAAC,OAAO,YAAY,UAAU,gBAAgB;AACjD,iBAAO,CAAC,EAAE,MAAM,kBAAkB,OAAO,WAAY,CAAA;AAAA,QAAA,WAC3C,OAAO,YAAY,CAAC,OAAO,SAAS,MAAM,SAAS,GAAG;AAChE,iBAAO,CAAC,EAAE,MAAM,iBAAiB,OAAO,WAAY,CAAA;AAAA,QACrD;AACA,eAAO;MACR;AAAA,MACA,SAASC,MAAA,YAAY,OAAO,EAAE,aAAa;AACpC,cAAA,SAAS,MAAM,OAAO;AAAA,UAC3B;AAAA,UACA;AAAA,UACA,OAAO,OAAO;AAAA,UACd,QAAQ,OAAO,YAAY;AAAA,UAC3B;AAAA,QAAA,CACA;AACD,YAAI,CAAC,OAAO,MAAM,OAAO,UAAU,gBAAgB;AAClD,iBAAO,EAAE,GAAG,QAAQ,OAAO,eAAe;AAAA,QAC3C;AAEO,eAAA;AAAA,SACL,CAAC,YAAY,WAAW,QAAQ,cAAc,CAAC;AAAA,MAEjD;AAAA,IAAA;AAAA,IArCF;AAAA,IAAA;AAAA,IAAA;AAAA,MAAA,UAAA;AAAA,MAAA,YAAA;AAAA,MAAA,cAAA;AAAA,IAAA;AAAA,IAAAC;AAAAA,EAAA;AAyCF;AACA,MAAM,eAA8G;AAAA,EACnH,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,cAAc;AACf;;;"}
@@ -0,0 +1,79 @@
1
+ import { jsxDEV } from "react/jsx-dev-runtime";
2
+ import { useMemo, useCallback } from "react";
3
+ import { TenantForm } from "./TenantForm.js";
4
+ import { useForm } from "../../contexts.js";
5
+ import { useRedirectToBacklinkCallback } from "../../internal/hooks/useRedirectToBacklink.js";
6
+ import { useSetSessionToken } from "@contember/react-client";
7
+ import { useSignInPasswordlessMutation } from "../../hooks/mutations/passwordless/useSignInPasswordlessMutation.js";
8
+ const usePasswordlessSignInForm = useForm;
9
+ const headers = {
10
+ "X-Contember-Token-Path": "data.mutation.result.token"
11
+ };
12
+ const DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 60;
13
+ const PasswordlessSignInForm = ({ children, onSuccess, requestId, validationType, token, expiration = DEFAULT_LOGIN_EXPIRATION }) => {
14
+ const signIn = useSignInPasswordlessMutation({ headers });
15
+ const redirectToBacklink = useRedirectToBacklinkCallback();
16
+ const setSessionToken = useSetSessionToken();
17
+ return /* @__PURE__ */ jsxDEV(
18
+ TenantForm,
19
+ {
20
+ onSuccess: (args) => {
21
+ onSuccess?.();
22
+ setSessionToken(args.result.token);
23
+ redirectToBacklink();
24
+ },
25
+ errorMapping: errorToField,
26
+ initialValues: useMemo(() => ({
27
+ token: token ?? "",
28
+ otpToken: ""
29
+ }), [token]),
30
+ validate: ({ values, state }) => {
31
+ if (!values.token) {
32
+ return [{ code: "FIELD_REQUIRED", field: "token" }];
33
+ }
34
+ if (!values.otpToken && state === "otp-required") {
35
+ return [{ code: "FIELD_REQUIRED", field: "otpToken" }];
36
+ } else if (values.otpToken && !values.otpToken.match(/^\d{6}$/)) {
37
+ return [{ code: "INVALID_VALUE", field: "otpToken" }];
38
+ }
39
+ return [];
40
+ },
41
+ execute: useCallback(async ({ values }) => {
42
+ const result = await signIn({
43
+ requestId,
44
+ expiration,
45
+ token: values.token,
46
+ mfaOtp: values.otpToken || void 0,
47
+ validationType
48
+ });
49
+ if (!result.ok && result.error === "OTP_REQUIRED") {
50
+ return { ...result, state: "otp-required" };
51
+ }
52
+ return result;
53
+ }, [expiration, requestId, signIn, validationType]),
54
+ children
55
+ },
56
+ void 0,
57
+ false,
58
+ {
59
+ fileName: "/home/runner/work/contember/contember/packages/react-client-tenant/src/components/forms/PasswordlessSignInForm.tsx",
60
+ lineNumber: 52,
61
+ columnNumber: 3
62
+ },
63
+ void 0
64
+ );
65
+ };
66
+ const errorToField = {
67
+ PERSON_DISABLED: void 0,
68
+ TOKEN_EXPIRED: "token",
69
+ TOKEN_NOT_FOUND: "token",
70
+ TOKEN_USED: "token",
71
+ TOKEN_INVALID: "token",
72
+ INVALID_OTP_TOKEN: "otpToken",
73
+ OTP_REQUIRED: void 0
74
+ };
75
+ export {
76
+ PasswordlessSignInForm,
77
+ usePasswordlessSignInForm
78
+ };
79
+ //# sourceMappingURL=PasswordlessSignInForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PasswordlessSignInForm.js","sources":["../../../../../../packages/react-client-tenant/src/components/forms/PasswordlessSignInForm.tsx"],"sourcesContent":["import { ReactElement, useCallback, useMemo } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { FormContextValue, FormError, FormState } from '../../types/forms'\nimport { useForm } from '../../contexts'\nimport { SignInPasswordlessMutationResult, useSignInPasswordlessMutation } from '../../hooks'\nimport { useRedirectToBacklinkCallback } from '../../internal/hooks/useRedirectToBacklink'\nimport { useSetSessionToken } from '@contember/react-client'\n\nexport type PasswordlessSignInFormValues = {\n\ttoken: string\n\totpToken: string\n}\n\nexport type PasswordlessSignInFormErrorCode =\n\t| TenantApi.SignInPasswordlessErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'UNKNOWN_ERROR'\n\nexport type PasswordlessSignInFormState =\n\t| FormState\n\t| 'otp-required'\n\nexport type PasswordlessSignInFormError = FormError<PasswordlessSignInFormValues, PasswordlessSignInFormErrorCode>\n\nexport type PasswordlessSignInFormContextValue = FormContextValue<PasswordlessSignInFormValues, PasswordlessSignInFormErrorCode, PasswordlessSignInFormState>\n\n\nexport interface PasswordlessSignInFormProps {\n\trequestId: string\n\tvalidationType: TenantApi.PasswordlessValidationType\n\ttoken?: string\n\texpiration?: number\n\tchildren: ReactElement\n\tonSuccess?: () => void\n}\n\nexport const usePasswordlessSignInForm = useForm as () => PasswordlessSignInFormContextValue\n\nconst headers = {\n\t'X-Contember-Token-Path': 'data.mutation.result.token',\n}\nconst DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 60 // 14 days\n\nexport const PasswordlessSignInForm = ({ children, onSuccess, requestId, validationType, token, expiration = DEFAULT_LOGIN_EXPIRATION }: PasswordlessSignInFormProps) => {\n\n\tconst signIn = useSignInPasswordlessMutation({ headers })\n\tconst redirectToBacklink = useRedirectToBacklinkCallback()\n\tconst setSessionToken = useSetSessionToken()\n\treturn (\n\t\t<TenantForm<PasswordlessSignInFormContextValue, SignInPasswordlessMutationResult>\n\t\t\tonSuccess={args => {\n\t\t\t\tonSuccess?.()\n\t\t\t\tsetSessionToken(args.result.token)\n\t\t\t\tredirectToBacklink()\n\t\t\t}}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={useMemo(() => ({\n\t\t\t\ttoken: token ?? '',\n\t\t\t\totpToken: '',\n\t\t\t}), [token])}\n\t\t\tvalidate={({ values, state }) => {\n\t\t\t\tif (!values.token) {\n\t\t\t\t\treturn [{ code: 'FIELD_REQUIRED', field: 'token' }]\n\t\t\t\t}\n\t\t\t\tif (!values.otpToken && state === 'otp-required') {\n\t\t\t\t\treturn [{ code: 'FIELD_REQUIRED', field: 'otpToken' }]\n\t\t\t\t} else if (values.otpToken && !values.otpToken.match(/^\\d{6}$/)) {\n\t\t\t\t\treturn [{ code: 'INVALID_VALUE', field: 'otpToken' }]\n\t\t\t\t}\n\t\t\t\treturn []\n\t\t\t}}\n\t\t\texecute={useCallback(async ({ values }) => {\n\t\t\t\tconst result = await signIn({\n\t\t\t\t\trequestId,\n\t\t\t\t\texpiration,\n\t\t\t\t\ttoken: values.token,\n\t\t\t\t\tmfaOtp: values.otpToken || undefined,\n\t\t\t\t\tvalidationType,\n\t\t\t\t})\n\t\t\t\tif (!result.ok && result.error === 'OTP_REQUIRED') {\n\t\t\t\t\treturn { ...result, state: 'otp-required' }\n\t\t\t\t}\n\n\t\t\t\treturn result\n\t\t\t}, [expiration, requestId, signIn, validationType])}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.SignInPasswordlessErrorCode, keyof PasswordlessSignInFormValues | undefined> = {\n\tPERSON_DISABLED: undefined,\n\tTOKEN_EXPIRED: 'token',\n\tTOKEN_NOT_FOUND: 'token',\n\tTOKEN_USED: 'token',\n\tTOKEN_INVALID: 'token',\n\tINVALID_OTP_TOKEN: 'otpToken',\n\tOTP_REQUIRED: undefined,\n}\n"],"names":["this"],"mappings":";;;;;;;AAsCO,MAAM,4BAA4B;AAEzC,MAAM,UAAU;AAAA,EACf,0BAA0B;AAC3B;AACA,MAAM,2BAA2B,KAAK,KAAK;AAE9B,MAAA,yBAAyB,CAAC,EAAE,UAAU,WAAW,WAAW,gBAAgB,OAAO,aAAa,+BAA4D;AAExK,QAAM,SAAS,8BAA8B,EAAE,QAAS,CAAA;AACxD,QAAM,qBAAqB;AAC3B,QAAM,kBAAkB;AAEvB,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,WAAW,CAAQ,SAAA;AACN;AACI,wBAAA,KAAK,OAAO,KAAK;AACd;MACpB;AAAA,MACA,cAAc;AAAA,MACd,eAAe,QAAQ,OAAO;AAAA,QAC7B,OAAO,SAAS;AAAA,QAChB,UAAU;AAAA,MAAA,IACP,CAAC,KAAK,CAAC;AAAA,MACX,UAAU,CAAC,EAAE,QAAQ,YAAY;AAC5B,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,CAAC,EAAE,MAAM,kBAAkB,OAAO,QAAS,CAAA;AAAA,QACnD;AACA,YAAI,CAAC,OAAO,YAAY,UAAU,gBAAgB;AACjD,iBAAO,CAAC,EAAE,MAAM,kBAAkB,OAAO,WAAY,CAAA;AAAA,QAAA,WAC3C,OAAO,YAAY,CAAC,OAAO,SAAS,MAAM,SAAS,GAAG;AAChE,iBAAO,CAAC,EAAE,MAAM,iBAAiB,OAAO,WAAY,CAAA;AAAA,QACrD;AACA,eAAO;MACR;AAAA,MACA,SAAS,YAAY,OAAO,EAAE,aAAa;AACpC,cAAA,SAAS,MAAM,OAAO;AAAA,UAC3B;AAAA,UACA;AAAA,UACA,OAAO,OAAO;AAAA,UACd,QAAQ,OAAO,YAAY;AAAA,UAC3B;AAAA,QAAA,CACA;AACD,YAAI,CAAC,OAAO,MAAM,OAAO,UAAU,gBAAgB;AAClD,iBAAO,EAAE,GAAG,QAAQ,OAAO,eAAe;AAAA,QAC3C;AAEO,eAAA;AAAA,SACL,CAAC,YAAY,WAAW,QAAQ,cAAc,CAAC;AAAA,MAEjD;AAAA,IAAA;AAAA,IArCF;AAAA,IAAA;AAAA,IAAA;AAAA,MAAA,UAAA;AAAA,MAAA,YAAA;AAAA,MAAA,cAAA;AAAA,IAAA;AAAA,IAAAA;AAAAA,EAAA;AAyCF;AACA,MAAM,eAA8G;AAAA,EACnH,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,cAAc;AACf;"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxDevRuntime = require("react/jsx-dev-runtime");
4
+ const React = require("react");
5
+ const TenantForm = require("./TenantForm.cjs");
6
+ const contexts = require("../../contexts.cjs");
7
+ const consts = require("../../consts.cjs");
8
+ const useInitSignInPasswordlessMutation = require("../../hooks/mutations/passwordless/useInitSignInPasswordlessMutation.cjs");
9
+ const usePasswordlessSignInInitForm = contexts.useForm;
10
+ const PasswordlessSignInInitForm = ({ children, onSuccess }) => {
11
+ const initSignIn = useInitSignInPasswordlessMutation.useInitSignInPasswordlessMutation();
12
+ return /* @__PURE__ */ jsxDevRuntime.jsxDEV(
13
+ TenantForm.TenantForm,
14
+ {
15
+ onSuccess: (res) => {
16
+ localStorage.setItem(consts.PASSWORDLESS_REQUEST_STORAGE_KEY, res.result.requestId);
17
+ onSuccess?.(res);
18
+ },
19
+ errorMapping: errorToField,
20
+ initialValues: React.useMemo(() => ({
21
+ email: ""
22
+ }), []),
23
+ validate: ({ values }) => {
24
+ if (!values.email) {
25
+ return [{ code: "FIELD_REQUIRED", field: "email" }];
26
+ } else if (!values.email.match(/^.+@.+$/)) {
27
+ return [{ code: "INVALID_VALUE", field: "email" }];
28
+ }
29
+ return [];
30
+ },
31
+ execute: React.useCallback(async ({ values }) => {
32
+ return await initSignIn({
33
+ email: values.email
34
+ });
35
+ }, [initSignIn]),
36
+ children
37
+ },
38
+ void 0,
39
+ false,
40
+ {
41
+ fileName: "/home/runner/work/contember/contember/packages/react-client-tenant/src/components/forms/PasswordlessSignInInitForm.tsx",
42
+ lineNumber: 37,
43
+ columnNumber: 3
44
+ },
45
+ void 0
46
+ );
47
+ };
48
+ const errorToField = {
49
+ PERSON_NOT_FOUND: "email",
50
+ PASSWORDLESS_DISABLED: void 0
51
+ };
52
+ exports.PasswordlessSignInInitForm = PasswordlessSignInInitForm;
53
+ exports.usePasswordlessSignInInitForm = usePasswordlessSignInInitForm;
54
+ //# sourceMappingURL=PasswordlessSignInInitForm.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PasswordlessSignInInitForm.cjs","sources":["../../../../../../packages/react-client-tenant/src/components/forms/PasswordlessSignInInitForm.tsx"],"sourcesContent":["import { ReactElement, useCallback, useMemo } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { FormContextValue, FormError, FormState } from '../../types/forms'\nimport { useForm } from '../../contexts'\nimport { InitSignInPasswordlessMutationResult, useInitSignInPasswordlessMutation } from '../../hooks'\nimport { PASSWORDLESS_REQUEST_STORAGE_KEY } from '../../consts'\n\nexport type PasswordlessSignInInitFormValues = {\n\temail: string\n}\n\nexport type PasswordlessSignInInitFormErrorCode =\n\t| TenantApi.InitSignInPasswordlessErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'UNKNOWN_ERROR'\n\nexport type PasswordlessSignInInitFormState = FormState\n\nexport type PasswordlessSignInInitFormError = FormError<PasswordlessSignInInitFormValues, PasswordlessSignInInitFormErrorCode>\n\nexport type PasswordlessSignInInitFormContextValue = FormContextValue<PasswordlessSignInInitFormValues, PasswordlessSignInInitFormErrorCode>\n\n\nexport interface PasswordlessSignInInitFormProps {\n\tchildren: ReactElement\n\tonSuccess?: (args: { result: InitSignInPasswordlessMutationResult }) => void\n}\n\nexport const usePasswordlessSignInInitForm = useForm as () => PasswordlessSignInInitFormContextValue\n\nexport const PasswordlessSignInInitForm = ({ children, onSuccess }: PasswordlessSignInInitFormProps) => {\n\n\tconst initSignIn = useInitSignInPasswordlessMutation()\n\treturn (\n\t\t<TenantForm<PasswordlessSignInInitFormContextValue, InitSignInPasswordlessMutationResult>\n\t\t\tonSuccess={res => {\n\t\t\t\tlocalStorage.setItem(PASSWORDLESS_REQUEST_STORAGE_KEY, res.result.requestId)\n\t\t\t\tonSuccess?.(res)\n\t\t\t}}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={useMemo(() => ({\n\t\t\t\temail: '',\n\t\t\t}), [])}\n\t\t\tvalidate={({ values }) => {\n\t\t\t\tif (!values.email) {\n\t\t\t\t\treturn [{ code: 'FIELD_REQUIRED', field: 'email' }]\n\t\t\t\t} else if (!values.email.match(/^.+@.+$/)) {\n\t\t\t\t\treturn [{ code: 'INVALID_VALUE', field: 'email' }]\n\t\t\t\t}\n\t\t\t\treturn []\n\t\t\t}}\n\t\t\texecute={useCallback(async ({ values }) => {\n\t\t\t\treturn await initSignIn({\n\t\t\t\t\temail: values.email,\n\t\t\t\t})\n\t\t\t}, [initSignIn])}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.InitSignInPasswordlessErrorCode, keyof PasswordlessSignInInitFormValues | undefined> = {\n\tPERSON_NOT_FOUND: 'email',\n\tPASSWORDLESS_DISABLED: undefined,\n}\n"],"names":["useForm","useInitSignInPasswordlessMutation","jsxDEV","TenantForm","PASSWORDLESS_REQUEST_STORAGE_KEY","useMemo","useCallback","this"],"mappings":";;;;;;;;AA8BO,MAAM,gCAAgCA,SAAA;AAEtC,MAAM,6BAA6B,CAAC,EAAE,UAAU,gBAAiD;AAEvG,QAAM,aAAaC,kCAAAA;AAElB,SAAAC,8BAAA;AAAA,IAACC,WAAA;AAAA,IAAA;AAAA,MACA,WAAW,CAAO,QAAA;AACjB,qBAAa,QAAQC,OAAA,kCAAkC,IAAI,OAAO,SAAS;AAC3E,oBAAY,GAAG;AAAA,MAChB;AAAA,MACA,cAAc;AAAA,MACd,eAAeC,cAAQ,OAAO;AAAA,QAC7B,OAAO;AAAA,MACR,IAAI,CAAA,CAAE;AAAA,MACN,UAAU,CAAC,EAAE,aAAa;AACrB,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,CAAC,EAAE,MAAM,kBAAkB,OAAO,QAAS,CAAA;AAAA,mBACxC,CAAC,OAAO,MAAM,MAAM,SAAS,GAAG;AAC1C,iBAAO,CAAC,EAAE,MAAM,iBAAiB,OAAO,QAAS,CAAA;AAAA,QAClD;AACA,eAAO;MACR;AAAA,MACA,SAASC,MAAA,YAAY,OAAO,EAAE,aAAa;AAC1C,eAAO,MAAM,WAAW;AAAA,UACvB,OAAO,OAAO;AAAA,QAAA,CACd;AAAA,MAAA,GACC,CAAC,UAAU,CAAC;AAAA,MAEd;AAAA,IAAA;AAAA,IAvBF;AAAA,IAAA;AAAA,IAAA;AAAA,MAAA,UAAA;AAAA,MAAA,YAAA;AAAA,MAAA,cAAA;AAAA,IAAA;AAAA,IAAAC;AAAAA,EAAA;AA2BF;AACA,MAAM,eAAsH;AAAA,EAC3H,kBAAkB;AAAA,EAClB,uBAAuB;AACxB;;;"}
@@ -0,0 +1,54 @@
1
+ import { jsxDEV } from "react/jsx-dev-runtime";
2
+ import { useMemo, useCallback } from "react";
3
+ import { TenantForm } from "./TenantForm.js";
4
+ import { useForm } from "../../contexts.js";
5
+ import { PASSWORDLESS_REQUEST_STORAGE_KEY } from "../../consts.js";
6
+ import { useInitSignInPasswordlessMutation } from "../../hooks/mutations/passwordless/useInitSignInPasswordlessMutation.js";
7
+ const usePasswordlessSignInInitForm = useForm;
8
+ const PasswordlessSignInInitForm = ({ children, onSuccess }) => {
9
+ const initSignIn = useInitSignInPasswordlessMutation();
10
+ return /* @__PURE__ */ jsxDEV(
11
+ TenantForm,
12
+ {
13
+ onSuccess: (res) => {
14
+ localStorage.setItem(PASSWORDLESS_REQUEST_STORAGE_KEY, res.result.requestId);
15
+ onSuccess?.(res);
16
+ },
17
+ errorMapping: errorToField,
18
+ initialValues: useMemo(() => ({
19
+ email: ""
20
+ }), []),
21
+ validate: ({ values }) => {
22
+ if (!values.email) {
23
+ return [{ code: "FIELD_REQUIRED", field: "email" }];
24
+ } else if (!values.email.match(/^.+@.+$/)) {
25
+ return [{ code: "INVALID_VALUE", field: "email" }];
26
+ }
27
+ return [];
28
+ },
29
+ execute: useCallback(async ({ values }) => {
30
+ return await initSignIn({
31
+ email: values.email
32
+ });
33
+ }, [initSignIn]),
34
+ children
35
+ },
36
+ void 0,
37
+ false,
38
+ {
39
+ fileName: "/home/runner/work/contember/contember/packages/react-client-tenant/src/components/forms/PasswordlessSignInInitForm.tsx",
40
+ lineNumber: 37,
41
+ columnNumber: 3
42
+ },
43
+ void 0
44
+ );
45
+ };
46
+ const errorToField = {
47
+ PERSON_NOT_FOUND: "email",
48
+ PASSWORDLESS_DISABLED: void 0
49
+ };
50
+ export {
51
+ PasswordlessSignInInitForm,
52
+ usePasswordlessSignInInitForm
53
+ };
54
+ //# sourceMappingURL=PasswordlessSignInInitForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PasswordlessSignInInitForm.js","sources":["../../../../../../packages/react-client-tenant/src/components/forms/PasswordlessSignInInitForm.tsx"],"sourcesContent":["import { ReactElement, useCallback, useMemo } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { FormContextValue, FormError, FormState } from '../../types/forms'\nimport { useForm } from '../../contexts'\nimport { InitSignInPasswordlessMutationResult, useInitSignInPasswordlessMutation } from '../../hooks'\nimport { PASSWORDLESS_REQUEST_STORAGE_KEY } from '../../consts'\n\nexport type PasswordlessSignInInitFormValues = {\n\temail: string\n}\n\nexport type PasswordlessSignInInitFormErrorCode =\n\t| TenantApi.InitSignInPasswordlessErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'UNKNOWN_ERROR'\n\nexport type PasswordlessSignInInitFormState = FormState\n\nexport type PasswordlessSignInInitFormError = FormError<PasswordlessSignInInitFormValues, PasswordlessSignInInitFormErrorCode>\n\nexport type PasswordlessSignInInitFormContextValue = FormContextValue<PasswordlessSignInInitFormValues, PasswordlessSignInInitFormErrorCode>\n\n\nexport interface PasswordlessSignInInitFormProps {\n\tchildren: ReactElement\n\tonSuccess?: (args: { result: InitSignInPasswordlessMutationResult }) => void\n}\n\nexport const usePasswordlessSignInInitForm = useForm as () => PasswordlessSignInInitFormContextValue\n\nexport const PasswordlessSignInInitForm = ({ children, onSuccess }: PasswordlessSignInInitFormProps) => {\n\n\tconst initSignIn = useInitSignInPasswordlessMutation()\n\treturn (\n\t\t<TenantForm<PasswordlessSignInInitFormContextValue, InitSignInPasswordlessMutationResult>\n\t\t\tonSuccess={res => {\n\t\t\t\tlocalStorage.setItem(PASSWORDLESS_REQUEST_STORAGE_KEY, res.result.requestId)\n\t\t\t\tonSuccess?.(res)\n\t\t\t}}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={useMemo(() => ({\n\t\t\t\temail: '',\n\t\t\t}), [])}\n\t\t\tvalidate={({ values }) => {\n\t\t\t\tif (!values.email) {\n\t\t\t\t\treturn [{ code: 'FIELD_REQUIRED', field: 'email' }]\n\t\t\t\t} else if (!values.email.match(/^.+@.+$/)) {\n\t\t\t\t\treturn [{ code: 'INVALID_VALUE', field: 'email' }]\n\t\t\t\t}\n\t\t\t\treturn []\n\t\t\t}}\n\t\t\texecute={useCallback(async ({ values }) => {\n\t\t\t\treturn await initSignIn({\n\t\t\t\t\temail: values.email,\n\t\t\t\t})\n\t\t\t}, [initSignIn])}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.InitSignInPasswordlessErrorCode, keyof PasswordlessSignInInitFormValues | undefined> = {\n\tPERSON_NOT_FOUND: 'email',\n\tPASSWORDLESS_DISABLED: undefined,\n}\n"],"names":["this"],"mappings":";;;;;;AA8BO,MAAM,gCAAgC;AAEtC,MAAM,6BAA6B,CAAC,EAAE,UAAU,gBAAiD;AAEvG,QAAM,aAAa;AAElB,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,WAAW,CAAO,QAAA;AACjB,qBAAa,QAAQ,kCAAkC,IAAI,OAAO,SAAS;AAC3E,oBAAY,GAAG;AAAA,MAChB;AAAA,MACA,cAAc;AAAA,MACd,eAAe,QAAQ,OAAO;AAAA,QAC7B,OAAO;AAAA,MACR,IAAI,CAAA,CAAE;AAAA,MACN,UAAU,CAAC,EAAE,aAAa;AACrB,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,CAAC,EAAE,MAAM,kBAAkB,OAAO,QAAS,CAAA;AAAA,mBACxC,CAAC,OAAO,MAAM,MAAM,SAAS,GAAG;AAC1C,iBAAO,CAAC,EAAE,MAAM,iBAAiB,OAAO,QAAS,CAAA;AAAA,QAClD;AACA,eAAO;MACR;AAAA,MACA,SAAS,YAAY,OAAO,EAAE,aAAa;AAC1C,eAAO,MAAM,WAAW;AAAA,UACvB,OAAO,OAAO;AAAA,QAAA,CACd;AAAA,MAAA,GACC,CAAC,UAAU,CAAC;AAAA,MAEd;AAAA,IAAA;AAAA,IAvBF;AAAA,IAAA;AAAA,IAAA;AAAA,MAAA,UAAA;AAAA,MAAA,YAAA;AAAA,MAAA,cAAA;AAAA,IAAA;AAAA,IAAAA;AAAAA,EAAA;AA2BF;AACA,MAAM,eAAsH;AAAA,EAC3H,kBAAkB;AAAA,EAClB,uBAAuB;AACxB;"}