powr-sdk-web 3.0.2 → 3.0.3

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.
@@ -0,0 +1,646 @@
1
+ "use strict";
2
+ "use client";
3
+
4
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _lucideReact = require("lucide-react");
11
+ var _reactToastify = require("react-toastify");
12
+ var _react2 = require("@monaco-editor/react");
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 _t4 in e) "default" !== _t4 && {}.hasOwnProperty.call(e, _t4) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t4)) && (i.get || i.set) ? o(f, _t4, i) : f[_t4] = e[_t4]); return f; })(e, t); }
14
+ 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; }
15
+ 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; }
16
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
17
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
18
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
19
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
20
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
21
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
22
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
23
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
24
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
25
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
26
+ 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; }
27
+ 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; } }
28
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
29
+ var PowrBaseFunctionsAdmin = function PowrBaseFunctionsAdmin(_ref) {
30
+ var projectId = _ref.projectId,
31
+ _ref$apiUrl = _ref.apiUrl,
32
+ apiUrl = _ref$apiUrl === void 0 ? "https://api.powrbase.cloud/powr/functions" : _ref$apiUrl,
33
+ _ref$theme = _ref.theme,
34
+ theme = _ref$theme === void 0 ? "default" : _ref$theme,
35
+ onFunctionAdded = _ref.onFunctionAdded,
36
+ onFunctionUpdated = _ref.onFunctionUpdated,
37
+ onError = _ref.onError;
38
+ var _useState = (0, _react.useState)([]),
39
+ _useState2 = _slicedToArray(_useState, 2),
40
+ functions = _useState2[0],
41
+ setFunctions = _useState2[1];
42
+ var _useState3 = (0, _react.useState)(true),
43
+ _useState4 = _slicedToArray(_useState3, 2),
44
+ loading = _useState4[0],
45
+ setLoading = _useState4[1];
46
+ var _useState5 = (0, _react.useState)(false),
47
+ _useState6 = _slicedToArray(_useState5, 2),
48
+ isSubmitting = _useState6[0],
49
+ setIsSubmitting = _useState6[1];
50
+ var _useState7 = (0, _react.useState)(false),
51
+ _useState8 = _slicedToArray(_useState7, 2),
52
+ showAddModal = _useState8[0],
53
+ setShowAddModal = _useState8[1];
54
+ var _useState9 = (0, _react.useState)(false),
55
+ _useState0 = _slicedToArray(_useState9, 2),
56
+ showEditModal = _useState0[0],
57
+ setShowEditModal = _useState0[1];
58
+ var _useState1 = (0, _react.useState)(null),
59
+ _useState10 = _slicedToArray(_useState1, 2),
60
+ editingFunction = _useState10[0],
61
+ setEditingFunction = _useState10[1];
62
+ var _useState11 = (0, _react.useState)(''),
63
+ _useState12 = _slicedToArray(_useState11, 2),
64
+ iframeSrcDoc = _useState12[0],
65
+ setIframeSrcDoc = _useState12[1];
66
+
67
+ // Separate state for add modal testing
68
+ var _useState13 = (0, _react.useState)(''),
69
+ _useState14 = _slicedToArray(_useState13, 2),
70
+ addUserInput = _useState14[0],
71
+ setAddUserInput = _useState14[1];
72
+ var _useState15 = (0, _react.useState)(''),
73
+ _useState16 = _slicedToArray(_useState15, 2),
74
+ addOutput = _useState16[0],
75
+ setAddOutput = _useState16[1];
76
+
77
+ // Separate state for edit modal testing
78
+ var _useState17 = (0, _react.useState)(''),
79
+ _useState18 = _slicedToArray(_useState17, 2),
80
+ editUserInput = _useState18[0],
81
+ setEditUserInput = _useState18[1];
82
+ var _useState19 = (0, _react.useState)(''),
83
+ _useState20 = _slicedToArray(_useState19, 2),
84
+ editOutput = _useState20[0],
85
+ setEditOutput = _useState20[1];
86
+
87
+ // Test mode to track which modal is being tested
88
+ var _useState21 = (0, _react.useState)(null),
89
+ _useState22 = _slicedToArray(_useState21, 2),
90
+ testMode = _useState22[0],
91
+ setTestMode = _useState22[1];
92
+ var _useState23 = (0, _react.useState)({
93
+ name: '',
94
+ // Default code for testing
95
+ path: ''
96
+ }),
97
+ _useState24 = _slicedToArray(_useState23, 2),
98
+ formData = _useState24[0],
99
+ setFormData = _useState24[1];
100
+ var _useState25 = (0, _react.useState)({
101
+ code: ''
102
+ }),
103
+ _useState26 = _slicedToArray(_useState25, 2),
104
+ editFormData = _useState26[0],
105
+ setEditFormData = _useState26[1];
106
+ var iframeRef = (0, _react.useRef)(null);
107
+ var handleTestAddCode = function handleTestAddCode() {
108
+ setAddOutput("");
109
+ setTestMode('add');
110
+ console.log("Testing add code with user input:", addUserInput, formData);
111
+ var escapedUserInput = addUserInput.replace(/`/g, "\\`");
112
+ var wrappedCode = "\n <script>\n const userInput = `".concat(escapedUserInput, "`;\n const log = console.log;\n console.log = function(...args) {\n parent.postMessage({ type: 'console', message: args.join(' ') }, '*');\n log.apply(console, args);\n };\n try {\n ").concat(formData.name, "\n } catch (err) {\n console.log(\"Error:\", err.message);\n }\n </script>\n ");
113
+ setIframeSrcDoc("<html><body>".concat(wrappedCode, "</body></html>"));
114
+ };
115
+ var handleTestEditCode = function handleTestEditCode() {
116
+ setEditOutput("");
117
+ setTestMode('edit');
118
+ console.log("Testing edit code with user input:", editUserInput, editFormData);
119
+ var escapedUserInput = editUserInput.replace(/`/g, "\\`");
120
+ var wrappedCode = "\n <script>\n const userInput = `".concat(escapedUserInput, "`;\n const log = console.log;\n console.log = function(...args) {\n parent.postMessage({ type: 'console', message: args.join(' ') }, '*');\n log.apply(console, args);\n };\n try {\n ").concat(editFormData.code, "\n } catch (err) {\n console.log(\"Error:\", err.message);\n }\n </script>\n ");
121
+ setIframeSrcDoc("<html><body>".concat(wrappedCode, "</body></html>"));
122
+ };
123
+ (0, _react.useEffect)(function () {
124
+ var handleMessage = function handleMessage(event) {
125
+ var _event$data;
126
+ if (((_event$data = event.data) === null || _event$data === void 0 ? void 0 : _event$data.type) === 'console') {
127
+ if (testMode === 'add') {
128
+ setAddOutput(function (prev) {
129
+ return prev + event.data.message + '\n';
130
+ });
131
+ } else if (testMode === 'edit') {
132
+ setEditOutput(function (prev) {
133
+ return prev + event.data.message + '\n';
134
+ });
135
+ }
136
+ }
137
+ };
138
+ window.addEventListener('message', handleMessage);
139
+ return function () {
140
+ return window.removeEventListener('message', handleMessage);
141
+ };
142
+ }, [testMode]);
143
+ var fetchFunctions = /*#__PURE__*/function () {
144
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
145
+ var response, data, errorMsg, _t;
146
+ return _regenerator().w(function (_context) {
147
+ while (1) switch (_context.n) {
148
+ case 0:
149
+ _context.p = 0;
150
+ setLoading(true);
151
+ _context.n = 1;
152
+ return fetch("".concat(apiUrl, "?projectId=").concat(projectId), {
153
+ method: 'GET',
154
+ headers: {
155
+ 'Content-Type': 'application/json'
156
+ }
157
+ });
158
+ case 1:
159
+ response = _context.v;
160
+ if (response.ok) {
161
+ _context.n = 2;
162
+ break;
163
+ }
164
+ throw new Error('Failed to fetch functions');
165
+ case 2:
166
+ _context.n = 3;
167
+ return response.json();
168
+ case 3:
169
+ data = _context.v;
170
+ if (!data.success) {
171
+ _context.n = 4;
172
+ break;
173
+ }
174
+ setFunctions(data.allfunctions || []);
175
+ _context.n = 5;
176
+ break;
177
+ case 4:
178
+ throw new Error('API response indicates failure');
179
+ case 5:
180
+ _context.n = 7;
181
+ break;
182
+ case 6:
183
+ _context.p = 6;
184
+ _t = _context.v;
185
+ console.error('Error fetching functions:', _t);
186
+ errorMsg = 'Failed to load functions';
187
+ _reactToastify.toast.error(errorMsg);
188
+ onError && onError(_t, errorMsg);
189
+ case 7:
190
+ _context.p = 7;
191
+ setLoading(false);
192
+ return _context.f(7);
193
+ case 8:
194
+ return _context.a(2);
195
+ }
196
+ }, _callee, null, [[0, 6, 7, 8]]);
197
+ }));
198
+ return function fetchFunctions() {
199
+ return _ref2.apply(this, arguments);
200
+ };
201
+ }();
202
+ (0, _react.useEffect)(function () {
203
+ if (projectId) {
204
+ fetchFunctions();
205
+ }
206
+ }, [projectId]);
207
+ var handleInputChange = function handleInputChange(e) {
208
+ var _e$target = e.target,
209
+ name = _e$target.name,
210
+ value = _e$target.value;
211
+ setFormData(function (prev) {
212
+ return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, name, value));
213
+ });
214
+ };
215
+ var handleEditInputChange = function handleEditInputChange(e) {
216
+ var _e$target2 = e.target,
217
+ name = _e$target2.name,
218
+ value = _e$target2.value;
219
+ setEditFormData(function (prev) {
220
+ return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, name, value));
221
+ });
222
+ };
223
+ var handleSubmit = /*#__PURE__*/function () {
224
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
225
+ var errorMsg, response, contentType, result, successMsg, _errorMsg, _t2;
226
+ return _regenerator().w(function (_context2) {
227
+ while (1) switch (_context2.n) {
228
+ case 0:
229
+ if (!(!formData.name || !formData.path)) {
230
+ _context2.n = 1;
231
+ break;
232
+ }
233
+ errorMsg = 'Name and path are required';
234
+ _reactToastify.toast.error(errorMsg);
235
+ onError && onError(new Error(errorMsg), errorMsg);
236
+ return _context2.a(2);
237
+ case 1:
238
+ setIsSubmitting(true);
239
+ _context2.p = 2;
240
+ _context2.n = 3;
241
+ return fetch("".concat(apiUrl, "?projectId=").concat(projectId), {
242
+ method: 'POST',
243
+ headers: {
244
+ 'Content-Type': 'application/json'
245
+ },
246
+ body: JSON.stringify({
247
+ code: formData.name,
248
+ route: formData.path
249
+ })
250
+ });
251
+ case 3:
252
+ response = _context2.v;
253
+ if (response.ok) {
254
+ _context2.n = 4;
255
+ break;
256
+ }
257
+ throw new Error("HTTP ".concat(response.status, ": ").concat(response.statusText));
258
+ case 4:
259
+ contentType = response.headers.get('content-type');
260
+ if (!(!contentType || !contentType.includes('application/json'))) {
261
+ _context2.n = 5;
262
+ break;
263
+ }
264
+ throw new Error('Server returned non-JSON response');
265
+ case 5:
266
+ _context2.n = 6;
267
+ return response.json();
268
+ case 6:
269
+ result = _context2.v;
270
+ if (!result.success) {
271
+ _context2.n = 7;
272
+ break;
273
+ }
274
+ successMsg = 'Function added successfully!';
275
+ _reactToastify.toast.success(successMsg);
276
+ onFunctionAdded && onFunctionAdded(result.entry);
277
+ setFormData({
278
+ name: '',
279
+ path: ''
280
+ });
281
+ setShowAddModal(false);
282
+ setAddUserInput('');
283
+ setAddOutput('');
284
+ setTestMode(null);
285
+ fetchFunctions();
286
+ _context2.n = 8;
287
+ break;
288
+ case 7:
289
+ throw new Error(result.message || 'Failed to add function');
290
+ case 8:
291
+ _context2.n = 10;
292
+ break;
293
+ case 9:
294
+ _context2.p = 9;
295
+ _t2 = _context2.v;
296
+ console.error('Error adding function:', _t2);
297
+ _errorMsg = _t2 instanceof Error ? _t2.message : 'Failed to add function';
298
+ _reactToastify.toast.error(_errorMsg);
299
+ onError && onError(_t2, _errorMsg);
300
+ case 10:
301
+ _context2.p = 10;
302
+ setIsSubmitting(false);
303
+ return _context2.f(10);
304
+ case 11:
305
+ return _context2.a(2);
306
+ }
307
+ }, _callee2, null, [[2, 9, 10, 11]]);
308
+ }));
309
+ return function handleSubmit() {
310
+ return _ref3.apply(this, arguments);
311
+ };
312
+ }();
313
+ var handleEditClick = function handleEditClick(func) {
314
+ setEditingFunction(func);
315
+ setEditFormData({
316
+ code: func.code
317
+ });
318
+ setEditUserInput('');
319
+ setEditOutput('');
320
+ setTestMode(null);
321
+ setShowEditModal(true);
322
+ };
323
+ var handleEditSubmit = /*#__PURE__*/function () {
324
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
325
+ var errorMsg, response, contentType, result, successMsg, _errorMsg2, _t3;
326
+ return _regenerator().w(function (_context3) {
327
+ while (1) switch (_context3.n) {
328
+ case 0:
329
+ if (!(!editingFunction || !editFormData.code)) {
330
+ _context3.n = 1;
331
+ break;
332
+ }
333
+ errorMsg = 'Code is required';
334
+ _reactToastify.toast.error(errorMsg);
335
+ onError && onError(new Error(errorMsg), errorMsg);
336
+ return _context3.a(2);
337
+ case 1:
338
+ setIsSubmitting(true);
339
+ _context3.p = 2;
340
+ _context3.n = 3;
341
+ return fetch("".concat(apiUrl, "/").concat(editingFunction.route.replace('/', ''), "?projectId=").concat(projectId), {
342
+ method: 'PUT',
343
+ headers: {
344
+ 'Content-Type': 'application/json'
345
+ },
346
+ body: JSON.stringify({
347
+ code: editFormData.code
348
+ })
349
+ });
350
+ case 3:
351
+ response = _context3.v;
352
+ if (response.ok) {
353
+ _context3.n = 4;
354
+ break;
355
+ }
356
+ throw new Error("HTTP ".concat(response.status, ": ").concat(response.statusText));
357
+ case 4:
358
+ contentType = response.headers.get('content-type');
359
+ if (!(!contentType || !contentType.includes('application/json'))) {
360
+ _context3.n = 5;
361
+ break;
362
+ }
363
+ throw new Error('Server returned non-JSON response');
364
+ case 5:
365
+ _context3.n = 6;
366
+ return response.json();
367
+ case 6:
368
+ result = _context3.v;
369
+ if (!result.success) {
370
+ _context3.n = 7;
371
+ break;
372
+ }
373
+ successMsg = 'Function updated successfully!';
374
+ _reactToastify.toast.success(successMsg);
375
+ onFunctionUpdated && onFunctionUpdated(result.entry);
376
+ setEditFormData({
377
+ code: ''
378
+ });
379
+ setShowEditModal(false);
380
+ setEditingFunction(null);
381
+ setEditUserInput('');
382
+ setEditOutput('');
383
+ setTestMode(null);
384
+ fetchFunctions();
385
+ _context3.n = 8;
386
+ break;
387
+ case 7:
388
+ throw new Error(result.message || 'Failed to update function');
389
+ case 8:
390
+ _context3.n = 10;
391
+ break;
392
+ case 9:
393
+ _context3.p = 9;
394
+ _t3 = _context3.v;
395
+ console.log('Error updating function:', _t3);
396
+ _errorMsg2 = _t3 instanceof Error ? _t3.message : 'Failed to update function';
397
+ _reactToastify.toast.error(_errorMsg2);
398
+ onError && onError(_t3, _errorMsg2);
399
+ case 10:
400
+ _context3.p = 10;
401
+ setIsSubmitting(false);
402
+ return _context3.f(10);
403
+ case 11:
404
+ return _context3.a(2);
405
+ }
406
+ }, _callee3, null, [[2, 9, 10, 11]]);
407
+ }));
408
+ return function handleEditSubmit() {
409
+ return _ref4.apply(this, arguments);
410
+ };
411
+ }();
412
+ if (loading) {
413
+ return /*#__PURE__*/_react["default"].createElement("div", {
414
+ className: "flex items-center justify-center h-64"
415
+ }, /*#__PURE__*/_react["default"].createElement(_lucideReact.Loader, {
416
+ className: "animate-spin size-8"
417
+ }));
418
+ }
419
+ return /*#__PURE__*/_react["default"].createElement("div", {
420
+ className: ""
421
+ }, /*#__PURE__*/_react["default"].createElement(_reactToastify.ToastContainer, null), /*#__PURE__*/_react["default"].createElement("div", {
422
+ className: "flex items-center justify-between"
423
+ }, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("h1", {
424
+ className: "text-2xl font-bold text-gray-900"
425
+ }, "Functions Management"), /*#__PURE__*/_react["default"].createElement("p", {
426
+ className: "text-gray-600 mt-1"
427
+ }, "Manage your dynamic API functions and endpoints")), /*#__PURE__*/_react["default"].createElement("button", {
428
+ onClick: function onClick() {
429
+ setShowAddModal(true);
430
+ setAddUserInput('');
431
+ setAddOutput('');
432
+ setTestMode(null);
433
+ },
434
+ className: "bg-orange-600 hover:bg-orange-700 text-white px-4 py-2 rounded-md flex items-center"
435
+ }, /*#__PURE__*/_react["default"].createElement(_lucideReact.Plus, {
436
+ className: "size-4 mr-2"
437
+ }), "Add Function")), /*#__PURE__*/_react["default"].createElement("div", {
438
+ className: "grid grid-cols-1 md:grid-cols-1 gap-4 mt-6"
439
+ }, /*#__PURE__*/_react["default"].createElement("div", {
440
+ className: "bg-white p-4 rounded-lg shadow-md"
441
+ }, /*#__PURE__*/_react["default"].createElement("div", {
442
+ className: "flex items-center"
443
+ }, /*#__PURE__*/_react["default"].createElement(_lucideReact.Route, {
444
+ className: "size-8 text-blue-600"
445
+ }), /*#__PURE__*/_react["default"].createElement("div", {
446
+ className: "ml-3"
447
+ }, /*#__PURE__*/_react["default"].createElement("p", {
448
+ className: "text-sm font-medium text-gray-600"
449
+ }, "Total Functions"), /*#__PURE__*/_react["default"].createElement("p", {
450
+ className: "text-2xl font-bold text-gray-900"
451
+ }, functions.length))))), /*#__PURE__*/_react["default"].createElement("div", {
452
+ className: "mt-6"
453
+ }, /*#__PURE__*/_react["default"].createElement("h2", {
454
+ className: "text-xl font-bold text-gray-800 mb-4"
455
+ }, "All API Functions"), functions.length === 0 ? /*#__PURE__*/_react["default"].createElement("div", {
456
+ className: "text-center py-8 text-gray-500"
457
+ }, /*#__PURE__*/_react["default"].createElement(_lucideReact.Route, {
458
+ className: "size-12 mx-auto mb-4 text-gray-300"
459
+ }), /*#__PURE__*/_react["default"].createElement("p", null, "No functions configured yet"), /*#__PURE__*/_react["default"].createElement("p", {
460
+ className: "text-sm"
461
+ }, "Add your first function to get started")) : /*#__PURE__*/_react["default"].createElement("div", {
462
+ className: "space-y-4"
463
+ }, functions.map(function (func) {
464
+ return /*#__PURE__*/_react["default"].createElement("div", {
465
+ key: func._id,
466
+ className: "bg-white p-4 rounded-lg shadow-md hover:bg-gray-50"
467
+ }, /*#__PURE__*/_react["default"].createElement("div", {
468
+ className: "flex items-center justify-between"
469
+ }, /*#__PURE__*/_react["default"].createElement("div", {
470
+ className: "flex-1"
471
+ }, /*#__PURE__*/_react["default"].createElement("div", {
472
+ className: "flex items-center space-x-3"
473
+ }, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("p", {
474
+ className: "text-sm font-medium text-gray-900"
475
+ }, "/", func.route), /*#__PURE__*/_react["default"].createElement("p", {
476
+ className: "text-xs text-gray-400 font-mono bg-gray-100 px-2 py-1 rounded"
477
+ }, func.code)))), /*#__PURE__*/_react["default"].createElement("div", {
478
+ className: "flex items-center space-x-2"
479
+ }, /*#__PURE__*/_react["default"].createElement("button", {
480
+ onClick: function onClick() {
481
+ return handleEditClick(func);
482
+ },
483
+ className: "p-2 hover:bg-gray-100 rounded-md"
484
+ }, /*#__PURE__*/_react["default"].createElement(_lucideReact.Edit, {
485
+ className: "size-4 text-gray-500"
486
+ })))));
487
+ }))), showAddModal && /*#__PURE__*/_react["default"].createElement("div", {
488
+ className: "fixed inset-0 flex items-center justify-center bg-black/50 z-50"
489
+ }, /*#__PURE__*/_react["default"].createElement("div", {
490
+ className: "bg-white rounded-2xl shadow-xl p-6 w-full max-w-3xl overflow-y-auto max-h-[90vh]"
491
+ }, /*#__PURE__*/_react["default"].createElement("h2", {
492
+ className: "text-xl font-bold text-gray-800 mb-6"
493
+ }, "Add New Function"), /*#__PURE__*/_react["default"].createElement("div", {
494
+ className: "space-y-4"
495
+ }, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
496
+ htmlFor: "name",
497
+ className: "block text-sm font-medium text-gray-700"
498
+ }, "Code * ", /*#__PURE__*/_react["default"].createElement("span", {
499
+ className: "text-xs text-gray-400"
500
+ }, "(Use ", /*#__PURE__*/_react["default"].createElement("code", null, "userInput"), " to access test input)")), /*#__PURE__*/_react["default"].createElement(_react2.Editor, {
501
+ height: "40vh",
502
+ language: "javascript",
503
+ value: formData.name,
504
+ onChange: function onChange(newValue) {
505
+ return setFormData(function (prev) {
506
+ return _objectSpread(_objectSpread({}, prev), {}, {
507
+ name: newValue || ''
508
+ });
509
+ });
510
+ },
511
+ theme: "vs-dark"
512
+ })), /*#__PURE__*/_react["default"].createElement("div", {
513
+ className: "space-y-2"
514
+ }, /*#__PURE__*/_react["default"].createElement("label", {
515
+ htmlFor: "userInput",
516
+ className: "block text-sm font-medium text-gray-700"
517
+ }, "Test Input (optional)"), /*#__PURE__*/_react["default"].createElement("textarea", {
518
+ id: "userInput",
519
+ rows: 3,
520
+ className: "w-full border border-gray-300 rounded-md p-2 focus:outline-none focus:border-orange-600 focus:ring-1 focus:ring-orange-600",
521
+ value: addUserInput,
522
+ onChange: function onChange(e) {
523
+ return setAddUserInput(e.target.value);
524
+ },
525
+ placeholder: "Enter test input if required"
526
+ }), /*#__PURE__*/_react["default"].createElement("div", {
527
+ className: "flex justify-end gap-4 mt-4"
528
+ }, /*#__PURE__*/_react["default"].createElement("button", {
529
+ onClick: handleTestAddCode,
530
+ disabled: loading,
531
+ className: "bg-orange-600 text-white hover:bg-orange-700 px-4 py-2 rounded-md"
532
+ }, "Test Code")), addOutput && /*#__PURE__*/_react["default"].createElement("div", {
533
+ className: "mt-6"
534
+ }, /*#__PURE__*/_react["default"].createElement("label", {
535
+ className: "block text-sm font-medium text-gray-700 mb-1"
536
+ }, "Output"), /*#__PURE__*/_react["default"].createElement("pre", {
537
+ className: "bg-gray-800 text-green-200 p-4 rounded-md overflow-auto max-h-64"
538
+ }, addOutput))), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
539
+ htmlFor: "path",
540
+ className: "block text-sm font-medium text-gray-700"
541
+ }, "Function Name *"), /*#__PURE__*/_react["default"].createElement("input", {
542
+ type: "text",
543
+ id: "path",
544
+ name: "path",
545
+ value: formData.path,
546
+ onChange: handleInputChange,
547
+ placeholder: "welcome",
548
+ required: true,
549
+ className: "w-full border border-gray-300 rounded-md p-2 focus:outline-none focus:border-orange-600 focus:ring-1 focus:ring-orange-600"
550
+ }))), /*#__PURE__*/_react["default"].createElement("div", {
551
+ className: "flex justify-end gap-4 mt-6"
552
+ }, /*#__PURE__*/_react["default"].createElement("button", {
553
+ onClick: function onClick() {
554
+ setShowAddModal(false);
555
+ setAddUserInput('');
556
+ setAddOutput('');
557
+ setTestMode(null);
558
+ },
559
+ className: "bg-gray-300 text-gray-700 hover:bg-gray-400 px-4 py-2 rounded-md"
560
+ }, "Cancel"), /*#__PURE__*/_react["default"].createElement("button", {
561
+ onClick: handleSubmit,
562
+ disabled: isSubmitting,
563
+ className: "bg-orange-600 text-white hover:bg-orange-700 px-4 py-2 rounded-md"
564
+ }, isSubmitting ? /*#__PURE__*/_react["default"].createElement(_lucideReact.Loader, {
565
+ className: "animate-spin size-5 mx-auto"
566
+ }) : 'Add Function')))), showEditModal && editingFunction && /*#__PURE__*/_react["default"].createElement("div", {
567
+ className: "fixed inset-0 flex items-center justify-center bg-black/50 z-50"
568
+ }, /*#__PURE__*/_react["default"].createElement("div", {
569
+ className: "bg-white rounded-2xl shadow-xl p-6 w-full max-w-3xl overflow-y-auto max-h-[90vh]"
570
+ }, /*#__PURE__*/_react["default"].createElement("h2", {
571
+ className: "text-xl font-bold text-gray-800 mb-6"
572
+ }, "Edit Function: /", editingFunction.route), /*#__PURE__*/_react["default"].createElement("div", {
573
+ className: "space-y-4"
574
+ }, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
575
+ htmlFor: "name",
576
+ className: "block text-sm font-medium text-gray-700"
577
+ }, "Code * ", /*#__PURE__*/_react["default"].createElement("span", {
578
+ className: "text-xs text-gray-400"
579
+ }, "(Use ", /*#__PURE__*/_react["default"].createElement("code", null, "userInput"), " to access test input)")), /*#__PURE__*/_react["default"].createElement(_react2.Editor, {
580
+ height: "40vh",
581
+ language: "javascript",
582
+ value: editFormData.code,
583
+ onChange: function onChange(newValue) {
584
+ return setEditFormData(function (prev) {
585
+ return _objectSpread(_objectSpread({}, prev), {}, {
586
+ code: newValue || ''
587
+ });
588
+ });
589
+ },
590
+ theme: "vs-dark"
591
+ })), /*#__PURE__*/_react["default"].createElement("div", {
592
+ className: "space-y-2"
593
+ }, /*#__PURE__*/_react["default"].createElement("label", {
594
+ htmlFor: "userInput",
595
+ className: "block text-sm font-medium text-gray-700"
596
+ }, "Test Input (optional)"), /*#__PURE__*/_react["default"].createElement("textarea", {
597
+ id: "userInput",
598
+ rows: 3,
599
+ className: "w-full border border-gray-300 rounded-md p-2 focus:outline-none focus:border-orange-600 focus:ring-1 focus:ring-orange-600",
600
+ value: editUserInput,
601
+ onChange: function onChange(e) {
602
+ return setEditUserInput(e.target.value);
603
+ },
604
+ placeholder: "Enter test input if required"
605
+ }), /*#__PURE__*/_react["default"].createElement("div", {
606
+ className: "flex justify-end gap-4 mt-4"
607
+ }, /*#__PURE__*/_react["default"].createElement("button", {
608
+ onClick: handleTestEditCode,
609
+ disabled: loading,
610
+ className: "bg-orange-600 text-white hover:bg-orange-700 px-4 py-2 rounded-md"
611
+ }, "Test Code")), editOutput && /*#__PURE__*/_react["default"].createElement("div", {
612
+ className: "mt-6"
613
+ }, /*#__PURE__*/_react["default"].createElement("label", {
614
+ className: "block text-sm font-medium text-gray-700 mb-1"
615
+ }, "Output"), /*#__PURE__*/_react["default"].createElement("pre", {
616
+ className: "bg-gray-800 text-green-200 p-4 rounded-md overflow-auto max-h-64"
617
+ }, editOutput)))), /*#__PURE__*/_react["default"].createElement("div", {
618
+ className: "flex justify-end gap-4 mt-6"
619
+ }, /*#__PURE__*/_react["default"].createElement("button", {
620
+ onClick: function onClick() {
621
+ setShowEditModal(false);
622
+ setEditingFunction(null);
623
+ setEditFormData({
624
+ code: ''
625
+ });
626
+ setEditUserInput('');
627
+ setEditOutput('');
628
+ setTestMode(null);
629
+ },
630
+ className: "bg-gray-300 text-gray-700 hover:bg-gray-400 px-4 py-2 rounded-md"
631
+ }, "Cancel"), /*#__PURE__*/_react["default"].createElement("button", {
632
+ onClick: handleEditSubmit,
633
+ disabled: isSubmitting,
634
+ className: "bg-orange-600 text-white hover:bg-orange-700 px-4 py-2 rounded-md"
635
+ }, isSubmitting ? /*#__PURE__*/_react["default"].createElement(_lucideReact.Loader, {
636
+ className: "animate-spin size-5 mx-auto"
637
+ }) : 'Update Function')))), /*#__PURE__*/_react["default"].createElement("iframe", {
638
+ title: "code-runner",
639
+ sandbox: "allow-scripts",
640
+ srcDoc: iframeSrcDoc,
641
+ style: {
642
+ display: 'none'
643
+ }
644
+ }));
645
+ };
646
+ var _default = exports["default"] = PowrBaseFunctionsAdmin;
package/dist/index.js CHANGED
@@ -39,6 +39,12 @@ Object.defineProperty(exports, "PowrBaseFormsAdmin", {
39
39
  return _admin2["default"];
40
40
  }
41
41
  });
42
+ Object.defineProperty(exports, "PowrBaseFunctionsAdmin", {
43
+ enumerable: true,
44
+ get: function get() {
45
+ return _admin7["default"];
46
+ }
47
+ });
42
48
  Object.defineProperty(exports, "PowrBaseInvoice", {
43
49
  enumerable: true,
44
50
  get: function get() {
@@ -69,12 +75,6 @@ Object.defineProperty(exports, "PowrBaseNotificationsAdmin", {
69
75
  return _admin5["default"];
70
76
  }
71
77
  });
72
- Object.defineProperty(exports, "PowrBasePlexxAdmin", {
73
- enumerable: true,
74
- get: function get() {
75
- return _admin7["default"];
76
- }
77
- });
78
78
  Object.defineProperty(exports, "PowrBaseReviews", {
79
79
  enumerable: true,
80
80
  get: function get() {
@@ -142,5 +142,5 @@ var _admin3 = _interopRequireDefault(require("./slides/admin"));
142
142
  var _admin4 = _interopRequireDefault(require("./invoices/admin"));
143
143
  var _admin5 = _interopRequireDefault(require("./notifications/admin"));
144
144
  var _admin6 = _interopRequireDefault(require("./users/admin"));
145
- var _admin7 = _interopRequireDefault(require("./plexx/admin"));
145
+ var _admin7 = _interopRequireDefault(require("./functions/admin"));
146
146
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "powr-sdk-web",
3
- "version": "3.0.2",
3
+ "version": "3.0.3",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "build": "babel src -d dist --copy-files",