@constructor-io/constructorio-ui-quizzes 1.17.6 → 1.17.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.
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  const react_1 = tslib_1.__importDefault(require("react"));
5
- function CloseSVG() {
6
- return (react_1.default.createElement("svg", { width: '24', height: '24', viewBox: '0 0 24 24', fill: 'none', xmlns: 'http://www.w3.org/2000/svg' },
5
+ function CloseSVG(props) {
6
+ return (react_1.default.createElement("svg", Object.assign({}, props, { role: 'button', "aria-label": 'Close', width: '24', height: '24', viewBox: '0 0 24 24', fill: 'none', xmlns: 'http://www.w3.org/2000/svg' }),
7
7
  react_1.default.createElement("path", { d: 'M18.4748 4.11089C18.8653 3.72036 19.4985 3.72036 19.889 4.11089C20.2795 4.50141 20.2795 5.13458 19.889 5.5251L5.52503 19.8891C5.13451 20.2796 4.50134 20.2796 4.11082 19.8891C3.72029 19.4985 3.72029 18.8654 4.11082 18.4748L18.4748 4.11089Z', fill: '#505A75' }),
8
8
  react_1.default.createElement("path", { d: 'M4.11076 5.5251C3.72024 5.13458 3.72024 4.50141 4.11076 4.11089C4.50129 3.72036 5.13445 3.72036 5.52498 4.11089L19.8889 18.4748C20.2795 18.8654 20.2795 19.4985 19.8889 19.8891C19.4984 20.2796 18.8652 20.2796 18.4747 19.8891L4.11076 5.5251Z', fill: '#505A75' })));
9
9
  }
@@ -4,10 +4,12 @@ const tslib_1 = require("tslib");
4
4
  const react_1 = tslib_1.__importStar(require("react"));
5
5
  const CheckMarkCircleSVG_1 = tslib_1.__importDefault(require("./CheckMarkCircleSVG"));
6
6
  const AlertCircleSVG_1 = tslib_1.__importDefault(require("./AlertCircleSVG"));
7
+ const Toaster_1 = tslib_1.__importDefault(require("./Toaster"));
7
8
  function EmailField({ onSubmit }) {
8
9
  const [formError, setFormError] = (0, react_1.useState)(null);
9
10
  const [isSubmitted, setIsSubmitted] = (0, react_1.useState)(false);
10
11
  const [email, setEmail] = (0, react_1.useState)('');
12
+ const [showNotification, setShowNotification] = react_1.default.useState(false);
11
13
  const validate = () => {
12
14
  if (email.length > 0 && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
13
15
  setFormError(null);
@@ -32,19 +34,24 @@ function EmailField({ onSubmit }) {
32
34
  });
33
35
  }
34
36
  });
37
+ const onCloseToaster = () => {
38
+ setShowNotification(false);
39
+ setIsSubmitted(false);
40
+ setFormError(null);
41
+ };
42
+ (0, react_1.useEffect)(() => {
43
+ if (isSubmitted || (formError === null || formError === void 0 ? void 0 : formError.type) === 'callback') {
44
+ setShowNotification(true);
45
+ }
46
+ }, [isSubmitted, formError === null || formError === void 0 ? void 0 : formError.type]);
35
47
  return (react_1.default.createElement("div", { className: 'cio-share-results-feature-group' },
36
48
  react_1.default.createElement("form", { onSubmit: handleSubmit },
37
49
  react_1.default.createElement("div", { className: 'cio-share-results-description' }, "Share by email"),
38
50
  react_1.default.createElement("div", { className: 'cio-share-results-button-group' },
39
51
  react_1.default.createElement("div", { className: 'cio-share-results-email-input-group' },
40
- react_1.default.createElement("input", { className: `cio-share-results-email-input ${formError ? 'cio-share-results-email-input--error' : ''}`, onChange: (e) => setEmail(e.target.value) }),
52
+ react_1.default.createElement("input", { className: `cio-share-results-email-input ${formError ? 'cio-share-results-email-input--error' : ''}`, onChange: (e) => setEmail(e.target.value), placeholder: 'Enter an email address to receive and share the results' }),
41
53
  (formError === null || formError === void 0 ? void 0 : formError.type) === 'validate' && (react_1.default.createElement("div", { className: 'cio-share-results-email-input-error-message' }, formError.message))),
42
54
  react_1.default.createElement("button", { className: 'cio-share-results-share-button', type: 'submit' }, "Send"))),
43
- isSubmitted && (react_1.default.createElement("div", { className: 'cio-share-results-notification' },
44
- react_1.default.createElement(CheckMarkCircleSVG_1.default, null),
45
- react_1.default.createElement("div", null, "Email sent"))),
46
- (formError === null || formError === void 0 ? void 0 : formError.type) === 'callback' && (react_1.default.createElement("div", { className: 'cio-share-results-notification' },
47
- react_1.default.createElement(AlertCircleSVG_1.default, null),
48
- react_1.default.createElement("div", null, formError.message)))));
55
+ showNotification && (react_1.default.createElement(Toaster_1.default, { icon: isSubmitted ? CheckMarkCircleSVG_1.default : AlertCircleSVG_1.default, message: isSubmitted ? 'Email sent' : formError === null || formError === void 0 ? void 0 : formError.message, onCloseToaster: onCloseToaster }))));
49
56
  }
50
57
  exports.default = EmailField;
@@ -4,9 +4,21 @@ const tslib_1 = require("tslib");
4
4
  const react_1 = tslib_1.__importStar(require("react"));
5
5
  const CheckMarkCircleSVG_1 = tslib_1.__importDefault(require("./CheckMarkCircleSVG"));
6
6
  const AlertCircleSVG_1 = tslib_1.__importDefault(require("./AlertCircleSVG"));
7
+ const Toaster_1 = tslib_1.__importDefault(require("./Toaster"));
7
8
  function LinkField({ url }) {
8
9
  const [isCopied, setIsCopied] = (0, react_1.useState)(false);
9
10
  const [isError, setIsError] = (0, react_1.useState)(false);
11
+ const [showNotification, setShowNotification] = react_1.default.useState(false);
12
+ const onCloseToaster = () => {
13
+ setShowNotification(false);
14
+ setIsCopied(false);
15
+ setIsError(false);
16
+ };
17
+ (0, react_1.useEffect)(() => {
18
+ if (isCopied || isError) {
19
+ setShowNotification(true);
20
+ }
21
+ }, [isCopied, isError]);
10
22
  return (react_1.default.createElement("div", { className: 'cio-share-results-feature-group' },
11
23
  react_1.default.createElement("div", { className: 'cio-share-results-description' }, "Share by link"),
12
24
  react_1.default.createElement("div", { className: 'cio-share-results-button-group' },
@@ -20,11 +32,8 @@ function LinkField({ url }) {
20
32
  setIsError(true);
21
33
  }
22
34
  } }, "Copy link")),
23
- isCopied && (react_1.default.createElement("div", { className: 'cio-share-results-notification' },
24
- react_1.default.createElement(CheckMarkCircleSVG_1.default, null),
25
- react_1.default.createElement("div", null, "Link copied to clipboard"))),
26
- isError && (react_1.default.createElement("div", { className: 'cio-share-results-notification' },
27
- react_1.default.createElement(AlertCircleSVG_1.default, null),
28
- react_1.default.createElement("div", null, "Sorry, there was an error copying. Please try again.")))));
35
+ showNotification && (react_1.default.createElement(Toaster_1.default, { icon: isCopied ? CheckMarkCircleSVG_1.default : AlertCircleSVG_1.default, message: isCopied
36
+ ? 'Link copied to clipboard'
37
+ : 'Sorry, there was an error copying. Please try again.', onCloseToaster: onCloseToaster }))));
29
38
  }
30
39
  exports.default = LinkField;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const React = tslib_1.__importStar(require("react"));
5
+ const CloseSVG_1 = tslib_1.__importDefault(require("./CloseSVG"));
6
+ function Toaster(props) {
7
+ const { icon: Icon, message, onCloseToaster } = props;
8
+ return (React.createElement("div", { className: 'cio-share-results-notification' },
9
+ React.createElement(Icon, null),
10
+ React.createElement("div", null, message),
11
+ React.createElement(CloseSVG_1.default, { className: 'cio-toaster-close-button', onClick: () => onCloseToaster() })));
12
+ }
13
+ exports.default = Toaster;
package/lib/cjs/utils.js CHANGED
@@ -177,6 +177,9 @@ function formatMatchedOptions(options, separator, lastSeparator) {
177
177
  if (!options.length || !separator || !lastSeparator) {
178
178
  return '';
179
179
  }
180
+ if (options.length === 1) {
181
+ return options[0];
182
+ }
180
183
  const firstPart = options.slice(0, -1).join(separator);
181
184
  return [firstPart, lastSeparator, options.at(-1)].join('');
182
185
  }
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = '1.17.6';
3
+ exports.default = '1.17.8';
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
- export default function CloseSVG() {
3
- return (React.createElement("svg", { width: '24', height: '24', viewBox: '0 0 24 24', fill: 'none', xmlns: 'http://www.w3.org/2000/svg' },
2
+ export default function CloseSVG(props) {
3
+ return (React.createElement("svg", { ...props, role: 'button', "aria-label": 'Close', width: '24', height: '24', viewBox: '0 0 24 24', fill: 'none', xmlns: 'http://www.w3.org/2000/svg' },
4
4
  React.createElement("path", { d: 'M18.4748 4.11089C18.8653 3.72036 19.4985 3.72036 19.889 4.11089C20.2795 4.50141 20.2795 5.13458 19.889 5.5251L5.52503 19.8891C5.13451 20.2796 4.50134 20.2796 4.11082 19.8891C3.72029 19.4985 3.72029 18.8654 4.11082 18.4748L18.4748 4.11089Z', fill: '#505A75' }),
5
5
  React.createElement("path", { d: 'M4.11076 5.5251C3.72024 5.13458 3.72024 4.50141 4.11076 4.11089C4.50129 3.72036 5.13445 3.72036 5.52498 4.11089L19.8889 18.4748C20.2795 18.8654 20.2795 19.4985 19.8889 19.8891C19.4984 20.2796 18.8652 20.2796 18.4747 19.8891L4.11076 5.5251Z', fill: '#505A75' })));
6
6
  }
@@ -1,10 +1,12 @@
1
- import React, { useState } from 'react';
1
+ import React, { useEffect, useState } from 'react';
2
2
  import CheckMarkCircleSVG from './CheckMarkCircleSVG';
3
3
  import AlertCircleSVG from './AlertCircleSVG';
4
+ import Toaster from './Toaster';
4
5
  export default function EmailField({ onSubmit }) {
5
6
  const [formError, setFormError] = useState(null);
6
7
  const [isSubmitted, setIsSubmitted] = useState(false);
7
8
  const [email, setEmail] = useState('');
9
+ const [showNotification, setShowNotification] = React.useState(false);
8
10
  const validate = () => {
9
11
  if (email.length > 0 && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
10
12
  setFormError(null);
@@ -29,18 +31,23 @@ export default function EmailField({ onSubmit }) {
29
31
  });
30
32
  }
31
33
  };
34
+ const onCloseToaster = () => {
35
+ setShowNotification(false);
36
+ setIsSubmitted(false);
37
+ setFormError(null);
38
+ };
39
+ useEffect(() => {
40
+ if (isSubmitted || formError?.type === 'callback') {
41
+ setShowNotification(true);
42
+ }
43
+ }, [isSubmitted, formError?.type]);
32
44
  return (React.createElement("div", { className: 'cio-share-results-feature-group' },
33
45
  React.createElement("form", { onSubmit: handleSubmit },
34
46
  React.createElement("div", { className: 'cio-share-results-description' }, "Share by email"),
35
47
  React.createElement("div", { className: 'cio-share-results-button-group' },
36
48
  React.createElement("div", { className: 'cio-share-results-email-input-group' },
37
- React.createElement("input", { className: `cio-share-results-email-input ${formError ? 'cio-share-results-email-input--error' : ''}`, onChange: (e) => setEmail(e.target.value) }),
49
+ React.createElement("input", { className: `cio-share-results-email-input ${formError ? 'cio-share-results-email-input--error' : ''}`, onChange: (e) => setEmail(e.target.value), placeholder: 'Enter an email address to receive and share the results' }),
38
50
  formError?.type === 'validate' && (React.createElement("div", { className: 'cio-share-results-email-input-error-message' }, formError.message))),
39
51
  React.createElement("button", { className: 'cio-share-results-share-button', type: 'submit' }, "Send"))),
40
- isSubmitted && (React.createElement("div", { className: 'cio-share-results-notification' },
41
- React.createElement(CheckMarkCircleSVG, null),
42
- React.createElement("div", null, "Email sent"))),
43
- formError?.type === 'callback' && (React.createElement("div", { className: 'cio-share-results-notification' },
44
- React.createElement(AlertCircleSVG, null),
45
- React.createElement("div", null, formError.message)))));
52
+ showNotification && (React.createElement(Toaster, { icon: isSubmitted ? CheckMarkCircleSVG : AlertCircleSVG, message: isSubmitted ? 'Email sent' : formError?.message, onCloseToaster: onCloseToaster }))));
46
53
  }
@@ -1,9 +1,21 @@
1
- import React, { useState } from 'react';
1
+ import React, { useEffect, useState } from 'react';
2
2
  import CheckMarkCircleSVG from './CheckMarkCircleSVG';
3
3
  import AlertCircleSVG from './AlertCircleSVG';
4
+ import Toaster from './Toaster';
4
5
  export default function LinkField({ url }) {
5
6
  const [isCopied, setIsCopied] = useState(false);
6
7
  const [isError, setIsError] = useState(false);
8
+ const [showNotification, setShowNotification] = React.useState(false);
9
+ const onCloseToaster = () => {
10
+ setShowNotification(false);
11
+ setIsCopied(false);
12
+ setIsError(false);
13
+ };
14
+ useEffect(() => {
15
+ if (isCopied || isError) {
16
+ setShowNotification(true);
17
+ }
18
+ }, [isCopied, isError]);
7
19
  return (React.createElement("div", { className: 'cio-share-results-feature-group' },
8
20
  React.createElement("div", { className: 'cio-share-results-description' }, "Share by link"),
9
21
  React.createElement("div", { className: 'cio-share-results-button-group' },
@@ -17,10 +29,7 @@ export default function LinkField({ url }) {
17
29
  setIsError(true);
18
30
  }
19
31
  } }, "Copy link")),
20
- isCopied && (React.createElement("div", { className: 'cio-share-results-notification' },
21
- React.createElement(CheckMarkCircleSVG, null),
22
- React.createElement("div", null, "Link copied to clipboard"))),
23
- isError && (React.createElement("div", { className: 'cio-share-results-notification' },
24
- React.createElement(AlertCircleSVG, null),
25
- React.createElement("div", null, "Sorry, there was an error copying. Please try again.")))));
32
+ showNotification && (React.createElement(Toaster, { icon: isCopied ? CheckMarkCircleSVG : AlertCircleSVG, message: isCopied
33
+ ? 'Link copied to clipboard'
34
+ : 'Sorry, there was an error copying. Please try again.', onCloseToaster: onCloseToaster }))));
26
35
  }
@@ -0,0 +1,9 @@
1
+ import * as React from 'react';
2
+ import CloseSVG from './CloseSVG';
3
+ export default function Toaster(props) {
4
+ const { icon: Icon, message, onCloseToaster } = props;
5
+ return (React.createElement("div", { className: 'cio-share-results-notification' },
6
+ React.createElement(Icon, null),
7
+ React.createElement("div", null, message),
8
+ React.createElement(CloseSVG, { className: 'cio-toaster-close-button', onClick: () => onCloseToaster() })));
9
+ }
package/lib/mjs/utils.js CHANGED
@@ -157,6 +157,9 @@ export function formatMatchedOptions(options, separator, lastSeparator) {
157
157
  if (!options.length || !separator || !lastSeparator) {
158
158
  return '';
159
159
  }
160
+ if (options.length === 1) {
161
+ return options[0];
162
+ }
160
163
  const firstPart = options.slice(0, -1).join(separator);
161
164
  return [firstPart, lastSeparator, options.at(-1)].join('');
162
165
  }
@@ -1 +1 @@
1
- export default '1.17.6';
1
+ export default '1.17.8';
package/lib/styles.css CHANGED
@@ -1026,6 +1026,12 @@
1026
1026
  gap: 12px;
1027
1027
  }
1028
1028
 
1029
+ .cio-quiz .cio-share-results-notification .cio-toaster-close-button{
1030
+ margin-left: auto;
1031
+ cursor: pointer;
1032
+ width: 16px;
1033
+ }
1034
+
1029
1035
  .cio-quiz .cio-share-results-link-input {
1030
1036
  font-size: 1rem;
1031
1037
  padding: 12px 20px;
@@ -1,2 +1,2 @@
1
1
  /// <reference types="react" />
2
- export default function CloseSVG(): JSX.Element;
2
+ export default function CloseSVG(props: any): JSX.Element;
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ export interface NotificationProps {
3
+ icon: (props: any) => JSX.Element;
4
+ message?: string;
5
+ onCloseToaster: () => void;
6
+ }
7
+ export default function Toaster(props: NotificationProps): JSX.Element;
@@ -1,2 +1,2 @@
1
- declare const _default: "1.17.6";
1
+ declare const _default: "1.17.8";
2
2
  export default _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@constructor-io/constructorio-ui-quizzes",
3
- "version": "1.17.6",
3
+ "version": "1.17.8",
4
4
  "description": "Constructor.io Quizzes UI library for web applications",
5
5
  "author": "constructor.io",
6
6
  "license": "MIT",