@magicfeedback/native 1.0.6 → 1.0.8

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.
package/README.md CHANGED
@@ -95,4 +95,31 @@ This function triggers the submission of the generated feedback form.
95
95
  ![](./public/A_form.png)
96
96
 
97
97
  By following these steps and including the appropriate HTML and JavaScript code snippets, you can easily generate and
98
- display feedback forms on your website using the magicfeedback service.
98
+ display feedback forms on your website using the magicfeedback service.
99
+
100
+ ### B. Send feedback directly
101
+ With this option you can send feedback directly without generate a form.
102
+ This section provides an overview of how to use this feature and the necessary code snippets.
103
+
104
+ To send feedback directly, you need to include the following JavaScript code snippet in your application:
105
+
106
+ ```js
107
+ window.magicfeedback.send(
108
+ "$_APP_ID",
109
+ "$_PUBLIC_KEY",
110
+ [
111
+ {
112
+ "key": 'string',
113
+ "value": ["string"]
114
+ },
115
+ ]
116
+ )
117
+ ```
118
+
119
+ In this code snippet, you need to replace $_APP_ID with the actual ID of your feedback application and the $_PUBLIC_KEY with the public key of your feedback application. This ID and key is provided
120
+ by the magicfeedback service. Next, can include the feedback data in the array of objects. Each object must have the following structure:
121
+
122
+ * **key**: This setting determines the key of the feedback data.
123
+ * **value**: This setting determines the value of the feedback data.
124
+
125
+ Finally, to send the feedback, you can use the magicfeedback.send() function.
@@ -1,146 +1 @@
1
- /*
2
- * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
3
- * This devtool is neither made for production nor for readable output files.
4
- * It uses "eval()" calls to create a separate source file in the browser devtools.
5
- * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
6
- * or disable the default devtool with "devtool: false".
7
- * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
8
- */
9
- (function webpackUniversalModuleDefinition(root, factory) {
10
- if(typeof exports === 'object' && typeof module === 'object')
11
- module.exports = factory();
12
- else if(typeof define === 'function' && define.amd)
13
- define([], factory);
14
- else if(typeof exports === 'object')
15
- exports["magicfeedback"] = factory();
16
- else
17
- root["magicfeedback"] = factory();
18
- })(self, () => {
19
- return /******/ (() => { // webpackBootstrap
20
- /******/ var __webpack_modules__ = ({
21
-
22
- /***/ "./node_modules/cross-fetch/dist/browser-ponyfill.js":
23
- /*!***********************************************************!*\
24
- !*** ./node_modules/cross-fetch/dist/browser-ponyfill.js ***!
25
- \***********************************************************/
26
- /***/ (function(module, exports) {
27
-
28
- eval("var global = typeof self !== 'undefined' ? self : this;\nvar __self__ = (function () {\nfunction F() {\nthis.fetch = false;\nthis.DOMException = global.DOMException\n}\nF.prototype = global;\nreturn new F();\n})();\n(function(self) {\n\nvar irrelevant = (function (exports) {\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob:\n 'FileReader' in self &&\n 'Blob' in self &&\n (function() {\n try {\n new Blob();\n return true\n } catch (e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n };\n\n function isDataView(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ];\n\n var isArrayBufferView =\n ArrayBuffer.isView ||\n function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n };\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name);\n }\n if (/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value);\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift();\n return {done: value === undefined, value: value}\n }\n };\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n };\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {};\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value);\n }, this);\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n this.append(header[0], header[1]);\n }, this);\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name]);\n }, this);\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name);\n value = normalizeValue(value);\n var oldValue = this.map[name];\n this.map[name] = oldValue ? oldValue + ', ' + value : value;\n };\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)];\n };\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name);\n return this.has(name) ? this.map[name] : null\n };\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n };\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value);\n };\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this);\n }\n }\n };\n\n Headers.prototype.keys = function() {\n var items = [];\n this.forEach(function(value, name) {\n items.push(name);\n });\n return iteratorFor(items)\n };\n\n Headers.prototype.values = function() {\n var items = [];\n this.forEach(function(value) {\n items.push(value);\n });\n return iteratorFor(items)\n };\n\n Headers.prototype.entries = function() {\n var items = [];\n this.forEach(function(value, name) {\n items.push([name, value]);\n });\n return iteratorFor(items)\n };\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries;\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true;\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result);\n };\n reader.onerror = function() {\n reject(reader.error);\n };\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n reader.readAsArrayBuffer(blob);\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n reader.readAsText(blob);\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf);\n var chars = new Array(view.length);\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i]);\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength);\n view.set(new Uint8Array(buf));\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false;\n\n this._initBody = function(body) {\n this._bodyInit = body;\n if (!body) {\n this._bodyText = '';\n } else if (typeof body === 'string') {\n this._bodyText = body;\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body;\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body;\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString();\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer);\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer]);\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body);\n } else {\n this._bodyText = body = Object.prototype.toString.call(body);\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8');\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type);\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n }\n };\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this);\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n };\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n };\n }\n\n this.text = function() {\n var rejected = consumed(this);\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n };\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n };\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n };\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase();\n return methods.indexOf(upcased) > -1 ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {};\n var body = options.body;\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url;\n this.credentials = input.credentials;\n if (!options.headers) {\n this.headers = new Headers(input.headers);\n }\n this.method = input.method;\n this.mode = input.mode;\n this.signal = input.signal;\n if (!body && input._bodyInit != null) {\n body = input._bodyInit;\n input.bodyUsed = true;\n }\n } else {\n this.url = String(input);\n }\n\n this.credentials = options.credentials || this.credentials || 'same-origin';\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers);\n }\n this.method = normalizeMethod(options.method || this.method || 'GET');\n this.mode = options.mode || this.mode || null;\n this.signal = options.signal || this.signal;\n this.referrer = null;\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body);\n }\n\n Request.prototype.clone = function() {\n return new Request(this, {body: this._bodyInit})\n };\n\n function decode(body) {\n var form = new FormData();\n body\n .trim()\n .split('&')\n .forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=');\n var name = split.shift().replace(/\\+/g, ' ');\n var value = split.join('=').replace(/\\+/g, ' ');\n form.append(decodeURIComponent(name), decodeURIComponent(value));\n }\n });\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers();\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ');\n preProcessedHeaders.split(/\\r?\\n/).forEach(function(line) {\n var parts = line.split(':');\n var key = parts.shift().trim();\n if (key) {\n var value = parts.join(':').trim();\n headers.append(key, value);\n }\n });\n return headers\n }\n\n Body.call(Request.prototype);\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {};\n }\n\n this.type = 'default';\n this.status = options.status === undefined ? 200 : options.status;\n this.ok = this.status >= 200 && this.status < 300;\n this.statusText = 'statusText' in options ? options.statusText : 'OK';\n this.headers = new Headers(options.headers);\n this.url = options.url || '';\n this._initBody(bodyInit);\n }\n\n Body.call(Response.prototype);\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n };\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''});\n response.type = 'error';\n return response\n };\n\n var redirectStatuses = [301, 302, 303, 307, 308];\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n };\n\n exports.DOMException = self.DOMException;\n try {\n new exports.DOMException();\n } catch (err) {\n exports.DOMException = function(message, name) {\n this.message = message;\n this.name = name;\n var error = Error(message);\n this.stack = error.stack;\n };\n exports.DOMException.prototype = Object.create(Error.prototype);\n exports.DOMException.prototype.constructor = exports.DOMException;\n }\n\n function fetch(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init);\n\n if (request.signal && request.signal.aborted) {\n return reject(new exports.DOMException('Aborted', 'AbortError'))\n }\n\n var xhr = new XMLHttpRequest();\n\n function abortXhr() {\n xhr.abort();\n }\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n };\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');\n var body = 'response' in xhr ? xhr.response : xhr.responseText;\n resolve(new Response(body, options));\n };\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'));\n };\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'));\n };\n\n xhr.onabort = function() {\n reject(new exports.DOMException('Aborted', 'AbortError'));\n };\n\n xhr.open(request.method, request.url, true);\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true;\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false;\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob';\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value);\n });\n\n if (request.signal) {\n request.signal.addEventListener('abort', abortXhr);\n\n xhr.onreadystatechange = function() {\n // DONE (success or failure)\n if (xhr.readyState === 4) {\n request.signal.removeEventListener('abort', abortXhr);\n }\n };\n }\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);\n })\n }\n\n fetch.polyfill = true;\n\n if (!self.fetch) {\n self.fetch = fetch;\n self.Headers = Headers;\n self.Request = Request;\n self.Response = Response;\n }\n\n exports.Headers = Headers;\n exports.Request = Request;\n exports.Response = Response;\n exports.fetch = fetch;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n return exports;\n\n})({});\n})(__self__);\n__self__.fetch.ponyfill = true;\n// Remove \"polyfill\" property added by whatwg-fetch\ndelete __self__.fetch.polyfill;\n// Choose between native implementation (global) or custom implementation (__self__)\n// var ctx = global.fetch ? global : __self__;\nvar ctx = __self__; // this line disable service worker support temporarily\nexports = ctx.fetch // To enable: import fetch from 'cross-fetch'\nexports[\"default\"] = ctx.fetch // For TypeScript consumers without esModuleInterop.\nexports.fetch = ctx.fetch // To enable: import {fetch} from 'cross-fetch'\nexports.Headers = ctx.Headers\nexports.Request = ctx.Request\nexports.Response = ctx.Response\nmodule.exports = exports\n\n\n//# sourceURL=webpack://magicfeedback/./node_modules/cross-fetch/dist/browser-ponyfill.js?");
29
-
30
- /***/ }),
31
-
32
- /***/ "./src/config.ts":
33
- /*!***********************!*\
34
- !*** ./src/config.ts ***!
35
- \***********************/
36
- /***/ ((__unused_webpack_module, exports) => {
37
-
38
- "use strict";
39
- eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Config = void 0;\nclass Config {\n constructor() {\n this.variables = {};\n this.variables[\"url\"] = \"https://api.magicfeedback.io\";\n this.variables[\"debug\"] = false;\n }\n get(key) {\n return this.variables[key];\n }\n set(key, value) {\n this.variables[key] = value;\n }\n}\nexports.Config = Config;\n\n\n//# sourceURL=webpack://magicfeedback/./src/config.ts?");
40
-
41
- /***/ }),
42
-
43
- /***/ "./src/form.ts":
44
- /*!*********************!*\
45
- !*** ./src/form.ts ***!
46
- \*********************/
47
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
48
-
49
- "use strict";
50
- eval("\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Form = void 0;\nconst request_1 = __webpack_require__(/*! ./request */ \"./src/request.ts\");\nconst log_1 = __webpack_require__(/*! ./log */ \"./src/log.ts\");\nclass Form {\n /**\n *\n * @param config\n * @param appId\n */\n constructor(config, appId) {\n // Config\n this.config = config;\n this.request = new request_1.Request();\n this.log = new log_1.Log(config);\n // Attributes\n this.appId = appId;\n }\n /**\n * Generate\n * TODO: Check if is inside of a <form>\n * @param appId\n */\n generate(selector, options = {}) {\n //TODO: Check if already exist the form\n // Request question from the app\n this.request\n .get(`${this.config.get(\"url\")}/apps/${this.appId}/questions`, {})\n .then((appQuestions) => {\n if (appQuestions === undefined || !appQuestions) {\n this.log.err(`No questions for app ${this.appId}`);\n return;\n }\n // Create the from from the JSON\n this.generateForm(this.appId, appQuestions, selector, options);\n });\n }\n /**\n * Create\n * @param appId\n * @param appQuestions\n * @param selector\n * @param options\n *\n * TODO: Add option to generate in <form> or in other <tag>\n */\n generateForm(appId, appQuestions, selector, options = {}) {\n // Select the container\n const container = document.getElementById(selector);\n if (!container) {\n this.log.err(`Element with ID '${selector}' not found.`);\n return;\n }\n container.classList.add(\"magicfeedback-container\");\n // Create the form\n const form = document.createElement(\"form\");\n form.classList.add(\"magicfeedback-form\");\n form.id = \"magicfeedback-\" + appId;\n // Process questions and create in the form\n appQuestions.forEach((question) => {\n const { id, title, type, ref, require, \n //external_id,\n value, defaultValue, } = question;\n this.log.log(\"Question\", question);\n let element;\n let elementTypeClass;\n let elementContainer = document.createElement(\"div\");\n elementContainer.classList.add(\"magicfeedback-div\");\n switch (type) {\n case \"TEXT\":\n // Create a text input field\n element = document.createElement(\"input\");\n element.type = \"text\";\n elementTypeClass = \"magicfeedback-text\";\n break;\n case \"LONGTEXT\":\n // Create a textarea element for TEXT and LONGTEXT types\n element = document.createElement(\"textarea\");\n element.rows = 3; // Set the number of rows based on the type\n elementTypeClass = \"magicfeedback-longtext\";\n break;\n case \"NUMBER\":\n // Create an input element with type \"number\" for NUMBER type\n element = document.createElement(\"input\");\n element.type = \"number\";\n elementTypeClass = \"magicfeedback-number\";\n if (value.length) {\n value.sort((a, b) => {\n let aa = Number(a);\n let bb = Number(b);\n return aa - bb;\n });\n element.max = value[value.length - 1];\n element.min = value[0];\n element.value = value[0];\n }\n break;\n case \"RADIO\":\n case \"MULTIPLECHOICE\":\n element = document.createElement(\"div\");\n elementTypeClass =\n \"magicfeedback-\" + (type === \"RADIO\" ? \"radio\" : \"checkbox\");\n value.forEach((option) => {\n const label = document.createElement(\"label\");\n const input = document.createElement(\"input\");\n input.type = type === \"RADIO\" ? \"radio\" : \"checkbox\";\n input.name = ref;\n input.value = option;\n input.required =\n require.toLocaleLowerCase() === \"true\" ? true : false;\n input.classList.add(elementTypeClass);\n input.classList.add(\"magicfeedback-input\");\n if (option === defaultValue) {\n input.checked = true;\n }\n label.textContent = option;\n element.appendChild(input);\n element.appendChild(label);\n });\n break;\n case \"SELECT\":\n // Create a select element for RADIO and MULTIPLECHOICE types\n element = document.createElement(\"select\");\n elementTypeClass = \"magicfeedback-select\";\n value.forEach((optionValue) => {\n // Create an option element for each value in the question's value array\n const option = document.createElement(\"option\");\n option.value = optionValue;\n option.text = optionValue;\n element.appendChild(option);\n });\n break;\n case \"DATE\":\n // Create an input element with type \"date\" for DATE type\n element = document.createElement(\"input\");\n element.type = \"date\";\n elementTypeClass = \"magicfeedback-date\";\n break;\n case \"BOOLEAN\":\n // Create an input element with type \"checkbox\" for BOOLEAN type\n element = document.createElement(\"input\");\n element.type = \"checkbox\";\n elementTypeClass = \"magicfeedback-boolean\";\n break;\n default:\n return; // Skip unknown types\n }\n element.id = `magicfeedback-${id}`;\n element.setAttribute(\"name\", ref);\n if (defaultValue !== undefined) {\n element.value = defaultValue;\n }\n // Add the label and input element to the form\n const label = document.createElement(\"label\");\n label.setAttribute(\"for\", `magicfeedback-${id}`);\n label.textContent = title;\n label.classList.add(\"magicfeedback-label\");\n elementContainer.appendChild(label);\n element.classList.add(elementTypeClass);\n if (type != \"RADIO\" && type != \"MULTIPLECHOICE\") {\n element.classList.add(\"magicfeedback-input\");\n element.required =\n require.toLocaleLowerCase() === \"true\" ? true : false;\n }\n elementContainer.appendChild(element);\n form.appendChild(elementContainer);\n });\n // Submit button\n if (options.addButton) {\n // Create a submit button if specified in options\n const submitButton = document.createElement(\"button\");\n submitButton.type = \"submit\";\n submitButton.textContent = \"Submit\";\n submitButton.classList.add(\"magicfeedback-submit\");\n form.appendChild(submitButton);\n }\n // Add the form to the specified container\n container.appendChild(form);\n // Submit event\n form.addEventListener(\"submit\", (event) => __awaiter(this, void 0, void 0, function* () {\n event.preventDefault();\n try {\n // BEFORE\n if (options.beforeSubmitEvent) {\n yield options.beforeSubmitEvent();\n }\n // SEND\n const response = yield this.send();\n // AFTER\n if (options.afterSubmitEvent) {\n yield options.afterSubmitEvent(response);\n }\n return response;\n }\n catch (error) {\n // Handle error in beforeSubmitEvent, send(), or afterSubmitEvent\n this.log.err(`An error occurred while submitting the form ${this.appId}:`, error);\n // You can perform error handling logic here if needed\n return error;\n }\n }));\n }\n /**\n * Answer\n * @param appId\n * @returns\n * TODO: Required\n */\n answer() {\n const form = document.getElementById(\"magicfeedback-\" + this.appId);\n if (!form) {\n this.log.err(`Form \"${form}\" not found.`);\n return [];\n }\n const surveyAnswers = [];\n let hasError = false; // Flag to track if an error has occurred\n const inputs = form.querySelectorAll(\".magicfeedback-input\");\n inputs.forEach((input) => {\n const inputType = input.type;\n //const required = (input as HTMLInputElement).required;\n const ans = {\n id: input.name,\n type: inputType,\n value: [],\n };\n const value = input.value;\n if (inputType === \"radio\" || inputType === \"checkbox\") {\n if (input.checked) {\n ans.value.push(value);\n surveyAnswers.push(ans);\n }\n }\n else {\n ans.value.push(value);\n surveyAnswers.push(ans);\n }\n });\n if (hasError) {\n return []; // Stop the process if there's an error\n }\n return surveyAnswers;\n }\n /**\n * Send\n * @returns\n */\n send() {\n return __awaiter(this, void 0, void 0, function* () {\n // Define the URL and request payload\n const url = `${this.config.get(\"url\")}/feedback/apps`;\n try {\n // Get the survey answers from the answer() function\n const surveyAnswers = this.answer();\n if (surveyAnswers.length === 0) {\n throw new Error(\"No answers provided\");\n }\n // Make the AJAX POST request\n const response = yield this.request.post(url, {\n appId: this.appId,\n answers: surveyAnswers,\n });\n if (response.ok) {\n // Handle success response\n this.log.log(`Form ${this.appId} submitted successfully!`);\n // You can perform additional actions here if needed\n }\n else {\n // Handle error response\n this.log.err(`Failed to submit form ${this.appId}:`, response.status, response.statusText);\n throw new Error(response.statusText);\n }\n return response;\n }\n catch (error) {\n // Handle network or request error\n this.log.err(`An error occurred while submitting the form ${this.appId}:`, error);\n // You can perform error handling logic here if needed\n throw error;\n }\n });\n }\n}\nexports.Form = Form;\n\n\n//# sourceURL=webpack://magicfeedback/./src/form.ts?");
51
-
52
- /***/ }),
53
-
54
- /***/ "./src/index.ts":
55
- /*!**********************!*\
56
- !*** ./src/index.ts ***!
57
- \**********************/
58
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
59
-
60
- "use strict";
61
- eval("\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nconst main_1 = __importDefault(__webpack_require__(/*! ./main */ \"./src/main.ts\"));\nlet instance = null;\nif (!instance) {\n instance = (0, main_1.default)();\n}\nexports[\"default\"] = instance;\n\n\n//# sourceURL=webpack://magicfeedback/./src/index.ts?");
62
-
63
- /***/ }),
64
-
65
- /***/ "./src/log.ts":
66
- /*!********************!*\
67
- !*** ./src/log.ts ***!
68
- \********************/
69
- /***/ ((__unused_webpack_module, exports) => {
70
-
71
- "use strict";
72
- eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Log = void 0;\nclass Log {\n /**\n *\n * @param config\n */\n constructor(config) {\n // Config\n this.config = config;\n }\n /**\n *\n * @param args\n */\n log(...args) {\n if (this.config.get(\"debug\")) {\n console.log(\"[MagicFeedback]:\", ...args);\n }\n }\n /**\n *\n * @param args\n */\n err(...args) {\n console.error(\"[MagicFeedback]:\", ...args);\n }\n}\nexports.Log = Log;\n\n\n//# sourceURL=webpack://magicfeedback/./src/log.ts?");
73
-
74
- /***/ }),
75
-
76
- /***/ "./src/main.ts":
77
- /*!*********************!*\
78
- !*** ./src/main.ts ***!
79
- \*********************/
80
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
81
-
82
- "use strict";
83
- eval("\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nconst request_1 = __webpack_require__(/*! ./request */ \"./src/request.ts\");\nconst form_1 = __webpack_require__(/*! ./form */ \"./src/form.ts\");\nconst config_1 = __webpack_require__(/*! ./config */ \"./src/config.ts\");\nconst log_1 = __webpack_require__(/*! ./log */ \"./src/log.ts\");\n/**\n *\n * @returns\n */\nfunction main() {\n //===============================================\n // Attributes\n //===============================================\n const config = new config_1.Config();\n const request = new request_1.Request();\n let log;\n //===============================================\n // Private\n //===============================================\n //===============================================\n // Public\n //===============================================\n /**\n *\n * @param options\n */\n function init(options) {\n if (options === null || options === void 0 ? void 0 : options.url)\n config.set(\"url\", options === null || options === void 0 ? void 0 : options.url);\n if (options === null || options === void 0 ? void 0 : options.debug)\n config.set(\"debug\", options === null || options === void 0 ? void 0 : options.debug);\n log = new log_1.Log(config);\n log.log(\"Initialized Magicfeedback\", config);\n }\n /**\n *\n * @param appId\n * @param answers\n * @param profile\n * @returns\n */\n function send(appId, answers, profile) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!appId)\n log.err(\"No appID provided\");\n if (!answers)\n log.err(\"No answers provided\");\n if (answers.length == 0)\n log.err(\"Answers are empty\");\n const payload = {\n appId: appId,\n answers: answers,\n };\n if (profile)\n payload.profile = profile;\n let res = {};\n try {\n res = yield request.post(`${config.get(\"url\")}/feedback/apps`, payload);\n log.log(`sent native feedback`, res);\n }\n catch (e) {\n log.err(`error native feedback`, e);\n }\n return res;\n });\n }\n /**\n *\n * @param appId\n * @returns\n */\n function form(appId) {\n if (!appId)\n log.err(\"No appID provided\");\n return new form_1.Form(config, appId);\n }\n //===============================================\n // Return\n //===============================================\n return {\n // lifecycle\n init,\n // requests\n send,\n form,\n };\n}\nexports[\"default\"] = main;\n\n\n//# sourceURL=webpack://magicfeedback/./src/main.ts?");
84
-
85
- /***/ }),
86
-
87
- /***/ "./src/request.ts":
88
- /*!************************!*\
89
- !*** ./src/request.ts ***!
90
- \************************/
91
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
92
-
93
- "use strict";
94
- eval("\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Request = void 0;\nconst package_json_1 = __importDefault(__webpack_require__(/*! ../package.json */ \"./package.json\"));\nconst cross_fetch_1 = __importDefault(__webpack_require__(/*! cross-fetch */ \"./node_modules/cross-fetch/dist/browser-ponyfill.js\"));\nclass Request {\n /**\n *\n */\n constructor() {\n /**\n * Attributes\n */\n this.headers = {};\n this.headers = {\n Accept: \"application/json\",\n \"Magicfeedback-Sdk-Version\": package_json_1.default.version,\n };\n }\n /**\n *\n * @param url\n * @param body\n * @returns\n */\n post(url, body) {\n return __awaiter(this, void 0, void 0, function* () {\n return (0, cross_fetch_1.default)(url, {\n method: \"POST\",\n headers: Object.assign({ \"Content-Type\": \"application/json\" }, this.headers),\n body: JSON.stringify(body),\n });\n });\n }\n /**\n *\n * @param url\n * @param body\n * @returns\n */\n get(url, params) {\n return __awaiter(this, void 0, void 0, function* () {\n const serializedParams = Object.entries(params)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)\n .join(\"&\");\n const requestUrl = `${url}?${serializedParams}`;\n return (0, cross_fetch_1.default)(requestUrl, {\n method: \"GET\",\n headers: this.headers,\n }).then((res) => {\n if (res.status >= 400) {\n throw new Error(\"[MagicFeedback] Bad response from server\");\n }\n return res.json();\n });\n });\n }\n}\nexports.Request = Request;\n\n\n//# sourceURL=webpack://magicfeedback/./src/request.ts?");
95
-
96
- /***/ }),
97
-
98
- /***/ "./package.json":
99
- /*!**********************!*\
100
- !*** ./package.json ***!
101
- \**********************/
102
- /***/ ((module) => {
103
-
104
- "use strict";
105
- eval("module.exports = JSON.parse('{\"name\":\"@magicfeedback/native\",\"version\":\"1.0.5\",\"main\":\"./dist/magicfeedback-sdk.node.js\",\"browser\":\"./dist/magicfeedback-sdk.browser.js\",\"types\":\"./dist/types/src/index.d.ts\",\"repository\":{\"type\":\"git\",\"url\":\"git+ssh://git@github.com/MagicFeedback/magicfeedback-sdk.git\"},\"author\":\"farias@magicfeedback.io\",\"license\":\"MIT\",\"private\":false,\"scripts\":{\"dev\":\"vite\",\"build\":\"webpack\",\"build:watch\":\"webpack --watch --mode development\",\"test\":\"jest\",\"test:watch\":\"jest --watchAll\",\"coverage\":\"vitest run --coverage\"},\"files\":[\"dist\"],\"devDependencies\":{\"@babel/preset-typescript\":\"^7.22.5\",\"@types/node\":\"^17.0.21\",\"@types/webpack\":\"^5.28.0\",\"@types/webpack-node-externals\":\"^2.5.3\",\"c8\":\"^7.11.0\",\"jest\":\"^29.5.0\",\"jest-environment-jsdom\":\"^29.5.0\",\"jest-fetch-mock\":\"^3.0.3\",\"nock\":\"^13.2.4\",\"ts-jest\":\"^29.1.0\",\"ts-loader\":\"^9.2.7\",\"ts-node\":\"^10.7.0\",\"typescript\":\"^4.6.2\",\"vite\":\"^2.8.0\",\"vite-plugin-dts\":\"^0.9.9\",\"vitest\":\"^0.5.9\",\"webpack\":\"^5.70.0\",\"webpack-cli\":\"^4.9.2\",\"webpack-node-externals\":\"^3.0.0\"},\"dependencies\":{\"cross-fetch\":\"^3.1.5\",\"is-bundling-for-browser-or-node\":\"^1.1.1\"},\"description\":\"MagicFeedbackAI JavaScript Library for [MagicFeedback.io](https://magicfeedback.io/)\",\"bugs\":{\"url\":\"https://github.com/MagicFeedback/magicfeedback-sdk/issues\"},\"homepage\":\"https://github.com/MagicFeedback/magicfeedback-sdk#readme\",\"directories\":{\"example\":\"examples\",\"test\":\"test\"}}');\n\n//# sourceURL=webpack://magicfeedback/./package.json?");
106
-
107
- /***/ })
108
-
109
- /******/ });
110
- /************************************************************************/
111
- /******/ // The module cache
112
- /******/ var __webpack_module_cache__ = {};
113
- /******/
114
- /******/ // The require function
115
- /******/ function __webpack_require__(moduleId) {
116
- /******/ // Check if module is in cache
117
- /******/ var cachedModule = __webpack_module_cache__[moduleId];
118
- /******/ if (cachedModule !== undefined) {
119
- /******/ return cachedModule.exports;
120
- /******/ }
121
- /******/ // Create a new module (and put it into the cache)
122
- /******/ var module = __webpack_module_cache__[moduleId] = {
123
- /******/ // no module.id needed
124
- /******/ // no module.loaded needed
125
- /******/ exports: {}
126
- /******/ };
127
- /******/
128
- /******/ // Execute the module function
129
- /******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
130
- /******/
131
- /******/ // Return the exports of the module
132
- /******/ return module.exports;
133
- /******/ }
134
- /******/
135
- /************************************************************************/
136
- /******/
137
- /******/ // startup
138
- /******/ // Load entry module and return exports
139
- /******/ // This entry module is referenced by other modules so it can't be inlined
140
- /******/ var __webpack_exports__ = __webpack_require__("./src/index.ts");
141
- /******/ __webpack_exports__ = __webpack_exports__["default"];
142
- /******/
143
- /******/ return __webpack_exports__;
144
- /******/ })()
145
- ;
146
- });
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.magicfeedback=t():e.magicfeedback=t()}(self,(()=>{return e={98:function(e,t){var r="undefined"!=typeof self?self:this,n=function(){function e(){this.fetch=!1,this.DOMException=r.DOMException}return e.prototype=r,new e}();!function(e){!function(t){var r="URLSearchParams"in e,n="Symbol"in e&&"iterator"in Symbol,o="FileReader"in e&&"Blob"in e&&function(){try{return new Blob,!0}catch(e){return!1}}(),i="FormData"in e,s="ArrayBuffer"in e;if(s)var a=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],c=ArrayBuffer.isView||function(e){return e&&a.indexOf(Object.prototype.toString.call(e))>-1};function d(e){if("string"!=typeof e&&(e=String(e)),/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(e))throw new TypeError("Invalid character in header field name");return e.toLowerCase()}function u(e){return"string"!=typeof e&&(e=String(e)),e}function l(e){var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return n&&(t[Symbol.iterator]=function(){return t}),t}function f(e){this.map={},e instanceof f?e.forEach((function(e,t){this.append(t,e)}),this):Array.isArray(e)?e.forEach((function(e){this.append(e[0],e[1])}),this):e&&Object.getOwnPropertyNames(e).forEach((function(t){this.append(t,e[t])}),this)}function p(e){if(e.bodyUsed)return Promise.reject(new TypeError("Already read"));e.bodyUsed=!0}function h(e){return new Promise((function(t,r){e.onload=function(){t(e.result)},e.onerror=function(){r(e.error)}}))}function b(e){var t=new FileReader,r=h(t);return t.readAsArrayBuffer(e),r}function y(e){if(e.slice)return e.slice(0);var t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e)),t.buffer}function m(){return this.bodyUsed=!1,this._initBody=function(e){var t;this._bodyInit=e,e?"string"==typeof e?this._bodyText=e:o&&Blob.prototype.isPrototypeOf(e)?this._bodyBlob=e:i&&FormData.prototype.isPrototypeOf(e)?this._bodyFormData=e:r&&URLSearchParams.prototype.isPrototypeOf(e)?this._bodyText=e.toString():s&&o&&(t=e)&&DataView.prototype.isPrototypeOf(t)?(this._bodyArrayBuffer=y(e.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):s&&(ArrayBuffer.prototype.isPrototypeOf(e)||c(e))?this._bodyArrayBuffer=y(e):this._bodyText=e=Object.prototype.toString.call(e):this._bodyText="",this.headers.get("content-type")||("string"==typeof e?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):r&&URLSearchParams.prototype.isPrototypeOf(e)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},o&&(this.blob=function(){var e=p(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?p(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(b)}),this.text=function(){var e,t,r,n=p(this);if(n)return n;if(this._bodyBlob)return e=this._bodyBlob,r=h(t=new FileReader),t.readAsText(e),r;if(this._bodyArrayBuffer)return Promise.resolve(function(e){for(var t=new Uint8Array(e),r=new Array(t.length),n=0;n<t.length;n++)r[n]=String.fromCharCode(t[n]);return r.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},i&&(this.formData=function(){return this.text().then(w)}),this.json=function(){return this.text().then(JSON.parse)},this}f.prototype.append=function(e,t){e=d(e),t=u(t);var r=this.map[e];this.map[e]=r?r+", "+t:t},f.prototype.delete=function(e){delete this.map[d(e)]},f.prototype.get=function(e){return e=d(e),this.has(e)?this.map[e]:null},f.prototype.has=function(e){return this.map.hasOwnProperty(d(e))},f.prototype.set=function(e,t){this.map[d(e)]=u(t)},f.prototype.forEach=function(e,t){for(var r in this.map)this.map.hasOwnProperty(r)&&e.call(t,this.map[r],r,this)},f.prototype.keys=function(){var e=[];return this.forEach((function(t,r){e.push(r)})),l(e)},f.prototype.values=function(){var e=[];return this.forEach((function(t){e.push(t)})),l(e)},f.prototype.entries=function(){var e=[];return this.forEach((function(t,r){e.push([r,t])})),l(e)},n&&(f.prototype[Symbol.iterator]=f.prototype.entries);var g=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];function v(e,t){var r,n,o=(t=t||{}).body;if(e instanceof v){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new f(e.headers)),this.method=e.method,this.mode=e.mode,this.signal=e.signal,o||null==e._bodyInit||(o=e._bodyInit,e.bodyUsed=!0)}else this.url=String(e);if(this.credentials=t.credentials||this.credentials||"same-origin",!t.headers&&this.headers||(this.headers=new f(t.headers)),this.method=(n=(r=t.method||this.method||"GET").toUpperCase(),g.indexOf(n)>-1?n:r),this.mode=t.mode||this.mode||null,this.signal=t.signal||this.signal,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&o)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(o)}function w(e){var t=new FormData;return e.trim().split("&").forEach((function(e){if(e){var r=e.split("="),n=r.shift().replace(/\+/g," "),o=r.join("=").replace(/\+/g," ");t.append(decodeURIComponent(n),decodeURIComponent(o))}})),t}function k(e,t){t||(t={}),this.type="default",this.status=void 0===t.status?200:t.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in t?t.statusText:"OK",this.headers=new f(t.headers),this.url=t.url||"",this._initBody(e)}v.prototype.clone=function(){return new v(this,{body:this._bodyInit})},m.call(v.prototype),m.call(k.prototype),k.prototype.clone=function(){return new k(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new f(this.headers),url:this.url})},k.error=function(){var e=new k(null,{status:0,statusText:""});return e.type="error",e};var E=[301,302,303,307,308];k.redirect=function(e,t){if(-1===E.indexOf(t))throw new RangeError("Invalid status code");return new k(null,{status:t,headers:{location:e}})},t.DOMException=e.DOMException;try{new t.DOMException}catch(e){t.DOMException=function(e,t){this.message=e,this.name=t;var r=Error(e);this.stack=r.stack},t.DOMException.prototype=Object.create(Error.prototype),t.DOMException.prototype.constructor=t.DOMException}function x(e,r){return new Promise((function(n,i){var s=new v(e,r);if(s.signal&&s.signal.aborted)return i(new t.DOMException("Aborted","AbortError"));var a=new XMLHttpRequest;function c(){a.abort()}a.onload=function(){var e,t,r={status:a.status,statusText:a.statusText,headers:(e=a.getAllResponseHeaders()||"",t=new f,e.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach((function(e){var r=e.split(":"),n=r.shift().trim();if(n){var o=r.join(":").trim();t.append(n,o)}})),t)};r.url="responseURL"in a?a.responseURL:r.headers.get("X-Request-URL");var o="response"in a?a.response:a.responseText;n(new k(o,r))},a.onerror=function(){i(new TypeError("Network request failed"))},a.ontimeout=function(){i(new TypeError("Network request failed"))},a.onabort=function(){i(new t.DOMException("Aborted","AbortError"))},a.open(s.method,s.url,!0),"include"===s.credentials?a.withCredentials=!0:"omit"===s.credentials&&(a.withCredentials=!1),"responseType"in a&&o&&(a.responseType="blob"),s.headers.forEach((function(e,t){a.setRequestHeader(t,e)})),s.signal&&(s.signal.addEventListener("abort",c),a.onreadystatechange=function(){4===a.readyState&&s.signal.removeEventListener("abort",c)}),a.send(void 0===s._bodyInit?null:s._bodyInit)}))}x.polyfill=!0,e.fetch||(e.fetch=x,e.Headers=f,e.Request=v,e.Response=k),t.Headers=f,t.Request=v,t.Response=k,t.fetch=x,Object.defineProperty(t,"__esModule",{value:!0})}({})}(n),n.fetch.ponyfill=!0,delete n.fetch.polyfill;var o=n;(t=o.fetch).default=o.fetch,t.fetch=o.fetch,t.Headers=o.Headers,t.Request=o.Request,t.Response=o.Response,e.exports=t},607:function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const o=n(r(519));let i=null;i||(i=(0,o.default)()),t.default=i},519:function(e,t,r){"use strict";var n=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(o,i){function s(e){try{c(n.next(e))}catch(e){i(e)}}function a(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const o=r(954),i=r(712),s=r(5),a=r(341);t.default=function(){const e=new i.Config;let t;return{init:function(r){(null==r?void 0:r.url)&&e.set("url",null==r?void 0:r.url),(null==r?void 0:r.debug)&&e.set("debug",null==r?void 0:r.debug),t=new s.Log(e),t.log("Initialized Magicfeedback",e)},send:function(r,o,i,s){return n(this,void 0,void 0,(function*(){r||t.err("No appID provided"),o||t.err("No publicKey provided"),i||t.err("No answers provided"),0==i.length&&t.err("Answers are empty");const n=e.get("url"),c={integration:r,publicKey:o,feedback:{answers:i,profile:s}};try{const e=yield(0,a.sendFeedback)(n,c,t);return t.log("sent native feedback"),e}catch(e){return t.err("error native feedback",e),!1}}))},form:function(r,n){return r||t.err("No appID provided"),n||t.err("No publicKey provided"),new o.Form(e,r,n)}}}},712:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0,t.Config=class{constructor(){this.variables={},this.variables.url="https://mvp-dot-feedbackai-380013.lm.r.appspot.com/",this.variables.debug=!1}get(e){return this.variables[e]}set(e,t){this.variables[e]=t}}},954:function(e,t,r){"use strict";var n=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(o,i){function s(e){try{c(n.next(e))}catch(e){i(e)}}function a(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.Form=void 0;const o=r(5),i=r(341);t.Form=class{constructor(e,t,r){this.config=e,this.log=new o.Log(e),this.appId=t,this.publicKey=r}generate(e,t={}){this.log.log("Generating form for app",this.appId);const r=this.config.get("url");(0,i.getQuestions)(r,this.appId,this.publicKey,this.log).then((r=>{void 0!==r&&r?this.generateForm(this.appId,r,e,t):this.log.err(`No questions for app ${this.appId}`)}))}generateForm(e,t,r,o={}){const i=document.getElementById(r);if(!i)return void this.log.err(`Element with ID '${r}' not found.`);i.classList.add("magicfeedback-container");const s=document.createElement("form");if(s.classList.add("magicfeedback-form"),s.id="magicfeedback-"+e,t.forEach((e=>{const{id:t,title:r,type:n,ref:o,require:i,value:a,defaultValue:c}=e;let d,u,l=document.createElement("div");switch(l.classList.add("magicfeedback-div"),n){case"TEXT":d=document.createElement("input"),d.type="text",u="magicfeedback-text";break;case"LONGTEXT":d=document.createElement("textarea"),d.rows=3,u="magicfeedback-longtext";break;case"NUMBER":d=document.createElement("input"),d.type="number",u="magicfeedback-number",a.length&&(a.sort(((e,t)=>Number(e)-Number(t))),d.max=a[a.length-1],d.min=a[0],d.value=a[0]);break;case"RADIO":case"MULTIPLECHOICE":d=document.createElement("div"),u="magicfeedback-"+("RADIO"===n?"radio":"checkbox"),a.forEach((e=>{const t=document.createElement("div");t.classList.add(`magicfeedback-${"RADIO"===n?"radio":"checkbox"}-container`);const r=document.createElement("label"),s=document.createElement("input");s.type="RADIO"===n?"radio":"checkbox",s.name=o,s.value=e,s.required=i,s.classList.add(u),s.classList.add("magicfeedback-input"),e===c&&(s.checked=!0),r.textContent=e,t.appendChild(s),t.appendChild(r),d.appendChild(t)}));break;case"SELECT":d=document.createElement("select"),u="magicfeedback-select",a.forEach((e=>{const t=document.createElement("option");t.value=e,t.text=e,d.appendChild(t)}));break;case"DATE":d=document.createElement("input"),d.type="date",u="magicfeedback-date";break;case"BOOLEAN":d=document.createElement("input"),d.type="checkbox",u="magicfeedback-boolean";break;default:return}d.id=`magicfeedback-${t}`,d.setAttribute("name",o),void 0!==c&&(d.value=c);const f=document.createElement("label");f.setAttribute("for",`magicfeedback-${t}`),f.textContent=r,f.classList.add("magicfeedback-label"),l.appendChild(f),d.classList.add(u),"RADIO"!=n&&"MULTIPLECHOICE"!=n&&(d.classList.add("magicfeedback-input"),d.required=i),l.appendChild(d),s.appendChild(l)})),o.addButton){const e=document.createElement("button");e.type="submit",e.textContent="Submit",e.classList.add("magicfeedback-submit"),s.appendChild(e)}i.appendChild(s),s.addEventListener("submit",(e=>n(this,void 0,void 0,(function*(){e.preventDefault();try{o.beforeSubmitEvent&&(yield o.beforeSubmitEvent());const e=yield this.send();return o.afterSubmitEvent&&(yield o.afterSubmitEvent(e)),e}catch(e){return this.log.err(`An error occurred while submitting the form ${this.appId}:`,e),e}}))))}answer(){const e=document.getElementById("magicfeedback-"+this.appId);if(!e)return this.log.err(`Form "${e}" not found.`),[];const t=[];return e.querySelectorAll(".magicfeedback-input").forEach((e=>{const r=e.type,n={key:e.name,value:[]},o=e.value;"radio"===r||"checkbox"===r?e.checked&&(n.value.push(o),t.push(n)):(n.value.push(o),t.push(n))})),t}send(){return n(this,void 0,void 0,(function*(){try{const e=this.answer();if(0===e.length)throw new Error("No answers provided");const t=this.config.get("url"),r={integration:this.appId,publicKey:this.publicKey,feedback:{answers:e}};return yield(0,i.sendFeedback)(t,r,this.log)}catch(e){throw this.log.err(`An error occurred while submitting the form ${this.appId}:`,e),e}}))}}},374:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.endpoints=void 0,t.endpoints={sdk:{app:(e,t)=>`sdk/app/${e}/${t}`,feedback:"sdk/feedback"}}},341:function(e,t,r){"use strict";var n=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(o,i){function s(e){try{c(n.next(e))}catch(e){i(e)}}function a(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.sendFeedback=t.getQuestions=void 0;const i=o(r(98)),s=o(r(147)),a=r(374),c={Accept:"application/json","Magicfeedback-Sdk-Version":s.default.version};t.getQuestions=function(e,t,r,o){return n(this,void 0,void 0,(function*(){try{const n=yield(0,i.default)(e+a.endpoints.sdk.app(t,r),{method:"GET",headers:c});if(n.ok){const e=yield n.json();return o.log(`Received questions for app ${t}`,e),e}throw o.err(`Failed to get questions for app ${t}:`,n.status,n.statusText),new Error("[MagicFeedback] Bad response from server")}catch(e){return console.error(e),[]}}))},t.sendFeedback=function(e,t,r){return n(this,void 0,void 0,(function*(){try{const n=yield(0,i.default)(e+a.endpoints.sdk.feedback,{method:"POST",headers:Object.assign({"Content-Type":"application/json"},c),body:JSON.stringify(t)});if(n.ok)return r.log(`Form ${t.integration} submitted successfully!`),!0;throw r.err(`Failed to submit form ${t.integration}:`,n.status,n.statusText),new Error(n.statusText)}catch(e){return console.error(e),!1}}))}},5:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Log=void 0,t.Log=class{constructor(e){this.config=e}log(...e){this.config.get("debug")&&console.log("[MagicFeedback]:",...e)}err(...e){console.error("[MagicFeedback]:",...e)}}},147:e=>{"use strict";e.exports=JSON.parse('{"name":"@magicfeedback/native","version":"1.0.8","main":"./dist/magicfeedback-sdk.node.js","browser":"./dist/magicfeedback-sdk.browser.js","types":"./dist/types/src/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/MagicFeedback/magicfeedback-sdk.git"},"author":"farias@magicfeedback.io","license":"MIT","private":false,"scripts":{"dev":"vite","build":"webpack","build:watch":"webpack --watch --mode development","test":"jest","test:watch":"jest --watchAll","coverage":"vitest run --coverage"},"files":["dist"],"devDependencies":{"@babel/preset-typescript":"^7.22.5","@types/node":"^17.0.21","@types/webpack":"^5.28.0","@types/webpack-node-externals":"^2.5.3","c8":"^7.11.0","jest":"^29.5.0","jest-environment-jsdom":"^29.5.0","jest-fetch-mock":"^3.0.3","nock":"^13.2.4","ts-jest":"^29.1.0","ts-loader":"^9.2.7","ts-node":"^10.7.0","typescript":"^4.6.2","vite":"^2.8.0","vite-plugin-dts":"^0.9.9","vitest":"^0.5.9","webpack":"^5.70.0","webpack-cli":"^4.9.2","webpack-node-externals":"^3.0.0"},"dependencies":{"cross-fetch":"^3.1.5","is-bundling-for-browser-or-node":"^1.1.1"},"description":"MagicFeedbackAI JavaScript Library for [MagicFeedback.io](https://magicfeedback.io/)","bugs":{"url":"https://github.com/MagicFeedback/magicfeedback-sdk/issues"},"homepage":"https://github.com/MagicFeedback/magicfeedback-sdk#readme","directories":{"example":"examples","test":"test"}}')}},t={},function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n].call(i.exports,i,i.exports,r),i.exports}(607).default;var e,t}));
@@ -1,140 +1 @@
1
- /*
2
- * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
3
- * This devtool is neither made for production nor for readable output files.
4
- * It uses "eval()" calls to create a separate source file in the browser devtools.
5
- * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
6
- * or disable the default devtool with "devtool: false".
7
- * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
8
- */
9
- (function webpackUniversalModuleDefinition(root, factory) {
10
- if(typeof exports === 'object' && typeof module === 'object')
11
- module.exports = factory();
12
- else if(typeof define === 'function' && define.amd)
13
- define([], factory);
14
- else if(typeof exports === 'object')
15
- exports["magicfeedback"] = factory();
16
- else
17
- root["magicfeedback"] = factory();
18
- })(global, () => {
19
- return /******/ (() => { // webpackBootstrap
20
- /******/ "use strict";
21
- /******/ var __webpack_modules__ = ({
22
-
23
- /***/ "./src/config.ts":
24
- /*!***********************!*\
25
- !*** ./src/config.ts ***!
26
- \***********************/
27
- /***/ ((__unused_webpack_module, exports) => {
28
-
29
- eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Config = void 0;\nclass Config {\n constructor() {\n this.variables = {};\n this.variables[\"url\"] = \"https://api.magicfeedback.io\";\n this.variables[\"debug\"] = false;\n }\n get(key) {\n return this.variables[key];\n }\n set(key, value) {\n this.variables[key] = value;\n }\n}\nexports.Config = Config;\n\n\n//# sourceURL=webpack://magicfeedback/./src/config.ts?");
30
-
31
- /***/ }),
32
-
33
- /***/ "./src/form.ts":
34
- /*!*********************!*\
35
- !*** ./src/form.ts ***!
36
- \*********************/
37
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
38
-
39
- eval("\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Form = void 0;\nconst request_1 = __webpack_require__(/*! ./request */ \"./src/request.ts\");\nconst log_1 = __webpack_require__(/*! ./log */ \"./src/log.ts\");\nclass Form {\n /**\n *\n * @param config\n * @param appId\n */\n constructor(config, appId) {\n // Config\n this.config = config;\n this.request = new request_1.Request();\n this.log = new log_1.Log(config);\n // Attributes\n this.appId = appId;\n }\n /**\n * Generate\n * TODO: Check if is inside of a <form>\n * @param appId\n */\n generate(selector, options = {}) {\n //TODO: Check if already exist the form\n // Request question from the app\n this.request\n .get(`${this.config.get(\"url\")}/apps/${this.appId}/questions`, {})\n .then((appQuestions) => {\n if (appQuestions === undefined || !appQuestions) {\n this.log.err(`No questions for app ${this.appId}`);\n return;\n }\n // Create the from from the JSON\n this.generateForm(this.appId, appQuestions, selector, options);\n });\n }\n /**\n * Create\n * @param appId\n * @param appQuestions\n * @param selector\n * @param options\n *\n * TODO: Add option to generate in <form> or in other <tag>\n */\n generateForm(appId, appQuestions, selector, options = {}) {\n // Select the container\n const container = document.getElementById(selector);\n if (!container) {\n this.log.err(`Element with ID '${selector}' not found.`);\n return;\n }\n container.classList.add(\"magicfeedback-container\");\n // Create the form\n const form = document.createElement(\"form\");\n form.classList.add(\"magicfeedback-form\");\n form.id = \"magicfeedback-\" + appId;\n // Process questions and create in the form\n appQuestions.forEach((question) => {\n const { id, title, type, ref, require, \n //external_id,\n value, defaultValue, } = question;\n this.log.log(\"Question\", question);\n let element;\n let elementTypeClass;\n let elementContainer = document.createElement(\"div\");\n elementContainer.classList.add(\"magicfeedback-div\");\n switch (type) {\n case \"TEXT\":\n // Create a text input field\n element = document.createElement(\"input\");\n element.type = \"text\";\n elementTypeClass = \"magicfeedback-text\";\n break;\n case \"LONGTEXT\":\n // Create a textarea element for TEXT and LONGTEXT types\n element = document.createElement(\"textarea\");\n element.rows = 3; // Set the number of rows based on the type\n elementTypeClass = \"magicfeedback-longtext\";\n break;\n case \"NUMBER\":\n // Create an input element with type \"number\" for NUMBER type\n element = document.createElement(\"input\");\n element.type = \"number\";\n elementTypeClass = \"magicfeedback-number\";\n if (value.length) {\n value.sort((a, b) => {\n let aa = Number(a);\n let bb = Number(b);\n return aa - bb;\n });\n element.max = value[value.length - 1];\n element.min = value[0];\n element.value = value[0];\n }\n break;\n case \"RADIO\":\n case \"MULTIPLECHOICE\":\n element = document.createElement(\"div\");\n elementTypeClass =\n \"magicfeedback-\" + (type === \"RADIO\" ? \"radio\" : \"checkbox\");\n value.forEach((option) => {\n const label = document.createElement(\"label\");\n const input = document.createElement(\"input\");\n input.type = type === \"RADIO\" ? \"radio\" : \"checkbox\";\n input.name = ref;\n input.value = option;\n input.required =\n require.toLocaleLowerCase() === \"true\" ? true : false;\n input.classList.add(elementTypeClass);\n input.classList.add(\"magicfeedback-input\");\n if (option === defaultValue) {\n input.checked = true;\n }\n label.textContent = option;\n element.appendChild(input);\n element.appendChild(label);\n });\n break;\n case \"SELECT\":\n // Create a select element for RADIO and MULTIPLECHOICE types\n element = document.createElement(\"select\");\n elementTypeClass = \"magicfeedback-select\";\n value.forEach((optionValue) => {\n // Create an option element for each value in the question's value array\n const option = document.createElement(\"option\");\n option.value = optionValue;\n option.text = optionValue;\n element.appendChild(option);\n });\n break;\n case \"DATE\":\n // Create an input element with type \"date\" for DATE type\n element = document.createElement(\"input\");\n element.type = \"date\";\n elementTypeClass = \"magicfeedback-date\";\n break;\n case \"BOOLEAN\":\n // Create an input element with type \"checkbox\" for BOOLEAN type\n element = document.createElement(\"input\");\n element.type = \"checkbox\";\n elementTypeClass = \"magicfeedback-boolean\";\n break;\n default:\n return; // Skip unknown types\n }\n element.id = `magicfeedback-${id}`;\n element.setAttribute(\"name\", ref);\n if (defaultValue !== undefined) {\n element.value = defaultValue;\n }\n // Add the label and input element to the form\n const label = document.createElement(\"label\");\n label.setAttribute(\"for\", `magicfeedback-${id}`);\n label.textContent = title;\n label.classList.add(\"magicfeedback-label\");\n elementContainer.appendChild(label);\n element.classList.add(elementTypeClass);\n if (type != \"RADIO\" && type != \"MULTIPLECHOICE\") {\n element.classList.add(\"magicfeedback-input\");\n element.required =\n require.toLocaleLowerCase() === \"true\" ? true : false;\n }\n elementContainer.appendChild(element);\n form.appendChild(elementContainer);\n });\n // Submit button\n if (options.addButton) {\n // Create a submit button if specified in options\n const submitButton = document.createElement(\"button\");\n submitButton.type = \"submit\";\n submitButton.textContent = \"Submit\";\n submitButton.classList.add(\"magicfeedback-submit\");\n form.appendChild(submitButton);\n }\n // Add the form to the specified container\n container.appendChild(form);\n // Submit event\n form.addEventListener(\"submit\", (event) => __awaiter(this, void 0, void 0, function* () {\n event.preventDefault();\n try {\n // BEFORE\n if (options.beforeSubmitEvent) {\n yield options.beforeSubmitEvent();\n }\n // SEND\n const response = yield this.send();\n // AFTER\n if (options.afterSubmitEvent) {\n yield options.afterSubmitEvent(response);\n }\n return response;\n }\n catch (error) {\n // Handle error in beforeSubmitEvent, send(), or afterSubmitEvent\n this.log.err(`An error occurred while submitting the form ${this.appId}:`, error);\n // You can perform error handling logic here if needed\n return error;\n }\n }));\n }\n /**\n * Answer\n * @param appId\n * @returns\n * TODO: Required\n */\n answer() {\n const form = document.getElementById(\"magicfeedback-\" + this.appId);\n if (!form) {\n this.log.err(`Form \"${form}\" not found.`);\n return [];\n }\n const surveyAnswers = [];\n let hasError = false; // Flag to track if an error has occurred\n const inputs = form.querySelectorAll(\".magicfeedback-input\");\n inputs.forEach((input) => {\n const inputType = input.type;\n //const required = (input as HTMLInputElement).required;\n const ans = {\n id: input.name,\n type: inputType,\n value: [],\n };\n const value = input.value;\n if (inputType === \"radio\" || inputType === \"checkbox\") {\n if (input.checked) {\n ans.value.push(value);\n surveyAnswers.push(ans);\n }\n }\n else {\n ans.value.push(value);\n surveyAnswers.push(ans);\n }\n });\n if (hasError) {\n return []; // Stop the process if there's an error\n }\n return surveyAnswers;\n }\n /**\n * Send\n * @returns\n */\n send() {\n return __awaiter(this, void 0, void 0, function* () {\n // Define the URL and request payload\n const url = `${this.config.get(\"url\")}/feedback/apps`;\n try {\n // Get the survey answers from the answer() function\n const surveyAnswers = this.answer();\n if (surveyAnswers.length === 0) {\n throw new Error(\"No answers provided\");\n }\n // Make the AJAX POST request\n const response = yield this.request.post(url, {\n appId: this.appId,\n answers: surveyAnswers,\n });\n if (response.ok) {\n // Handle success response\n this.log.log(`Form ${this.appId} submitted successfully!`);\n // You can perform additional actions here if needed\n }\n else {\n // Handle error response\n this.log.err(`Failed to submit form ${this.appId}:`, response.status, response.statusText);\n throw new Error(response.statusText);\n }\n return response;\n }\n catch (error) {\n // Handle network or request error\n this.log.err(`An error occurred while submitting the form ${this.appId}:`, error);\n // You can perform error handling logic here if needed\n throw error;\n }\n });\n }\n}\nexports.Form = Form;\n\n\n//# sourceURL=webpack://magicfeedback/./src/form.ts?");
40
-
41
- /***/ }),
42
-
43
- /***/ "./src/index.ts":
44
- /*!**********************!*\
45
- !*** ./src/index.ts ***!
46
- \**********************/
47
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
48
-
49
- eval("\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nconst main_1 = __importDefault(__webpack_require__(/*! ./main */ \"./src/main.ts\"));\nlet instance = null;\nif (!instance) {\n instance = (0, main_1.default)();\n}\nexports[\"default\"] = instance;\n\n\n//# sourceURL=webpack://magicfeedback/./src/index.ts?");
50
-
51
- /***/ }),
52
-
53
- /***/ "./src/log.ts":
54
- /*!********************!*\
55
- !*** ./src/log.ts ***!
56
- \********************/
57
- /***/ ((__unused_webpack_module, exports) => {
58
-
59
- eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Log = void 0;\nclass Log {\n /**\n *\n * @param config\n */\n constructor(config) {\n // Config\n this.config = config;\n }\n /**\n *\n * @param args\n */\n log(...args) {\n if (this.config.get(\"debug\")) {\n console.log(\"[MagicFeedback]:\", ...args);\n }\n }\n /**\n *\n * @param args\n */\n err(...args) {\n console.error(\"[MagicFeedback]:\", ...args);\n }\n}\nexports.Log = Log;\n\n\n//# sourceURL=webpack://magicfeedback/./src/log.ts?");
60
-
61
- /***/ }),
62
-
63
- /***/ "./src/main.ts":
64
- /*!*********************!*\
65
- !*** ./src/main.ts ***!
66
- \*********************/
67
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
68
-
69
- eval("\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nconst request_1 = __webpack_require__(/*! ./request */ \"./src/request.ts\");\nconst form_1 = __webpack_require__(/*! ./form */ \"./src/form.ts\");\nconst config_1 = __webpack_require__(/*! ./config */ \"./src/config.ts\");\nconst log_1 = __webpack_require__(/*! ./log */ \"./src/log.ts\");\n/**\n *\n * @returns\n */\nfunction main() {\n //===============================================\n // Attributes\n //===============================================\n const config = new config_1.Config();\n const request = new request_1.Request();\n let log;\n //===============================================\n // Private\n //===============================================\n //===============================================\n // Public\n //===============================================\n /**\n *\n * @param options\n */\n function init(options) {\n if (options === null || options === void 0 ? void 0 : options.url)\n config.set(\"url\", options === null || options === void 0 ? void 0 : options.url);\n if (options === null || options === void 0 ? void 0 : options.debug)\n config.set(\"debug\", options === null || options === void 0 ? void 0 : options.debug);\n log = new log_1.Log(config);\n log.log(\"Initialized Magicfeedback\", config);\n }\n /**\n *\n * @param appId\n * @param answers\n * @param profile\n * @returns\n */\n function send(appId, answers, profile) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!appId)\n log.err(\"No appID provided\");\n if (!answers)\n log.err(\"No answers provided\");\n if (answers.length == 0)\n log.err(\"Answers are empty\");\n const payload = {\n appId: appId,\n answers: answers,\n };\n if (profile)\n payload.profile = profile;\n let res = {};\n try {\n res = yield request.post(`${config.get(\"url\")}/feedback/apps`, payload);\n log.log(`sent native feedback`, res);\n }\n catch (e) {\n log.err(`error native feedback`, e);\n }\n return res;\n });\n }\n /**\n *\n * @param appId\n * @returns\n */\n function form(appId) {\n if (!appId)\n log.err(\"No appID provided\");\n return new form_1.Form(config, appId);\n }\n //===============================================\n // Return\n //===============================================\n return {\n // lifecycle\n init,\n // requests\n send,\n form,\n };\n}\nexports[\"default\"] = main;\n\n\n//# sourceURL=webpack://magicfeedback/./src/main.ts?");
70
-
71
- /***/ }),
72
-
73
- /***/ "./src/request.ts":
74
- /*!************************!*\
75
- !*** ./src/request.ts ***!
76
- \************************/
77
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
78
-
79
- eval("\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Request = void 0;\nconst package_json_1 = __importDefault(__webpack_require__(/*! ../package.json */ \"./package.json\"));\nconst cross_fetch_1 = __importDefault(__webpack_require__(/*! cross-fetch */ \"cross-fetch\"));\nclass Request {\n /**\n *\n */\n constructor() {\n /**\n * Attributes\n */\n this.headers = {};\n this.headers = {\n Accept: \"application/json\",\n \"Magicfeedback-Sdk-Version\": package_json_1.default.version,\n };\n }\n /**\n *\n * @param url\n * @param body\n * @returns\n */\n post(url, body) {\n return __awaiter(this, void 0, void 0, function* () {\n return (0, cross_fetch_1.default)(url, {\n method: \"POST\",\n headers: Object.assign({ \"Content-Type\": \"application/json\" }, this.headers),\n body: JSON.stringify(body),\n });\n });\n }\n /**\n *\n * @param url\n * @param body\n * @returns\n */\n get(url, params) {\n return __awaiter(this, void 0, void 0, function* () {\n const serializedParams = Object.entries(params)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)\n .join(\"&\");\n const requestUrl = `${url}?${serializedParams}`;\n return (0, cross_fetch_1.default)(requestUrl, {\n method: \"GET\",\n headers: this.headers,\n }).then((res) => {\n if (res.status >= 400) {\n throw new Error(\"[MagicFeedback] Bad response from server\");\n }\n return res.json();\n });\n });\n }\n}\nexports.Request = Request;\n\n\n//# sourceURL=webpack://magicfeedback/./src/request.ts?");
80
-
81
- /***/ }),
82
-
83
- /***/ "cross-fetch":
84
- /*!******************************!*\
85
- !*** external "cross-fetch" ***!
86
- \******************************/
87
- /***/ ((module) => {
88
-
89
- module.exports = require("cross-fetch");
90
-
91
- /***/ }),
92
-
93
- /***/ "./package.json":
94
- /*!**********************!*\
95
- !*** ./package.json ***!
96
- \**********************/
97
- /***/ ((module) => {
98
-
99
- eval("module.exports = JSON.parse('{\"name\":\"@magicfeedback/native\",\"version\":\"1.0.5\",\"main\":\"./dist/magicfeedback-sdk.node.js\",\"browser\":\"./dist/magicfeedback-sdk.browser.js\",\"types\":\"./dist/types/src/index.d.ts\",\"repository\":{\"type\":\"git\",\"url\":\"git+ssh://git@github.com/MagicFeedback/magicfeedback-sdk.git\"},\"author\":\"farias@magicfeedback.io\",\"license\":\"MIT\",\"private\":false,\"scripts\":{\"dev\":\"vite\",\"build\":\"webpack\",\"build:watch\":\"webpack --watch --mode development\",\"test\":\"jest\",\"test:watch\":\"jest --watchAll\",\"coverage\":\"vitest run --coverage\"},\"files\":[\"dist\"],\"devDependencies\":{\"@babel/preset-typescript\":\"^7.22.5\",\"@types/node\":\"^17.0.21\",\"@types/webpack\":\"^5.28.0\",\"@types/webpack-node-externals\":\"^2.5.3\",\"c8\":\"^7.11.0\",\"jest\":\"^29.5.0\",\"jest-environment-jsdom\":\"^29.5.0\",\"jest-fetch-mock\":\"^3.0.3\",\"nock\":\"^13.2.4\",\"ts-jest\":\"^29.1.0\",\"ts-loader\":\"^9.2.7\",\"ts-node\":\"^10.7.0\",\"typescript\":\"^4.6.2\",\"vite\":\"^2.8.0\",\"vite-plugin-dts\":\"^0.9.9\",\"vitest\":\"^0.5.9\",\"webpack\":\"^5.70.0\",\"webpack-cli\":\"^4.9.2\",\"webpack-node-externals\":\"^3.0.0\"},\"dependencies\":{\"cross-fetch\":\"^3.1.5\",\"is-bundling-for-browser-or-node\":\"^1.1.1\"},\"description\":\"MagicFeedbackAI JavaScript Library for [MagicFeedback.io](https://magicfeedback.io/)\",\"bugs\":{\"url\":\"https://github.com/MagicFeedback/magicfeedback-sdk/issues\"},\"homepage\":\"https://github.com/MagicFeedback/magicfeedback-sdk#readme\",\"directories\":{\"example\":\"examples\",\"test\":\"test\"}}');\n\n//# sourceURL=webpack://magicfeedback/./package.json?");
100
-
101
- /***/ })
102
-
103
- /******/ });
104
- /************************************************************************/
105
- /******/ // The module cache
106
- /******/ var __webpack_module_cache__ = {};
107
- /******/
108
- /******/ // The require function
109
- /******/ function __webpack_require__(moduleId) {
110
- /******/ // Check if module is in cache
111
- /******/ var cachedModule = __webpack_module_cache__[moduleId];
112
- /******/ if (cachedModule !== undefined) {
113
- /******/ return cachedModule.exports;
114
- /******/ }
115
- /******/ // Create a new module (and put it into the cache)
116
- /******/ var module = __webpack_module_cache__[moduleId] = {
117
- /******/ // no module.id needed
118
- /******/ // no module.loaded needed
119
- /******/ exports: {}
120
- /******/ };
121
- /******/
122
- /******/ // Execute the module function
123
- /******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
124
- /******/
125
- /******/ // Return the exports of the module
126
- /******/ return module.exports;
127
- /******/ }
128
- /******/
129
- /************************************************************************/
130
- /******/
131
- /******/ // startup
132
- /******/ // Load entry module and return exports
133
- /******/ // This entry module is referenced by other modules so it can't be inlined
134
- /******/ var __webpack_exports__ = __webpack_require__("./src/index.ts");
135
- /******/ __webpack_exports__ = __webpack_exports__["default"];
136
- /******/
137
- /******/ return __webpack_exports__;
138
- /******/ })()
139
- ;
140
- });
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.magicfeedback=t():e.magicfeedback=t()}(global,(()=>(()=>{"use strict";var e={607:function(e,t,n){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const a=i(n(519));let o=null;o||(o=(0,a.default)()),t.default=o},519:function(e,t,n){var i=this&&this.__awaiter||function(e,t,n,i){return new(n||(n=Promise))((function(a,o){function r(e){try{s(i.next(e))}catch(e){o(e)}}function c(e){try{s(i.throw(e))}catch(e){o(e)}}function s(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,c)}s((i=i.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const a=n(954),o=n(712),r=n(5),c=n(341);t.default=function(){const e=new o.Config;let t;return{init:function(n){(null==n?void 0:n.url)&&e.set("url",null==n?void 0:n.url),(null==n?void 0:n.debug)&&e.set("debug",null==n?void 0:n.debug),t=new r.Log(e),t.log("Initialized Magicfeedback",e)},send:function(n,a,o,r){return i(this,void 0,void 0,(function*(){n||t.err("No appID provided"),a||t.err("No publicKey provided"),o||t.err("No answers provided"),0==o.length&&t.err("Answers are empty");const i=e.get("url"),s={integration:n,publicKey:a,feedback:{answers:o,profile:r}};try{const e=yield(0,c.sendFeedback)(i,s,t);return t.log("sent native feedback"),e}catch(e){return t.err("error native feedback",e),!1}}))},form:function(n,i){return n||t.err("No appID provided"),i||t.err("No publicKey provided"),new a.Form(e,n,i)}}}},712:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0,t.Config=class{constructor(){this.variables={},this.variables.url="https://mvp-dot-feedbackai-380013.lm.r.appspot.com/",this.variables.debug=!1}get(e){return this.variables[e]}set(e,t){this.variables[e]=t}}},954:function(e,t,n){var i=this&&this.__awaiter||function(e,t,n,i){return new(n||(n=Promise))((function(a,o){function r(e){try{s(i.next(e))}catch(e){o(e)}}function c(e){try{s(i.throw(e))}catch(e){o(e)}}function s(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,c)}s((i=i.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.Form=void 0;const a=n(5),o=n(341);t.Form=class{constructor(e,t,n){this.config=e,this.log=new a.Log(e),this.appId=t,this.publicKey=n}generate(e,t={}){this.log.log("Generating form for app",this.appId);const n=this.config.get("url");(0,o.getQuestions)(n,this.appId,this.publicKey,this.log).then((n=>{void 0!==n&&n?this.generateForm(this.appId,n,e,t):this.log.err(`No questions for app ${this.appId}`)}))}generateForm(e,t,n,a={}){const o=document.getElementById(n);if(!o)return void this.log.err(`Element with ID '${n}' not found.`);o.classList.add("magicfeedback-container");const r=document.createElement("form");if(r.classList.add("magicfeedback-form"),r.id="magicfeedback-"+e,t.forEach((e=>{const{id:t,title:n,type:i,ref:a,require:o,value:c,defaultValue:s}=e;let d,u,l=document.createElement("div");switch(l.classList.add("magicfeedback-div"),i){case"TEXT":d=document.createElement("input"),d.type="text",u="magicfeedback-text";break;case"LONGTEXT":d=document.createElement("textarea"),d.rows=3,u="magicfeedback-longtext";break;case"NUMBER":d=document.createElement("input"),d.type="number",u="magicfeedback-number",c.length&&(c.sort(((e,t)=>Number(e)-Number(t))),d.max=c[c.length-1],d.min=c[0],d.value=c[0]);break;case"RADIO":case"MULTIPLECHOICE":d=document.createElement("div"),u="magicfeedback-"+("RADIO"===i?"radio":"checkbox"),c.forEach((e=>{const t=document.createElement("div");t.classList.add(`magicfeedback-${"RADIO"===i?"radio":"checkbox"}-container`);const n=document.createElement("label"),r=document.createElement("input");r.type="RADIO"===i?"radio":"checkbox",r.name=a,r.value=e,r.required=o,r.classList.add(u),r.classList.add("magicfeedback-input"),e===s&&(r.checked=!0),n.textContent=e,t.appendChild(r),t.appendChild(n),d.appendChild(t)}));break;case"SELECT":d=document.createElement("select"),u="magicfeedback-select",c.forEach((e=>{const t=document.createElement("option");t.value=e,t.text=e,d.appendChild(t)}));break;case"DATE":d=document.createElement("input"),d.type="date",u="magicfeedback-date";break;case"BOOLEAN":d=document.createElement("input"),d.type="checkbox",u="magicfeedback-boolean";break;default:return}d.id=`magicfeedback-${t}`,d.setAttribute("name",a),void 0!==s&&(d.value=s);const p=document.createElement("label");p.setAttribute("for",`magicfeedback-${t}`),p.textContent=n,p.classList.add("magicfeedback-label"),l.appendChild(p),d.classList.add(u),"RADIO"!=i&&"MULTIPLECHOICE"!=i&&(d.classList.add("magicfeedback-input"),d.required=o),l.appendChild(d),r.appendChild(l)})),a.addButton){const e=document.createElement("button");e.type="submit",e.textContent="Submit",e.classList.add("magicfeedback-submit"),r.appendChild(e)}o.appendChild(r),r.addEventListener("submit",(e=>i(this,void 0,void 0,(function*(){e.preventDefault();try{a.beforeSubmitEvent&&(yield a.beforeSubmitEvent());const e=yield this.send();return a.afterSubmitEvent&&(yield a.afterSubmitEvent(e)),e}catch(e){return this.log.err(`An error occurred while submitting the form ${this.appId}:`,e),e}}))))}answer(){const e=document.getElementById("magicfeedback-"+this.appId);if(!e)return this.log.err(`Form "${e}" not found.`),[];const t=[];return e.querySelectorAll(".magicfeedback-input").forEach((e=>{const n=e.type,i={key:e.name,value:[]},a=e.value;"radio"===n||"checkbox"===n?e.checked&&(i.value.push(a),t.push(i)):(i.value.push(a),t.push(i))})),t}send(){return i(this,void 0,void 0,(function*(){try{const e=this.answer();if(0===e.length)throw new Error("No answers provided");const t=this.config.get("url"),n={integration:this.appId,publicKey:this.publicKey,feedback:{answers:e}};return yield(0,o.sendFeedback)(t,n,this.log)}catch(e){throw this.log.err(`An error occurred while submitting the form ${this.appId}:`,e),e}}))}}},374:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.endpoints=void 0,t.endpoints={sdk:{app:(e,t)=>`sdk/app/${e}/${t}`,feedback:"sdk/feedback"}}},341:function(e,t,n){var i=this&&this.__awaiter||function(e,t,n,i){return new(n||(n=Promise))((function(a,o){function r(e){try{s(i.next(e))}catch(e){o(e)}}function c(e){try{s(i.throw(e))}catch(e){o(e)}}function s(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,c)}s((i=i.apply(e,t||[])).next())}))},a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.sendFeedback=t.getQuestions=void 0;const o=a(n(31)),r=a(n(147)),c=n(374),s={Accept:"application/json","Magicfeedback-Sdk-Version":r.default.version};t.getQuestions=function(e,t,n,a){return i(this,void 0,void 0,(function*(){try{const i=yield(0,o.default)(e+c.endpoints.sdk.app(t,n),{method:"GET",headers:s});if(i.ok){const e=yield i.json();return a.log(`Received questions for app ${t}`,e),e}throw a.err(`Failed to get questions for app ${t}:`,i.status,i.statusText),new Error("[MagicFeedback] Bad response from server")}catch(e){return console.error(e),[]}}))},t.sendFeedback=function(e,t,n){return i(this,void 0,void 0,(function*(){try{const i=yield(0,o.default)(e+c.endpoints.sdk.feedback,{method:"POST",headers:Object.assign({"Content-Type":"application/json"},s),body:JSON.stringify(t)});if(i.ok)return n.log(`Form ${t.integration} submitted successfully!`),!0;throw n.err(`Failed to submit form ${t.integration}:`,i.status,i.statusText),new Error(i.statusText)}catch(e){return console.error(e),!1}}))}},5:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Log=void 0,t.Log=class{constructor(e){this.config=e}log(...e){this.config.get("debug")&&console.log("[MagicFeedback]:",...e)}err(...e){console.error("[MagicFeedback]:",...e)}}},31:e=>{e.exports=require("cross-fetch")},147:e=>{e.exports=JSON.parse('{"name":"@magicfeedback/native","version":"1.0.8","main":"./dist/magicfeedback-sdk.node.js","browser":"./dist/magicfeedback-sdk.browser.js","types":"./dist/types/src/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/MagicFeedback/magicfeedback-sdk.git"},"author":"farias@magicfeedback.io","license":"MIT","private":false,"scripts":{"dev":"vite","build":"webpack","build:watch":"webpack --watch --mode development","test":"jest","test:watch":"jest --watchAll","coverage":"vitest run --coverage"},"files":["dist"],"devDependencies":{"@babel/preset-typescript":"^7.22.5","@types/node":"^17.0.21","@types/webpack":"^5.28.0","@types/webpack-node-externals":"^2.5.3","c8":"^7.11.0","jest":"^29.5.0","jest-environment-jsdom":"^29.5.0","jest-fetch-mock":"^3.0.3","nock":"^13.2.4","ts-jest":"^29.1.0","ts-loader":"^9.2.7","ts-node":"^10.7.0","typescript":"^4.6.2","vite":"^2.8.0","vite-plugin-dts":"^0.9.9","vitest":"^0.5.9","webpack":"^5.70.0","webpack-cli":"^4.9.2","webpack-node-externals":"^3.0.0"},"dependencies":{"cross-fetch":"^3.1.5","is-bundling-for-browser-or-node":"^1.1.1"},"description":"MagicFeedbackAI JavaScript Library for [MagicFeedback.io](https://magicfeedback.io/)","bugs":{"url":"https://github.com/MagicFeedback/magicfeedback-sdk/issues"},"homepage":"https://github.com/MagicFeedback/magicfeedback-sdk#readme","directories":{"example":"examples","test":"test"}}')}},t={},n=function n(i){var a=t[i];if(void 0!==a)return a.exports;var o=t[i]={exports:{}};return e[i].call(o.exports,o,o.exports,n),o.exports}(607);return n.default})()));
@@ -8,12 +8,14 @@ export declare class Form {
8
8
  private request;
9
9
  private log;
10
10
  private appId;
11
+ private publicKey;
11
12
  /**
12
13
  *
13
14
  * @param config
14
15
  * @param appId
16
+ * @param publicKey
15
17
  */
16
- constructor(config: Config, appId: string);
18
+ constructor(config: Config, appId: string, publicKey: string);
17
19
  /**
18
20
  * Generate
19
21
  * TODO: Check if is inside of a <form>
@@ -1,6 +1,6 @@
1
1
  declare const _default: {
2
- init: (options?: import("./types").InitOptions | undefined) => void;
3
- send: (appId: string, answers: import("./types").NativeFeedbackAnswer[], profile?: import("./types").NativeFeedbackProfile | undefined) => Promise<{}>;
4
- form: (appId: string) => import("./form").Form;
2
+ init: (options?: import("./models/types").InitOptions | undefined) => void;
3
+ send: (appId: string, publicKey: string, answers: import("./models/types").NativeAnswer[], profile?: any) => Promise<boolean>;
4
+ form: (appId: string, publicKey: string) => import("./models/form").Form;
5
5
  };
6
6
  export default _default;
@@ -1,11 +1,11 @@
1
- import { InitOptions, NativeFeedback } from "./types";
2
- import { Form } from "./form";
1
+ import { InitOptions, NativeAnswer } from "./models/types";
2
+ import { Form } from "./models/form";
3
3
  /**
4
4
  *
5
5
  * @returns
6
6
  */
7
7
  export default function main(): {
8
8
  init: (options?: InitOptions) => void;
9
- send: (appId: NativeFeedback["appId"], answers: NativeFeedback["answers"], profile?: NativeFeedback["profile"]) => Promise<{}>;
10
- form: (appId: string) => Form;
9
+ send: (appId: string, publicKey: string, answers: NativeAnswer[], profile?: any) => Promise<boolean>;
10
+ form: (appId: string, publicKey: string) => Form;
11
11
  };
@@ -0,0 +1,6 @@
1
+ export declare class Config {
2
+ private variables;
3
+ constructor();
4
+ get<T>(key: string): T | undefined;
5
+ set<T>(key: string, value: T): void;
6
+ }
@@ -0,0 +1,47 @@
1
+ import { generateFormOptions, NativeAnswer } from "./types";
2
+ import { Config } from "./config";
3
+ export declare class Form {
4
+ /**
5
+ * Attributes
6
+ */
7
+ private config;
8
+ private log;
9
+ private appId;
10
+ private publicKey;
11
+ /**
12
+ *
13
+ * @param config
14
+ * @param appId
15
+ * @param publicKey
16
+ */
17
+ constructor(config: Config, appId: string, publicKey: string);
18
+ /**
19
+ * Generate
20
+ * TODO: Check if is inside of a <form>
21
+ * @param selector
22
+ * @param options
23
+ */
24
+ generate(selector: string, options?: generateFormOptions): void;
25
+ /**
26
+ * Create
27
+ * @param appId
28
+ * @param appQuestions
29
+ * @param selector
30
+ * @param options
31
+ *
32
+ * TODO: Add option to generate in <form> or in other <tag>
33
+ */
34
+ private generateForm;
35
+ /**
36
+ * Answer
37
+ * @param appId
38
+ * @returns
39
+ * TODO: Required
40
+ */
41
+ answer(): NativeAnswer[];
42
+ /**
43
+ * Send
44
+ * @returns
45
+ */
46
+ send(): Promise<boolean>;
47
+ }
@@ -0,0 +1,54 @@
1
+ export type Key = string;
2
+ export type InitOptions = {
3
+ url?: string;
4
+ debug?: boolean;
5
+ };
6
+ export type NativeFeedback = {
7
+ appId: string;
8
+ answers: NativeFeedbackAnswer[];
9
+ profile?: NativeFeedbackProfile;
10
+ };
11
+ export type NativeFeedbackAnswer = {
12
+ id: string;
13
+ type?: FEEDBACKAPPANSWERTYPE;
14
+ value: string[];
15
+ };
16
+ export type NativeFeedbackProfile = {
17
+ [key: string]: string;
18
+ };
19
+ export declare enum FEEDBACKAPPANSWERTYPE {
20
+ TEXT = "TEXT",
21
+ LONGTEXT = "LONGTEXT",
22
+ NUMBER = "NUMBER",
23
+ RADIO = "RADIO",
24
+ MULTIPLECHOICE = "MULTIPLECHOICE",
25
+ DATE = "DATE",
26
+ BOOLEAN = "BOOLEAN",
27
+ SELECT = "SELECT"
28
+ }
29
+ export type NativeQuestion = {
30
+ id: string;
31
+ title: string;
32
+ type: FEEDBACKAPPANSWERTYPE;
33
+ ref: string;
34
+ require: boolean;
35
+ external_id: string;
36
+ value: string[];
37
+ defaultValue: string;
38
+ appId: string;
39
+ };
40
+ export type NativeAnswer = {
41
+ key: string;
42
+ value: string[];
43
+ };
44
+ export type generateFormOptions = {
45
+ addButton?: boolean;
46
+ tag?: generateFormOptionsTag;
47
+ afterSubmitEvent?: Function;
48
+ beforeSubmitEvent?: Function;
49
+ };
50
+ declare enum generateFormOptionsTag {
51
+ FORM = "form",
52
+ DIV = "div"
53
+ }
54
+ export {};
@@ -0,0 +1,6 @@
1
+ export declare const endpoints: {
2
+ sdk: {
3
+ app: (appId: string, publicKey: string) => string;
4
+ feedback: string;
5
+ };
6
+ };
@@ -0,0 +1,4 @@
1
+ import { Log } from "../utils/log";
2
+ import { NativeQuestion } from "../models/types";
3
+ export declare function getQuestions(url: string, appId: string, publicKey: string, log: Log): Promise<NativeQuestion[]>;
4
+ export declare function sendFeedback(url: string, body: any, log: Log): Promise<boolean>;
@@ -31,15 +31,14 @@ export type NativeQuestion = {
31
31
  title: string;
32
32
  type: FEEDBACKAPPANSWERTYPE;
33
33
  ref: string;
34
- require: string;
34
+ require: boolean;
35
35
  external_id: string;
36
36
  value: string[];
37
37
  defaultValue: string;
38
38
  appId: string;
39
39
  };
40
40
  export type NativeAnswer = {
41
- id: string;
42
- type: string;
41
+ key: string;
43
42
  value: string[];
44
43
  };
45
44
  export type generateFormOptions = {
@@ -0,0 +1,22 @@
1
+ import { Config } from "../models/config";
2
+ export declare class Log {
3
+ /**
4
+ * Attributes
5
+ */
6
+ private config;
7
+ /**
8
+ *
9
+ * @param config
10
+ */
11
+ constructor(config: Config);
12
+ /**
13
+ *
14
+ * @param args
15
+ */
16
+ log(...args: any[]): void;
17
+ /**
18
+ *
19
+ * @param args
20
+ */
21
+ err(...args: any[]): void;
22
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magicfeedback/native",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "main": "./dist/magicfeedback-sdk.node.js",
5
5
  "browser": "./dist/magicfeedback-sdk.browser.js",
6
6
  "types": "./dist/types/src/index.d.ts",
package/dist/config.js DELETED
@@ -1,5 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.API_URL = void 0;
4
- exports.API_URL = "https://api.magicfeedback.io/";
5
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,+BAA+B,CAAC"}
package/dist/index.js DELETED
@@ -1,12 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const main_1 = __importDefault(require("./main"));
7
- let instance = null;
8
- if (!instance) {
9
- instance = (0, main_1.default)();
10
- }
11
- exports.default = instance;
12
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,kDAA0B;AAE1B,IAAI,QAAQ,GAAmC,IAAI,CAAC;AAEpD,IAAI,CAAC,QAAQ,EAAE;IACb,QAAQ,GAAG,IAAA,cAAI,GAAE,CAAC;CACnB;AAED,kBAAe,QAAS,CAAC"}
package/dist/main.js DELETED
@@ -1,48 +0,0 @@
1
- "use strict";
2
- //import { API_URL } from "./config";
3
- //import { isForNode } from "is-bundling-for-browser-or-node";
4
- //import { Company, Feedback, Key, Options, TrackedEvent, User } from "./types";
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- function main() {
7
- let magicfeedbackKey = undefined;
8
- /*let magicfeedbackKey: string | undefined = undefined;
9
- let magicfeedbackHost: string = API_URL;
10
- let sessionUserId: string | undefined = undefined;
11
- let persistUser: boolean = isForNode ? false : true;
12
- let debug = false;
13
-
14
- /*log("Instance created");
15
-
16
- function getUrl() {
17
- return `${magicfeedbackHost}/${magicfeedbackKey}`;
18
- }
19
-
20
- function log(...args: any[]) {
21
- if (debug) {
22
- console.log("[Bucket]", ...args);
23
- }
24
- }
25
-
26
- function err(...args: any[]): never {
27
- if (debug) {
28
- console.error("[Bucket]", ...args);
29
- }
30
- throw new Error(...args);
31
- }
32
-
33
- //
34
- function init(key: Key, options?: Options) {
35
- if (!key) {
36
- err("Tracking key was not provided");
37
- }
38
- magicfeedbackKey = key;
39
- if (options?.host) magicfeedbackHost = options?.host;
40
- if (typeof options?.persistUser !== "undefined")
41
- persistUser = options?.persistUser;
42
- if (options?.debug) debug = options?.debug;
43
-
44
- log(`initialized with key "${magicfeedbackKey}" and options`, options);
45
- }*/
46
- }
47
- exports.default = main;
48
- //# sourceMappingURL=main.js.map
package/dist/main.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAAA,qCAAqC;AACrC,8DAA8D;AAC9D,gFAAgF;;AAEhF,SAAwB,IAAI;IAC1B,IAAI,gBAAgB,GAAuB,SAAS,CAAC;IACrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAqCG;AACL,CAAC;AAxCD,uBAwCC"}
package/dist/type.js DELETED
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=type.js.map
package/dist/type.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"type.js","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- export declare const API_URL = "https://api.magicfeedback.io/";
@@ -1,5 +0,0 @@
1
- declare const _default: {
2
- init: (options?: import("./types").InitOptions | undefined) => void;
3
- send: (appId: string, answers: import("./types").NativeFeedbackAnswer[], profile?: import("./types").NativeFeedbackProfile | undefined) => Promise<{}>;
4
- };
5
- export default _default;
@@ -1,5 +0,0 @@
1
- import { InitOptions, NativeFeedback } from "./types";
2
- export default function main(): {
3
- init: (options?: InitOptions) => void;
4
- send: (appId: NativeFeedback["appId"], answers: NativeFeedback["answers"], profile?: NativeFeedback["profile"]) => Promise<{}>;
5
- };
@@ -1,35 +0,0 @@
1
- export type Key = string;
2
- export type Options = {
3
- persistUser?: boolean;
4
- host?: string;
5
- debug?: boolean;
6
- };
7
- export type User = {
8
- userId: string;
9
- attributes?: {
10
- name?: string;
11
- [key: string]: any;
12
- };
13
- };
14
- export type Company = {
15
- userId: string;
16
- companyId: string;
17
- attributes?: {
18
- name?: string;
19
- [key: string]: any;
20
- };
21
- };
22
- export type TrackedEvent = {
23
- event: string;
24
- userId: string;
25
- attributes?: {
26
- [key: string]: any;
27
- };
28
- };
29
- export type Feedback = {
30
- featureId: string;
31
- userId: string;
32
- companyId?: string;
33
- score?: number;
34
- comment?: string;
35
- };
@@ -1,27 +0,0 @@
1
- export type Key = string;
2
- export type InitOptions = {
3
- url?: string;
4
- debug?: boolean;
5
- };
6
- export type NativeFeedback = {
7
- appId: string;
8
- answers: NativeFeedbackAnswer[];
9
- profile?: NativeFeedbackProfile;
10
- };
11
- export type NativeFeedbackAnswer = {
12
- id: string;
13
- type?: FEEDBACKAPPANSWERTYPE;
14
- value: string[];
15
- };
16
- export type NativeFeedbackProfile = {
17
- [key: string]: string;
18
- };
19
- export declare enum FEEDBACKAPPANSWERTYPE {
20
- TEXT = "TEXT",
21
- LONGTEXT = "LONGTEXT",
22
- NUMBER = "NUMBER",
23
- RADIO = "RADIO",
24
- MULTIPLECHOICE = "MULTIPLECHOICE",
25
- DATE = "DATE",
26
- BOOLEAN = "BOOLEAN"
27
- }
package/dist/types.js DELETED
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=types.js.map
package/dist/types.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}