powr-sdk-web 5.6.8 → 5.6.10

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.
@@ -52,39 +52,43 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
52
52
  _useState0 = _slicedToArray(_useState9, 2),
53
53
  isSaving = _useState0[0],
54
54
  setIsSaving = _useState0[1];
55
- var _useState1 = (0, _react.useState)({
55
+ var _useState1 = (0, _react.useState)(''),
56
+ _useState10 = _slicedToArray(_useState1, 2),
57
+ createFeedback = _useState10[0],
58
+ setCreateFeedback = _useState10[1];
59
+ var _useState11 = (0, _react.useState)({
56
60
  formTitle: '',
57
61
  formName: '',
58
62
  formId: '',
59
63
  fields: []
60
64
  }),
61
- _useState10 = _slicedToArray(_useState1, 2),
62
- formDraft = _useState10[0],
63
- setFormDraft = _useState10[1];
64
- var _useState11 = (0, _react.useState)(null),
65
65
  _useState12 = _slicedToArray(_useState11, 2),
66
- selectedForm = _useState12[0],
67
- setSelectedForm = _useState12[1];
68
- var _useState13 = (0, _react.useState)(false),
66
+ formDraft = _useState12[0],
67
+ setFormDraft = _useState12[1];
68
+ var _useState13 = (0, _react.useState)(null),
69
69
  _useState14 = _slicedToArray(_useState13, 2),
70
- showDetailModal = _useState14[0],
71
- setShowDetailModal = _useState14[1];
72
- var _useState15 = (0, _react.useState)('responses'),
70
+ selectedForm = _useState14[0],
71
+ setSelectedForm = _useState14[1];
72
+ var _useState15 = (0, _react.useState)(false),
73
73
  _useState16 = _slicedToArray(_useState15, 2),
74
- activeTab = _useState16[0],
75
- setActiveTab = _useState16[1];
76
- var _useState17 = (0, _react.useState)([]),
74
+ showDetailModal = _useState16[0],
75
+ setShowDetailModal = _useState16[1];
76
+ var _useState17 = (0, _react.useState)('responses'),
77
77
  _useState18 = _slicedToArray(_useState17, 2),
78
- formResponses = _useState18[0],
79
- setFormResponses = _useState18[1];
80
- var _useState19 = (0, _react.useState)(0),
78
+ activeTab = _useState18[0],
79
+ setActiveTab = _useState18[1];
80
+ var _useState19 = (0, _react.useState)([]),
81
81
  _useState20 = _slicedToArray(_useState19, 2),
82
- responseCount = _useState20[0],
83
- setResponseCount = _useState20[1];
84
- var _useState21 = (0, _react.useState)(false),
82
+ formResponses = _useState20[0],
83
+ setFormResponses = _useState20[1];
84
+ var _useState21 = (0, _react.useState)(0),
85
85
  _useState22 = _slicedToArray(_useState21, 2),
86
- loadingResponses = _useState22[0],
87
- setLoadingResponses = _useState22[1];
86
+ responseCount = _useState22[0],
87
+ setResponseCount = _useState22[1];
88
+ var _useState23 = (0, _react.useState)(false),
89
+ _useState24 = _slicedToArray(_useState23, 2),
90
+ loadingResponses = _useState24[0],
91
+ setLoadingResponses = _useState24[1];
88
92
  var fetchForms = /*#__PURE__*/function () {
89
93
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
90
94
  var _yield$apiCall, data, ok, _t;
@@ -190,6 +194,12 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
190
194
  return _ref3.apply(this, arguments);
191
195
  };
192
196
  }();
197
+ var notify = function notify(type, message) {
198
+ setCreateFeedback(message);
199
+ if (onFormAction) {
200
+ onFormAction(type, message);
201
+ }
202
+ };
193
203
  var resetFormDraft = function resetFormDraft() {
194
204
  setFormDraft({
195
205
  formTitle: '',
@@ -201,13 +211,33 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
201
211
  var slugify = function slugify(value) {
202
212
  return value.toLowerCase().trim().replace(/[^a-z0-9]+/g, '').slice(0, 32);
203
213
  };
214
+ var uniqueFieldName = function uniqueFieldName(label, index, fields) {
215
+ var taken = fields.map(function (field) {
216
+ return field.name;
217
+ }).filter(Boolean);
218
+ var base = slugify(label) || "field".concat(index + 1);
219
+ var candidate = base;
220
+ var suffix = 2;
221
+ while (taken.includes(candidate)) {
222
+ candidate = "".concat(base).concat(suffix);
223
+ suffix += 1;
224
+ }
225
+ return candidate;
226
+ };
204
227
  var addField = function addField(type) {
205
- var index = formDraft.fields.length + 1;
206
228
  setFormDraft(function (prev) {
229
+ var index = prev.fields.length + 1;
230
+ var defaults = type === 'mobile' ? {
231
+ name: 'whatsapp',
232
+ label: 'Mobile Number'
233
+ } : {
234
+ name: "field".concat(index),
235
+ label: "Field ".concat(index)
236
+ };
207
237
  return _objectSpread(_objectSpread({}, prev), {}, {
208
- fields: [].concat(_toConsumableArray(prev.fields), [_objectSpread({
209
- name: "field".concat(index),
210
- label: "Field ".concat(index),
238
+ fields: [].concat(_toConsumableArray(prev.fields), [_objectSpread(_objectSpread({
239
+ id: "".concat(Date.now(), "-").concat(index)
240
+ }, defaults), {}, {
211
241
  type: type,
212
242
  required: false
213
243
  }, type === 'radio' ? {
@@ -236,17 +266,16 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
236
266
  };
237
267
  var createForm = /*#__PURE__*/function () {
238
268
  var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
239
- var trimmedTitle, trimmedName, trimmedId, hasInvalidField, payload, _yield$apiCall3, result, ok, errorMessage, _t3;
269
+ var trimmedTitle, trimmedName, trimmedId, hasInvalidField, fieldNames, duplicateNames, usedNames, normalizedFields, payload, _yield$apiCall3, result, ok, errorMessage, _t3;
240
270
  return _regenerator().w(function (_context3) {
241
271
  while (1) switch (_context3.p = _context3.n) {
242
272
  case 0:
273
+ setCreateFeedback('');
243
274
  if (projectId) {
244
275
  _context3.n = 1;
245
276
  break;
246
277
  }
247
- if (onFormAction) {
248
- onFormAction('error', 'Project ID is required');
249
- }
278
+ notify('error', 'Project ID is required');
250
279
  return _context3.a(2);
251
280
  case 1:
252
281
  trimmedTitle = formDraft.formTitle.trim();
@@ -256,18 +285,14 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
256
285
  _context3.n = 2;
257
286
  break;
258
287
  }
259
- if (onFormAction) {
260
- onFormAction('error', 'Form title, name, and ID are required');
261
- }
288
+ notify('error', 'Form title, name, and ID are required');
262
289
  return _context3.a(2);
263
290
  case 2:
264
291
  if (!(formDraft.fields.length === 0)) {
265
292
  _context3.n = 3;
266
293
  break;
267
294
  }
268
- if (onFormAction) {
269
- onFormAction('error', 'Add at least one field');
270
- }
295
+ notify('error', 'Add at least one field');
271
296
  return _context3.a(2);
272
297
  case 3:
273
298
  hasInvalidField = formDraft.fields.some(function (field) {
@@ -278,70 +303,92 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
278
303
  _context3.n = 4;
279
304
  break;
280
305
  }
281
- if (onFormAction) {
282
- onFormAction('error', 'Each field needs a name and label');
283
- }
306
+ notify('error', 'Each field needs a name and label');
284
307
  return _context3.a(2);
285
308
  case 4:
309
+ fieldNames = formDraft.fields.map(function (field) {
310
+ return field.name.trim();
311
+ });
312
+ duplicateNames = fieldNames.filter(function (name, index) {
313
+ return fieldNames.indexOf(name) !== index;
314
+ });
315
+ if (!(duplicateNames.length > 0)) {
316
+ _context3.n = 5;
317
+ break;
318
+ }
319
+ notify('error', "Each field needs a unique name. Duplicate: ".concat(_toConsumableArray(new Set(duplicateNames)).join(', ')));
320
+ return _context3.a(2);
321
+ case 5:
286
322
  setIsSaving(true);
287
- _context3.p = 5;
323
+ _context3.p = 6;
324
+ usedNames = new Set();
325
+ normalizedFields = formDraft.fields.map(function (field, index, allFields) {
326
+ var _field$name2;
327
+ var others = allFields.filter(function (_, i) {
328
+ return i !== index;
329
+ });
330
+ var name = ((_field$name2 = field.name) === null || _field$name2 === void 0 ? void 0 : _field$name2.trim()) || uniqueFieldName(field.label, index, others);
331
+ var candidate = name;
332
+ var suffix = 2;
333
+ while (usedNames.has(candidate)) {
334
+ candidate = "".concat(name).concat(suffix);
335
+ suffix += 1;
336
+ }
337
+ usedNames.add(candidate);
338
+ return _objectSpread({
339
+ name: candidate,
340
+ label: field.label.trim(),
341
+ type: field.type,
342
+ required: !!field.required
343
+ }, field.type === 'radio' ? {
344
+ options: field.options || []
345
+ } : {});
346
+ });
288
347
  payload = {
289
348
  formTitle: trimmedTitle,
290
349
  formName: trimmedName,
291
350
  formId: trimmedId,
292
- fields: formDraft.fields.map(function (field) {
293
- return _objectSpread({
294
- name: field.name.trim(),
295
- label: field.label.trim(),
296
- type: field.type,
297
- required: !!field.required
298
- }, field.type === 'radio' ? {
299
- options: field.options || []
300
- } : {});
301
- })
351
+ fields: normalizedFields
302
352
  };
303
- _context3.n = 6;
353
+ _context3.n = 7;
304
354
  return (0, _auth.apiCall)(apiUrl, "/forms/create-form", projectId, {
305
355
  method: 'POST',
306
356
  body: payload
307
357
  });
308
- case 6:
358
+ case 7:
309
359
  _yield$apiCall3 = _context3.v;
310
360
  result = _yield$apiCall3.data;
311
361
  ok = _yield$apiCall3.ok;
312
362
  if (ok) {
313
- _context3.n = 7;
363
+ _context3.n = 8;
314
364
  break;
315
365
  }
316
366
  throw new Error(result.message || 'Failed to create form');
317
- case 7:
318
- if (onFormAction) {
319
- onFormAction('success', result.message || 'Form created successfully!');
320
- }
367
+ case 8:
368
+ notify('success', result.message || 'Form created successfully!');
321
369
  resetFormDraft();
370
+ setCreateFeedback('');
322
371
  setShowCreateModal(false);
323
372
  fetchForms();
324
373
  if (onRefresh) {
325
374
  onRefresh();
326
375
  }
327
- _context3.n = 9;
376
+ _context3.n = 10;
328
377
  break;
329
- case 8:
330
- _context3.p = 8;
378
+ case 9:
379
+ _context3.p = 9;
331
380
  _t3 = _context3.v;
332
381
  console.error('Error creating form:', _t3);
333
382
  errorMessage = _t3 instanceof Error ? _t3.message : 'Failed to create form';
334
- if (onFormAction) {
335
- onFormAction('error', errorMessage);
336
- }
337
- case 9:
338
- _context3.p = 9;
339
- setIsSaving(false);
340
- return _context3.f(9);
383
+ notify('error', errorMessage);
341
384
  case 10:
385
+ _context3.p = 10;
386
+ setIsSaving(false);
387
+ return _context3.f(10);
388
+ case 11:
342
389
  return _context3.a(2);
343
390
  }
344
- }, _callee3, null, [[5, 8, 9, 10]]);
391
+ }, _callee3, null, [[6, 9, 10, 11]]);
345
392
  }));
346
393
  return function createForm() {
347
394
  return _ref4.apply(this, arguments);
@@ -379,6 +426,7 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
379
426
  }, "Create and manage your dynamic forms")), /*#__PURE__*/_react["default"].createElement("button", {
380
427
  onClick: function onClick() {
381
428
  resetFormDraft();
429
+ setCreateFeedback('');
382
430
  setShowCreateModal(true);
383
431
  },
384
432
  className: "bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg flex items-center gap-2"
@@ -442,7 +490,9 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
442
490
  className: "bg-white rounded-2xl shadow-xl p-8 w-full max-w-3xl max-h-[90vh] overflow-y-auto"
443
491
  }, /*#__PURE__*/_react["default"].createElement("h2", {
444
492
  className: "text-xl font-bold text-gray-800 mb-6"
445
- }, "Create New Form"), /*#__PURE__*/_react["default"].createElement("div", {
493
+ }, "Create New Form"), createFeedback && /*#__PURE__*/_react["default"].createElement("div", {
494
+ className: "mb-4 rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700"
495
+ }, createFeedback), /*#__PURE__*/_react["default"].createElement("div", {
446
496
  className: "space-y-6"
447
497
  }, /*#__PURE__*/_react["default"].createElement("div", {
448
498
  className: "grid grid-cols-1 md:grid-cols-2 gap-4"
@@ -506,7 +556,7 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
506
556
  className: "text-sm font-semibold text-gray-900"
507
557
  }, "Fields"), /*#__PURE__*/_react["default"].createElement("div", {
508
558
  className: "flex flex-wrap gap-2"
509
- }, ['text', 'email', 'textarea', 'radio', 'fileUploader'].map(function (type) {
559
+ }, ['text', 'email', 'mobile', 'textarea', 'radio', 'fileUploader'].map(function (type) {
510
560
  return /*#__PURE__*/_react["default"].createElement("button", {
511
561
  key: type,
512
562
  type: "button",
@@ -521,7 +571,7 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
521
571
  className: "space-y-4"
522
572
  }, formDraft.fields.map(function (field, index) {
523
573
  return /*#__PURE__*/_react["default"].createElement("div", {
524
- key: "".concat(field.name, "-").concat(index),
574
+ key: field.id || index,
525
575
  className: "rounded-lg border border-gray-200 p-4 space-y-3"
526
576
  }, /*#__PURE__*/_react["default"].createElement("div", {
527
577
  className: "flex items-center justify-between"
@@ -581,12 +631,15 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
581
631
  })))), /*#__PURE__*/_react["default"].createElement("div", {
582
632
  className: "flex justify-end gap-4 mt-6"
583
633
  }, /*#__PURE__*/_react["default"].createElement("button", {
634
+ type: "button",
584
635
  onClick: function onClick() {
585
636
  resetFormDraft();
637
+ setCreateFeedback('');
586
638
  setShowCreateModal(false);
587
639
  },
588
640
  className: "bg-gray-300 text-gray-700 hover:bg-gray-400 px-4 py-2 rounded-md"
589
641
  }, "Cancel"), /*#__PURE__*/_react["default"].createElement("button", {
642
+ type: "button",
590
643
  onClick: createForm,
591
644
  disabled: isSaving,
592
645
  className: "bg-blue-600 text-white hover:bg-blue-700 px-4 py-2 rounded-md disabled:opacity-50"
@@ -202,6 +202,26 @@ var PowrForm = function PowrForm(_ref) {
202
202
  }), {
203
203
  className: inputClass
204
204
  })));
205
+ case "mobile":
206
+ return /*#__PURE__*/_react["default"].createElement(InputField, {
207
+ key: field.name,
208
+ label: field.label,
209
+ required: field.required,
210
+ error: errors[field.name],
211
+ theme: theme
212
+ }, /*#__PURE__*/_react["default"].createElement("input", _extends({
213
+ type: "tel",
214
+ inputMode: "tel",
215
+ autoComplete: "tel"
216
+ }, register(field.name, {
217
+ required: field.required,
218
+ pattern: {
219
+ value: /^[0-9+\-\s()]{8,15}$/,
220
+ message: "Invalid mobile number"
221
+ }
222
+ }), {
223
+ className: inputClass
224
+ })));
205
225
  case "textarea":
206
226
  return /*#__PURE__*/_react["default"].createElement(InputField, {
207
227
  key: field.name,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "powr-sdk-web",
3
- "version": "5.6.8",
3
+ "version": "5.6.10",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "build": "babel src -d dist --copy-files",