@indietabletop/appkit 6.1.6 → 7.0.0-0

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 (269) hide show
  1. package/dist/AppConfig/AppConfig.d.ts +29 -0
  2. package/dist/AuthCard/AuthCard.d.ts +10 -0
  3. package/dist/AuthCard/AuthCard.stories.d.ts +34 -0
  4. package/dist/AuthCard/style.css.d.ts +23 -0
  5. package/dist/DialogTrigger/index.d.ts +13 -0
  6. package/dist/DocumentTitle/DocumentTitle.d.ts +3 -0
  7. package/dist/EnumMapper.d.ts +25 -0
  8. package/dist/ExternalLink.d.ts +3 -0
  9. package/dist/FullscreenDismissBlocker.d.ts +5 -0
  10. package/{lib/HistoryState.ts → dist/HistoryState.d.ts} +2 -5
  11. package/dist/IndieTabletopClubLogo.d.ts +7 -0
  12. package/dist/IndieTabletopClubSymbol.d.ts +7 -0
  13. package/dist/InfoPage/index.d.ts +8 -0
  14. package/dist/InfoPage/pages.d.ts +2 -0
  15. package/dist/InfoPage/style.css.d.ts +5 -0
  16. package/dist/Letterhead/index.d.ts +19 -0
  17. package/dist/Letterhead/stories.d.ts +13 -0
  18. package/dist/Letterhead/style.css.d.ts +46 -0
  19. package/dist/LetterheadForm/LetterheadReadonlyTextField.stories.d.ts +17 -0
  20. package/dist/LetterheadForm/LetterheadSubmitError.stories.d.ts +11 -0
  21. package/dist/LetterheadForm/LetterheadTextField.stories.d.ts +336 -0
  22. package/dist/LetterheadForm/index.d.ts +44 -0
  23. package/dist/LetterheadForm/style.css.d.ts +8 -0
  24. package/dist/LoadingIndicator.d.ts +3 -0
  25. package/dist/MiddotSeparated/MiddotSeparated.d.ts +8 -0
  26. package/dist/MiddotSeparated/MiddotSeparated.stories.d.ts +586 -0
  27. package/dist/MiddotSeparated/style.css.d.ts +1 -0
  28. package/dist/ModalDialog/index.d.ts +12 -0
  29. package/dist/ModalDialog/style.css.d.ts +58 -0
  30. package/dist/ModernIDB/Cursor.d.ts +56 -0
  31. package/dist/ModernIDB/ModernIDB.d.ts +66 -0
  32. package/dist/ModernIDB/ModernIDBError.d.ts +3 -0
  33. package/dist/ModernIDB/ObjectStore.d.ts +112 -0
  34. package/dist/ModernIDB/ObjectStoreIndex.d.ts +53 -0
  35. package/dist/ModernIDB/Transaction.d.ts +16 -0
  36. package/dist/ModernIDB/VersionChangeManager.d.ts +30 -0
  37. package/dist/ModernIDB/bindings/factory.d.ts +12 -0
  38. package/dist/ModernIDB/bindings/index.d.ts +2 -0
  39. package/{lib/ModernIDB/bindings/types.ts → dist/ModernIDB/bindings/types.d.ts} +13 -32
  40. package/dist/ModernIDB/bindings/utils.d.ts +2 -0
  41. package/dist/ModernIDB/index.d.ts +10 -0
  42. package/dist/ModernIDB/types.d.ts +88 -0
  43. package/dist/ModernIDB/utils.d.ts +4 -0
  44. package/dist/QRCode/QRCode.d.ts +7 -0
  45. package/dist/QRCode/QRCode.stories.d.ts +33 -0
  46. package/dist/QRCode/style.css.d.ts +4 -0
  47. package/dist/ReleaseInfo/index.d.ts +5 -0
  48. package/dist/RulesetResolver.d.ts +87 -0
  49. package/dist/SafariCheck/SafariCheck.d.ts +23 -0
  50. package/dist/SafariCheck/SafariCheck.stories.d.ts +73 -0
  51. package/dist/SafariCheck/style.css.d.ts +17 -0
  52. package/dist/ServiceWorkerHandler.d.ts +11 -0
  53. package/dist/ShareButton/ShareButton.d.ts +57 -0
  54. package/dist/ShareButton/ShareButton.stories.d.ts +1577 -0
  55. package/dist/ShareButton/test.css.d.ts +1 -0
  56. package/dist/SubscribeCard/LetterheadInfoCard.d.ts +2 -0
  57. package/dist/SubscribeCard/SubscribeByEmailCard.d.ts +24 -0
  58. package/dist/SubscribeCard/SubscribeByEmailCard.stories.d.ts +10 -0
  59. package/dist/SubscribeCard/SubscribeByPledgeCard.d.ts +36 -0
  60. package/dist/SubscribeCard/SubscribeByPledgeCard.stories.d.ts +65 -0
  61. package/dist/SubscribeCard/style.css.d.ts +4 -0
  62. package/dist/account/AccountIssueView.d.ts +3 -0
  63. package/dist/account/AlreadyLoggedInView.d.ts +5 -0
  64. package/dist/account/CurrentUserFetcher.d.ts +20 -0
  65. package/dist/account/CurrentUserFetcher.stories.d.ts +136 -0
  66. package/dist/account/FailureFallbackView.d.ts +1 -0
  67. package/dist/account/JoinCard.d.ts +14 -0
  68. package/dist/account/JoinCard.stories.d.ts +143 -0
  69. package/dist/account/LoadingView.d.ts +1 -0
  70. package/dist/account/LoginCard.d.ts +39 -0
  71. package/dist/account/LoginCard.stories.d.ts +217 -0
  72. package/dist/account/LoginView.d.ts +10 -0
  73. package/dist/account/NoConnectionView.d.ts +4 -0
  74. package/dist/account/PasswordResetCard.d.ts +15 -0
  75. package/dist/account/PasswordResetCard.stories.d.ts +128 -0
  76. package/dist/account/UserMismatchView.d.ts +6 -0
  77. package/dist/account/VerifyPage.d.ts +13 -0
  78. package/dist/account/style.css.d.ts +10 -0
  79. package/{lib/account/types.ts → dist/account/types.d.ts} +3 -6
  80. package/dist/account/useFetchCurrentUser.d.ts +28 -0
  81. package/dist/account/useRedirectPath.d.ts +6 -0
  82. package/dist/animations.css.d.ts +3 -0
  83. package/dist/append-copy-to-text.d.ts +10 -0
  84. package/dist/append-copy-to-text.test.d.ts +1 -0
  85. package/dist/appkit.css +1 -0
  86. package/dist/appkit.js +10692 -0
  87. package/dist/async-op.d.ts +101 -0
  88. package/dist/atomic.css.d.ts +6 -0
  89. package/{lib/caught-value.ts → dist/caught-value.d.ts} +1 -11
  90. package/{lib/class-names.ts → dist/class-names.d.ts} +6 -17
  91. package/dist/client.d.ts +424 -0
  92. package/dist/common.css.d.ts +5 -0
  93. package/dist/copyrightRange.d.ts +1 -0
  94. package/dist/copyrightRange.test.d.ts +1 -0
  95. package/dist/createSafeStorage.d.ts +34 -0
  96. package/dist/failureMessages.d.ts +20 -0
  97. package/dist/failureMessages.test.d.ts +1 -0
  98. package/dist/form/FormSubmitButton.d.ts +17 -0
  99. package/dist/form/SubmitErrorAlert.d.ts +5 -0
  100. package/dist/form/style.css.d.ts +3 -0
  101. package/dist/globals.css.d.ts +0 -0
  102. package/dist/groupBy.d.ts +1 -0
  103. package/dist/groupBy.test.d.ts +1 -0
  104. package/dist/hrefs.d.ts +32 -0
  105. package/dist/hrefs.test.d.ts +1 -0
  106. package/dist/idToDate.d.ts +5 -0
  107. package/dist/idToDate.test.d.ts +1 -0
  108. package/dist/ids.d.ts +1 -0
  109. package/dist/ids.test.d.ts +1 -0
  110. package/dist/index.d.ts +64 -0
  111. package/dist/internal.css.d.ts +2 -0
  112. package/dist/mailto.d.ts +8 -0
  113. package/dist/mailto.test.d.ts +1 -0
  114. package/dist/media.d.ts +39 -0
  115. package/dist/random.d.ts +3 -0
  116. package/dist/result/swr.d.ts +4 -0
  117. package/{lib/sleep.ts → dist/sleep.d.ts} +1 -3
  118. package/dist/store/index.d.ts +237 -0
  119. package/dist/store/store.d.ts +144 -0
  120. package/dist/store/types.d.ts +49 -0
  121. package/dist/store/utils.d.ts +10 -0
  122. package/dist/storybook/decorators.d.ts +3 -0
  123. package/dist/structs.d.ts +1 -0
  124. package/{lib/typeguards.ts → dist/typeguards.d.ts} +1 -3
  125. package/dist/typeguards.test.d.ts +1 -0
  126. package/{lib/types.ts → dist/types.d.ts} +12 -23
  127. package/dist/unique.d.ts +10 -0
  128. package/dist/unique.test.d.ts +1 -0
  129. package/dist/use-async-op.d.ts +6 -0
  130. package/dist/use-document-background-color.d.ts +4 -0
  131. package/dist/use-form.d.ts +29 -0
  132. package/dist/use-is-installed.d.ts +8 -0
  133. package/dist/use-media-query.d.ts +1 -0
  134. package/dist/use-reverting-state.d.ts +5 -0
  135. package/dist/use-scroll-restoration.d.ts +25 -0
  136. package/dist/useEnsureValue.d.ts +6 -0
  137. package/dist/useInvokeClient.d.ts +25 -0
  138. package/dist/useIsVisible.d.ts +4 -0
  139. package/dist/utm.d.ts +58 -0
  140. package/dist/utm.test.d.ts +1 -0
  141. package/dist/validations.d.ts +3 -0
  142. package/dist/vars.css.d.ts +10 -0
  143. package/package.json +12 -5
  144. package/lib/AppConfig/AppConfig.tsx +0 -61
  145. package/lib/AuthCard/AuthCard.stories.ts +0 -34
  146. package/lib/AuthCard/AuthCard.tsx +0 -64
  147. package/lib/AuthCard/style.css.ts +0 -49
  148. package/lib/DialogTrigger/index.tsx +0 -36
  149. package/lib/DocumentTitle/DocumentTitle.tsx +0 -10
  150. package/lib/EnumMapper.ts +0 -50
  151. package/lib/ExternalLink.tsx +0 -10
  152. package/lib/FullscreenDismissBlocker.tsx +0 -23
  153. package/lib/IndieTabletopClubLogo.tsx +0 -44
  154. package/lib/IndieTabletopClubSymbol.tsx +0 -37
  155. package/lib/InfoPage/index.tsx +0 -46
  156. package/lib/InfoPage/pages.tsx +0 -36
  157. package/lib/InfoPage/style.css.ts +0 -36
  158. package/lib/Letterhead/index.tsx +0 -85
  159. package/lib/Letterhead/stories.tsx +0 -41
  160. package/lib/Letterhead/style.css.ts +0 -152
  161. package/lib/LetterheadForm/LetterheadReadonlyTextField.stories.tsx +0 -17
  162. package/lib/LetterheadForm/LetterheadSubmitError.stories.tsx +0 -19
  163. package/lib/LetterheadForm/LetterheadTextField.stories.tsx +0 -19
  164. package/lib/LetterheadForm/index.tsx +0 -137
  165. package/lib/LetterheadForm/style.css.ts +0 -89
  166. package/lib/LoadingIndicator.tsx +0 -40
  167. package/lib/MiddotSeparated/MiddotSeparated.stories.ts +0 -26
  168. package/lib/MiddotSeparated/MiddotSeparated.tsx +0 -26
  169. package/lib/MiddotSeparated/style.css.ts +0 -10
  170. package/lib/ModalDialog/index.tsx +0 -28
  171. package/lib/ModalDialog/style.css.ts +0 -88
  172. package/lib/ModernIDB/Cursor.ts +0 -91
  173. package/lib/ModernIDB/ModernIDB.ts +0 -337
  174. package/lib/ModernIDB/ModernIDBError.ts +0 -9
  175. package/lib/ModernIDB/ObjectStore.ts +0 -195
  176. package/lib/ModernIDB/ObjectStoreIndex.ts +0 -102
  177. package/lib/ModernIDB/README.md +0 -9
  178. package/lib/ModernIDB/Transaction.ts +0 -40
  179. package/lib/ModernIDB/VersionChangeManager.ts +0 -57
  180. package/lib/ModernIDB/bindings/factory.tsx +0 -165
  181. package/lib/ModernIDB/bindings/index.ts +0 -2
  182. package/lib/ModernIDB/bindings/utils.tsx +0 -32
  183. package/lib/ModernIDB/index.ts +0 -10
  184. package/lib/ModernIDB/types.ts +0 -120
  185. package/lib/ModernIDB/utils.ts +0 -51
  186. package/lib/QRCode/QRCode.stories.tsx +0 -41
  187. package/lib/QRCode/QRCode.tsx +0 -54
  188. package/lib/QRCode/style.css.ts +0 -23
  189. package/lib/ReleaseInfo/index.tsx +0 -29
  190. package/lib/RulesetResolver.ts +0 -214
  191. package/lib/SafariCheck/SafariCheck.stories.tsx +0 -99
  192. package/lib/SafariCheck/SafariCheck.tsx +0 -273
  193. package/lib/SafariCheck/addToDock.svg +0 -13
  194. package/lib/SafariCheck/addToHomeScreen.svg +0 -12
  195. package/lib/SafariCheck/safari.svg +0 -32
  196. package/lib/SafariCheck/shareIcon.svg +0 -11
  197. package/lib/SafariCheck/style.css.ts +0 -106
  198. package/lib/ServiceWorkerHandler.tsx +0 -53
  199. package/lib/ShareButton/ShareButton.stories.tsx +0 -58
  200. package/lib/ShareButton/ShareButton.tsx +0 -153
  201. package/lib/ShareButton/test.css.ts +0 -3
  202. package/lib/SubscribeCard/LetterheadInfoCard.tsx +0 -23
  203. package/lib/SubscribeCard/SubscribeByEmailCard.stories.tsx +0 -69
  204. package/lib/SubscribeCard/SubscribeByEmailCard.tsx +0 -183
  205. package/lib/SubscribeCard/SubscribeByPledgeCard.stories.tsx +0 -133
  206. package/lib/SubscribeCard/SubscribeByPledgeCard.tsx +0 -127
  207. package/lib/SubscribeCard/style.css.ts +0 -14
  208. package/lib/account/AccountIssueView.tsx +0 -44
  209. package/lib/account/AlreadyLoggedInView.tsx +0 -47
  210. package/lib/account/CurrentUserFetcher.stories.tsx +0 -292
  211. package/lib/account/CurrentUserFetcher.tsx +0 -118
  212. package/lib/account/FailureFallbackView.tsx +0 -36
  213. package/lib/account/JoinCard.stories.tsx +0 -257
  214. package/lib/account/JoinCard.tsx +0 -301
  215. package/lib/account/LoadingView.tsx +0 -14
  216. package/lib/account/LoginCard.stories.tsx +0 -288
  217. package/lib/account/LoginCard.tsx +0 -100
  218. package/lib/account/LoginView.tsx +0 -151
  219. package/lib/account/NoConnectionView.tsx +0 -34
  220. package/lib/account/PasswordResetCard.stories.tsx +0 -242
  221. package/lib/account/PasswordResetCard.tsx +0 -296
  222. package/lib/account/UserMismatchView.tsx +0 -62
  223. package/lib/account/VerifyPage.tsx +0 -195
  224. package/lib/account/style.css.ts +0 -57
  225. package/lib/account/useFetchCurrentUser.tsx +0 -63
  226. package/lib/account/useRedirectPath.ts +0 -21
  227. package/lib/animations.css.ts +0 -17
  228. package/lib/append-copy-to-text.ts +0 -35
  229. package/lib/async-op.ts +0 -286
  230. package/lib/atomic.css.ts +0 -11
  231. package/lib/client.ts +0 -662
  232. package/lib/common.css.ts +0 -48
  233. package/lib/copyrightRange.ts +0 -10
  234. package/lib/createSafeStorage.ts +0 -91
  235. package/lib/failureMessages.ts +0 -108
  236. package/lib/form/FormSubmitButton.tsx +0 -58
  237. package/lib/form/SubmitErrorAlert.tsx +0 -21
  238. package/lib/form/style.css.ts +0 -9
  239. package/lib/globals.css.ts +0 -62
  240. package/lib/groupBy.ts +0 -25
  241. package/lib/hrefs.ts +0 -48
  242. package/lib/idToDate.ts +0 -8
  243. package/lib/ids.ts +0 -6
  244. package/lib/index.ts +0 -71
  245. package/lib/internal.css.ts +0 -10
  246. package/lib/mailto.ts +0 -40
  247. package/lib/media.ts +0 -50
  248. package/lib/random.ts +0 -19
  249. package/lib/result/swr.ts +0 -18
  250. package/lib/store/index.tsx +0 -241
  251. package/lib/store/store.ts +0 -479
  252. package/lib/store/types.ts +0 -45
  253. package/lib/store/utils.ts +0 -54
  254. package/lib/storybook/decorators.tsx +0 -10
  255. package/lib/structs.ts +0 -3
  256. package/lib/unique.ts +0 -24
  257. package/lib/use-async-op.ts +0 -16
  258. package/lib/use-document-background-color.ts +0 -16
  259. package/lib/use-form.ts +0 -78
  260. package/lib/use-is-installed.ts +0 -17
  261. package/lib/use-media-query.ts +0 -21
  262. package/lib/use-reverting-state.ts +0 -32
  263. package/lib/use-scroll-restoration.ts +0 -99
  264. package/lib/useEnsureValue.ts +0 -31
  265. package/lib/useInvokeClient.ts +0 -54
  266. package/lib/useIsVisible.ts +0 -27
  267. package/lib/utm.ts +0 -92
  268. package/lib/validations.ts +0 -25
  269. package/lib/vars.css.ts +0 -13
@@ -1,242 +0,0 @@
1
- import { http, HttpResponse } from "msw";
2
- import preview from "../../.storybook/preview.tsx";
3
- import { sleep } from "../sleep.ts";
4
- import type { CurrentUser, SessionInfo } from "../types.ts";
5
- import { PasswordResetCard } from "./PasswordResetCard.tsx";
6
-
7
- function createMocks(options?: { responseSpeed?: number }) {
8
- const simulateNetwork = () => sleep(options?.responseSpeed ?? 2000);
9
-
10
- const john: CurrentUser = {
11
- id: "john",
12
- email: "john@example.com",
13
- isVerified: true,
14
- };
15
-
16
- const sessionInfo: SessionInfo = {
17
- createdTs: 123,
18
- expiresTs: 123,
19
- };
20
-
21
- return {
22
- data: { john },
23
- handlers: {
24
- requestPasswordReset: {
25
- success: () => {
26
- return http.post(
27
- "http://mock.api/v1/password-reset-tokens",
28
- async () => {
29
- await simulateNetwork();
30
- return HttpResponse.json({ message: "OK", tokenId: "1" });
31
- },
32
- );
33
- },
34
- userNotFound: () => {
35
- return http.post(
36
- "http://mock.api/v1/password-reset-tokens",
37
- async () => {
38
- await simulateNetwork();
39
- return HttpResponse.text("User not found", { status: 404 });
40
- },
41
- );
42
- },
43
- unknownFailure: () => {
44
- return http.post(
45
- "http://mock.api/v1/password-reset-tokens",
46
- async () => {
47
- await simulateNetwork();
48
- return HttpResponse.text("Internal server error", {
49
- status: 500,
50
- });
51
- },
52
- );
53
- },
54
- },
55
-
56
- checkPasswordResetCode: {
57
- success() {
58
- return http.get(
59
- "http://mock.api/v1/password-reset-tokens/:id",
60
- async () => {
61
- await simulateNetwork();
62
- return HttpResponse.json({ message: "OK" });
63
- },
64
- );
65
- },
66
- notFoundOrExpired() {
67
- return http.get(
68
- "http://mock.api/v1/password-reset-tokens/:id",
69
- async () => {
70
- await simulateNetwork();
71
- return HttpResponse.text("Not found", { status: 404 });
72
- },
73
- );
74
- },
75
- unknownFailure() {
76
- return http.get(
77
- "http://mock.api/v1/password-reset-tokens/:id",
78
- async () => {
79
- await simulateNetwork();
80
- return HttpResponse.text("Internal server error", {
81
- status: 500,
82
- });
83
- },
84
- );
85
- },
86
- },
87
-
88
- setNewPassword: {
89
- success() {
90
- return http.put(
91
- "http://mock.api/v1/password-reset-tokens/:id",
92
- async () => {
93
- await simulateNetwork();
94
- return HttpResponse.json({ message: "OK" });
95
- },
96
- );
97
- },
98
- notFoundOrExpired() {
99
- return http.put(
100
- "http://mock.api/v1/password-reset-tokens/:id",
101
- async () => {
102
- await simulateNetwork();
103
- return HttpResponse.text("Not found", { status: 404 });
104
- },
105
- );
106
- },
107
- unknownFailure() {
108
- return http.put(
109
- "http://mock.api/v1/password-reset-tokens/:id",
110
- async () => {
111
- await simulateNetwork();
112
- return HttpResponse.text("Internal server error", {
113
- status: 500,
114
- });
115
- },
116
- );
117
- },
118
- },
119
-
120
- createNewSession: {
121
- success: (currentUser: CurrentUser) => {
122
- return http.post("http://mock.api/v1/sessions", async () => {
123
- await simulateNetwork();
124
- return HttpResponse.json({ currentUser, sessionInfo });
125
- });
126
- },
127
- },
128
- },
129
- };
130
- }
131
-
132
- const { data, handlers } = createMocks({ responseSpeed: 700 });
133
-
134
- const meta = preview.meta({
135
- title: "Account/Password Reset Page",
136
- component: PasswordResetCard,
137
- tags: ["autodocs"],
138
- args: {},
139
- parameters: {
140
- msw: {
141
- handlers: {
142
- request: handlers.requestPasswordReset.success(),
143
- check: handlers.checkPasswordResetCode.success(),
144
- set: handlers.setNewPassword.success(),
145
- login: handlers.createNewSession.success(data.john),
146
- },
147
- },
148
- },
149
- });
150
-
151
- /**
152
- * The default case in which all steps of the flow succeed.
153
- */
154
- export const Success = meta.story({});
155
-
156
- /**
157
- * In this case, the initial step fails because the email address was not
158
- * found in our database.
159
- */
160
- export const UserNotFoundOnRequestCode = meta.story({
161
- parameters: {
162
- msw: {
163
- handlers: {
164
- request: handlers.requestPasswordReset.userNotFound(),
165
- },
166
- },
167
- },
168
- });
169
-
170
- /**
171
- * In this case, the initial step fails for a reason that doesn't have any
172
- * special handling in this location. E.g. network error, server error, etc.
173
- */
174
- export const UnknownFailureOnRequestCode = meta.story({
175
- parameters: {
176
- msw: {
177
- handlers: {
178
- request: handlers.requestPasswordReset.unknownFailure(),
179
- },
180
- },
181
- },
182
- });
183
-
184
- /**
185
- * In this case, the check code step fails because the token has expired,
186
- * or is incorrect.
187
- */
188
- export const NotFoundOrExpiredOnCheckCode = meta.story({
189
- parameters: {
190
- msw: {
191
- handlers: {
192
- check: handlers.checkPasswordResetCode.notFoundOrExpired(),
193
- },
194
- },
195
- },
196
- });
197
-
198
- /**
199
- * In this case, the check step fails for a reason that doesn't have any
200
- * special handling in this location. E.g. network error, server error, etc.
201
- */
202
- export const UnknownFailureOnCheckCode = meta.story({
203
- parameters: {
204
- msw: {
205
- handlers: {
206
- check: handlers.checkPasswordResetCode.unknownFailure(),
207
- },
208
- },
209
- },
210
- });
211
-
212
- /**
213
- * In this case, the final set password step fails because the token has
214
- * expired.
215
- *
216
- * Note that technically the token could also be incorrect/not found, but
217
- * because the user has gotten through the check step, that would require
218
- * some very strange set of circumstances.
219
- */
220
- export const NotFoundOrExpiredOnSetPassword = meta.story({
221
- parameters: {
222
- msw: {
223
- handlers: {
224
- set: handlers.setNewPassword.notFoundOrExpired(),
225
- },
226
- },
227
- },
228
- });
229
-
230
- /**
231
- * In this case, the set password step fails for a reason that doesn't have any
232
- * special handling in this location. E.g. network error, server error, etc.
233
- */
234
- export const UnknownFailureOnSetPassword = meta.story({
235
- parameters: {
236
- msw: {
237
- handlers: {
238
- set: handlers.setNewPassword.unknownFailure(),
239
- },
240
- },
241
- },
242
- });
@@ -1,296 +0,0 @@
1
- import { Form, useStoreState } from "@ariakit/react";
2
- import { type Dispatch, type SetStateAction, useState } from "react";
3
- import { Link } from "wouter";
4
- import { useAppConfig, useClient } from "../AppConfig/AppConfig.tsx";
5
- import { cx } from "../class-names.ts";
6
- import { interactiveText } from "../common.css.ts";
7
- import { getSubmitFailureMessage } from "../failureMessages.ts";
8
- import {
9
- Letterhead,
10
- LetterheadHeading,
11
- LetterheadParagraph,
12
- LetterheadSubmitButton,
13
- } from "../Letterhead/index.tsx";
14
- import { button } from "../Letterhead/style.css.ts";
15
- import {
16
- LetterheadFormActions,
17
- LetterheadHeader,
18
- LetterheadSubmitError,
19
- LetterheadTextField,
20
- } from "../LetterheadForm/index.tsx";
21
- import { useForm } from "../use-form.ts";
22
- import { validEmail, validPassword } from "../validations.ts";
23
- import type { DefaultFormValues } from "./types.ts";
24
-
25
- type SetStep = Dispatch<SetStateAction<ResetPasswordStep>>;
26
-
27
- function RequestPasswordResetStep(props: {
28
- defaultValues?: DefaultFormValues;
29
- setStep: SetStep;
30
- }) {
31
- const { defaultValues } = props;
32
- const { client, placeholders, hrefs } = useAppConfig();
33
-
34
- const { form, submitName } = useForm({
35
- defaultValues: {
36
- email: defaultValues?.email ?? "",
37
- },
38
- validate: {
39
- email: validEmail,
40
- },
41
-
42
- async onSubmit({ values }) {
43
- const op = await client.requestPasswordReset(values);
44
-
45
- return op.mapFailure((failure) => {
46
- return getSubmitFailureMessage(failure, {
47
- 404: "🤔 Couldn't find a user with this email address.",
48
- });
49
- });
50
- },
51
-
52
- onSuccess(response, { values }) {
53
- props.setStep({
54
- type: "SUBMIT_CODE",
55
- tokenId: response.tokenId,
56
- email: values.email,
57
- });
58
- },
59
- });
60
-
61
- const emailValue = useStoreState(form, (s) => s.values.email);
62
-
63
- return (
64
- <Letterhead>
65
- <LetterheadHeader>
66
- <LetterheadHeading>Password reset</LetterheadHeading>
67
- <LetterheadParagraph>
68
- Enter your Indie Tabletop Club account email to begin password reset.
69
- We will send you a one-time code to verify your access.
70
- </LetterheadParagraph>
71
- </LetterheadHeader>
72
-
73
- <Form store={form} resetOnSubmit={false}>
74
- <LetterheadTextField
75
- name={form.names.email}
76
- label="Email"
77
- type="email"
78
- placeholder={placeholders.email}
79
- required
80
- />
81
-
82
- <LetterheadFormActions>
83
- <LetterheadSubmitError name={submitName} />
84
- <LetterheadSubmitButton>Continue</LetterheadSubmitButton>
85
-
86
- <LetterheadParagraph align="start">
87
- {"Remembered your password? "}
88
- <Link
89
- href={hrefs.login()}
90
- className={interactiveText}
91
- state={{ emailValue }}
92
- >
93
- Log in
94
- </Link>
95
- {"."}
96
- </LetterheadParagraph>
97
- </LetterheadFormActions>
98
- </Form>
99
- </Letterhead>
100
- );
101
- }
102
-
103
- function SubmitCodeStep(props: {
104
- tokenId: string;
105
- email: string;
106
- setStep: SetStep;
107
- }) {
108
- const client = useClient();
109
- const { form, submitName } = useForm({
110
- defaultValues: {
111
- code: "",
112
- },
113
-
114
- async onSubmit({ values }) {
115
- const op = await client.checkPasswordResetCode({
116
- ...values,
117
- tokenId: props.tokenId,
118
- });
119
-
120
- return op.mapFailure((failure) => {
121
- return getSubmitFailureMessage(failure, {
122
- 404: "🚫 This code is incorrect or expired. Please try again.",
123
- });
124
- });
125
- },
126
-
127
- onSuccess(_, { values }) {
128
- props.setStep({
129
- type: "SET_NEW_PASSWORD",
130
- tokenId: props.tokenId,
131
- code: values.code,
132
- email: props.email,
133
- });
134
- },
135
- });
136
-
137
- return (
138
- <Letterhead>
139
- <LetterheadHeader>
140
- <LetterheadHeading>Submit code</LetterheadHeading>
141
- <LetterheadParagraph>
142
- We've sent a one-time code to the email address you have provided.
143
- Please, enter the code in the field below to continue.
144
- </LetterheadParagraph>
145
- </LetterheadHeader>
146
-
147
- <Form store={form} resetOnSubmit={false}>
148
- <LetterheadTextField
149
- name={form.names.code}
150
- label="Code"
151
- placeholder="E.g. 123123"
152
- autoComplete="one-time-code"
153
- required
154
- />
155
-
156
- <LetterheadFormActions>
157
- <LetterheadSubmitError name={submitName} />
158
- <LetterheadSubmitButton>Verify code</LetterheadSubmitButton>
159
- </LetterheadFormActions>
160
- </Form>
161
- </Letterhead>
162
- );
163
- }
164
-
165
- function SetNewPasswordStep(props: {
166
- tokenId: string;
167
- code: string;
168
- email: string;
169
- setStep: SetStep;
170
- }) {
171
- const client = useClient();
172
-
173
- const { form, submitName } = useForm({
174
- defaultValues: { password: "" },
175
- validate: { password: validPassword },
176
- async onSubmit({ values }) {
177
- const res = await client.setNewPassword({
178
- tokenId: props.tokenId,
179
- code: props.code,
180
- password: values.password,
181
- });
182
-
183
- if (res.isFailure) {
184
- return res.mapFailure((failure) => {
185
- return getSubmitFailureMessage(failure, {
186
- 404: "⏱️ One-time code has expired. Please restart the password reset process.",
187
- });
188
- });
189
- }
190
-
191
- // Login attempt with new credentials. Must be performed in onSubmit so
192
- // that errors are correctly propagated.
193
- const loginOp = await client.login({
194
- email: props.email,
195
- password: values.password,
196
- });
197
-
198
- return loginOp.mapFailure(getSubmitFailureMessage);
199
- },
200
- onSuccess() {
201
- props.setStep({ type: "SUCCESS" });
202
- },
203
- });
204
-
205
- return (
206
- <Letterhead>
207
- <LetterheadHeader>
208
- <LetterheadHeading>Choose New Password</LetterheadHeading>
209
- <LetterheadParagraph>
210
- Please choose a new password. Make it at least 8 characters long.
211
- </LetterheadParagraph>
212
- </LetterheadHeader>
213
-
214
- <Form store={form} resetOnSubmit={false}>
215
- <LetterheadTextField
216
- name={form.names.password}
217
- label="New Password"
218
- type="password"
219
- placeholder="Enter a new password"
220
- required
221
- />
222
-
223
- <LetterheadFormActions>
224
- <LetterheadSubmitError name={submitName} />
225
- <LetterheadSubmitButton>Save & Login</LetterheadSubmitButton>
226
- </LetterheadFormActions>
227
- </Form>
228
- </Letterhead>
229
- );
230
- }
231
-
232
- function SuccessStep() {
233
- const { hrefs } = useAppConfig();
234
-
235
- return (
236
- <Letterhead>
237
- <LetterheadHeader>
238
- <LetterheadHeading>Success!</LetterheadHeading>
239
- <LetterheadParagraph>
240
- Your password has been successfully reset and you've been
241
- automatically logged in. Yay!
242
- </LetterheadParagraph>
243
- </LetterheadHeader>
244
-
245
- <LetterheadFormActions>
246
- <Link href={hrefs.dashboard()} {...cx(button())}>
247
- Go to dashboard
248
- </Link>
249
- </LetterheadFormActions>
250
- </Letterhead>
251
- );
252
- }
253
-
254
- type ResetPasswordStep =
255
- | { type: "REQUEST_PASSWORD_RESET" }
256
- | { type: "SUBMIT_CODE"; tokenId: string; email: string }
257
- | { type: "SET_NEW_PASSWORD"; tokenId: string; code: string; email: string }
258
- | { type: "SUCCESS" };
259
-
260
- export type PasswordResetCardProps = {
261
- /**
262
- * Default values for the initial request password reset step.
263
- *
264
- * You might want to provide a value for history state or query param, so that
265
- * if a user jumps between login and password reset, their email address
266
- * is maintained between the two locations.
267
- */
268
- defaultValues?: DefaultFormValues;
269
- };
270
-
271
- /**
272
- * Allows the user to reset their password.
273
- */
274
- export function PasswordResetCard(props: PasswordResetCardProps) {
275
- const [step, setStep] = useState<ResetPasswordStep>({
276
- type: "REQUEST_PASSWORD_RESET",
277
- });
278
-
279
- switch (step.type) {
280
- case "REQUEST_PASSWORD_RESET": {
281
- return <RequestPasswordResetStep {...props} setStep={setStep} />;
282
- }
283
-
284
- case "SUBMIT_CODE": {
285
- return <SubmitCodeStep {...step} setStep={setStep} />;
286
- }
287
-
288
- case "SET_NEW_PASSWORD": {
289
- return <SetNewPasswordStep {...step} setStep={setStep} />;
290
- }
291
-
292
- case "SUCCESS": {
293
- return <SuccessStep />;
294
- }
295
- }
296
- }
@@ -1,62 +0,0 @@
1
- import { Button } from "@ariakit/react";
2
- import { cx } from "../class-names.ts";
3
- import {
4
- Letterhead,
5
- LetterheadHeading,
6
- LetterheadParagraph,
7
- } from "../Letterhead/index.tsx";
8
- import { LetterheadHeader } from "../LetterheadForm/index.tsx";
9
- import { useAppActions } from "../store/index.tsx";
10
- import type { CurrentUser } from "../types.ts";
11
- import { accountPicker } from "./style.css.ts";
12
-
13
- export function UserMismatchView(props: {
14
- serverUser: CurrentUser;
15
- localUser: CurrentUser;
16
- reload: () => void;
17
- }) {
18
- const { localUser, serverUser, reload } = props;
19
- const { clientLogout, serverLogout } = useAppActions();
20
-
21
- return (
22
- <Letterhead>
23
- <LetterheadHeader>
24
- <LetterheadHeading>User mismatch</LetterheadHeading>
25
-
26
- <LetterheadParagraph>
27
- You are logged into Indie Tabletop Club as <em>{serverUser.email}</em>
28
- , but locally stored data belong to <em>{localUser.email}</em>.
29
- </LetterheadParagraph>
30
-
31
- <LetterheadParagraph>
32
- Which account do you want to use?
33
- </LetterheadParagraph>
34
- </LetterheadHeader>
35
-
36
- <div {...cx(accountPicker.container)}>
37
- <Button
38
- {...cx(accountPicker.button)}
39
- type="button"
40
- onClick={async () => await clientLogout({ serverUser })}
41
- >
42
- <div {...cx(accountPicker.buttonLabel)}>{serverUser.email}</div>
43
- <div>Local data will be deleted.</div>
44
- </Button>
45
-
46
- <div {...cx(accountPicker.divider)} />
47
-
48
- <Button
49
- {...cx(accountPicker.button)}
50
- type="button"
51
- onClick={async () => {
52
- await serverLogout();
53
- reload();
54
- }}
55
- >
56
- <div {...cx(accountPicker.buttonLabel)}>{localUser.email}</div>
57
- <div>You will be asked to log in again.</div>
58
- </Button>
59
- </div>
60
- </Letterhead>
61
- );
62
- }