@pingux/astro 2.107.0-alpha.1 → 2.107.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/lib/cjs/components/AIComponents/Attachment/Attachment.d.ts +5 -0
  2. package/lib/cjs/components/AIComponents/Attachment/Attachment.js +107 -0
  3. package/lib/cjs/components/AIComponents/Attachment/Attachment.styles.d.ts +22 -0
  4. package/lib/cjs/components/AIComponents/Attachment/Attachment.styles.js +31 -0
  5. package/lib/cjs/components/AIComponents/Attachment/index.d.ts +1 -0
  6. package/lib/cjs/components/AIComponents/Attachment/index.js +14 -0
  7. package/lib/cjs/components/AIComponents/PromptInput/PromptInput.d.ts +4 -0
  8. package/lib/cjs/components/AIComponents/PromptInput/PromptInput.js +147 -0
  9. package/lib/cjs/components/AIComponents/PromptInput/PromptInput.stories.d.ts +10 -0
  10. package/lib/cjs/components/AIComponents/PromptInput/PromptInput.stories.js +74 -0
  11. package/lib/cjs/components/AIComponents/PromptInput/PromptInput.test.d.ts +1 -0
  12. package/lib/cjs/components/AIComponents/PromptInput/PromptInput.test.js +225 -0
  13. package/lib/cjs/components/AIComponents/PromptInput/PromptUploadButton.d.ts +4 -0
  14. package/lib/cjs/components/AIComponents/PromptInput/PromptUploadButton.js +45 -0
  15. package/lib/cjs/components/AIComponents/PromptInput/index.d.ts +1 -0
  16. package/lib/cjs/components/AIComponents/PromptInput/index.js +14 -0
  17. package/lib/cjs/components/FileInputField/FileInputField.js +34 -22
  18. package/lib/cjs/components/FileInputField/FileInputField.test.js +9 -0
  19. package/lib/cjs/components/FileInputField/FileSelectIcon.d.ts +10 -0
  20. package/lib/cjs/components/FileInputField/FileSelectIcon.js +39 -0
  21. package/lib/cjs/index.d.ts +2 -0
  22. package/lib/cjs/index.js +16 -0
  23. package/lib/cjs/styles/themes/next-gen/convertedComponentList.js +1 -1
  24. package/lib/cjs/styles/themes/next-gen/next-gen.d.ts +79 -0
  25. package/lib/cjs/styles/themes/next-gen/variants/button.d.ts +58 -0
  26. package/lib/cjs/styles/themes/next-gen/variants/button.js +34 -1
  27. package/lib/cjs/styles/themes/next-gen/variants/input.js +19 -0
  28. package/lib/cjs/styles/themes/next-gen/variants/variants.d.ts +21 -0
  29. package/lib/cjs/styles/themes/next-gen/variants/variants.js +2 -0
  30. package/lib/cjs/types/promptInput.d.ts +42 -0
  31. package/lib/cjs/types/promptInput.js +6 -0
  32. package/lib/components/AIComponents/Attachment/Attachment.js +98 -0
  33. package/lib/components/AIComponents/Attachment/Attachment.styles.js +23 -0
  34. package/lib/components/AIComponents/Attachment/index.js +1 -0
  35. package/lib/components/AIComponents/PromptInput/PromptInput.js +133 -0
  36. package/lib/components/AIComponents/PromptInput/PromptInput.stories.js +61 -0
  37. package/lib/components/AIComponents/PromptInput/PromptInput.test.js +218 -0
  38. package/lib/components/AIComponents/PromptInput/PromptUploadButton.js +36 -0
  39. package/lib/components/AIComponents/PromptInput/index.js +1 -0
  40. package/lib/components/FileInputField/FileInputField.js +34 -22
  41. package/lib/components/FileInputField/FileInputField.test.js +9 -0
  42. package/lib/components/FileInputField/FileSelectIcon.js +30 -0
  43. package/lib/index.js +2 -0
  44. package/lib/styles/themes/next-gen/convertedComponentList.js +1 -1
  45. package/lib/styles/themes/next-gen/variants/button.js +34 -1
  46. package/lib/styles/themes/next-gen/variants/input.js +19 -0
  47. package/lib/styles/themes/next-gen/variants/variants.js +2 -0
  48. package/lib/types/promptInput.js +1 -0
  49. package/package.json +1 -1
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+
3
+ var _typeof = require("@babel/runtime-corejs3/helpers/typeof");
4
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
5
+ var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");
6
+ var _Object$create = require("@babel/runtime-corejs3/core-js-stable/object/create");
7
+ var _Object$getPrototypeOf = require("@babel/runtime-corejs3/core-js-stable/object/get-prototype-of");
8
+ var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");
9
+ var _Object$setPrototypeOf = require("@babel/runtime-corejs3/core-js-stable/object/set-prototype-of");
10
+ var _Promise = require("@babel/runtime-corejs3/core-js-stable/promise");
11
+ var _reverseInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/reverse");
12
+ var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");
13
+ var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");
14
+ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");
15
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
16
+ var _url = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/url"));
17
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));
18
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
19
+ var _react = _interopRequireWildcard(require("react"));
20
+ var _GlobeIcon = _interopRequireDefault(require("@pingux/mdi-react/GlobeIcon"));
21
+ var _ = require("../../..");
22
+ var _testWrapper = require("../../../utils/testUtils/testWrapper");
23
+ var _Attachment = require("../Attachment/Attachment");
24
+ var _PromptInput = _interopRequireDefault(require("./PromptInput"));
25
+ var _react2 = require("@emotion/react");
26
+ function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
28
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = _Object$defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof _Symbol ? _Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return _Object$defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = _Object$create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = _Object$getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = _Object$create(IteratorPrototype); function defineIteratorMethods(prototype) { var _context7; _forEachInstanceProperty(_context7 = ["next", "throw", "return"]).call(_context7, function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], _forEachInstanceProperty(tryLocsList).call(tryLocsList, pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return _Object$setPrototypeOf ? _Object$setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = _Object$create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = _Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return _reverseInstanceProperty(keys).call(keys), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { var _context8; if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, _forEachInstanceProperty(_context8 = this.tryEntries).call(_context8, resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+_sliceInstanceProperty(name).call(name, 1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
29
+ var testFileURL = 'test-file-url';
30
+ var testFileName = 'chucknorris.png';
31
+ var testFile = new File(['(⌐□_□)'], testFileName, {
32
+ type: 'image/png'
33
+ });
34
+ var onSubmitCallback = jest.fn();
35
+ var onCancelCallback = jest.fn();
36
+ var onChangeCallback = jest.fn();
37
+ var onFileChangeCallback = jest.fn();
38
+ var PromptInputStory = function PromptInputStory(props) {
39
+ var _useState = (0, _react.useState)(''),
40
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
41
+ value = _useState2[0],
42
+ setValue = _useState2[1];
43
+ return (0, _react2.jsx)(_.AstroProvider, {
44
+ themeOverrides: [_.NextGenTheme]
45
+ }, (0, _react2.jsx)(_PromptInput["default"], {
46
+ placeholder: "Enter a prompt here",
47
+ onChange: function onChange(e) {
48
+ setValue(e.target.value);
49
+ onChangeCallback(e);
50
+ },
51
+ onSubmit: onSubmitCallback,
52
+ onCancel: onCancelCallback,
53
+ onFileChange: onFileChangeCallback,
54
+ value: value,
55
+ "data-testid": "testid",
56
+ label: "chat prompt",
57
+ isLoading: props.isLoading,
58
+ attachmentProps: {
59
+ icon: props.attachmentIcon,
60
+ iconWrapperProps: {
61
+ 'data-testid': 'icon-wrapper'
62
+ }
63
+ },
64
+ uploadButtonProps: {
65
+ 'data-testid': 'upload button'
66
+ }
67
+ }));
68
+ };
69
+ var originalValue = _url["default"].createObjectURL;
70
+ beforeAll(function () {
71
+ _url["default"].createObjectURL = jest.fn(function () {
72
+ return testFileURL;
73
+ });
74
+ });
75
+ afterAll(function () {
76
+ _url["default"].createObjectURL = originalValue;
77
+ });
78
+ afterEach(function () {
79
+ jest.resetAllMocks();
80
+ });
81
+ test('prompt is rendered', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
82
+ var input;
83
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
84
+ while (1) switch (_context.prev = _context.next) {
85
+ case 0:
86
+ (0, _testWrapper.render)((0, _react2.jsx)(PromptInputStory, null));
87
+ input = _testWrapper.screen.getByTestId('testid');
88
+ expect(input).toBeInTheDocument();
89
+ case 3:
90
+ case "end":
91
+ return _context.stop();
92
+ }
93
+ }, _callee);
94
+ })));
95
+ test('onChange and value props work correctly', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
96
+ var input, testValue;
97
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
98
+ while (1) switch (_context2.prev = _context2.next) {
99
+ case 0:
100
+ (0, _testWrapper.render)((0, _react2.jsx)(PromptInputStory, null));
101
+ input = _testWrapper.screen.getByTestId('prompt-input');
102
+ testValue = 'test input';
103
+ _testWrapper.fireEvent.change(input, {
104
+ target: {
105
+ value: testValue
106
+ }
107
+ });
108
+ expect(input).toHaveValue(testValue);
109
+ expect(onChangeCallback).toHaveBeenCalledTimes(1);
110
+ case 6:
111
+ case "end":
112
+ return _context2.stop();
113
+ }
114
+ }, _callee2);
115
+ })));
116
+ test('onSubmit prop works correctly', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
117
+ var input, button, testValue;
118
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
119
+ while (1) switch (_context3.prev = _context3.next) {
120
+ case 0:
121
+ (0, _testWrapper.render)((0, _react2.jsx)(PromptInputStory, null));
122
+ input = _testWrapper.screen.getByTestId('prompt-input');
123
+ button = _testWrapper.screen.getByTestId('upload button');
124
+ testValue = 'test input';
125
+ _testWrapper.fireEvent.change(input, {
126
+ target: {
127
+ value: testValue
128
+ }
129
+ });
130
+ _testWrapper.fireEvent.mouseDown(button);
131
+ _testWrapper.fireEvent.mouseUp(button);
132
+ expect(onSubmitCallback).toHaveBeenCalledTimes(1);
133
+ case 8:
134
+ case "end":
135
+ return _context3.stop();
136
+ }
137
+ }, _callee3);
138
+ })));
139
+ test('onCancel prop works correctly', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
140
+ var input, button, testValue;
141
+ return _regeneratorRuntime().wrap(function _callee4$(_context4) {
142
+ while (1) switch (_context4.prev = _context4.next) {
143
+ case 0:
144
+ (0, _testWrapper.render)((0, _react2.jsx)(PromptInputStory, {
145
+ isLoading: true
146
+ }));
147
+ input = _testWrapper.screen.getByTestId('prompt-input');
148
+ button = _testWrapper.screen.getByTestId('upload button');
149
+ testValue = 'test input';
150
+ _testWrapper.fireEvent.change(input, {
151
+ target: {
152
+ value: testValue
153
+ }
154
+ });
155
+ _testWrapper.fireEvent.mouseDown(button);
156
+ _testWrapper.fireEvent.mouseUp(button);
157
+ expect(onCancelCallback).toHaveBeenCalledTimes(1);
158
+ case 8:
159
+ case "end":
160
+ return _context4.stop();
161
+ }
162
+ }, _callee4);
163
+ })));
164
+ test('should add and remove a file attachment', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
165
+ var fileInput, removeButton;
166
+ return _regeneratorRuntime().wrap(function _callee5$(_context5) {
167
+ while (1) switch (_context5.prev = _context5.next) {
168
+ case 0:
169
+ (0, _testWrapper.render)((0, _react2.jsx)(PromptInputStory, {
170
+ attachmentIcon: _GlobeIcon["default"]
171
+ }));
172
+ fileInput = _testWrapper.screen.getAllByLabelText('add attachment')[0];
173
+ _testWrapper.fireEvent.change(fileInput, {
174
+ target: {
175
+ files: [testFile]
176
+ }
177
+ });
178
+ expect(onFileChangeCallback).toHaveBeenCalledTimes(1);
179
+ expect(_testWrapper.screen.getByText(testFileName)).toBeInTheDocument();
180
+ expect(_testWrapper.screen.getByTestId('icon-wrapper')).toBeInTheDocument();
181
+ removeButton = _testWrapper.screen.getByTestId('remove-attachment');
182
+ _testWrapper.fireEvent.mouseDown(removeButton);
183
+ _testWrapper.fireEvent.mouseUp(removeButton);
184
+ expect(onFileChangeCallback).toHaveBeenCalledTimes(2);
185
+ expect(_testWrapper.screen.queryByText(testFileName)).not.toBeInTheDocument();
186
+ expect(_testWrapper.screen.queryByTestId('icon-wrapper')).not.toBeInTheDocument();
187
+ case 12:
188
+ case "end":
189
+ return _context5.stop();
190
+ }
191
+ }, _callee5);
192
+ })));
193
+ test('should use default icon if no icon is provided', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
194
+ var fileInput, removeButton;
195
+ return _regeneratorRuntime().wrap(function _callee6$(_context6) {
196
+ while (1) switch (_context6.prev = _context6.next) {
197
+ case 0:
198
+ (0, _testWrapper.render)((0, _react2.jsx)(PromptInputStory, null));
199
+ fileInput = _testWrapper.screen.getAllByLabelText('add attachment')[0];
200
+ _testWrapper.fireEvent.change(fileInput, {
201
+ target: {
202
+ files: [testFile]
203
+ }
204
+ });
205
+ expect(onFileChangeCallback).toHaveBeenCalledTimes(1);
206
+ expect(_testWrapper.screen.getByText(testFileName)).toBeInTheDocument();
207
+ expect(_testWrapper.screen.getByTestId('icon-wrapper')).toBeInTheDocument();
208
+ removeButton = _testWrapper.screen.getByTestId('remove-attachment');
209
+ _testWrapper.fireEvent.mouseDown(removeButton);
210
+ _testWrapper.fireEvent.mouseUp(removeButton);
211
+ expect(onFileChangeCallback).toHaveBeenCalledTimes(2);
212
+ expect(_testWrapper.screen.queryByText(testFileName)).not.toBeInTheDocument();
213
+ expect(_testWrapper.screen.queryByTestId('icon-wrapper')).not.toBeInTheDocument();
214
+ case 12:
215
+ case "end":
216
+ return _context6.stop();
217
+ }
218
+ }, _callee6);
219
+ })));
220
+ test('regex expression', function () {
221
+ var string = 'alongiflename.txt';
222
+ expect((0, _Attachment.getFileExtension)(string)).toBe('txt');
223
+ var badString = 'alongfilename.rtrtrert...';
224
+ expect((0, _Attachment.getFileExtension)(badString)).toBe('unknown file type');
225
+ });
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { PromptUploadButtonProps } from '../../../types/promptInput';
3
+ declare const PromptUploadButton: (props: PromptUploadButtonProps) => React.JSX.Element;
4
+ export default PromptUploadButton;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
4
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
5
+ _Object$defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+ var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
10
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));
11
+ var _react = _interopRequireDefault(require("react"));
12
+ var _ArrowUpIcon = _interopRequireDefault(require("@pingux/mdi-react/ArrowUpIcon"));
13
+ var _StopIcon = _interopRequireDefault(require("@pingux/mdi-react/StopIcon"));
14
+ var _index = require("../../../index");
15
+ var _react2 = require("@emotion/react");
16
+ var _excluded = ["isLoading", "onCancel", "onSubmit", "value", "uploadButtonContainerProps"];
17
+ var PromptUploadButton = function PromptUploadButton(props) {
18
+ var isLoading = props.isLoading,
19
+ onCancel = props.onCancel,
20
+ onSubmit = props.onSubmit,
21
+ value = props.value,
22
+ uploadButtonContainerProps = props.uploadButtonContainerProps,
23
+ others = (0, _objectWithoutProperties2["default"])(props, _excluded);
24
+ var onPress = function onPress(e) {
25
+ if (isLoading && onCancel) {
26
+ onCancel(e);
27
+ } else if (onSubmit) {
28
+ onSubmit(e);
29
+ }
30
+ };
31
+ return (0, _react2.jsx)(_index.Box, uploadButtonContainerProps, (0, _react2.jsx)(_index.IconButton, (0, _extends2["default"])({
32
+ "aria-label": "upload chat",
33
+ isDisabled: !isLoading && value.length === 0,
34
+ variant: "inverted",
35
+ sx: {
36
+ size: '24px'
37
+ },
38
+ onPress: onPress
39
+ }, others), (0, _react2.jsx)(_index.Icon, {
40
+ size: "xs",
41
+ icon: isLoading ? _StopIcon["default"] : _ArrowUpIcon["default"]
42
+ })));
43
+ };
44
+ var _default = PromptUploadButton;
45
+ exports["default"] = _default;
@@ -0,0 +1 @@
1
+ export { default } from './PromptInput';
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
4
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
5
+ _Object$defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ _Object$defineProperty(exports, "default", {
9
+ enumerable: true,
10
+ get: function get() {
11
+ return _PromptInput["default"];
12
+ }
13
+ });
14
+ var _PromptInput = _interopRequireDefault(require("./PromptInput"));
@@ -41,8 +41,9 @@ var _fieldAttributes = require("../../utils/docUtils/fieldAttributes");
41
41
  var _statusProp = require("../../utils/docUtils/statusProp");
42
42
  var _FileItem = _interopRequireDefault(require("./FileItem"));
43
43
  var _FileSelect = _interopRequireDefault(require("./FileSelect"));
44
+ var _FileSelectIcon = _interopRequireDefault(require("./FileSelectIcon"));
44
45
  var _react2 = require("@emotion/react");
45
- var _excluded = ["defaultButtonText", "defaultFileList", "fileList", "helperText", "isDisabled", "isLoading", "isMultiple", "onFileSelect", "onRemove", "status", "textProps"];
46
+ var _excluded = ["buttonProps", "defaultButtonText", "defaultFileList", "fileList", "helperText", "iconContainerProps", "iconProps", "isDisabled", "isIconButton", "isLoading", "isMultiple", "label", "onFileSelect", "onRemove", "status", "textProps"];
46
47
  function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
47
48
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
48
49
  function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty2(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
@@ -52,19 +53,24 @@ var FILE_CHANGE_STATUS = {
52
53
  ADDED: 'added',
53
54
  DELETED: 'deleted'
54
55
  };
55
- var FileInputField = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
56
- var defaultButtonText = _ref.defaultButtonText,
57
- defaultFileList = _ref.defaultFileList,
58
- uploadedFilesImperative = _ref.fileList,
59
- helperText = _ref.helperText,
60
- isDisabled = _ref.isDisabled,
61
- isLoading = _ref.isLoading,
62
- isMultiple = _ref.isMultiple,
63
- onFileSelect = _ref.onFileSelect,
64
- onRemove = _ref.onRemove,
65
- status = _ref.status,
66
- textProps = _ref.textProps,
67
- others = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
56
+ var FileInputField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
57
+ var buttonProps = props.buttonProps,
58
+ defaultButtonText = props.defaultButtonText,
59
+ defaultFileList = props.defaultFileList,
60
+ uploadedFilesImperative = props.fileList,
61
+ helperText = props.helperText,
62
+ iconContainerProps = props.iconContainerProps,
63
+ iconProps = props.iconProps,
64
+ isDisabled = props.isDisabled,
65
+ isIconButton = props.isIconButton,
66
+ isLoading = props.isLoading,
67
+ isMultiple = props.isMultiple,
68
+ label = props.label,
69
+ onFileSelect = props.onFileSelect,
70
+ onRemove = props.onRemove,
71
+ status = props.status,
72
+ textProps = props.textProps,
73
+ others = (0, _objectWithoutProperties2["default"])(props, _excluded);
68
74
  var _useState = (0, _react.useState)(defaultFileList || []),
69
75
  _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
70
76
  uploadedFiles = _useState2[0],
@@ -87,8 +93,9 @@ var FileInputField = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
87
93
  nonAriaProps = _getAriaAttributeProp.nonAriaProps;
88
94
  var _useField = (0, _useField2["default"])(_objectSpread({
89
95
  status: status,
90
- isDisabled: isDisabled
91
- }, nonAriaProps)),
96
+ isDisabled: isDisabled,
97
+ label: label
98
+ }, props)),
92
99
  fieldContainerProps = _useField.fieldContainerProps,
93
100
  fieldControlInputProps = _useField.fieldControlInputProps,
94
101
  fieldControlWrapperProps = _useField.fieldControlWrapperProps,
@@ -166,8 +173,8 @@ var FileInputField = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
166
173
  onRemove(e, fileId);
167
174
  }
168
175
  setUploadedFiles(function (prevFiles) {
169
- return (0, _filter["default"])(prevFiles).call(prevFiles, function (_ref2) {
170
- var id = _ref2.id;
176
+ return (0, _filter["default"])(prevFiles).call(prevFiles, function (_ref) {
177
+ var id = _ref.id;
171
178
  return id !== fileId;
172
179
  });
173
180
  });
@@ -206,7 +213,7 @@ var FileInputField = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
206
213
  }, [uploadedFiles, uploadedFilesImperative, isMultiple]);
207
214
  return (0, _react2.jsx)(_.Box, {
208
215
  fieldContainerProps: fieldContainerProps
209
- }, (0, _react2.jsx)(_.Label, fieldLabelProps), (0, _react2.jsx)(_.Box, (0, _extends2["default"])({
216
+ }, label && (0, _react2.jsx)(_.Label, fieldLabelProps), (0, _react2.jsx)(_.Box, (0, _extends2["default"])({
210
217
  variant: "forms.fileInputField.wrapper"
211
218
  }, (0, _pendoID.getPendoID)(displayName), (0, _reactAria.mergeProps)(fieldControlWrapperProps, nonAriaProps), {
212
219
  className: classNames
@@ -214,17 +221,22 @@ var FileInputField = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
214
221
  // to pass accessibility test, this removes focusable dependents
215
222
  role: "none"
216
223
  }), (0, _react2.jsx)(_.Input, (0, _extends2["default"])({}, (0, _reactAria.mergeProps)(visuallyHiddenProps, fieldControlInputProps, getInputProps()), {
217
- "aria-label": "File Input",
218
224
  multiple: isMultiple,
219
225
  onChange: handleOnChange,
220
226
  ref: inputRef,
221
227
  type: "file"
222
- })), filesListNode, shouldFileSelectRender() && (0, _react2.jsx)(_FileSelect["default"], (0, _extends2["default"])({
228
+ })), filesListNode, shouldFileSelectRender() && (isIconButton ? (0, _react2.jsx)(_FileSelectIcon["default"], (0, _extends2["default"])({
229
+ handleFileSelect: handleFileSelect,
230
+ iconContainerProps: iconContainerProps,
231
+ buttonProps: buttonProps,
232
+ iconProps: iconProps,
233
+ isDisabled: isDisabled || isLoading
234
+ }, ariaProps)) : (0, _react2.jsx)(_FileSelect["default"], (0, _extends2["default"])({
223
235
  buttonText: defaultButtonText,
224
236
  handleFileSelect: handleFileSelect,
225
237
  isDisabled: isDisabled || isLoading,
226
238
  textProps: textProps
227
- }, ariaProps)), isLoading && (0, _react2.jsx)(_.Loader, {
239
+ }, ariaProps))), isLoading && (0, _react2.jsx)(_.Loader, {
228
240
  color: "active",
229
241
  sx: {
230
242
  position: 'absolute'
@@ -212,4 +212,13 @@ test('should display helper text if passed', function () {
212
212
  helperText: testHelperText
213
213
  });
214
214
  expect(_react2.screen.getByText(testHelperText)).toBeInTheDocument();
215
+ });
216
+ test('should render icon button if isIconButton prop is true', function () {
217
+ getComponent({
218
+ isIconButton: true
219
+ });
220
+ var iconButton = _react2.screen.getByRole('button', {
221
+ name: 'Add File Icon'
222
+ });
223
+ expect(iconButton).toBeInTheDocument();
215
224
  });
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { ButtonProps, IconProps } from '../../index';
3
+ interface FileSelectIconProps {
4
+ handleFileSelect: () => void;
5
+ iconContainerProps: object;
6
+ buttonProps: ButtonProps;
7
+ iconProps: IconProps;
8
+ }
9
+ declare const FileSelectIcon: (props: FileSelectIconProps) => React.JSX.Element;
10
+ export default FileSelectIcon;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
4
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
5
+ _Object$defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+ var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
10
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));
11
+ var _react = _interopRequireDefault(require("react"));
12
+ var _reactAria = require("react-aria");
13
+ var _AddIcon = _interopRequireDefault(require("@pingux/mdi-react/AddIcon"));
14
+ var _index = require("../../index");
15
+ var _react2 = require("@emotion/react");
16
+ var _excluded = ["handleFileSelect", "iconContainerProps", "buttonProps", "iconProps"];
17
+ /* eslint-disable @typescript-eslint/no-explicit-any */
18
+ var FileSelectIcon = function FileSelectIcon(props) {
19
+ var handleFileSelect = props.handleFileSelect,
20
+ iconContainerProps = props.iconContainerProps,
21
+ buttonProps = props.buttonProps,
22
+ iconProps = props.iconProps,
23
+ others = (0, _objectWithoutProperties2["default"])(props, _excluded);
24
+ return (0, _react2.jsx)(_index.Box, iconContainerProps, (0, _react2.jsx)(_index.IconButton, (0, _extends2["default"])({
25
+ onPress: handleFileSelect
26
+ }, (0, _reactAria.mergeProps)(buttonProps, others)), (0, _react2.jsx)(_index.Icon, (0, _extends2["default"])({
27
+ title: {
28
+ name: 'Add File Icon'
29
+ },
30
+ icon: _AddIcon["default"],
31
+ sx: {
32
+ borderRadius: '50%',
33
+ border: '2px solid',
34
+ borderColor: 'gray-800'
35
+ }
36
+ }, iconProps))));
37
+ };
38
+ var _default = FileSelectIcon;
39
+ exports["default"] = _default;
@@ -8,7 +8,9 @@ export { default as AccordionItem } from './components/AccordionItem';
8
8
  export * from './components/AccordionItem';
9
9
  export { default as AIPanel } from './components/AIComponents/AIPanel/AIPanel';
10
10
  export { default as AIPanelHeader } from './components/AIComponents/AIPanel/AIPanelHeader';
11
+ export { default as Attachment } from './components/AIComponents/Attachment';
11
12
  export { default as Prompt } from './components/AIComponents/Prompt';
13
+ export { default as PromptInput } from './components/AIComponents/PromptInput';
12
14
  export { default as Response } from './components/AIComponents/Response';
13
15
  export { default as ResponseAttachment } from './components/AIComponents/Response/ResponseAttachment';
14
16
  export { default as ResponseList } from './components/AIComponents/Response/ResponseList';
package/lib/cjs/index.js CHANGED
@@ -18,7 +18,9 @@ var _exportNames = {
18
18
  AccordionItem: true,
19
19
  AIPanel: true,
20
20
  AIPanelHeader: true,
21
+ Attachment: true,
21
22
  Prompt: true,
23
+ PromptInput: true,
22
24
  Response: true,
23
25
  ResponseAttachment: true,
24
26
  ResponseList: true,
@@ -206,6 +208,12 @@ _Object$defineProperty(exports, "AstroWrapper", {
206
208
  return _AstroProvider["default"];
207
209
  }
208
210
  });
211
+ _Object$defineProperty(exports, "Attachment", {
212
+ enumerable: true,
213
+ get: function get() {
214
+ return _Attachment["default"];
215
+ }
216
+ });
209
217
  _Object$defineProperty(exports, "Avatar", {
210
218
  enumerable: true,
211
219
  get: function get() {
@@ -716,6 +724,12 @@ _Object$defineProperty(exports, "Prompt", {
716
724
  return _Prompt["default"];
717
725
  }
718
726
  });
727
+ _Object$defineProperty(exports, "PromptInput", {
728
+ enumerable: true,
729
+ get: function get() {
730
+ return _PromptInput["default"];
731
+ }
732
+ });
719
733
  _Object$defineProperty(exports, "Radio", {
720
734
  enumerable: true,
721
735
  get: function get() {
@@ -1042,7 +1056,9 @@ _forEachInstanceProperty(_context4 = _Object$keys(_AccordionItem)).call(_context
1042
1056
  });
1043
1057
  var _AIPanel = _interopRequireDefault(require("./components/AIComponents/AIPanel/AIPanel"));
1044
1058
  var _AIPanelHeader = _interopRequireDefault(require("./components/AIComponents/AIPanel/AIPanelHeader"));
1059
+ var _Attachment = _interopRequireDefault(require("./components/AIComponents/Attachment"));
1045
1060
  var _Prompt = _interopRequireDefault(require("./components/AIComponents/Prompt"));
1061
+ var _PromptInput = _interopRequireDefault(require("./components/AIComponents/PromptInput"));
1046
1062
  var _Response = _interopRequireDefault(require("./components/AIComponents/Response"));
1047
1063
  var _ResponseAttachment = _interopRequireDefault(require("./components/AIComponents/Response/ResponseAttachment"));
1048
1064
  var _ResponseList = _interopRequireDefault(require("./components/AIComponents/Response/ResponseList"));
@@ -17,7 +17,7 @@ var componentSpecificNextGenBlacklist = {
17
17
  OverlayPanel: ['Expandable']
18
18
  };
19
19
  exports.componentSpecificNextGenBlacklist = componentSpecificNextGenBlacklist;
20
- var nextGenOnlyComponents = ['NavigationHeader', 'Prompt', 'AI Panel', 'Response', 'Suggestions'];
20
+ var nextGenOnlyComponents = ['NavigationHeader', 'Prompt', 'AI Panel', 'Response', 'Suggestions', 'Prompt Input'];
21
21
  exports.nextGenOnlyComponents = nextGenOnlyComponents;
22
22
  var _default = nextGenConvertedComponents;
23
23
  exports["default"] = _default;