@owlmeans/web-auth-email 0.0.0-stage → 0.1.19

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 (263) hide show
  1. package/README.md +116 -2
  2. package/THIRD-PARTY-NOTICES.txt +24 -0
  3. package/agent-meta/manifest.json +16 -0
  4. package/agent-meta/skills/web-auth-email/SKILL.md +119 -0
  5. package/build/@/components/ui/alert.d.ts +10 -0
  6. package/build/@/components/ui/alert.d.ts.map +1 -0
  7. package/build/@/components/ui/alert.js +26 -0
  8. package/build/@/components/ui/alert.js.map +1 -0
  9. package/build/@/components/ui/button.d.ts +11 -0
  10. package/build/@/components/ui/button.d.ts.map +1 -0
  11. package/build/@/components/ui/button.js +32 -0
  12. package/build/@/components/ui/button.js.map +1 -0
  13. package/build/@/components/ui/card.d.ts +10 -0
  14. package/build/@/components/ui/card.d.ts.map +1 -0
  15. package/build/@/components/ui/card.js +25 -0
  16. package/build/@/components/ui/card.js.map +1 -0
  17. package/build/@/components/ui/input.d.ts +4 -0
  18. package/build/@/components/ui/input.d.ts.map +1 -0
  19. package/build/@/components/ui/input.js +7 -0
  20. package/build/@/components/ui/input.js.map +1 -0
  21. package/build/@/components/ui/label.d.ts +5 -0
  22. package/build/@/components/ui/label.d.ts.map +1 -0
  23. package/build/@/components/ui/label.js +8 -0
  24. package/build/@/components/ui/label.js.map +1 -0
  25. package/build/@/lib/utils.d.ts +3 -0
  26. package/build/@/lib/utils.d.ts.map +1 -0
  27. package/build/@/lib/utils.js +6 -0
  28. package/build/@/lib/utils.js.map +1 -0
  29. package/build/append.d.ts +23 -0
  30. package/build/append.d.ts.map +1 -0
  31. package/build/append.js +49 -0
  32. package/build/append.js.map +1 -0
  33. package/build/components/connected.d.ts +8 -0
  34. package/build/components/connected.d.ts.map +1 -0
  35. package/build/components/connected.js +16 -0
  36. package/build/components/connected.js.map +1 -0
  37. package/build/components/credit.d.ts +5 -0
  38. package/build/components/credit.d.ts.map +1 -0
  39. package/build/components/credit.js +16 -0
  40. package/build/components/credit.js.map +1 -0
  41. package/build/components/fields.d.ts +23 -0
  42. package/build/components/fields.d.ts.map +1 -0
  43. package/build/components/fields.js +39 -0
  44. package/build/components/fields.js.map +1 -0
  45. package/build/components/index.d.ts +9 -0
  46. package/build/components/index.d.ts.map +1 -0
  47. package/build/components/index.js +8 -0
  48. package/build/components/index.js.map +1 -0
  49. package/build/components/offer.d.ts +9 -0
  50. package/build/components/offer.d.ts.map +1 -0
  51. package/build/components/offer.js +99 -0
  52. package/build/components/offer.js.map +1 -0
  53. package/build/components/panel.d.ts +12 -0
  54. package/build/components/panel.d.ts.map +1 -0
  55. package/build/components/panel.js +129 -0
  56. package/build/components/panel.js.map +1 -0
  57. package/build/components/route.d.ts +9 -0
  58. package/build/components/route.d.ts.map +1 -0
  59. package/build/components/route.js +17 -0
  60. package/build/components/route.js.map +1 -0
  61. package/build/components/screen.d.ts +17 -0
  62. package/build/components/screen.d.ts.map +1 -0
  63. package/build/components/screen.js +79 -0
  64. package/build/components/screen.js.map +1 -0
  65. package/build/components/types.d.ts +81 -0
  66. package/build/components/types.d.ts.map +1 -0
  67. package/build/components/types.js +2 -0
  68. package/build/components/types.js.map +1 -0
  69. package/build/consts.d.ts +37 -0
  70. package/build/consts.d.ts.map +1 -0
  71. package/build/consts.js +43 -0
  72. package/build/consts.js.map +1 -0
  73. package/build/entrypoints.d.ts +10 -0
  74. package/build/entrypoints.d.ts.map +1 -0
  75. package/build/entrypoints.js +14 -0
  76. package/build/entrypoints.js.map +1 -0
  77. package/build/hooks/consts.local.d.ts +4 -0
  78. package/build/hooks/consts.local.d.ts.map +1 -0
  79. package/build/hooks/consts.local.js +9 -0
  80. package/build/hooks/consts.local.js.map +1 -0
  81. package/build/hooks/types.d.ts +78 -0
  82. package/build/hooks/types.d.ts.map +1 -0
  83. package/build/hooks/types.js +2 -0
  84. package/build/hooks/types.js.map +1 -0
  85. package/build/hooks/use-email-login.d.ts +13 -0
  86. package/build/hooks/use-email-login.d.ts.map +1 -0
  87. package/build/hooks/use-email-login.js +208 -0
  88. package/build/hooks/use-email-login.js.map +1 -0
  89. package/build/hooks/use-password.d.ts +13 -0
  90. package/build/hooks/use-password.d.ts.map +1 -0
  91. package/build/hooks/use-password.js +118 -0
  92. package/build/hooks/use-password.js.map +1 -0
  93. package/build/hooks/use-translate.d.ts +7 -0
  94. package/build/hooks/use-translate.d.ts.map +1 -0
  95. package/build/hooks/use-translate.js +12 -0
  96. package/build/hooks/use-translate.js.map +1 -0
  97. package/build/i18n/auth/be.json +7 -0
  98. package/build/i18n/auth/de.json +7 -0
  99. package/build/i18n/auth/en.json +7 -0
  100. package/build/i18n/auth/es.json +7 -0
  101. package/build/i18n/auth/fr.json +7 -0
  102. package/build/i18n/auth/pl.json +7 -0
  103. package/build/i18n/auth/ru.json +7 -0
  104. package/build/i18n/auth/uk.json +7 -0
  105. package/build/i18n/be.json +100 -0
  106. package/build/i18n/de.json +100 -0
  107. package/build/i18n/en.json +100 -0
  108. package/build/i18n/es.json +100 -0
  109. package/build/i18n/fr.json +100 -0
  110. package/build/i18n/pl.json +100 -0
  111. package/build/i18n/ru.json +100 -0
  112. package/build/i18n/uk.json +100 -0
  113. package/build/i18n.d.ts +2 -0
  114. package/build/i18n.d.ts.map +1 -0
  115. package/build/i18n.js +40 -0
  116. package/build/i18n.js.map +1 -0
  117. package/build/index.d.ts +23 -0
  118. package/build/index.d.ts.map +1 -0
  119. package/build/index.js +17 -0
  120. package/build/index.js.map +1 -0
  121. package/build/password/types.d.ts +39 -0
  122. package/build/password/types.d.ts.map +1 -0
  123. package/build/password/types.js +2 -0
  124. package/build/password/types.js.map +1 -0
  125. package/build/password.d.ts +4 -0
  126. package/build/password.d.ts.map +1 -0
  127. package/build/password.js +45 -0
  128. package/build/password.js.map +1 -0
  129. package/build/plugin.d.ts +10 -0
  130. package/build/plugin.d.ts.map +1 -0
  131. package/build/plugin.js +21 -0
  132. package/build/plugin.js.map +1 -0
  133. package/build/refusal/consts.local.d.ts +3 -0
  134. package/build/refusal/consts.local.d.ts.map +1 -0
  135. package/build/refusal/consts.local.js +3 -0
  136. package/build/refusal/consts.local.js.map +1 -0
  137. package/build/refusal/types.d.ts +38 -0
  138. package/build/refusal/types.d.ts.map +1 -0
  139. package/build/refusal/types.js +2 -0
  140. package/build/refusal/types.js.map +1 -0
  141. package/build/refusal.d.ts +4 -0
  142. package/build/refusal.d.ts.map +1 -0
  143. package/build/refusal.js +131 -0
  144. package/build/refusal.js.map +1 -0
  145. package/build/service.d.ts +12 -0
  146. package/build/service.d.ts.map +1 -0
  147. package/build/service.js +66 -0
  148. package/build/service.js.map +1 -0
  149. package/build/state/types.d.ts +90 -0
  150. package/build/state/types.d.ts.map +1 -0
  151. package/build/state/types.js +2 -0
  152. package/build/state/types.js.map +1 -0
  153. package/build/state.d.ts +4 -0
  154. package/build/state.d.ts.map +1 -0
  155. package/build/state.js +98 -0
  156. package/build/state.js.map +1 -0
  157. package/build/step.d.ts +16 -0
  158. package/build/step.d.ts.map +1 -0
  159. package/build/step.js +31 -0
  160. package/build/step.js.map +1 -0
  161. package/build/storage/types.d.ts +42 -0
  162. package/build/storage/types.d.ts.map +1 -0
  163. package/build/storage/types.js +2 -0
  164. package/build/storage/types.js.map +1 -0
  165. package/build/storage.d.ts +4 -0
  166. package/build/storage.d.ts.map +1 -0
  167. package/build/storage.js +100 -0
  168. package/build/storage.js.map +1 -0
  169. package/build/types.d.ts +102 -0
  170. package/build/types.d.ts.map +1 -0
  171. package/build/types.js +2 -0
  172. package/build/types.js.map +1 -0
  173. package/build/utils/account.d.ts +4 -0
  174. package/build/utils/account.d.ts.map +1 -0
  175. package/build/utils/account.js +11 -0
  176. package/build/utils/account.js.map +1 -0
  177. package/build/utils/locale.d.ts +6 -0
  178. package/build/utils/locale.d.ts.map +1 -0
  179. package/build/utils/locale.js +10 -0
  180. package/build/utils/locale.js.map +1 -0
  181. package/build/utils/text/types.d.ts +23 -0
  182. package/build/utils/text/types.d.ts.map +1 -0
  183. package/build/utils/text/types.js +2 -0
  184. package/build/utils/text/types.js.map +1 -0
  185. package/build/utils/text.d.ts +4 -0
  186. package/build/utils/text.d.ts.map +1 -0
  187. package/build/utils/text.js +26 -0
  188. package/build/utils/text.js.map +1 -0
  189. package/build/utils.d.ts +8 -0
  190. package/build/utils.d.ts.map +1 -0
  191. package/build/utils.js +9 -0
  192. package/build/utils.js.map +1 -0
  193. package/components.json +21 -0
  194. package/package.json +71 -4
  195. package/src/@/components/ui/alert.tsx +70 -0
  196. package/src/@/components/ui/button.tsx +60 -0
  197. package/src/@/components/ui/card.tsx +93 -0
  198. package/src/@/components/ui/input.tsx +22 -0
  199. package/src/@/components/ui/label.tsx +23 -0
  200. package/src/@/globals.css +57 -0
  201. package/src/@/lib/utils.ts +6 -0
  202. package/src/append.ts +65 -0
  203. package/src/components/connected.tsx +36 -0
  204. package/src/components/credit.tsx +30 -0
  205. package/src/components/fields.tsx +112 -0
  206. package/src/components/index.ts +8 -0
  207. package/src/components/offer.tsx +197 -0
  208. package/src/components/panel.tsx +299 -0
  209. package/src/components/route.tsx +20 -0
  210. package/src/components/screen.tsx +253 -0
  211. package/src/components/types.ts +85 -0
  212. package/src/consts.ts +53 -0
  213. package/src/entrypoints.ts +15 -0
  214. package/src/hooks/consts.local.ts +12 -0
  215. package/src/hooks/types.ts +79 -0
  216. package/src/hooks/use-email-login.ts +234 -0
  217. package/src/hooks/use-password.ts +137 -0
  218. package/src/hooks/use-translate.ts +14 -0
  219. package/src/i18n/auth/be.json +7 -0
  220. package/src/i18n/auth/de.json +7 -0
  221. package/src/i18n/auth/en.json +7 -0
  222. package/src/i18n/auth/es.json +7 -0
  223. package/src/i18n/auth/fr.json +7 -0
  224. package/src/i18n/auth/pl.json +7 -0
  225. package/src/i18n/auth/ru.json +7 -0
  226. package/src/i18n/auth/uk.json +7 -0
  227. package/src/i18n/be.json +100 -0
  228. package/src/i18n/de.json +100 -0
  229. package/src/i18n/en.json +100 -0
  230. package/src/i18n/es.json +100 -0
  231. package/src/i18n/fr.json +100 -0
  232. package/src/i18n/pl.json +100 -0
  233. package/src/i18n/ru.json +100 -0
  234. package/src/i18n/uk.json +100 -0
  235. package/src/i18n.ts +43 -0
  236. package/src/index.ts +22 -0
  237. package/src/password/types.ts +43 -0
  238. package/src/password.ts +65 -0
  239. package/src/plugin.ts +22 -0
  240. package/src/refusal/consts.local.ts +2 -0
  241. package/src/refusal/types.ts +64 -0
  242. package/src/refusal.ts +145 -0
  243. package/src/service.ts +95 -0
  244. package/src/state/types.ts +72 -0
  245. package/src/state.ts +115 -0
  246. package/src/step.ts +38 -0
  247. package/src/storage/types.ts +43 -0
  248. package/src/storage.ts +113 -0
  249. package/src/types.ts +111 -0
  250. package/src/utils/account.ts +12 -0
  251. package/src/utils/locale.ts +11 -0
  252. package/src/utils/text/types.ts +24 -0
  253. package/src/utils/text.ts +34 -0
  254. package/src/utils.ts +9 -0
  255. package/tests/helpers.ts +22 -0
  256. package/tests/i18n.spec.ts +94 -0
  257. package/tests/package-boundary.spec.ts +35 -0
  258. package/tests/password.spec.ts +56 -0
  259. package/tests/refusal.spec.ts +91 -0
  260. package/tests/state.spec.ts +99 -0
  261. package/tests/step.spec.ts +82 -0
  262. package/tests/storage.spec.ts +83 -0
  263. package/tsconfig.json +21 -0
@@ -0,0 +1,208 @@
1
+ import { useCallback, useEffect, useMemo, useReducer, useRef } from 'react';
2
+ import { useContext, useNavigate } from '@owlmeans/client';
3
+ import { DISPATCHER } from '@owlmeans/auth';
4
+ import { EMAIL_CAPTCHA_ACTION_PASSWORD, EMAIL_CAPTCHA_ACTION_PIN, EMAIL_LOGIN_SERVICE, EmailAuthError, EmailAuthUnavailable, EmailSignInReason, } from '@owlmeans/auth-email';
5
+ import { captchaLoader } from '@owlmeans/web-captcha';
6
+ import { useCaptcha } from '@owlmeans/web-captcha/react';
7
+ import { logger } from '@owlmeans/log';
8
+ import { emailLoginStateHelper as helper } from '../state.js';
9
+ import { emailRefusalHelper } from '../refusal.js';
10
+ import { emailStorageHelper } from '../storage.js';
11
+ import { wireLocale } from '../utils/locale.js';
12
+ const log = logger('auth-email');
13
+ /**
14
+ * The e-mail sign-in form: an address, then a mailed PIN — or, where the deployment offers
15
+ * passwords, the address and a password, which on a device the account does not know turns into a
16
+ * mailed PIN as well. A captcha token is fetched right before each send-PIN and password sign-in
17
+ * when the deployment asks for one; the PIN step needs none.
18
+ *
19
+ * Every transition is `emailLoginStateHelper.reduce`; this hook only performs the calls and
20
+ * dispatches what they answered. A successful answer is finished by the client service
21
+ * (`complete`), which leaves the page.
22
+ */
23
+ export const useEmailLogin = (opts = {}) => {
24
+ const ctx = useContext();
25
+ const nav = useNavigate();
26
+ const client = ctx.service(EMAIL_LOGIN_SERVICE);
27
+ const locale = wireLocale(opts.locale);
28
+ const [state, dispatch] = useReducer(helper.reduce, opts.email, helper.initial);
29
+ // Handlers read the latest form, not the one of the render that created them.
30
+ const current = useRef(state);
31
+ current.current = state;
32
+ const siteKey = state.options?.captcha?.siteKey ?? null;
33
+ const pinCaptcha = useCaptcha({ siteKey, action: EMAIL_CAPTCHA_ACTION_PIN });
34
+ const passwordCaptcha = useCaptcha({ siteKey, action: EMAIL_CAPTCHA_ACTION_PASSWORD });
35
+ const loadOptions = useCallback(async (fresh) => {
36
+ try {
37
+ const options = await client.options(fresh === true ? { fresh } : undefined);
38
+ dispatch({ type: 'options', options });
39
+ return options;
40
+ }
41
+ catch (error) {
42
+ log.warn('E-mail sign-in options unavailable', error);
43
+ dispatch({ type: 'options-failed' });
44
+ return null;
45
+ }
46
+ }, [client]);
47
+ useEffect(() => { void loadOptions(); }, [loadOptions]);
48
+ const refuse = useCallback((error, context) => {
49
+ const refusal = emailRefusalHelper.refusalOf(error, context);
50
+ // The kind and the call only — never the address, the code or the password.
51
+ log.debug('E-mail sign-in refused', { context, kind: refusal.kind });
52
+ dispatch({ type: 'refused', refusal });
53
+ }, []);
54
+ /** A token for this action — through the hook's own captcha when it is the one loaded. */
55
+ const captchaToken = useCallback(async (options, captcha, action) => {
56
+ if (options.captcha == null || options.captcha.siteKey === '') {
57
+ return undefined;
58
+ }
59
+ const token = options.captcha.siteKey === siteKey
60
+ ? await captcha.execute()
61
+ : await captchaLoader.token(options.captcha.siteKey, action);
62
+ return token ?? undefined;
63
+ }, [siteKey]);
64
+ /** The options this call runs under: the loaded ones, else a fresh read. */
65
+ const optionsNow = useCallback(async () => {
66
+ const options = current.current.options ?? await loadOptions(true);
67
+ if (options == null) {
68
+ throw new EmailAuthUnavailable('options');
69
+ }
70
+ return options;
71
+ }, [loadOptions]);
72
+ const finish = useCallback(async (view) => {
73
+ if (view.token != null && view.token !== '') {
74
+ dispatch({ type: 'signed-in' });
75
+ await client.complete(view);
76
+ return;
77
+ }
78
+ if (view.challenge != null && view.reason === EmailSignInReason.Device) {
79
+ dispatch({ type: 'device', challenge: view.challenge });
80
+ return;
81
+ }
82
+ throw new EmailAuthError('answer');
83
+ }, [client]);
84
+ const send = useCallback(async () => {
85
+ const form = current.current;
86
+ if (form.busy != null || form.step === 'done') {
87
+ return;
88
+ }
89
+ const block = helper.sendBlock(form);
90
+ if (block != null) {
91
+ dispatch({ type: 'refused', refusal: block });
92
+ return;
93
+ }
94
+ dispatch({ type: 'start', busy: 'send' });
95
+ try {
96
+ const options = await optionsNow();
97
+ const captcha = await captchaToken(options, pinCaptcha, EMAIL_CAPTCHA_ACTION_PIN);
98
+ const { challenge } = await client.sendPin({
99
+ email: helper.normalizeEmail(form.email),
100
+ ...(locale != null ? { locale } : {}),
101
+ ...(captcha != null ? { captcha } : {}),
102
+ });
103
+ dispatch({ type: 'sent', challenge });
104
+ }
105
+ catch (error) {
106
+ refuse(error, 'send');
107
+ }
108
+ }, [client, locale, optionsNow, captchaToken, pinCaptcha, refuse]);
109
+ const verify = useCallback(async () => {
110
+ const form = current.current;
111
+ if (form.busy != null || form.step !== 'pin') {
112
+ return;
113
+ }
114
+ const block = helper.verifyBlock(form);
115
+ if (block != null) {
116
+ dispatch({ type: 'refused', refusal: block });
117
+ return;
118
+ }
119
+ dispatch({ type: 'start', busy: 'sign-in' });
120
+ try {
121
+ await finish(await client.signIn({
122
+ email: helper.normalizeEmail(form.email),
123
+ device: emailStorageHelper.deviceId(),
124
+ challenge: form.challenge,
125
+ pin: form.pin,
126
+ ...(locale != null ? { locale } : {}),
127
+ }));
128
+ }
129
+ catch (error) {
130
+ refuse(error, 'pin');
131
+ }
132
+ }, [client, locale, finish, refuse]);
133
+ const signIn = useCallback(async () => {
134
+ const form = current.current;
135
+ if (form.busy != null || form.step !== 'password') {
136
+ return;
137
+ }
138
+ const block = helper.signInBlock(form);
139
+ if (block != null) {
140
+ dispatch({ type: 'refused', refusal: block });
141
+ return;
142
+ }
143
+ dispatch({ type: 'start', busy: 'sign-in' });
144
+ try {
145
+ const options = await optionsNow();
146
+ const captcha = await captchaToken(options, passwordCaptcha, EMAIL_CAPTCHA_ACTION_PASSWORD);
147
+ await finish(await client.signIn({
148
+ email: helper.normalizeEmail(form.email),
149
+ device: emailStorageHelper.deviceId(),
150
+ password: form.password,
151
+ ...(locale != null ? { locale } : {}),
152
+ ...(captcha != null ? { captcha } : {}),
153
+ }));
154
+ }
155
+ catch (error) {
156
+ refuse(error, 'password');
157
+ }
158
+ }, [client, locale, optionsNow, captchaToken, passwordCaptcha, finish, refuse]);
159
+ const submit = useCallback(async () => {
160
+ switch (current.current.step) {
161
+ case 'email':
162
+ return await send();
163
+ case 'pin':
164
+ return await verify();
165
+ case 'password':
166
+ return await signIn();
167
+ default:
168
+ return;
169
+ }
170
+ }, [send, verify, signIn]);
171
+ const retryOptions = useCallback(async () => { await loadOptions(true); }, [loadOptions]);
172
+ const otherOptions = useMemo(() => {
173
+ let href;
174
+ try {
175
+ href = ctx.entrypoint(DISPATCHER).path();
176
+ }
177
+ catch {
178
+ return null;
179
+ }
180
+ return {
181
+ href,
182
+ go: (event) => {
183
+ event?.preventDefault();
184
+ void nav.go(DISPATCHER);
185
+ },
186
+ };
187
+ }, [ctx, nav]);
188
+ return {
189
+ state,
190
+ captcha: state.options?.captcha != null,
191
+ passwordOffered: helper.passwordOffered(state),
192
+ pinLength: helper.pinLength(state),
193
+ setEmail: useCallback((value) => dispatch({ type: 'email', value }), []),
194
+ setPin: useCallback((value) => dispatch({ type: 'pin', value }), []),
195
+ setPassword: useCallback((value) => dispatch({ type: 'password', value }), []),
196
+ setReveal: useCallback((value) => dispatch({ type: 'reveal', value }), []),
197
+ send,
198
+ verify,
199
+ signIn,
200
+ submit,
201
+ choosePassword: useCallback(() => dispatch({ type: 'choose-password' }), []),
202
+ choosePin: useCallback(() => dispatch({ type: 'choose-pin' }), []),
203
+ changeEmail: useCallback(() => dispatch({ type: 'change-email' }), []),
204
+ retryOptions,
205
+ otherOptions,
206
+ };
207
+ };
208
+ //# sourceMappingURL=use-email-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-email-login.js","sourceRoot":"","sources":["../../src/hooks/use-email-login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { EmailPasswordAliases } from '../types.js';
2
+ import type { UsePassword, UsePasswordOptions } from './types.js';
3
+ /**
4
+ * The I/O half of the password panel: the account's password state, a confirmation PIN, and the
5
+ * set / change / remove calls confirmed by it.
6
+ *
7
+ * The routes are addressed by alias: `aliases`, else those of the tree `appendEmailLogin` was given,
8
+ * else the `EMAIL_AUTH_PASSWORD_*` defaults. The mailed challenge never leaves this hook. The
9
+ * current browser's device id goes with every confirmation, so it stays remembered while the
10
+ * account's other devices are forgotten.
11
+ */
12
+ export declare const usePassword: (aliases?: EmailPasswordAliases, opts?: UsePasswordOptions) => UsePassword;
13
+ //# sourceMappingURL=use-password.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-password.d.ts","sourceRoot":"","sources":["../../src/hooks/use-password.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAA2B,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAEhF,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAIjE;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,aAAc,oBAAoB,SAAQ,kBAAkB,KAAQ,WA4G3F,CAAA"}
@@ -0,0 +1,118 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
+ import { useContext } from '@owlmeans/client';
3
+ import { EMAIL_LOGIN_SERVICE } from '@owlmeans/auth-email';
4
+ import { logger } from '@owlmeans/log';
5
+ import { emailRefusalHelper } from '../refusal.js';
6
+ import { emailStorageHelper } from '../storage.js';
7
+ import { wireLocale } from '../utils/locale.js';
8
+ import { DEFAULT_PASSWORD_ALIASES } from './consts.local.js';
9
+ const log = logger('auth-email');
10
+ /**
11
+ * The I/O half of the password panel: the account's password state, a confirmation PIN, and the
12
+ * set / change / remove calls confirmed by it.
13
+ *
14
+ * The routes are addressed by alias: `aliases`, else those of the tree `appendEmailLogin` was given,
15
+ * else the `EMAIL_AUTH_PASSWORD_*` defaults. The mailed challenge never leaves this hook. The
16
+ * current browser's device id goes with every confirmation, so it stays remembered while the
17
+ * account's other devices are forgotten.
18
+ */
19
+ export const usePassword = (aliases, opts = {}) => {
20
+ const ctx = useContext();
21
+ const locale = wireLocale(opts.locale);
22
+ const defaults = useMemo(() => {
23
+ if (!ctx.hasService(EMAIL_LOGIN_SERVICE)) {
24
+ return DEFAULT_PASSWORD_ALIASES;
25
+ }
26
+ const password = ctx.service(EMAIL_LOGIN_SERVICE).protocols().password;
27
+ return {
28
+ status: password.status.alias, pin: password.pin.alias, set: password.set.alias, remove: password.remove.alias,
29
+ };
30
+ }, [ctx]);
31
+ const statusAlias = aliases?.status ?? defaults.status;
32
+ const pinAlias = aliases?.pin ?? defaults.pin;
33
+ const setAlias = aliases?.set ?? defaults.set;
34
+ const removeAlias = aliases?.remove ?? defaults.remove;
35
+ const [status, setStatus] = useState(null);
36
+ const [loading, setLoading] = useState(true);
37
+ const [busy, setBusy] = useState(false);
38
+ const [pending, setPending] = useState(null);
39
+ const [refusal, setRefusal] = useState(null);
40
+ const [done, setDone] = useState(null);
41
+ const challenge = useRef(null);
42
+ const refuse = useCallback((error, context) => {
43
+ const next = emailRefusalHelper.refusalOf(error, context);
44
+ log.debug('Password action refused', { context, kind: next.kind });
45
+ setRefusal(next);
46
+ }, []);
47
+ const reload = useCallback(async () => {
48
+ setLoading(true);
49
+ setRefusal(null);
50
+ try {
51
+ setStatus(await ctx.entrypoint(statusAlias).call());
52
+ }
53
+ catch (error) {
54
+ refuse(error, 'status');
55
+ }
56
+ finally {
57
+ setLoading(false);
58
+ }
59
+ }, [ctx, statusAlias, refuse]);
60
+ useEffect(() => { void reload(); }, [reload]);
61
+ const sendPin = useCallback(async (purpose) => {
62
+ setBusy(true);
63
+ setRefusal(null);
64
+ setDone(null);
65
+ try {
66
+ const view = await ctx.entrypoint(pinAlias).call({
67
+ body: { purpose, ...(locale != null ? { locale } : {}) },
68
+ });
69
+ challenge.current = view.challenge;
70
+ setPending(purpose);
71
+ return true;
72
+ }
73
+ catch (error) {
74
+ refuse(error, 'confirm');
75
+ return false;
76
+ }
77
+ finally {
78
+ setBusy(false);
79
+ }
80
+ }, [ctx, pinAlias, locale, refuse]);
81
+ const confirm = useCallback(async (action, input) => {
82
+ if (challenge.current == null) {
83
+ setRefusal({ kind: 'code' });
84
+ return false;
85
+ }
86
+ setBusy(true);
87
+ setRefusal(null);
88
+ try {
89
+ const device = emailStorageHelper.deviceId();
90
+ const next = action === 'remove'
91
+ ? await ctx.entrypoint(removeAlias).call({
92
+ body: { challenge: challenge.current, pin: input.pin, device },
93
+ })
94
+ : await ctx.entrypoint(setAlias).call({
95
+ body: { password: input.password ?? '', challenge: challenge.current, pin: input.pin, device },
96
+ });
97
+ challenge.current = null;
98
+ setStatus(next);
99
+ setPending(null);
100
+ setDone(action);
101
+ return true;
102
+ }
103
+ catch (error) {
104
+ refuse(error, action === 'remove' ? 'remove' : 'set');
105
+ return false;
106
+ }
107
+ finally {
108
+ setBusy(false);
109
+ }
110
+ }, [ctx, setAlias, removeAlias, refuse]);
111
+ const cancel = useCallback(() => {
112
+ challenge.current = null;
113
+ setPending(null);
114
+ setRefusal(null);
115
+ }, []);
116
+ return { status, loading, busy, pending, refusal, done, reload, sendPin, confirm, cancel };
117
+ };
118
+ //# sourceMappingURL=use-password.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-password.js","sourceRoot":"","sources":["../../src/hooks/use-password.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Translate } from '../types.js';
2
+ /**
3
+ * This package's own translator (`lib : auth-email`), in the `(key, defaultValue)` shape every
4
+ * component here takes as its `translate` prop. Needs the application's i18n provider.
5
+ */
6
+ export declare const useEmailAuthTranslate: () => Translate;
7
+ //# sourceMappingURL=use-translate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-translate.d.ts","sourceRoot":"","sources":["../../src/hooks/use-translate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C;;;GAGG;AACH,eAAO,MAAM,qBAAqB,QAAO,SAIxC,CAAA"}
@@ -0,0 +1,12 @@
1
+ import { useCallback } from 'react';
2
+ import { useI18nLib } from '@owlmeans/client-i18n';
3
+ import { EMAIL_AUTH_I18N } from '../consts.js';
4
+ /**
5
+ * This package's own translator (`lib : auth-email`), in the `(key, defaultValue)` shape every
6
+ * component here takes as its `translate` prop. Needs the application's i18n provider.
7
+ */
8
+ export const useEmailAuthTranslate = () => {
9
+ const t = useI18nLib(EMAIL_AUTH_I18N);
10
+ return useCallback((key, defaultValue) => t(key, { defaultValue }), [t]);
11
+ };
12
+ //# sourceMappingURL=use-translate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-translate.js","sourceRoot":"","sources":["../../src/hooks/use-translate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAG9C;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAc,EAAE;IACnD,MAAM,CAAC,GAAG,UAAU,CAAC,eAAe,CAAC,CAAA;IAErC,OAAO,WAAW,CAAC,CAAC,GAAW,EAAE,YAAoB,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AAC1F,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ {
2
+ "login": {
3
+ "method": {
4
+ "email": "Працягнуць з электроннай поштай"
5
+ }
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "login": {
3
+ "method": {
4
+ "email": "Mit E-Mail fortfahren"
5
+ }
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "login": {
3
+ "method": {
4
+ "email": "Continue with email"
5
+ }
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "login": {
3
+ "method": {
4
+ "email": "Continuar con correo electrónico"
5
+ }
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "login": {
3
+ "method": {
4
+ "email": "Continuer avec une adresse e-mail"
5
+ }
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "login": {
3
+ "method": {
4
+ "email": "Kontynuuj z e-mailem"
5
+ }
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "login": {
3
+ "method": {
4
+ "email": "Продолжить с электронной почтой"
5
+ }
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "login": {
3
+ "method": {
4
+ "email": "Продовжити з електронною поштою"
5
+ }
6
+ }
7
+ }
@@ -0,0 +1,100 @@
1
+ {
2
+ "captcha": {
3
+ "notice": "Гэты сайт абаронены reCAPTCHA, і да яго прымяняюцца {{privacy}} і {{terms}} Google.",
4
+ "privacy": "Палітыка прыватнасці",
5
+ "terms": "Умовы выкарыстання"
6
+ },
7
+ "error": {
8
+ "captcha": "Не ўдалося пацвердзіць, што вы не робат. Паспрабуйце яшчэ раз.",
9
+ "captcha-unavailable": "Не ўдалося загрузіць праверку бяспекі. Праверце злучэнне і паспрабуйце яшчэ раз.",
10
+ "code": "Код няправільны або састарэў. Праверце яго або запытайце новы.",
11
+ "credentials": "Няправільны адрас электроннай пошты або пароль.",
12
+ "email": "Увядзіце правільны адрас электроннай пошты.",
13
+ "failed": "Нешта пайшло не так. Паспрабуйце яшчэ раз.",
14
+ "mismatch": "Паролі не супадаюць.",
15
+ "offer-expired": "Тэрмін дзеяння прапановы скончыўся. Пароль можна задаць пазней у наладах акаўнта.",
16
+ "password-disabled": "Уваход па паролі тут недаступны. Увайдзіце з кодам.",
17
+ "password-empty": "Увядзіце пароль.",
18
+ "pin-format": "Увядзіце код з ліста: {{length}} лічбаў.",
19
+ "throttled": "Занадта шмат спроб. Пачакайце крыху і паспрабуйце зноў.",
20
+ "throttled-in": "Занадта шмат спроб. Паспрабуйце зноў {{when}}.",
21
+ "unavailable": "Уваход часова недаступны. Паспрабуйце пазней.",
22
+ "weak": "Выкарыстоўвайце ад {{min}} да {{max}} сімвалаў і не выкарыстоўвайце свой адрас электроннай пошты."
23
+ },
24
+ "login": {
25
+ "change-email": "Змяніць адрас",
26
+ "device": "Мы не пазнаём гэтую прыладу. Увядзіце код, які мы адправілі вам на пошту.",
27
+ "done": "Выконваем уваход…",
28
+ "email-label": "Электронная пошта",
29
+ "email-placeholder": "you@example.com",
30
+ "hide-password": "Схаваць пароль",
31
+ "options-failed": "Не ўдалося загрузіць налады ўваходу.",
32
+ "other": "Іншыя спосабы ўваходу",
33
+ "password-label": "Пароль",
34
+ "password-submit": "Увайсці",
35
+ "password-subtitle": "Увайдзіце з дапамогай электроннай пошты і пароля.",
36
+ "pin-label": "Код з ліста",
37
+ "pin-subtitle": "Код для ўваходу чакае вас у пошце.",
38
+ "powered": "Працуе на OwlMeans",
39
+ "resend": "Адправіць новы код",
40
+ "retry": "Паўтарыць",
41
+ "send": "Атрымаць PIN-код для ўваходу",
42
+ "sending": "Адпраўляем…",
43
+ "sent": "Мы адправілі код для ўваходу на {{email}}.",
44
+ "show-password": "Паказаць пароль",
45
+ "subtitle": "Мы дашлём код для ўваходу на вашу пошту. Упершыню тут? Той жа код створыць ваш акаўнт.",
46
+ "title": "Уваход па электроннай пошце",
47
+ "use-password": "Ужо задалі пароль? Увайдзіце з ім",
48
+ "use-pin": "Увайсці з кодам",
49
+ "verify": "Увайсці",
50
+ "verifying": "Выконваем уваход…"
51
+ },
52
+ "offer": {
53
+ "description": "Наступным разам уваходзьце па пошце і паролі, не чакаючы кода.",
54
+ "hint": "Ад {{min}} да {{max}} сімвалаў.",
55
+ "later": "Пароль заўсёды можна задаць пазней у наладах акаўнта.",
56
+ "password-label": "Новы пароль",
57
+ "repeat-label": "Паўтарыце пароль",
58
+ "save": "Захаваць пароль",
59
+ "saving": "Захоўваем…",
60
+ "skip": "Не зараз",
61
+ "title": "Задайце пароль для хуткага ўваходу"
62
+ },
63
+ "password": {
64
+ "action": {
65
+ "change": "Змяніць пароль",
66
+ "remove": "Выдаліць пароль",
67
+ "set": "Задаць пароль"
68
+ },
69
+ "cancel": "Скасаваць",
70
+ "confirm": "Пацвердзіць",
71
+ "confirming": "Захоўваем…",
72
+ "description": "Уваходзьце па электроннай пошце і паролі замест кода.",
73
+ "devices": "На іншых прыладах пры наступным уваходзе спатрэбіцца код.",
74
+ "done": {
75
+ "change": "Пароль зменены.",
76
+ "remove": "Пароль выдалены.",
77
+ "set": "Пароль зададзены."
78
+ },
79
+ "explain": {
80
+ "change": "Каб змяніць пароль, пацвердзіце, што гэта вы, кодам, які мы дашлём на пошту.",
81
+ "remove": "Без пароля вы ўваходзіце з кодам, які прыходзіць на пошту. Мы дашлём код для пацвярджэння.",
82
+ "set": "Каб задаць пароль, пацвердзіце, што гэта вы, кодам, які мы дашлём на пошту."
83
+ },
84
+ "loading": "Загрузка…",
85
+ "new-label": "Новы пароль",
86
+ "off": "Уваход па паролі тут недаступны. Вы ўваходзіце з кодам, які прыходзіць на пошту.",
87
+ "pin-label": "Код з ліста",
88
+ "repeat-label": "Паўтарыце пароль",
89
+ "resend": "Адправіць новы код",
90
+ "retry": "Паўтарыць",
91
+ "send": "Адправіць код",
92
+ "sending": "Адпраўляем…",
93
+ "sent": "Мы адправілі код на вашу пошту.",
94
+ "set": "У вас ёсць пароль.",
95
+ "title": "Пароль",
96
+ "unreadable": "Не ўдалося загрузіць налады пароля.",
97
+ "unset": "У вас пакуль няма пароля. Вы ўваходзіце з кодам, які прыходзіць на пошту.",
98
+ "updated": "Апошняя змена: {{date}}."
99
+ }
100
+ }