@constructor-io/constructorio-ui-quizzes 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/lib/cjs/components/CioQuiz/index.js +9 -0
- package/lib/cjs/components/ResultCard/ResultCard.js +37 -15
- package/lib/cjs/components/ResultContainer/ResultContainer.js +15 -3
- package/lib/cjs/components/ResultCtaButton/ResultCtaButton.js +20 -2
- package/lib/cjs/components/Results/Results.js +2 -2
- package/lib/cjs/utils.js +2 -1
- package/lib/mjs/components/CioQuiz/index.js +9 -0
- package/lib/mjs/components/ResultCard/ResultCard.js +32 -14
- package/lib/mjs/components/ResultContainer/ResultContainer.js +15 -3
- package/lib/mjs/components/ResultCtaButton/ResultCtaButton.js +19 -2
- package/lib/mjs/components/Results/Results.js +1 -1
- package/lib/mjs/utils.js +2 -1
- package/lib/types/components/CioQuiz/context.d.ts +4 -2
- package/lib/types/components/ResultCard/ResultCard.d.ts +1 -0
- package/lib/types/components/ResultCtaButton/ResultCtaButton.d.ts +1 -0
- package/lib/types/hooks/useCioClient.d.ts +1 -1
- package/lib/types/types.d.ts +1 -1
- package/lib/types/utils.d.ts +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# Constructor.io Quizzes UI Library
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@constructor-io/constructorio-ui-quizzes)
|
|
4
|
+
[](https://github.com/Constructor-io/constructorio-ui-quizzes/blob/main/LICENSE)
|
|
5
|
+
|
|
3
6
|
A UI Library that provides React components to manage the fetching and rendering logic for [Constructor.io's Quizzes](https://constructor.io/products/quizzes/).
|
|
4
7
|
|
|
5
8
|
## Introduction
|
|
@@ -17,6 +17,14 @@ function CioQuiz(props) {
|
|
|
17
17
|
// eslint-disable-next-line no-console
|
|
18
18
|
console.error('quizId is a required field of type string');
|
|
19
19
|
}
|
|
20
|
+
if (!resultsPageOptions || Object.keys(resultsPageOptions).length === 0) {
|
|
21
|
+
// eslint-disable-next-line no-console
|
|
22
|
+
console.error('resultsPageOptions is a required field of type object');
|
|
23
|
+
}
|
|
24
|
+
if (resultsPageOptions && !(resultsPageOptions === null || resultsPageOptions === void 0 ? void 0 : resultsPageOptions.addToCartCallback)) {
|
|
25
|
+
// eslint-disable-next-line no-console
|
|
26
|
+
console.error('resultsPageOptions.addToCartCallback is a required field of type function');
|
|
27
|
+
}
|
|
20
28
|
const cioClient = (0, useCioClient_1.default)({ apiKey, cioJsClient });
|
|
21
29
|
const [state, dispatch] = (0, react_1.useReducer)(reducer_1.default, reducer_1.initialState);
|
|
22
30
|
const [requestState, setRequestState] = (0, react_1.useState)(constants_1.RequestStates.Stale);
|
|
@@ -44,6 +52,7 @@ function CioQuiz(props) {
|
|
|
44
52
|
isFirstQuestion,
|
|
45
53
|
quizNextHandler,
|
|
46
54
|
quizBackHandler,
|
|
55
|
+
cioClient,
|
|
47
56
|
};
|
|
48
57
|
(0, react_1.useEffect)(() => {
|
|
49
58
|
(() => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
@@ -1,23 +1,45 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
|
-
const react_1 = tslib_1.
|
|
4
|
+
const react_1 = tslib_1.__importStar(require("react"));
|
|
5
5
|
const ResultCtaButton_1 = tslib_1.__importDefault(require("../ResultCtaButton/ResultCtaButton"));
|
|
6
|
+
const context_1 = tslib_1.__importDefault(require("../CioQuiz/context"));
|
|
6
7
|
function ResultCard(props) {
|
|
7
|
-
var _a, _b
|
|
8
|
-
const { result, addToCartCallback, clickItemCallback, salePriceKey, regularPriceKey } = props;
|
|
8
|
+
var _a, _b;
|
|
9
|
+
const { result, addToCartCallback, clickItemCallback: customClickItemCallback, salePriceKey, regularPriceKey, resultPosition, } = props;
|
|
10
|
+
const { resultsResponse, cioClient } = (0, react_1.useContext)(context_1.default);
|
|
9
11
|
const salePrice = salePriceKey && ((_a = result === null || result === void 0 ? void 0 : result.data) === null || _a === void 0 ? void 0 : _a[salePriceKey]);
|
|
10
12
|
const regularPrice = regularPriceKey && ((_b = result === null || result === void 0 ? void 0 : result.data) === null || _b === void 0 ? void 0 : _b[regularPriceKey]);
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
const clickItemCallback = () => {
|
|
14
|
+
var _a;
|
|
15
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
16
|
+
if (resultsResponse && resultsResponse.request && resultsResponse.response) {
|
|
17
|
+
const { quiz_id, quiz_session_id, quiz_version_id, result_id, request: { section, page, num_results_per_page }, response: { total_num_results }, } = resultsResponse;
|
|
18
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
19
|
+
cioClient === null || cioClient === void 0 ? void 0 : cioClient.tracker.trackQuizResultClick({
|
|
20
|
+
quiz_id,
|
|
21
|
+
quiz_version_id,
|
|
22
|
+
quiz_session_id,
|
|
23
|
+
item_id: (_a = result.data) === null || _a === void 0 ? void 0 : _a.id,
|
|
24
|
+
item_name: result === null || result === void 0 ? void 0 : result.value,
|
|
25
|
+
section,
|
|
26
|
+
result_count: total_num_results,
|
|
27
|
+
result_page: page,
|
|
28
|
+
result_id,
|
|
29
|
+
result_position_on_page: resultPosition,
|
|
30
|
+
num_results_per_page,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (customClickItemCallback && typeof customClickItemCallback === 'function') {
|
|
34
|
+
customClickItemCallback(result);
|
|
14
35
|
}
|
|
15
36
|
};
|
|
37
|
+
const clickHandler = () => {
|
|
38
|
+
clickItemCallback();
|
|
39
|
+
};
|
|
16
40
|
const keyDownHandler = (event) => {
|
|
17
41
|
if ((event === null || event === void 0 ? void 0 : event.key) === ' ' || (event === null || event === void 0 ? void 0 : event.key) === 'Enter') {
|
|
18
|
-
|
|
19
|
-
clickItemCallback(result);
|
|
20
|
-
}
|
|
42
|
+
clickItemCallback();
|
|
21
43
|
}
|
|
22
44
|
};
|
|
23
45
|
const resultCardContent = () => {
|
|
@@ -34,12 +56,12 @@ function ResultCard(props) {
|
|
|
34
56
|
regularPrice && (react_1.default.createElement("span", { className: `cio-result-card-regular-price${salePrice ? '--strike-through' : ''}` },
|
|
35
57
|
"$",
|
|
36
58
|
regularPrice)))),
|
|
37
|
-
react_1.default.createElement(ResultCtaButton_1.default, { item: result, callback: addToCartCallback })));
|
|
59
|
+
react_1.default.createElement(ResultCtaButton_1.default, { item: result, callback: addToCartCallback, price: salePrice || regularPrice })));
|
|
60
|
+
};
|
|
61
|
+
const resultCardContentWithLink = () => {
|
|
62
|
+
var _a;
|
|
63
|
+
return (react_1.default.createElement("a", { className: 'cio-result-card-anchor', href: (_a = result.data) === null || _a === void 0 ? void 0 : _a.url }, resultCardContent()));
|
|
38
64
|
};
|
|
39
|
-
|
|
40
|
-
return (react_1.default.createElement("div", { onClick: clickHandler, onKeyDown: keyDownHandler, className: 'cio-result-card', role: 'button', tabIndex: 0 }, resultCardContent()));
|
|
41
|
-
}
|
|
42
|
-
return (react_1.default.createElement("div", { className: 'cio-result-card' },
|
|
43
|
-
react_1.default.createElement("a", { className: 'cio-result-card-anchor', href: (_c = result.data) === null || _c === void 0 ? void 0 : _c.url }, resultCardContent())));
|
|
65
|
+
return (react_1.default.createElement("div", { onClick: clickHandler, onKeyDown: keyDownHandler, className: 'cio-result-card', role: 'button', tabIndex: 0 }, !customClickItemCallback ? resultCardContentWithLink() : resultCardContent()));
|
|
44
66
|
}
|
|
45
67
|
exports.default = ResultCard;
|
|
@@ -12,8 +12,7 @@ function ResultContainer(props) {
|
|
|
12
12
|
var _a, _b, _c;
|
|
13
13
|
const { options, resetQuizSessionId } = props;
|
|
14
14
|
const { addToCartCallback, clickItemCallback, resultCardSalePriceKey, resultCardRegularPriceKey, } = options;
|
|
15
|
-
const { resultsResponse } = (0, react_1.useContext)(context_1.default);
|
|
16
|
-
const { dispatch } = (0, react_1.useContext)(context_1.default);
|
|
15
|
+
const { resultsResponse, cioClient, dispatch } = (0, react_1.useContext)(context_1.default);
|
|
17
16
|
const filterExpression = (_a = resultsResponse === null || resultsResponse === void 0 ? void 0 : resultsResponse.request) === null || _a === void 0 ? void 0 : _a.collection_filter_expression;
|
|
18
17
|
const zeroResults = !((_c = (_b = resultsResponse === null || resultsResponse === void 0 ? void 0 : resultsResponse.response) === null || _b === void 0 ? void 0 : _b.results) === null || _c === void 0 ? void 0 : _c.length);
|
|
19
18
|
const resultsTitle = zeroResults ? 'Oops, there are no results' : 'Here are your results';
|
|
@@ -25,7 +24,20 @@ function ResultContainer(props) {
|
|
|
25
24
|
});
|
|
26
25
|
}
|
|
27
26
|
};
|
|
28
|
-
if (resultsResponse) {
|
|
27
|
+
if (resultsResponse && resultsResponse.request && resultsResponse.response) {
|
|
28
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
29
|
+
const { quiz_id, quiz_session_id, quiz_version_id, result_id, request: { section, page }, response: { total_num_results }, } = resultsResponse;
|
|
30
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
31
|
+
cioClient === null || cioClient === void 0 ? void 0 : cioClient.tracker.trackQuizResultsLoaded({
|
|
32
|
+
quiz_id,
|
|
33
|
+
quiz_version_id,
|
|
34
|
+
quiz_session_id,
|
|
35
|
+
url: window.location.href,
|
|
36
|
+
section,
|
|
37
|
+
result_count: total_num_results,
|
|
38
|
+
result_page: page,
|
|
39
|
+
result_id,
|
|
40
|
+
});
|
|
29
41
|
return (react_1.default.createElement("div", { className: 'cio-results-container' },
|
|
30
42
|
react_1.default.createElement("h1", { className: 'cio-results-title' }, resultsTitle),
|
|
31
43
|
react_1.default.createElement("div", { className: 'cio-results-filter-and-redo-container' },
|
|
@@ -1,11 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
|
-
const react_1 = tslib_1.
|
|
4
|
+
const react_1 = tslib_1.__importStar(require("react"));
|
|
5
|
+
const context_1 = tslib_1.__importDefault(require("../CioQuiz/context"));
|
|
5
6
|
function ResultCtaButton(props) {
|
|
6
|
-
const { item, callback, className } = props;
|
|
7
|
+
const { item, callback, className, price } = props;
|
|
8
|
+
const { resultsResponse, cioClient } = (0, react_1.useContext)(context_1.default);
|
|
7
9
|
const clickHandler = (e) => {
|
|
10
|
+
var _a, _b;
|
|
8
11
|
e.preventDefault();
|
|
12
|
+
if (resultsResponse && resultsResponse.request && resultsResponse.response) {
|
|
13
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
14
|
+
const { quiz_id, quiz_session_id, quiz_version_id, request: { section }, } = resultsResponse;
|
|
15
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
16
|
+
cioClient === null || cioClient === void 0 ? void 0 : cioClient.tracker.trackQuizConversion({
|
|
17
|
+
quiz_id,
|
|
18
|
+
quiz_version_id,
|
|
19
|
+
quiz_session_id,
|
|
20
|
+
item_id: (_a = item.data) === null || _a === void 0 ? void 0 : _a.id,
|
|
21
|
+
item_name: item.value,
|
|
22
|
+
section,
|
|
23
|
+
variation_id: (_b = item.data) === null || _b === void 0 ? void 0 : _b.variation_id,
|
|
24
|
+
revenue: (price && String(price)) || undefined,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
9
27
|
if (callback && typeof callback === 'function') {
|
|
10
28
|
e.stopPropagation();
|
|
11
29
|
callback(item);
|
|
@@ -8,9 +8,9 @@ function Results(props) {
|
|
|
8
8
|
var _a, _b;
|
|
9
9
|
const { addToCartCallback, clickItemCallback, resultCardSalePriceKey, resultCardRegularPriceKey, } = props;
|
|
10
10
|
const { resultsResponse } = (0, react_1.useContext)(context_1.default);
|
|
11
|
-
return (react_1.default.createElement("div", { className: 'cio-results' }, (_b = (_a = resultsResponse === null || resultsResponse === void 0 ? void 0 : resultsResponse.response) === null || _a === void 0 ? void 0 : _a.results) === null || _b === void 0 ? void 0 : _b.map((result) => {
|
|
11
|
+
return (react_1.default.createElement("div", { className: 'cio-results' }, (_b = (_a = resultsResponse === null || resultsResponse === void 0 ? void 0 : resultsResponse.response) === null || _a === void 0 ? void 0 : _a.results) === null || _b === void 0 ? void 0 : _b.map((result, index) => {
|
|
12
12
|
var _a;
|
|
13
|
-
return (react_1.default.createElement(ResultCard_1.default, { result: result, key: (_a = result.data) === null || _a === void 0 ? void 0 : _a.id, salePriceKey: resultCardSalePriceKey, regularPriceKey: resultCardRegularPriceKey, addToCartCallback: addToCartCallback, clickItemCallback: clickItemCallback }));
|
|
13
|
+
return (react_1.default.createElement(ResultCard_1.default, { result: result, key: (_a = result.data) === null || _a === void 0 ? void 0 : _a.id, salePriceKey: resultCardSalePriceKey, regularPriceKey: resultCardRegularPriceKey, addToCartCallback: addToCartCallback, clickItemCallback: clickItemCallback, resultPosition: index + 1 }));
|
|
14
14
|
})));
|
|
15
15
|
}
|
|
16
16
|
exports.default = Results;
|
package/lib/cjs/utils.js
CHANGED
|
@@ -80,9 +80,10 @@ const getCioClient = (apiKey) => {
|
|
|
80
80
|
if (apiKey) {
|
|
81
81
|
return new constructorio_client_javascript_1.default({
|
|
82
82
|
apiKey,
|
|
83
|
+
sendTrackingEvents: true,
|
|
83
84
|
});
|
|
84
85
|
}
|
|
85
|
-
return
|
|
86
|
+
return undefined;
|
|
86
87
|
};
|
|
87
88
|
exports.getCioClient = getCioClient;
|
|
88
89
|
function getPreferredColorScheme() {
|
|
@@ -14,6 +14,14 @@ export default function CioQuiz(props) {
|
|
|
14
14
|
// eslint-disable-next-line no-console
|
|
15
15
|
console.error('quizId is a required field of type string');
|
|
16
16
|
}
|
|
17
|
+
if (!resultsPageOptions || Object.keys(resultsPageOptions).length === 0) {
|
|
18
|
+
// eslint-disable-next-line no-console
|
|
19
|
+
console.error('resultsPageOptions is a required field of type object');
|
|
20
|
+
}
|
|
21
|
+
if (resultsPageOptions && !resultsPageOptions?.addToCartCallback) {
|
|
22
|
+
// eslint-disable-next-line no-console
|
|
23
|
+
console.error('resultsPageOptions.addToCartCallback is a required field of type function');
|
|
24
|
+
}
|
|
17
25
|
const cioClient = useCioClient({ apiKey, cioJsClient });
|
|
18
26
|
const [state, dispatch] = useReducer(reducer, initialState);
|
|
19
27
|
const [requestState, setRequestState] = useState(RequestStates.Stale);
|
|
@@ -41,6 +49,7 @@ export default function CioQuiz(props) {
|
|
|
41
49
|
isFirstQuestion,
|
|
42
50
|
quizNextHandler,
|
|
43
51
|
quizBackHandler,
|
|
52
|
+
cioClient,
|
|
44
53
|
};
|
|
45
54
|
useEffect(() => {
|
|
46
55
|
(async () => {
|
|
@@ -1,19 +1,40 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { useContext } from 'react';
|
|
2
2
|
import ResultCtaButton from '../ResultCtaButton/ResultCtaButton';
|
|
3
|
+
import QuizContext from '../CioQuiz/context';
|
|
3
4
|
export default function ResultCard(props) {
|
|
4
|
-
const { result, addToCartCallback, clickItemCallback, salePriceKey, regularPriceKey } = props;
|
|
5
|
+
const { result, addToCartCallback, clickItemCallback: customClickItemCallback, salePriceKey, regularPriceKey, resultPosition, } = props;
|
|
6
|
+
const { resultsResponse, cioClient } = useContext(QuizContext);
|
|
5
7
|
const salePrice = salePriceKey && result?.data?.[salePriceKey];
|
|
6
8
|
const regularPrice = regularPriceKey && result?.data?.[regularPriceKey];
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
const clickItemCallback = () => {
|
|
10
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
11
|
+
if (resultsResponse && resultsResponse.request && resultsResponse.response) {
|
|
12
|
+
const { quiz_id, quiz_session_id, quiz_version_id, result_id, request: { section, page, num_results_per_page }, response: { total_num_results }, } = resultsResponse;
|
|
13
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
14
|
+
cioClient?.tracker.trackQuizResultClick({
|
|
15
|
+
quiz_id,
|
|
16
|
+
quiz_version_id,
|
|
17
|
+
quiz_session_id,
|
|
18
|
+
item_id: result.data?.id,
|
|
19
|
+
item_name: result?.value,
|
|
20
|
+
section,
|
|
21
|
+
result_count: total_num_results,
|
|
22
|
+
result_page: page,
|
|
23
|
+
result_id,
|
|
24
|
+
result_position_on_page: resultPosition,
|
|
25
|
+
num_results_per_page,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
if (customClickItemCallback && typeof customClickItemCallback === 'function') {
|
|
29
|
+
customClickItemCallback(result);
|
|
10
30
|
}
|
|
11
31
|
};
|
|
32
|
+
const clickHandler = () => {
|
|
33
|
+
clickItemCallback();
|
|
34
|
+
};
|
|
12
35
|
const keyDownHandler = (event) => {
|
|
13
36
|
if (event?.key === ' ' || event?.key === 'Enter') {
|
|
14
|
-
|
|
15
|
-
clickItemCallback(result);
|
|
16
|
-
}
|
|
37
|
+
clickItemCallback();
|
|
17
38
|
}
|
|
18
39
|
};
|
|
19
40
|
const resultCardContent = () => (React.createElement(React.Fragment, null,
|
|
@@ -28,10 +49,7 @@ export default function ResultCard(props) {
|
|
|
28
49
|
regularPrice && (React.createElement("span", { className: `cio-result-card-regular-price${salePrice ? '--strike-through' : ''}` },
|
|
29
50
|
"$",
|
|
30
51
|
regularPrice)))),
|
|
31
|
-
React.createElement(ResultCtaButton, { item: result, callback: addToCartCallback })));
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
return (React.createElement("div", { className: 'cio-result-card' },
|
|
36
|
-
React.createElement("a", { className: 'cio-result-card-anchor', href: result.data?.url }, resultCardContent())));
|
|
52
|
+
React.createElement(ResultCtaButton, { item: result, callback: addToCartCallback, price: salePrice || regularPrice })));
|
|
53
|
+
const resultCardContentWithLink = () => (React.createElement("a", { className: 'cio-result-card-anchor', href: result.data?.url }, resultCardContent()));
|
|
54
|
+
return (React.createElement("div", { onClick: clickHandler, onKeyDown: keyDownHandler, className: 'cio-result-card', role: 'button', tabIndex: 0 }, !customClickItemCallback ? resultCardContentWithLink() : resultCardContent()));
|
|
37
55
|
}
|
|
@@ -8,8 +8,7 @@ import Results from '../Results/Results';
|
|
|
8
8
|
export default function ResultContainer(props) {
|
|
9
9
|
const { options, resetQuizSessionId } = props;
|
|
10
10
|
const { addToCartCallback, clickItemCallback, resultCardSalePriceKey, resultCardRegularPriceKey, } = options;
|
|
11
|
-
const { resultsResponse } = useContext(QuizContext);
|
|
12
|
-
const { dispatch } = useContext(QuizContext);
|
|
11
|
+
const { resultsResponse, cioClient, dispatch } = useContext(QuizContext);
|
|
13
12
|
const filterExpression = resultsResponse?.request?.collection_filter_expression;
|
|
14
13
|
const zeroResults = !resultsResponse?.response?.results?.length;
|
|
15
14
|
const resultsTitle = zeroResults ? 'Oops, there are no results' : 'Here are your results';
|
|
@@ -21,7 +20,20 @@ export default function ResultContainer(props) {
|
|
|
21
20
|
});
|
|
22
21
|
}
|
|
23
22
|
};
|
|
24
|
-
if (resultsResponse) {
|
|
23
|
+
if (resultsResponse && resultsResponse.request && resultsResponse.response) {
|
|
24
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
25
|
+
const { quiz_id, quiz_session_id, quiz_version_id, result_id, request: { section, page }, response: { total_num_results }, } = resultsResponse;
|
|
26
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
27
|
+
cioClient?.tracker.trackQuizResultsLoaded({
|
|
28
|
+
quiz_id,
|
|
29
|
+
quiz_version_id,
|
|
30
|
+
quiz_session_id,
|
|
31
|
+
url: window.location.href,
|
|
32
|
+
section,
|
|
33
|
+
result_count: total_num_results,
|
|
34
|
+
result_page: page,
|
|
35
|
+
result_id,
|
|
36
|
+
});
|
|
25
37
|
return (React.createElement("div", { className: 'cio-results-container' },
|
|
26
38
|
React.createElement("h1", { className: 'cio-results-title' }, resultsTitle),
|
|
27
39
|
React.createElement("div", { className: 'cio-results-filter-and-redo-container' },
|
|
@@ -1,8 +1,25 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { useContext } from 'react';
|
|
2
|
+
import QuizContext from '../CioQuiz/context';
|
|
2
3
|
export default function ResultCtaButton(props) {
|
|
3
|
-
const { item, callback, className } = props;
|
|
4
|
+
const { item, callback, className, price } = props;
|
|
5
|
+
const { resultsResponse, cioClient } = useContext(QuizContext);
|
|
4
6
|
const clickHandler = (e) => {
|
|
5
7
|
e.preventDefault();
|
|
8
|
+
if (resultsResponse && resultsResponse.request && resultsResponse.response) {
|
|
9
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
10
|
+
const { quiz_id, quiz_session_id, quiz_version_id, request: { section }, } = resultsResponse;
|
|
11
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
12
|
+
cioClient?.tracker.trackQuizConversion({
|
|
13
|
+
quiz_id,
|
|
14
|
+
quiz_version_id,
|
|
15
|
+
quiz_session_id,
|
|
16
|
+
item_id: item.data?.id,
|
|
17
|
+
item_name: item.value,
|
|
18
|
+
section,
|
|
19
|
+
variation_id: item.data?.variation_id,
|
|
20
|
+
revenue: (price && String(price)) || undefined,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
6
23
|
if (callback && typeof callback === 'function') {
|
|
7
24
|
e.stopPropagation();
|
|
8
25
|
callback(item);
|
|
@@ -4,6 +4,6 @@ import ResultCard from '../ResultCard/ResultCard';
|
|
|
4
4
|
function Results(props) {
|
|
5
5
|
const { addToCartCallback, clickItemCallback, resultCardSalePriceKey, resultCardRegularPriceKey, } = props;
|
|
6
6
|
const { resultsResponse } = useContext(QuizContext);
|
|
7
|
-
return (React.createElement("div", { className: 'cio-results' }, resultsResponse?.response?.results?.map((result) => (React.createElement(ResultCard, { result: result, key: result.data?.id, salePriceKey: resultCardSalePriceKey, regularPriceKey: resultCardRegularPriceKey, addToCartCallback: addToCartCallback, clickItemCallback: clickItemCallback })))));
|
|
7
|
+
return (React.createElement("div", { className: 'cio-results' }, resultsResponse?.response?.results?.map((result, index) => (React.createElement(ResultCard, { result: result, key: result.data?.id, salePriceKey: resultCardSalePriceKey, regularPriceKey: resultCardRegularPriceKey, addToCartCallback: addToCartCallback, clickItemCallback: clickItemCallback, resultPosition: index + 1 })))));
|
|
8
8
|
}
|
|
9
9
|
export default Results;
|
package/lib/mjs/utils.js
CHANGED
|
@@ -69,9 +69,10 @@ export const getCioClient = (apiKey) => {
|
|
|
69
69
|
if (apiKey) {
|
|
70
70
|
return new ConstructorIOClient({
|
|
71
71
|
apiKey,
|
|
72
|
+
sendTrackingEvents: true,
|
|
72
73
|
});
|
|
73
74
|
}
|
|
74
|
-
return
|
|
75
|
+
return undefined;
|
|
75
76
|
};
|
|
76
77
|
export function getPreferredColorScheme() {
|
|
77
78
|
let colorScheme = 'light';
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import ConstructorIOClient from '@constructor-io/constructorio-client-javascript';
|
|
2
3
|
import { RequestStates } from '../../constants';
|
|
3
|
-
import { NextQuestionResponse,
|
|
4
|
+
import { NextQuestionResponse, QuizResultsResponse } from '../../types';
|
|
4
5
|
import { ActionAnswerQuestion } from './actions';
|
|
5
6
|
import { QuizReducerState } from './reducer';
|
|
6
7
|
interface QuizContextValue {
|
|
7
8
|
state: QuizReducerState;
|
|
8
9
|
requestState: RequestStates;
|
|
9
10
|
questionResponse: NextQuestionResponse;
|
|
10
|
-
resultsResponse:
|
|
11
|
+
resultsResponse: QuizResultsResponse;
|
|
11
12
|
isFirstQuestion: boolean;
|
|
12
13
|
quizNextHandler: (action?: ActionAnswerQuestion) => void;
|
|
13
14
|
quizBackHandler: () => void;
|
|
14
15
|
dispatch: React.Dispatch<ActionAnswerQuestion>;
|
|
16
|
+
cioClient: ConstructorIOClient;
|
|
15
17
|
}
|
|
16
18
|
declare const _default: React.Context<Partial<QuizContextValue>>;
|
|
17
19
|
export default _default;
|
|
@@ -6,6 +6,7 @@ interface ResultCardProps {
|
|
|
6
6
|
clickItemCallback?: (clickedResult: Partial<BrowseResultData>) => any;
|
|
7
7
|
salePriceKey?: string;
|
|
8
8
|
regularPriceKey?: string;
|
|
9
|
+
resultPosition: number;
|
|
9
10
|
}
|
|
10
11
|
export default function ResultCard(props: ResultCardProps): JSX.Element;
|
|
11
12
|
export {};
|
|
@@ -3,6 +3,6 @@ export type CioClientConfig = {
|
|
|
3
3
|
apiKey?: string;
|
|
4
4
|
cioJsClient?: ConstructorIOClient;
|
|
5
5
|
};
|
|
6
|
-
type UseCioClient = (cioClientConfig: CioClientConfig) => ConstructorIOClient |
|
|
6
|
+
type UseCioClient = (cioClientConfig: CioClientConfig) => ConstructorIOClient | undefined;
|
|
7
7
|
declare const useCioClient: UseCioClient;
|
|
8
8
|
export default useCioClient;
|
package/lib/types/types.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export type { QuestionOption, QuestionImages, Question, NextQuestionResponse, QuizResultsResponse,
|
|
1
|
+
export type { QuestionOption, QuestionImages, Question, NextQuestionResponse, QuizResultsResponse, BrowseResultData, BrowseRequestType, QuizzesParameters, QuizzesResultsParameters, } from '@constructor-io/constructorio-client-javascript/lib/types';
|
package/lib/types/utils.d.ts
CHANGED
|
@@ -27,5 +27,5 @@ export declare const getQuestionTypes: (questionType?: `${QuestionTypes}`) => {
|
|
|
27
27
|
isMultipleQuestion: boolean;
|
|
28
28
|
isSelectQuestion: boolean;
|
|
29
29
|
};
|
|
30
|
-
export declare const getCioClient: (apiKey?: string) => ConstructorIOClient |
|
|
30
|
+
export declare const getCioClient: (apiKey?: string) => ConstructorIOClient | undefined;
|
|
31
31
|
export declare function getPreferredColorScheme(): string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@constructor-io/constructorio-ui-quizzes",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Constructor.io Quizzes UI library for web applications",
|
|
5
5
|
"author": "constructor.io",
|
|
6
6
|
"license": "MIT",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"check-license": "license-checker --production --onlyAllow 'Apache-2.0;BSD-3-Clause;MIT;0BSD;BSD-2-Clause'"
|
|
50
50
|
},
|
|
51
51
|
"peerDependencies": {
|
|
52
|
-
"@constructor-io/constructorio-client-javascript": "^2.35.
|
|
52
|
+
"@constructor-io/constructorio-client-javascript": "^2.35.6",
|
|
53
53
|
"react": ">=16.12.0",
|
|
54
54
|
"react-dom": ">=16.12.0",
|
|
55
55
|
"tslib": "^2.4.0"
|