powr-sdk-web 6.8.0 → 6.9.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.
@@ -672,7 +672,7 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
672
672
  className: "text-sm font-semibold text-gray-900"
673
673
  }, "Fields"), /*#__PURE__*/_react["default"].createElement("div", {
674
674
  className: "flex flex-wrap gap-2"
675
- }, ['text', 'email', 'mobile', 'textarea', 'radio', 'fileUploader'].map(function (type) {
675
+ }, ['text', 'email', 'mobile', 'textarea', 'radio', 'photo', 'fileUploader'].map(function (type) {
676
676
  return /*#__PURE__*/_react["default"].createElement("button", {
677
677
  key: type,
678
678
  type: "button",
@@ -1137,7 +1137,25 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
1137
1137
  className: "text-sm font-medium text-gray-700"
1138
1138
  }, "Message"), /*#__PURE__*/_react["default"].createElement("p", {
1139
1139
  className: "text-gray-900 bg-gray-50 p-3 rounded whitespace-pre-wrap"
1140
- }, response.message)), response.paymentProofUrls && response.paymentProofUrls.length > 0 && /*#__PURE__*/_react["default"].createElement("div", {
1140
+ }, response.message)), (selectedForm.fields || []).filter(function (field) {
1141
+ return field.type === 'photo' && response[field.name];
1142
+ }).map(function (field) {
1143
+ return /*#__PURE__*/_react["default"].createElement("div", {
1144
+ key: field.name,
1145
+ className: "space-y-1"
1146
+ }, /*#__PURE__*/_react["default"].createElement("label", {
1147
+ className: "text-sm font-medium text-gray-700"
1148
+ }, field.label), /*#__PURE__*/_react["default"].createElement("a", {
1149
+ href: response[field.name],
1150
+ target: "_blank",
1151
+ rel: "noopener noreferrer",
1152
+ className: "block"
1153
+ }, /*#__PURE__*/_react["default"].createElement("img", {
1154
+ src: response[field.name],
1155
+ alt: field.label,
1156
+ className: "max-h-40 rounded border border-gray-200 bg-gray-50"
1157
+ })));
1158
+ }), response.paymentProofUrls && response.paymentProofUrls.length > 0 && /*#__PURE__*/_react["default"].createElement("div", {
1141
1159
  className: "space-y-1 md:col-span-2"
1142
1160
  }, /*#__PURE__*/_react["default"].createElement("label", {
1143
1161
  className: "text-sm font-medium text-gray-700"
@@ -8,6 +8,7 @@ var _react = _interopRequireWildcard(require("react"));
8
8
  var _reactHookForm = require("react-hook-form");
9
9
  var _axios = _interopRequireDefault(require("axios"));
10
10
  var _config = require("../config");
11
+ var _uploader = _interopRequireDefault(require("../uploader"));
11
12
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
12
13
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t3 in e) "default" !== _t3 && {}.hasOwnProperty.call(e, _t3) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t3)) && (i.get || i.set) ? o(f, _t3, i) : f[_t3] = e[_t3]); return f; })(e, t); }
13
14
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
@@ -27,6 +28,7 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
27
28
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
28
29
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
29
30
  function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
31
+ var UPLOAD_FIELD_TYPES = ["photo", "fileUploader"];
30
32
  var PowrForm = function PowrForm(_ref) {
31
33
  var formName = _ref.formName,
32
34
  projectId = _ref.projectId,
@@ -57,34 +59,30 @@ var PowrForm = function PowrForm(_ref) {
57
59
  _ref$loginMessage = _ref.loginMessage,
58
60
  loginMessage = _ref$loginMessage === void 0 ? "Sign in to send this. Fill the questions first if you want." : _ref$loginMessage,
59
61
  authenticatedLabel = _ref.authenticatedLabel;
60
- var _useState = (0, _react.useState)(null),
62
+ var _useState = (0, _react.useState)({}),
61
63
  _useState2 = _slicedToArray(_useState, 2),
62
- uploadedFileUrl = _useState2[0],
63
- setUploadedFileUrl = _useState2[1];
64
- var _useState3 = (0, _react.useState)(false),
64
+ uploads = _useState2[0],
65
+ setUploads = _useState2[1];
66
+ var _useState3 = (0, _react.useState)(null),
65
67
  _useState4 = _slicedToArray(_useState3, 2),
66
- hasSubmitted = _useState4[0],
67
- setHasSubmitted = _useState4[1];
68
- var _useState5 = (0, _react.useState)(null),
68
+ formSchema = _useState4[0],
69
+ setFormSchema = _useState4[1];
70
+ var _useState5 = (0, _react.useState)(true),
69
71
  _useState6 = _slicedToArray(_useState5, 2),
70
- formSchema = _useState6[0],
71
- setFormSchema = _useState6[1];
72
- var _useState7 = (0, _react.useState)(true),
72
+ isLoading = _useState6[0],
73
+ setIsLoading = _useState6[1];
74
+ var _useState7 = (0, _react.useState)(null),
73
75
  _useState8 = _slicedToArray(_useState7, 2),
74
- isLoading = _useState8[0],
75
- setIsLoading = _useState8[1];
76
+ error = _useState8[0],
77
+ setError = _useState8[1];
76
78
  var _useState9 = (0, _react.useState)(null),
77
79
  _useState0 = _slicedToArray(_useState9, 2),
78
- error = _useState0[0],
79
- setError = _useState0[1];
80
+ successMessage = _useState0[0],
81
+ setSuccessMessage = _useState0[1];
80
82
  var _useState1 = (0, _react.useState)(null),
81
83
  _useState10 = _slicedToArray(_useState1, 2),
82
- successMessage = _useState10[0],
83
- setSuccessMessage = _useState10[1];
84
- var _useState11 = (0, _react.useState)(null),
85
- _useState12 = _slicedToArray(_useState11, 2),
86
- submitError = _useState12[0],
87
- setSubmitError = _useState12[1];
84
+ submitError = _useState10[0],
85
+ setSubmitError = _useState10[1];
88
86
  var submissionId = Math.random().toString(36).substring(2, 10);
89
87
  (0, _react.useEffect)(function () {
90
88
  var fetchFormSchema = /*#__PURE__*/function () {
@@ -135,11 +133,26 @@ var PowrForm = function PowrForm(_ref) {
135
133
  }),
136
134
  register = _useForm.register,
137
135
  handleSubmit = _useForm.handleSubmit,
136
+ setValue = _useForm.setValue,
138
137
  errors = _useForm.formState.errors;
139
- var needsLogin = Boolean(requireLogin || (formSchema === null || formSchema === void 0 ? void 0 : formSchema.requireLogin)) && !isAuthenticated;
138
+
139
+ // /files needs a Powr token, so a form with an upload field is login-only.
140
+ var hasUploadField = ((formSchema === null || formSchema === void 0 ? void 0 : formSchema.fields) || []).some(function (f) {
141
+ return UPLOAD_FIELD_TYPES.includes(f.type);
142
+ });
143
+ var needsLogin = Boolean(requireLogin || (formSchema === null || formSchema === void 0 ? void 0 : formSchema.requireLogin) || hasUploadField) && !isAuthenticated;
144
+ var setUploadedUrl = function setUploadedUrl(field, files) {
145
+ var url = files !== null && files !== void 0 && files.length ? files[files.length - 1].url : "";
146
+ setUploads(function (prev) {
147
+ return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, field.name, url));
148
+ });
149
+ setValue(field.name, url, {
150
+ shouldValidate: true
151
+ });
152
+ };
140
153
  var onSubmit = /*#__PURE__*/function () {
141
154
  var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(data) {
142
- var finalData, response, resData, errorMsg, _errorMsg, _error$response, _errorMsg2, _t2;
155
+ var paymentProofUrls, finalData, response, resData, errorMsg, _errorMsg, _error$response, _errorMsg2, _t2;
143
156
  return _regenerator().w(function (_context2) {
144
157
  while (1) switch (_context2.p = _context2.n) {
145
158
  case 0:
@@ -150,11 +163,15 @@ var PowrForm = function PowrForm(_ref) {
150
163
  if (onNeedLogin) onNeedLogin();
151
164
  return _context2.a(2);
152
165
  case 1:
153
- setHasSubmitted(true);
154
166
  setSubmitError(null);
155
167
  setSuccessMessage(null);
168
+ paymentProofUrls = ((formSchema === null || formSchema === void 0 ? void 0 : formSchema.fields) || []).filter(function (f) {
169
+ return f.type === "fileUploader" && uploads[f.name];
170
+ }).map(function (f) {
171
+ return uploads[f.name];
172
+ });
156
173
  finalData = _objectSpread(_objectSpread(_objectSpread({}, data), extraFields && _typeof(extraFields) === "object" ? extraFields : {}), {}, {
157
- paymentProofUrls: uploadedFileUrl ? [uploadedFileUrl] : [],
174
+ paymentProofUrls: paymentProofUrls,
158
175
  id: submissionId,
159
176
  formTitle: formSchema === null || formSchema === void 0 ? void 0 : formSchema.formTitle,
160
177
  formName: formSchema === null || formSchema === void 0 ? void 0 : formSchema.formName
@@ -291,30 +308,41 @@ var PowrForm = function PowrForm(_ref) {
291
308
  })));
292
309
  }
293
310
  return null;
311
+ case "photo":
294
312
  case "fileUploader":
295
- return /*#__PURE__*/_react["default"].createElement("div", {
296
- key: field.name,
297
- className: "space-y-4"
298
- }, /*#__PURE__*/_react["default"].createElement("label", {
299
- className: "block text-base font-medium mb-1"
300
- }, field.label, " ", field.required && /*#__PURE__*/_react["default"].createElement("span", {
301
- className: "text-red-600"
302
- }, "*")), field.description && /*#__PURE__*/_react["default"].createElement("p", {
303
- className: "text-sm text-gray-500 mb-2"
304
- }, field.description), /*#__PURE__*/_react["default"].createElement("input", {
305
- type: "file",
306
- accept: "image/*,application/pdf",
307
- onChange: function onChange(e) {
308
- var _e$target$files;
309
- var file = (_e$target$files = e.target.files) === null || _e$target$files === void 0 ? void 0 : _e$target$files[0];
310
- if (file) {
311
- setUploadedFileUrl("uploaded-".concat(file.name));
313
+ {
314
+ var isPhoto = field.type === "photo";
315
+ return /*#__PURE__*/_react["default"].createElement(InputField, {
316
+ key: field.name,
317
+ label: field.label,
318
+ required: field.required,
319
+ error: errors[field.name] && {
320
+ message: isPhoto ? "Please add a photo." : "Please upload a file."
321
+ },
322
+ description: field.description,
323
+ theme: theme
324
+ }, /*#__PURE__*/_react["default"].createElement("input", _extends({
325
+ type: "hidden"
326
+ }, register(field.name, {
327
+ required: field.required
328
+ }))), isAuthenticated ? /*#__PURE__*/_react["default"].createElement(_uploader["default"], {
329
+ apiUrl: apiUrl,
330
+ projectId: projectId,
331
+ maxFiles: 1,
332
+ acceptedFileTypes: isPhoto ? "image/*" : "image/*,application/pdf",
333
+ onUploadComplete: function onUploadComplete(files) {
334
+ return setUploadedUrl(field, files);
335
+ },
336
+ onRemove: function onRemove(files) {
337
+ return setUploadedUrl(field, files);
338
+ },
339
+ onUploadError: function onUploadError() {
340
+ return setSubmitError("Upload failed. Please try again.");
312
341
  }
313
- },
314
- className: inputClass
315
- }), uploadedFileUrl && /*#__PURE__*/_react["default"].createElement("p", null, "File uploaded: ", uploadedFileUrl), hasSubmitted && !uploadedFileUrl && field.required && /*#__PURE__*/_react["default"].createElement("p", {
316
- className: "text-red-600 text-sm mt-1"
317
- }, "Payment proof is required."));
342
+ }) : /*#__PURE__*/_react["default"].createElement("p", {
343
+ className: "text-sm text-gray-500"
344
+ }, "Sign in to add ", isPhoto ? "a photo" : "a file", "."));
345
+ }
318
346
  default:
319
347
  return null;
320
348
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "powr-sdk-web",
3
- "version": "6.8.0",
3
+ "version": "6.9.0",
4
4
  "main": "dist/index.js",
5
5
  "files": [
6
6
  "dist"