@algolia/satellite 1.5.0 → 1.6.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 (34) hide show
  1. package/dist/cjs/Actions/Button/Button.tailwind.js +0 -12
  2. package/dist/cjs/Fields/Field/Field.js +1 -1
  3. package/dist/cjs/Fields/Form/stories/AsynchronousValidation.js +4 -4
  4. package/dist/cjs/Fields/Form/stories/Complex.js +4 -4
  5. package/dist/cjs/Fields/Form/stories/DependentFieldsValidation.js +4 -4
  6. package/dist/cjs/Fields/Form/stories/DirtyFields.js +4 -4
  7. package/dist/cjs/Fields/Form/stories/DynamicFieldsValidation.js +4 -4
  8. package/dist/cjs/Fields/Form/stories/FieldArrays.js +6 -6
  9. package/dist/cjs/Fields/Form/stories/JSONForms.js +3 -3
  10. package/dist/cjs/Fields/Form/stories/MultiStep.js +700 -0
  11. package/dist/cjs/Fields/Form/stories/ValidationStrategies.js +6 -6
  12. package/dist/cjs/Icons/index.d.ts +1 -1
  13. package/dist/cjs/Icons/index.js +6 -0
  14. package/dist/cjs/Indicators/Skeleton/Skeleton.js +1 -1
  15. package/dist/cjs/Indicators/index.d.ts +1 -0
  16. package/dist/cjs/Indicators/index.js +11 -0
  17. package/dist/esm/Actions/Button/Button.tailwind.js +0 -12
  18. package/dist/esm/Fields/Field/Field.js +1 -1
  19. package/dist/esm/Fields/Form/stories/AsynchronousValidation.js +4 -4
  20. package/dist/esm/Fields/Form/stories/Complex.js +4 -4
  21. package/dist/esm/Fields/Form/stories/DependentFieldsValidation.js +4 -4
  22. package/dist/esm/Fields/Form/stories/DirtyFields.js +4 -4
  23. package/dist/esm/Fields/Form/stories/DynamicFieldsValidation.js +4 -4
  24. package/dist/esm/Fields/Form/stories/FieldArrays.js +6 -6
  25. package/dist/esm/Fields/Form/stories/JSONForms.js +3 -3
  26. package/dist/esm/Fields/Form/stories/MultiStep.js +691 -0
  27. package/dist/esm/Fields/Form/stories/ValidationStrategies.js +6 -6
  28. package/dist/esm/Icons/index.d.ts +1 -1
  29. package/dist/esm/Icons/index.js +1 -1
  30. package/dist/esm/Indicators/Skeleton/Skeleton.js +1 -1
  31. package/dist/esm/Indicators/index.d.ts +1 -0
  32. package/dist/esm/Indicators/index.js +2 -1
  33. package/dist/satellite.min.css +1 -1
  34. package/package.json +6 -1
@@ -0,0 +1,691 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
3
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
4
+ import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
5
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
6
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16, _templateObject17, _templateObject18, _templateObject19, _templateObject20, _templateObject21, _templateObject22, _templateObject23, _templateObject24, _templateObject25, _templateObject26, _templateObject27, _templateObject28, _templateObject29, _templateObject30, _templateObject31, _templateObject32, _templateObject33, _templateObject34, _templateObject35, _templateObject36, _templateObject37, _templateObject38, _templateObject39, _templateObject40, _templateObject41, _templateObject42, _templateObject43, _templateObject44, _templateObject45, _templateObject46, _templateObject47, _templateObject48, _templateObject49, _templateObject50, _templateObject51, _templateObject52, _templateObject53, _templateObject54, _templateObject55, _templateObject56, _templateObject57, _templateObject58, _templateObject59, _templateObject60, _templateObject61, _templateObject62, _templateObject63, _templateObject64, _templateObject65, _templateObject66, _templateObject67, _templateObject68, _templateObject69, _templateObject70;
7
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
8
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
9
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
10
+ import { zodResolver } from "@hookform/resolvers/zod";
11
+ import { useFormik } from "formik";
12
+ import capitalize from "lodash/capitalize";
13
+ import clamp from "lodash/clamp";
14
+ import { useState } from "react";
15
+ import { Controller } from "react-hook-form";
16
+ import { useForm } from "react-hook-form";
17
+ import * as yup from "yup";
18
+ import { z } from "zod";
19
+ import { Button } from "../../../Actions/Button/Button";
20
+ import { DotPagination } from "../../../Navigation/Pagination/DotPagination";
21
+ import stl from "../../../styles/helpers/satellitePrefixer";
22
+ import { Checkbox } from "../../Checkbox";
23
+ import { Field } from "../../Field";
24
+ import { RadioButton } from "../../RadioGroup";
25
+ import { ExperimentalForm, ExperimentalFormErrorMessage, ExperimentalFormSubmit } from "../Form";
26
+ import { useFormikAutoFocusOnError } from "./utils/useFormikAutoFocusOnError";
27
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
28
+ var variantsEnum = ["separate", "group"];
29
+ var outOfStockEnum = ["show", "hide"];
30
+ var sortingOptions = ["relevance", "popularity", "lowest price first", "greatest discount first", "newest first"];
31
+ var filtersOptions = ["categories", "price", "brand", "size", "color"];
32
+ var initialFormData = {
33
+ variants: null,
34
+ outOfStock: null,
35
+ sorting: [],
36
+ filters: []
37
+ };
38
+ var steps = Object.keys(initialFormData);
39
+ var variantsOptions = [{
40
+ value: "separate",
41
+ title: "Show variants as separate items",
42
+ description: "Recommended when you want to give exposure to all the different variants of each product. May be preferable for smaller product ranges."
43
+ }, {
44
+ value: "group",
45
+ title: "Group variants under one item",
46
+ description: "Recommended when you have a large number of different products all with multiple variants."
47
+ }];
48
+ var outOfStockOptions = [{
49
+ value: "show",
50
+ title: "Show out-of-stock products in results",
51
+ description: "Recommended when you expect products to be quickly restocked, and you don't have any alternative products to offer."
52
+ }, {
53
+ value: "hide",
54
+ title: "Hide out-of-stock products from results",
55
+ description: "Recommended when you know products won't be restocked, or you can offer similar alternative products from your catalogue."
56
+ }];
57
+ var zodSchema = z.object({
58
+ variants: z["enum"](variantsEnum, {
59
+ errorMap: function errorMap() {
60
+ return {
61
+ message: "You must choose an option"
62
+ };
63
+ }
64
+ }),
65
+ outOfStock: z["enum"](outOfStockEnum, {
66
+ errorMap: function errorMap() {
67
+ return {
68
+ message: "You must choose an option"
69
+ };
70
+ }
71
+ }),
72
+ sorting: z.array(z["enum"](sortingOptions)).min(1, "You must specify at least one sort option"),
73
+ filters: z.array(z["enum"](filtersOptions)).min(1, "You must specify at least one filter option")
74
+ });
75
+ export var RHFMultiStepComponent = function RHFMultiStepComponent() {
76
+ var _useForm = useForm({
77
+ resolver: zodResolver(zodSchema),
78
+ defaultValues: initialFormData,
79
+ reValidateMode: "onChange"
80
+ }),
81
+ control = _useForm.control,
82
+ handleSubmit = _useForm.handleSubmit,
83
+ getFieldStateFromReactHookForm = _useForm.getFieldState,
84
+ formState = _useForm.formState,
85
+ reset = _useForm.reset,
86
+ trigger = _useForm.trigger,
87
+ getValues = _useForm.getValues;
88
+ var _useState = useState(initialFormData),
89
+ _useState2 = _slicedToArray(_useState, 2),
90
+ formData = _useState2[0],
91
+ setFormData = _useState2[1];
92
+ var _useState3 = useState(1),
93
+ _useState4 = _slicedToArray(_useState3, 2),
94
+ page = _useState4[0],
95
+ setPage = _useState4[1];
96
+ var goToPage = function goToPage(newPage) {
97
+ return setPage(clamp(newPage, 1, steps.length));
98
+ };
99
+ var goToPreviousPage = function goToPreviousPage() {
100
+ return goToPage(page - 1);
101
+ };
102
+ var goToNextPage = function goToNextPage() {
103
+ return goToPage(page + 1);
104
+ };
105
+ var getFieldState = function getFieldState(fieldName) {
106
+ var fieldState = getFieldStateFromReactHookForm(fieldName, formState);
107
+ var fieldErrors = fieldState.error ? Array.isArray(fieldState.error) ? fieldState.error : [fieldState.error] : [];
108
+ if (fieldErrors.length > 0) {
109
+ return {
110
+ status: "invalid",
111
+ errors: fieldErrors.map(function (error) {
112
+ return error.message;
113
+ })
114
+ };
115
+ } else if (!fieldState.invalid && formState.isSubmitted) {
116
+ return {
117
+ status: "validated"
118
+ };
119
+ } else {
120
+ return {
121
+ status: "default"
122
+ };
123
+ }
124
+ };
125
+ return /*#__PURE__*/_jsxs("div", {
126
+ className: stl(_templateObject || (_templateObject = _taggedTemplateLiteral(["flex flex-col gap-8 w-4/5"]))),
127
+ children: [/*#__PURE__*/_jsxs(ExperimentalForm, {
128
+ onSubmit: handleSubmit(function (data) {
129
+ return setFormData(data);
130
+ }),
131
+ onReset: function onReset() {
132
+ return setFormData(initialFormData);
133
+ },
134
+ className: stl(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["flex flex-col gap-8 overflow-hidden"]))),
135
+ children: [/*#__PURE__*/_jsx(ExperimentalFormErrorMessage, {
136
+ locale: {
137
+ errorText: function errorText(invalidFields) {
138
+ return /*#__PURE__*/_jsxs(_Fragment, {
139
+ children: [/*#__PURE__*/_jsxs("div", {
140
+ className: stl(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["display-heading mb-2"]))),
141
+ children: ["Please fix ", invalidFields.length, " error", invalidFields.length > 1 ? "s" : "", " below and try again."]
142
+ }), /*#__PURE__*/_jsx("div", {
143
+ className: stl(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["flex flex-col"]))),
144
+ children: /*#__PURE__*/_jsx("a", {
145
+ href: "#",
146
+ className: stl(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["text-black underline hover:text-grey-800"]))),
147
+ onClick: function onClick(e) {
148
+ e.preventDefault();
149
+ var firstInvalid = steps.find(function (step) {
150
+ return getFieldState(step).status === "invalid";
151
+ });
152
+ if (firstInvalid) {
153
+ goToPage(steps.indexOf(firstInvalid) + 1);
154
+ }
155
+ },
156
+ children: "Go to first error"
157
+ })
158
+ })]
159
+ });
160
+ }
161
+ }
162
+ }), /*#__PURE__*/_jsxs("div", {
163
+ className: stl(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["flex transition-transform ease-out duration-500"]))),
164
+ style: {
165
+ transform: "translateX(-".concat((page - 1) * 100, "%)")
166
+ },
167
+ children: [/*#__PURE__*/_jsx(Controller, {
168
+ name: "variants",
169
+ control: control,
170
+ render: function render(_ref) {
171
+ var field = _ref.field;
172
+ return /*#__PURE__*/_jsx(Field, {
173
+ label: /*#__PURE__*/_jsx("h2", {
174
+ className: stl(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["display-xlarge whitespace-normal inline"]))),
175
+ children: "How should we display products that contain multiple variants?"
176
+ }),
177
+ labelFor: variantsEnum[0],
178
+ state: getFieldState("variants"),
179
+ className: stl(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["w-full shrink-0"]))),
180
+ children: /*#__PURE__*/_jsx("div", {
181
+ className: stl(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["mt-7"]))),
182
+ children: variantsOptions.map(function (option) {
183
+ return /*#__PURE__*/_jsxs("label", {
184
+ htmlFor: option.value,
185
+ className: stl(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["flex flex-col gap-3 p-6 rounded display-body transition-colors hover:bg-grey-100"]))),
186
+ children: [/*#__PURE__*/_jsxs("div", {
187
+ className: stl(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral(["flex items-center gap-2"]))),
188
+ children: [/*#__PURE__*/_jsx(RadioButton, _objectSpread(_objectSpread({
189
+ id: option.value,
190
+ "aria-labelledby": option.value,
191
+ required: true
192
+ }, field), {}, {
193
+ value: option.value,
194
+ className: stl(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["shrink-0"])))
195
+ })), option.title]
196
+ }), /*#__PURE__*/_jsx("div", {
197
+ className: stl(_templateObject13 || (_templateObject13 = _taggedTemplateLiteral(["ml-6 typo-subdued"]))),
198
+ children: option.description
199
+ })]
200
+ }, option.value);
201
+ })
202
+ })
203
+ });
204
+ }
205
+ }), /*#__PURE__*/_jsx(Controller, {
206
+ name: "outOfStock",
207
+ control: control,
208
+ render: function render(_ref2) {
209
+ var field = _ref2.field;
210
+ return /*#__PURE__*/_jsx(Field, {
211
+ label: /*#__PURE__*/_jsx("h2", {
212
+ className: stl(_templateObject14 || (_templateObject14 = _taggedTemplateLiteral(["display-xlarge whitespace-normal inline"]))),
213
+ children: "How would you like to show out-of-stock items?"
214
+ }),
215
+ labelFor: outOfStockEnum[0],
216
+ state: getFieldState("outOfStock"),
217
+ className: stl(_templateObject15 || (_templateObject15 = _taggedTemplateLiteral(["w-full shrink-0"]))),
218
+ children: /*#__PURE__*/_jsx("div", {
219
+ className: stl(_templateObject16 || (_templateObject16 = _taggedTemplateLiteral(["mt-7"]))),
220
+ children: outOfStockOptions.map(function (option) {
221
+ return /*#__PURE__*/_jsxs("label", {
222
+ htmlFor: option.value,
223
+ className: stl(_templateObject17 || (_templateObject17 = _taggedTemplateLiteral(["flex flex-col gap-3 p-6 rounded display-body transition-colors hover:bg-grey-100"]))),
224
+ children: [/*#__PURE__*/_jsxs("div", {
225
+ className: stl(_templateObject18 || (_templateObject18 = _taggedTemplateLiteral(["flex items-center gap-2"]))),
226
+ children: [/*#__PURE__*/_jsx(RadioButton, _objectSpread(_objectSpread({
227
+ id: option.value,
228
+ "aria-labelledby": option.value,
229
+ required: true
230
+ }, field), {}, {
231
+ value: option.value,
232
+ className: stl(_templateObject19 || (_templateObject19 = _taggedTemplateLiteral(["shrink-0"])))
233
+ })), option.title]
234
+ }), /*#__PURE__*/_jsx("div", {
235
+ className: stl(_templateObject20 || (_templateObject20 = _taggedTemplateLiteral(["ml-6 typo-subdued"]))),
236
+ children: option.description
237
+ })]
238
+ }, option.value);
239
+ })
240
+ })
241
+ });
242
+ }
243
+ }), /*#__PURE__*/_jsx(Controller, {
244
+ name: "sorting",
245
+ control: control,
246
+ render: function render(_ref3) {
247
+ var field = _ref3.field;
248
+ return /*#__PURE__*/_jsxs(Field, {
249
+ label: /*#__PURE__*/_jsx("h2", {
250
+ className: stl(_templateObject21 || (_templateObject21 = _taggedTemplateLiteral(["display-xlarge whitespace-normal inline"]))),
251
+ children: "Select how your customers can sort their search results"
252
+ }),
253
+ labelFor: sortingOptions[0],
254
+ state: getFieldState("sorting"),
255
+ className: stl(_templateObject22 || (_templateObject22 = _taggedTemplateLiteral(["w-full shrink-0"]))),
256
+ children: [/*#__PURE__*/_jsx("div", {
257
+ className: stl(_templateObject23 || (_templateObject23 = _taggedTemplateLiteral(["mt-4 typo-subdued"]))),
258
+ children: "Select the sort order options you'd like to show customers. You can change these later."
259
+ }), /*#__PURE__*/_jsx("div", {
260
+ className: stl(_templateObject24 || (_templateObject24 = _taggedTemplateLiteral(["mt-7"]))),
261
+ children: sortingOptions.map(function (option) {
262
+ return /*#__PURE__*/_jsxs("label", {
263
+ htmlFor: option,
264
+ className: stl(_templateObject25 || (_templateObject25 = _taggedTemplateLiteral(["flex gap-2 p-4 rounded display-body transition-colors hover:bg-grey-100"]))),
265
+ children: [/*#__PURE__*/_jsx(Checkbox, _objectSpread(_objectSpread({
266
+ id: option,
267
+ required: true,
268
+ checked: getValues("sorting").includes(option)
269
+ }, field), {}, {
270
+ onChange: function onChange() {
271
+ return field.onChange(field.value.includes(option) ? field.value.filter(function (v) {
272
+ return v !== option;
273
+ }) : [].concat(_toConsumableArray(field.value), [option]));
274
+ }
275
+ })), capitalize(option)]
276
+ }, option);
277
+ })
278
+ })]
279
+ });
280
+ }
281
+ }), /*#__PURE__*/_jsx(Controller, {
282
+ name: "filters",
283
+ control: control,
284
+ render: function render(_ref4) {
285
+ var field = _ref4.field;
286
+ return /*#__PURE__*/_jsxs(Field, {
287
+ label: /*#__PURE__*/_jsx("h2", {
288
+ className: stl(_templateObject26 || (_templateObject26 = _taggedTemplateLiteral(["display-xlarge whitespace-normal inline"]))),
289
+ children: "Add filters to help narrow results"
290
+ }),
291
+ labelFor: filtersOptions[0],
292
+ state: getFieldState("filters"),
293
+ className: stl(_templateObject27 || (_templateObject27 = _taggedTemplateLiteral(["w-full shrink-0"]))),
294
+ children: [/*#__PURE__*/_jsxs("div", {
295
+ className: stl(_templateObject28 || (_templateObject28 = _taggedTemplateLiteral(["mt-4 typo-subdued"]))),
296
+ children: ["Select the filter options customers can use to refine results.", /*#__PURE__*/_jsx("br", {}), "You can edit these after setup."]
297
+ }), /*#__PURE__*/_jsx("div", {
298
+ className: stl(_templateObject29 || (_templateObject29 = _taggedTemplateLiteral(["mt-7"]))),
299
+ children: filtersOptions.map(function (option) {
300
+ return /*#__PURE__*/_jsxs("label", {
301
+ htmlFor: option,
302
+ className: stl(_templateObject30 || (_templateObject30 = _taggedTemplateLiteral(["flex gap-2 p-4 rounded display-body transition-colors hover:bg-grey-100"]))),
303
+ children: [/*#__PURE__*/_jsx(Checkbox, _objectSpread(_objectSpread({
304
+ id: option,
305
+ required: true,
306
+ checked: getValues("filters").includes(option)
307
+ }, field), {}, {
308
+ onChange: function onChange() {
309
+ return field.onChange(field.value.includes(option) ? field.value.filter(function (v) {
310
+ return v !== option;
311
+ }) : [].concat(_toConsumableArray(field.value), [option]));
312
+ }
313
+ })), capitalize(option)]
314
+ }, option);
315
+ })
316
+ })]
317
+ });
318
+ }
319
+ })]
320
+ }), /*#__PURE__*/_jsxs("div", {
321
+ className: stl(_templateObject31 || (_templateObject31 = _taggedTemplateLiteral(["w-full flex justify-between"]))),
322
+ children: [/*#__PURE__*/_jsxs("div", {
323
+ className: stl(_templateObject32 || (_templateObject32 = _taggedTemplateLiteral(["flex gap-2"]))),
324
+ children: [/*#__PURE__*/_jsx(Button, {
325
+ "aria-label": "Previous step",
326
+ disabled: page <= 1,
327
+ onClick: function onClick() {
328
+ return goToPreviousPage();
329
+ },
330
+ children: "Back"
331
+ }), page >= steps.length ? /*#__PURE__*/_jsx(ExperimentalFormSubmit, {
332
+ variant: "primary",
333
+ "aria-label": "Complete",
334
+ children: "Complete"
335
+ }) : /*#__PURE__*/_jsx(Button, {
336
+ variant: "primary",
337
+ "aria-label": "Next step",
338
+ onClick: /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
339
+ var valid;
340
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
341
+ while (1) switch (_context.prev = _context.next) {
342
+ case 0:
343
+ _context.next = 2;
344
+ return trigger(steps[page - 1]);
345
+ case 2:
346
+ valid = _context.sent;
347
+ if (valid) {
348
+ goToNextPage();
349
+ }
350
+ case 4:
351
+ case "end":
352
+ return _context.stop();
353
+ }
354
+ }, _callee);
355
+ })),
356
+ children: "Next"
357
+ })]
358
+ }), /*#__PURE__*/_jsx(Button, {
359
+ variant: "subtle",
360
+ "aria-label": "Reset the form",
361
+ onClick: function onClick() {
362
+ reset();
363
+ goToPage(1);
364
+ },
365
+ children: "Reset"
366
+ })]
367
+ }), /*#__PURE__*/_jsx("div", {
368
+ className: stl(_templateObject33 || (_templateObject33 = _taggedTemplateLiteral(["mt-8 mx-auto"]))),
369
+ children: /*#__PURE__*/_jsx(DotPagination, {
370
+ nbPages: steps.length,
371
+ currentPage: page,
372
+ onChange: goToPage,
373
+ size: "small"
374
+ })
375
+ })]
376
+ }), /*#__PURE__*/_jsx("hr", {
377
+ className: stl(_templateObject34 || (_templateObject34 = _taggedTemplateLiteral(["text-grey-500"])))
378
+ }), /*#__PURE__*/_jsx("code", {
379
+ className: stl(_templateObject35 || (_templateObject35 = _taggedTemplateLiteral(["whitespace-pre display-code"]))),
380
+ children: JSON.stringify(formData, null, 2)
381
+ })]
382
+ });
383
+ };
384
+ var yupSchema = yup.object({
385
+ variants: yup.string().oneOf(variantsEnum).required("You must choose an option"),
386
+ outOfStock: yup.string().oneOf(outOfStockEnum).required("You must choose an option"),
387
+ sorting: yup.array(yup.string().oneOf(sortingOptions)).min(1, "You must specify at least one sort option"),
388
+ filters: yup.array(yup.string().oneOf(filtersOptions)).min(1, "You must specify at least one filter option")
389
+ });
390
+ export var FormikMultiStepComponent = function FormikMultiStepComponent() {
391
+ var _useState5 = useState(initialFormData),
392
+ _useState6 = _slicedToArray(_useState5, 2),
393
+ formData = _useState6[0],
394
+ setFormData = _useState6[1];
395
+ var _useState7 = useState(false),
396
+ _useState8 = _slicedToArray(_useState7, 2),
397
+ revalidationEnabled = _useState8[0],
398
+ setRevalidationEnabled = _useState8[1];
399
+ var _useState9 = useState(1),
400
+ _useState10 = _slicedToArray(_useState9, 2),
401
+ page = _useState10[0],
402
+ setPage = _useState10[1];
403
+ var _useState11 = useState(false),
404
+ _useState12 = _slicedToArray(_useState11, 2),
405
+ nextPageClicked = _useState12[0],
406
+ setNextPageClicked = _useState12[1];
407
+ var goToPage = function goToPage(newPage) {
408
+ return setPage(clamp(newPage, 1, steps.length));
409
+ };
410
+ var goToPreviousPage = function goToPreviousPage() {
411
+ return goToPage(page - 1);
412
+ };
413
+ var goToNextPage = function goToNextPage() {
414
+ return goToPage(page + 1);
415
+ };
416
+ var formik = useFormik({
417
+ initialValues: initialFormData,
418
+ validateOnChange: revalidationEnabled,
419
+ validateOnBlur: revalidationEnabled,
420
+ validationSchema: yupSchema,
421
+ onSubmit: function onSubmit(values) {
422
+ return setFormData(values);
423
+ },
424
+ onReset: function onReset() {
425
+ return setFormData(initialFormData);
426
+ }
427
+ });
428
+ var getFieldState = function getFieldState(fieldName) {
429
+ var fieldMeta = formik.getFieldMeta(fieldName);
430
+ var fieldErrors = fieldMeta.error ? Array.isArray(fieldMeta.error) ? fieldMeta.error : [fieldMeta.error] : [];
431
+ if (fieldErrors.length > 0) {
432
+ return {
433
+ status: "invalid",
434
+ errors: fieldErrors
435
+ };
436
+ } else if (formik.isSubmitting && fieldMeta.touched) {
437
+ return {
438
+ status: "validated"
439
+ };
440
+ } else {
441
+ return {
442
+ status: "default"
443
+ };
444
+ }
445
+ };
446
+ useFormikAutoFocusOnError(formik);
447
+
448
+ // This is a workaround because calling `formik.validateField` doesn't return the field errors.
449
+ // See https://github.com/jaredpalmer/formik/issues/2021
450
+ if (nextPageClicked) {
451
+ setNextPageClicked(false);
452
+ if (getFieldState(steps[page - 1]).status !== "invalid") {
453
+ goToNextPage();
454
+ }
455
+ }
456
+ return /*#__PURE__*/_jsxs("div", {
457
+ className: stl(_templateObject36 || (_templateObject36 = _taggedTemplateLiteral(["flex flex-col gap-8 w-4/5"]))),
458
+ children: [/*#__PURE__*/_jsxs(ExperimentalForm, {
459
+ onSubmit: function onSubmit(e) {
460
+ setRevalidationEnabled(true);
461
+ formik.handleSubmit(e);
462
+ },
463
+ onReset: function onReset(e) {
464
+ setRevalidationEnabled(false);
465
+ formik.handleReset(e);
466
+ },
467
+ className: stl(_templateObject37 || (_templateObject37 = _taggedTemplateLiteral(["flex flex-col gap-8 overflow-hidden"]))),
468
+ children: [/*#__PURE__*/_jsx(ExperimentalFormErrorMessage, {
469
+ locale: {
470
+ errorText: function errorText(invalidFields) {
471
+ return /*#__PURE__*/_jsxs(_Fragment, {
472
+ children: [/*#__PURE__*/_jsxs("div", {
473
+ className: stl(_templateObject38 || (_templateObject38 = _taggedTemplateLiteral(["display-heading mb-2"]))),
474
+ children: ["Please fix ", invalidFields.length, " error", invalidFields.length > 1 ? "s" : "", " below and try again."]
475
+ }), /*#__PURE__*/_jsx("div", {
476
+ className: stl(_templateObject39 || (_templateObject39 = _taggedTemplateLiteral(["flex flex-col"]))),
477
+ children: /*#__PURE__*/_jsx("a", {
478
+ href: "#",
479
+ className: stl(_templateObject40 || (_templateObject40 = _taggedTemplateLiteral(["text-black underline hover:text-grey-800"]))),
480
+ onClick: function onClick(e) {
481
+ e.preventDefault();
482
+ var firstInvalid = steps.find(function (step) {
483
+ return getFieldState(step).status === "invalid";
484
+ });
485
+ if (firstInvalid) {
486
+ goToPage(steps.indexOf(firstInvalid) + 1);
487
+ }
488
+ },
489
+ children: "Go to first error"
490
+ })
491
+ })]
492
+ });
493
+ }
494
+ }
495
+ }), /*#__PURE__*/_jsxs("div", {
496
+ className: stl(_templateObject41 || (_templateObject41 = _taggedTemplateLiteral(["flex transition-transform ease-out duration-500"]))),
497
+ style: {
498
+ transform: "translateX(-".concat((page - 1) * 100, "%)")
499
+ },
500
+ children: [/*#__PURE__*/_jsx(Field, {
501
+ label: /*#__PURE__*/_jsx("h2", {
502
+ className: stl(_templateObject42 || (_templateObject42 = _taggedTemplateLiteral(["display-xlarge whitespace-normal inline"]))),
503
+ children: "How should we display products that contain multiple variants?"
504
+ }),
505
+ labelFor: variantsEnum[0],
506
+ state: getFieldState("variants"),
507
+ className: stl(_templateObject43 || (_templateObject43 = _taggedTemplateLiteral(["w-full shrink-0"]))),
508
+ children: /*#__PURE__*/_jsx("div", {
509
+ className: stl(_templateObject44 || (_templateObject44 = _taggedTemplateLiteral(["mt-7"]))),
510
+ children: variantsOptions.map(function (option) {
511
+ return /*#__PURE__*/_jsxs("label", {
512
+ htmlFor: option.value,
513
+ className: stl(_templateObject45 || (_templateObject45 = _taggedTemplateLiteral(["flex flex-col gap-3 p-6 rounded display-body transition-colors hover:bg-grey-100"]))),
514
+ children: [/*#__PURE__*/_jsxs("div", {
515
+ className: stl(_templateObject46 || (_templateObject46 = _taggedTemplateLiteral(["flex items-center gap-2"]))),
516
+ children: [/*#__PURE__*/_jsx(RadioButton, _objectSpread(_objectSpread({
517
+ id: option.value,
518
+ "aria-labelledby": option.value,
519
+ required: true
520
+ }, formik.getFieldProps({
521
+ name: "variants",
522
+ value: option.value,
523
+ type: "radio"
524
+ })), {}, {
525
+ className: stl(_templateObject47 || (_templateObject47 = _taggedTemplateLiteral(["shrink-0"])))
526
+ })), option.title]
527
+ }), /*#__PURE__*/_jsx("div", {
528
+ className: stl(_templateObject48 || (_templateObject48 = _taggedTemplateLiteral(["ml-6 typo-subdued"]))),
529
+ children: option.description
530
+ })]
531
+ }, option.value);
532
+ })
533
+ })
534
+ }), /*#__PURE__*/_jsx(Field, {
535
+ label: /*#__PURE__*/_jsx("h2", {
536
+ className: stl(_templateObject49 || (_templateObject49 = _taggedTemplateLiteral(["display-xlarge whitespace-normal inline"]))),
537
+ children: "How would you like to show out-of-stock items?"
538
+ }),
539
+ labelFor: outOfStockEnum[0],
540
+ state: getFieldState("outOfStock"),
541
+ className: stl(_templateObject50 || (_templateObject50 = _taggedTemplateLiteral(["w-full shrink-0"]))),
542
+ children: /*#__PURE__*/_jsx("div", {
543
+ className: stl(_templateObject51 || (_templateObject51 = _taggedTemplateLiteral(["mt-7"]))),
544
+ children: outOfStockOptions.map(function (option) {
545
+ return /*#__PURE__*/_jsxs("label", {
546
+ htmlFor: option.value,
547
+ className: stl(_templateObject52 || (_templateObject52 = _taggedTemplateLiteral(["flex flex-col gap-3 p-6 rounded display-body transition-colors hover:bg-grey-100"]))),
548
+ children: [/*#__PURE__*/_jsxs("div", {
549
+ className: stl(_templateObject53 || (_templateObject53 = _taggedTemplateLiteral(["flex items-center gap-2"]))),
550
+ children: [/*#__PURE__*/_jsx(RadioButton, _objectSpread(_objectSpread({
551
+ id: option.value,
552
+ "aria-labelledby": option.value,
553
+ required: true
554
+ }, formik.getFieldProps({
555
+ name: "outOfStock",
556
+ value: option.value,
557
+ type: "radio"
558
+ })), {}, {
559
+ className: stl(_templateObject54 || (_templateObject54 = _taggedTemplateLiteral(["shrink-0"])))
560
+ })), option.title]
561
+ }), /*#__PURE__*/_jsx("div", {
562
+ className: stl(_templateObject55 || (_templateObject55 = _taggedTemplateLiteral(["ml-6 typo-subdued"]))),
563
+ children: option.description
564
+ })]
565
+ }, option.value);
566
+ })
567
+ })
568
+ }), /*#__PURE__*/_jsxs(Field, {
569
+ label: /*#__PURE__*/_jsx("h2", {
570
+ className: stl(_templateObject56 || (_templateObject56 = _taggedTemplateLiteral(["display-xlarge whitespace-normal inline"]))),
571
+ children: "Select how your customers can sort their search results"
572
+ }),
573
+ labelFor: sortingOptions[0],
574
+ state: getFieldState("sorting"),
575
+ className: stl(_templateObject57 || (_templateObject57 = _taggedTemplateLiteral(["w-full shrink-0"]))),
576
+ children: [/*#__PURE__*/_jsx("div", {
577
+ className: stl(_templateObject58 || (_templateObject58 = _taggedTemplateLiteral(["mt-4 typo-subdued"]))),
578
+ children: "Select the sort order options you'd like to show customers. You can change these later."
579
+ }), /*#__PURE__*/_jsx("div", {
580
+ className: stl(_templateObject59 || (_templateObject59 = _taggedTemplateLiteral(["mt-7"]))),
581
+ children: sortingOptions.map(function (option) {
582
+ return /*#__PURE__*/_jsxs("label", {
583
+ htmlFor: option,
584
+ className: stl(_templateObject60 || (_templateObject60 = _taggedTemplateLiteral(["flex gap-2 p-4 rounded display-body transition-colors hover:bg-grey-100"]))),
585
+ children: [/*#__PURE__*/_jsx(Checkbox, _objectSpread(_objectSpread({
586
+ id: option,
587
+ required: true,
588
+ checked: formik.values.sorting.includes(option)
589
+ }, formik.getFieldProps("sorting")), {}, {
590
+ onChange: function onChange() {
591
+ var fieldProps = formik.getFieldProps("sorting");
592
+ formik.setFieldValue("sorting", fieldProps.value.includes(option) ? fieldProps.value.filter(function (v) {
593
+ return v !== option;
594
+ }) : [].concat(_toConsumableArray(fieldProps.value), [option]));
595
+ }
596
+ })), capitalize(option)]
597
+ }, option);
598
+ })
599
+ })]
600
+ }), /*#__PURE__*/_jsxs(Field, {
601
+ label: /*#__PURE__*/_jsx("h2", {
602
+ className: stl(_templateObject61 || (_templateObject61 = _taggedTemplateLiteral(["display-xlarge whitespace-normal inline"]))),
603
+ children: "Add filters to help narrow results"
604
+ }),
605
+ labelFor: filtersOptions[0],
606
+ state: getFieldState("filters"),
607
+ className: stl(_templateObject62 || (_templateObject62 = _taggedTemplateLiteral(["w-full shrink-0"]))),
608
+ children: [/*#__PURE__*/_jsxs("div", {
609
+ className: stl(_templateObject63 || (_templateObject63 = _taggedTemplateLiteral(["mt-4 typo-subdued"]))),
610
+ children: ["Select the filter options customers can use to refine results.", /*#__PURE__*/_jsx("br", {}), "You can edit these after setup."]
611
+ }), /*#__PURE__*/_jsx("div", {
612
+ className: stl(_templateObject64 || (_templateObject64 = _taggedTemplateLiteral(["mt-7"]))),
613
+ children: filtersOptions.map(function (option) {
614
+ return /*#__PURE__*/_jsxs("label", {
615
+ htmlFor: option,
616
+ className: stl(_templateObject65 || (_templateObject65 = _taggedTemplateLiteral(["flex gap-2 p-4 rounded display-body transition-colors hover:bg-grey-100"]))),
617
+ children: [/*#__PURE__*/_jsx(Checkbox, {
618
+ id: option,
619
+ required: true,
620
+ checked: formik.values.filters.includes(option),
621
+ onChange: function onChange() {
622
+ var fieldProps = formik.getFieldProps("filters");
623
+ formik.setFieldValue("filters", fieldProps.value.includes(option) ? fieldProps.value.filter(function (v) {
624
+ return v !== option;
625
+ }) : [].concat(_toConsumableArray(fieldProps.value), [option]));
626
+ }
627
+ }), capitalize(option)]
628
+ }, option);
629
+ })
630
+ })]
631
+ })]
632
+ }), /*#__PURE__*/_jsxs("div", {
633
+ className: stl(_templateObject66 || (_templateObject66 = _taggedTemplateLiteral(["w-full flex justify-between"]))),
634
+ children: [/*#__PURE__*/_jsxs("div", {
635
+ className: stl(_templateObject67 || (_templateObject67 = _taggedTemplateLiteral(["flex gap-2"]))),
636
+ children: [/*#__PURE__*/_jsx(Button, {
637
+ "aria-label": "Previous step",
638
+ disabled: page <= 1,
639
+ onClick: function onClick() {
640
+ return goToPreviousPage();
641
+ },
642
+ children: "Back"
643
+ }), page >= steps.length ? /*#__PURE__*/_jsx(ExperimentalFormSubmit, {
644
+ variant: "primary",
645
+ "aria-label": "Complete",
646
+ children: "Complete"
647
+ }) : /*#__PURE__*/_jsx(Button, {
648
+ variant: "primary",
649
+ "aria-label": "Next step",
650
+ onClick: /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
651
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
652
+ while (1) switch (_context2.prev = _context2.next) {
653
+ case 0:
654
+ _context2.next = 2;
655
+ return formik.validateField(steps[page - 1]);
656
+ case 2:
657
+ setNextPageClicked(true); // See workaround above
658
+ case 3:
659
+ case "end":
660
+ return _context2.stop();
661
+ }
662
+ }, _callee2);
663
+ })),
664
+ children: "Next"
665
+ })]
666
+ }), /*#__PURE__*/_jsx(Button, {
667
+ variant: "subtle",
668
+ "aria-label": "Reset the form",
669
+ onClick: function onClick() {
670
+ formik.resetForm();
671
+ goToPage(1);
672
+ },
673
+ children: "Reset"
674
+ })]
675
+ }), /*#__PURE__*/_jsx("div", {
676
+ className: stl(_templateObject68 || (_templateObject68 = _taggedTemplateLiteral(["mt-8 mx-auto"]))),
677
+ children: /*#__PURE__*/_jsx(DotPagination, {
678
+ nbPages: steps.length,
679
+ currentPage: page,
680
+ onChange: goToPage,
681
+ size: "small"
682
+ })
683
+ })]
684
+ }), /*#__PURE__*/_jsx("hr", {
685
+ className: stl(_templateObject69 || (_templateObject69 = _taggedTemplateLiteral(["text-grey-500"])))
686
+ }), /*#__PURE__*/_jsx("code", {
687
+ className: stl(_templateObject70 || (_templateObject70 = _taggedTemplateLiteral(["whitespace-pre display-code"]))),
688
+ children: JSON.stringify(formData, null, 2)
689
+ })]
690
+ });
691
+ };