@constructor-io/constructorio-ui-quizzes 1.4.7 → 1.5.1
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/dist/constructorio-ui-quizzes-bundled.js +14 -14
- package/lib/cjs/components/CioQuiz/index.js +14 -3
- package/lib/cjs/components/CoverTypeQuestion/CoverTypeQuestion.js +1 -3
- package/lib/cjs/components/OpenTextTypeQuestion/OpenTextTypeQuestion.js +1 -3
- package/lib/cjs/components/ResultCard/ResultCard.js +3 -1
- package/lib/cjs/components/ResultFavoritesButton/ResultFavoritesButton.js +18 -0
- package/lib/cjs/components/SelectTypeQuestion/SelectTypeQuestion.js +1 -3
- package/lib/cjs/constants.js +2 -0
- package/lib/cjs/hooks/usePropsGetters/index.js +4 -1
- package/lib/cjs/hooks/usePropsGetters/useAddToFavoritesButtonProps.js +25 -0
- package/lib/cjs/hooks/useQuizEvents/index.js +4 -1
- package/lib/cjs/hooks/useQuizEvents/useQuizAddToFavorites.js +22 -0
- package/lib/cjs/services/index.js +4 -1
- package/lib/cjs/stories/Quiz/tests/mocks.js +3 -1
- package/lib/cjs/utils.js +1 -0
- package/lib/mjs/components/CioQuiz/index.js +14 -4
- package/lib/mjs/components/CoverTypeQuestion/CoverTypeQuestion.js +1 -3
- package/lib/mjs/components/OpenTextTypeQuestion/OpenTextTypeQuestion.js +1 -3
- package/lib/mjs/components/ResultCard/ResultCard.js +3 -1
- package/lib/mjs/components/ResultFavoritesButton/ResultFavoritesButton.js +14 -0
- package/lib/mjs/components/SelectTypeQuestion/SelectTypeQuestion.js +1 -3
- package/lib/mjs/constants.js +2 -0
- package/lib/mjs/hooks/usePropsGetters/index.js +4 -1
- package/lib/mjs/hooks/usePropsGetters/useAddToFavoritesButtonProps.js +18 -0
- package/lib/mjs/hooks/useQuizEvents/index.js +4 -1
- package/lib/mjs/hooks/useQuizEvents/useQuizAddToFavorites.js +20 -0
- package/lib/mjs/services/index.js +4 -1
- package/lib/mjs/stories/Quiz/tests/mocks.js +9 -1
- package/lib/mjs/utils.js +1 -0
- package/lib/styles.css +55 -27
- package/lib/types/components/CioQuiz/context.d.ts +3 -1
- package/lib/types/components/ResultFavoritesButton/ResultFavoritesButton.d.ts +11 -0
- package/lib/types/constants.d.ts +2 -2
- package/lib/types/hooks/usePropsGetters/index.d.ts +2 -1
- package/lib/types/hooks/usePropsGetters/useAddToFavoritesButtonProps.d.ts +2 -0
- package/lib/types/hooks/useQuizEvents/useQuizAddToFavorites.d.ts +5 -0
- package/lib/types/services/index.d.ts +1 -1
- package/lib/types/types.d.ts +6 -0
- package/lib/types/utils.d.ts +1 -0
- package/package.json +1 -1
|
@@ -5,13 +5,15 @@ const react_1 = tslib_1.__importStar(require("react"));
|
|
|
5
5
|
const context_1 = tslib_1.__importDefault(require("./context"));
|
|
6
6
|
const QuizQuestions_1 = tslib_1.__importDefault(require("../QuizQuestions"));
|
|
7
7
|
const ResultContainer_1 = tslib_1.__importDefault(require("../ResultContainer/ResultContainer"));
|
|
8
|
+
const ControlBar_1 = tslib_1.__importDefault(require("../ControlBar/ControlBar"));
|
|
8
9
|
const constants_1 = require("../../constants");
|
|
9
10
|
const Spinner_1 = tslib_1.__importDefault(require("../Spinner/Spinner"));
|
|
10
11
|
const useQuiz_1 = tslib_1.__importDefault(require("../../hooks/useQuiz"));
|
|
11
12
|
const SessionPromptModal_1 = tslib_1.__importDefault(require("../SessionPromptModal/SessionPromptModal"));
|
|
12
13
|
const utils_1 = require("../../utils");
|
|
13
14
|
function CioQuiz(props) {
|
|
14
|
-
|
|
15
|
+
var _a;
|
|
16
|
+
const { cioClient, state, events: { hydrateQuiz, hasSessionStorageState, resetSessionStorageState }, getAddToCartButtonProps, getAddToFavoritesButtonProps, getCoverQuestionProps, getHydrateQuizButtonProps, getNextQuestionButtonProps, getOpenTextInputProps, getPreviousQuestionButtonProps, getQuizImageProps, getQuizResultButtonProps, getQuizResultLinkProps, getResetQuizButtonProps, getSelectInputProps, primaryColorStyles, } = (0, useQuiz_1.default)(props);
|
|
15
17
|
const [showSessionPrompt, setShowSessionPrompt] = (0, react_1.useState)(false);
|
|
16
18
|
const { resultsPageOptions, sessionStateOptions } = props;
|
|
17
19
|
(0, react_1.useEffect)(() => {
|
|
@@ -32,6 +34,7 @@ function CioQuiz(props) {
|
|
|
32
34
|
cioClient,
|
|
33
35
|
state,
|
|
34
36
|
getAddToCartButtonProps,
|
|
37
|
+
getAddToFavoritesButtonProps,
|
|
35
38
|
getCoverQuestionProps,
|
|
36
39
|
getHydrateQuizButtonProps,
|
|
37
40
|
getNextQuestionButtonProps,
|
|
@@ -43,19 +46,27 @@ function CioQuiz(props) {
|
|
|
43
46
|
getResetQuizButtonProps,
|
|
44
47
|
getSelectInputProps,
|
|
45
48
|
customClickItemCallback: !!(resultsPageOptions === null || resultsPageOptions === void 0 ? void 0 : resultsPageOptions.onQuizResultClick),
|
|
49
|
+
customAddToFavoritesCallback: !!(resultsPageOptions === null || resultsPageOptions === void 0 ? void 0 : resultsPageOptions.onAddToFavoritesClick),
|
|
46
50
|
primaryColorStyles,
|
|
47
51
|
};
|
|
48
52
|
if (state.quiz.requestState === constants_1.RequestStates.Loading) {
|
|
49
|
-
return (react_1.default.createElement("div", { className: 'cio-quiz' },
|
|
53
|
+
return (react_1.default.createElement("div", { className: 'cio-quiz cio-quiz-loading' },
|
|
50
54
|
react_1.default.createElement(Spinner_1.default, null)));
|
|
51
55
|
}
|
|
56
|
+
const questionData = (_a = state.quiz.currentQuestion) === null || _a === void 0 ? void 0 : _a.next_question;
|
|
57
|
+
const questionType = questionData === null || questionData === void 0 ? void 0 : questionData.type;
|
|
58
|
+
const questionImages = questionData === null || questionData === void 0 ? void 0 : questionData.images;
|
|
59
|
+
const displayBackgroundImage = (questionType === 'single' || questionType === 'multiple') && questionImages;
|
|
52
60
|
if (state.quiz.requestState === constants_1.RequestStates.Success) {
|
|
53
61
|
return (react_1.default.createElement("div", { className: 'cio-quiz' },
|
|
62
|
+
displayBackgroundImage && (0, utils_1.renderImages)(questionImages, 'cio-question-background-image'),
|
|
54
63
|
react_1.default.createElement("style", null,
|
|
55
64
|
".cio-quiz ",
|
|
56
65
|
(0, utils_1.convertPrimaryColorsToString)(primaryColorStyles)),
|
|
57
66
|
react_1.default.createElement(SessionPromptModal_1.default, { resetStoredState: resetSessionStorageState, continueSession: hydrateQuiz, showSessionPrompt: showSessionPrompt, setShowSessionPrompt: setShowSessionPrompt }),
|
|
58
|
-
react_1.default.createElement(context_1.default.Provider, { value: contextValue }, state.quiz.results || state.quiz.skipToResults ? (react_1.default.createElement(ResultContainer_1.default, { options: resultsPageOptions })) : (state.quiz.currentQuestion && react_1.default.createElement(
|
|
67
|
+
react_1.default.createElement(context_1.default.Provider, { value: contextValue }, state.quiz.results || state.quiz.skipToResults ? (react_1.default.createElement(ResultContainer_1.default, { options: resultsPageOptions })) : (state.quiz.currentQuestion && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
68
|
+
react_1.default.createElement(QuizQuestions_1.default, null),
|
|
69
|
+
react_1.default.createElement(ControlBar_1.default, { ctaButtonText: (questionData === null || questionData === void 0 ? void 0 : questionData.cta_text) || undefined })))))));
|
|
59
70
|
}
|
|
60
71
|
return null;
|
|
61
72
|
}
|
|
@@ -6,7 +6,6 @@ const QuestionTitle_1 = tslib_1.__importDefault(require("../QuestionTitle/Questi
|
|
|
6
6
|
const context_1 = tslib_1.__importDefault(require("../CioQuiz/context"));
|
|
7
7
|
const QuestionDescription_1 = tslib_1.__importDefault(require("../QuestionDescription/QuestionDescription"));
|
|
8
8
|
const utils_1 = require("../../utils");
|
|
9
|
-
const ControlBar_1 = tslib_1.__importDefault(require("../ControlBar/ControlBar"));
|
|
10
9
|
function CoverTypeQuestion() {
|
|
11
10
|
var _a;
|
|
12
11
|
const { state } = (0, react_1.useContext)(context_1.default);
|
|
@@ -23,8 +22,7 @@ function CoverTypeQuestion() {
|
|
|
23
22
|
hasImage ? (0, utils_1.renderImages)(question.images, 'cio-question-image-container') : '',
|
|
24
23
|
react_1.default.createElement("div", { className: 'cio-question-content' },
|
|
25
24
|
react_1.default.createElement(QuestionTitle_1.default, { title: question === null || question === void 0 ? void 0 : question.title }),
|
|
26
|
-
react_1.default.createElement(QuestionDescription_1.default, { description: question.description })
|
|
27
|
-
react_1.default.createElement(ControlBar_1.default, { ctaButtonText: question === null || question === void 0 ? void 0 : question.cta_text }))));
|
|
25
|
+
react_1.default.createElement(QuestionDescription_1.default, { description: question.description }))));
|
|
28
26
|
}
|
|
29
27
|
return null;
|
|
30
28
|
}
|
|
@@ -6,7 +6,6 @@ const QuestionTitle_1 = tslib_1.__importDefault(require("../QuestionTitle/Questi
|
|
|
6
6
|
const QuestionDescription_1 = tslib_1.__importDefault(require("../QuestionDescription/QuestionDescription"));
|
|
7
7
|
const utils_1 = require("../../utils");
|
|
8
8
|
const context_1 = tslib_1.__importDefault(require("../CioQuiz/context"));
|
|
9
|
-
const ControlBar_1 = tslib_1.__importDefault(require("../ControlBar/ControlBar"));
|
|
10
9
|
function OpenTextQuestion() {
|
|
11
10
|
var _a;
|
|
12
11
|
const { state, getOpenTextInputProps } = (0, react_1.useContext)(context_1.default);
|
|
@@ -24,8 +23,7 @@ function OpenTextQuestion() {
|
|
|
24
23
|
react_1.default.createElement("div", { className: 'cio-question-content' },
|
|
25
24
|
react_1.default.createElement(QuestionTitle_1.default, { title: question.title }),
|
|
26
25
|
react_1.default.createElement(QuestionDescription_1.default, { description: question.description }),
|
|
27
|
-
getOpenTextInputProps && react_1.default.createElement("input", Object.assign({}, getOpenTextInputProps()))
|
|
28
|
-
react_1.default.createElement(ControlBar_1.default, { ctaButtonText: question === null || question === void 0 ? void 0 : question.cta_text }))));
|
|
26
|
+
getOpenTextInputProps && react_1.default.createElement("input", Object.assign({}, getOpenTextInputProps())))));
|
|
29
27
|
}
|
|
30
28
|
return null;
|
|
31
29
|
}
|
|
@@ -3,11 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
4
|
const react_1 = tslib_1.__importStar(require("react"));
|
|
5
5
|
const ResultCtaButton_1 = tslib_1.__importDefault(require("../ResultCtaButton/ResultCtaButton"));
|
|
6
|
+
const ResultFavoritesButton_1 = tslib_1.__importDefault(require("../ResultFavoritesButton/ResultFavoritesButton"));
|
|
6
7
|
const context_1 = tslib_1.__importDefault(require("../CioQuiz/context"));
|
|
7
8
|
function ResultCard(props) {
|
|
8
9
|
var _a, _b, _c, _d;
|
|
9
10
|
const { result, salePriceKey, regularPriceKey, resultPosition, ratingCountKey, ratingScoreKey, renderResultCardPriceDetails, } = props;
|
|
10
|
-
const { customClickItemCallback, getQuizResultButtonProps, getQuizResultLinkProps } = (0, react_1.useContext)(context_1.default);
|
|
11
|
+
const { customAddToFavoritesCallback, customClickItemCallback, getQuizResultButtonProps, getQuizResultLinkProps, } = (0, react_1.useContext)(context_1.default);
|
|
11
12
|
const salePrice = salePriceKey && ((_a = result === null || result === void 0 ? void 0 : result.data) === null || _a === void 0 ? void 0 : _a[salePriceKey]);
|
|
12
13
|
const regularPrice = regularPriceKey && ((_b = result === null || result === void 0 ? void 0 : result.data) === null || _b === void 0 ? void 0 : _b[regularPriceKey]);
|
|
13
14
|
const ratingCount = ratingCountKey && ((_c = result === null || result === void 0 ? void 0 : result.data) === null || _c === void 0 ? void 0 : _c[ratingCountKey]);
|
|
@@ -39,6 +40,7 @@ function ResultCard(props) {
|
|
|
39
40
|
const resultCardContentWithoutLink = () => getQuizResultButtonProps && (react_1.default.createElement("div", Object.assign({}, getQuizResultButtonProps({ result, position: resultPosition, type: 'button' })), resultCardContent()));
|
|
40
41
|
const resultCardContentWithLink = () => getQuizResultLinkProps && (react_1.default.createElement("a", Object.assign({ className: 'cio-result-card-anchor', rel: 'noreferrer', target: '_blank' }, getQuizResultLinkProps({ result, position: resultPosition, type: 'link' })), resultCardContent()));
|
|
41
42
|
return (react_1.default.createElement("div", { className: 'cio-result-card' },
|
|
43
|
+
customAddToFavoritesCallback && (react_1.default.createElement(ResultFavoritesButton_1.default, { item: result, price: salePrice || regularPrice })),
|
|
42
44
|
!customClickItemCallback ? resultCardContentWithLink() : resultCardContentWithoutLink(),
|
|
43
45
|
react_1.default.createElement(ResultCtaButton_1.default, { item: result, price: salePrice || regularPrice })));
|
|
44
46
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const react_1 = tslib_1.__importStar(require("react"));
|
|
5
|
+
const context_1 = tslib_1.__importDefault(require("../CioQuiz/context"));
|
|
6
|
+
function ResultFavoritesButton(props) {
|
|
7
|
+
const { item, price } = props;
|
|
8
|
+
const { getAddToFavoritesButtonProps } = (0, react_1.useContext)(context_1.default);
|
|
9
|
+
if (getAddToFavoritesButtonProps) {
|
|
10
|
+
return (
|
|
11
|
+
// eslint-disable-next-line react/button-has-type
|
|
12
|
+
react_1.default.createElement("button", Object.assign({}, getAddToFavoritesButtonProps(item, price)),
|
|
13
|
+
react_1.default.createElement("svg", { xmlns: 'http://www.w3.org/2000/svg', viewBox: '-2 -2 35 35' },
|
|
14
|
+
react_1.default.createElement("path", { d: 'M 15 28.925781 L 14.808594 28.8125 C 14.789062 28.800781 12.699219 27.566406 10.136719 25.472656 C 7.765625 23.539062 4.488281 20.453125 2.335938 16.730469 C 0.785156 14.046875 0 11.367188 0 8.765625 C 0 7.632812 0.203125 6.570312 0.601562 5.601562 C 0.988281 4.675781 1.542969 3.855469 2.257812 3.171875 C 3.664062 1.820312 5.589844 1.074219 7.6875 1.074219 C 8.960938 1.074219 10.109375 1.277344 11.105469 1.675781 C 12.054688 2.058594 12.867188 2.617188 13.523438 3.339844 C 14.195312 4.085938 14.691406 4.992188 15 6.027344 C 15.308594 4.992188 15.804688 4.085938 16.476562 3.339844 C 17.132812 2.617188 17.945312 2.058594 18.894531 1.675781 C 19.890625 1.277344 21.039062 1.074219 22.3125 1.074219 C 24.410156 1.074219 26.339844 1.820312 27.742188 3.171875 C 28.457031 3.855469 29.011719 4.675781 29.398438 5.601562 C 29.796875 6.570312 30 7.632812 30 8.765625 C 30 11.371094 29.214844 14.046875 27.664062 16.730469 C 26.710938 18.375 25.460938 20.035156 23.949219 21.664062 C 22.746094 22.960938 21.371094 24.242188 19.863281 25.472656 C 17.300781 27.566406 15.210938 28.800781 15.191406 28.8125 Z M 7.6875 1.832031 C 5.789062 1.832031 4.042969 2.5 2.78125 3.714844 C 1.457031 4.988281 0.757812 6.734375 0.757812 8.765625 C 0.757812 11.234375 1.507812 13.785156 2.992188 16.351562 C 4.144531 18.347656 6.40625 21.449219 10.601562 24.878906 C 12.679688 26.574219 14.433594 27.695312 15 28.042969 C 15.566406 27.695312 17.324219 26.574219 19.398438 24.878906 C 21.714844 22.984375 24.914062 19.96875 27.007812 16.351562 C 28.492188 13.785156 29.242188 11.234375 29.242188 8.765625 C 29.246094 6.734375 28.542969 4.988281 27.21875 3.714844 C 25.957031 2.5 24.210938 1.832031 22.3125 1.832031 C 20.023438 1.832031 18.25 2.507812 17.039062 3.847656 C 15.953125 5.050781 15.378906 6.75 15.378906 8.765625 L 14.621094 8.765625 C 14.621094 6.75 14.046875 5.050781 12.960938 3.847656 C 11.75 2.507812 9.976562 1.832031 7.6875 1.832031 Z M 7.6875 1.832031' }))));
|
|
15
|
+
}
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
exports.default = ResultFavoritesButton;
|
|
@@ -6,7 +6,6 @@ const QuestionTitle_1 = tslib_1.__importDefault(require("../QuestionTitle/Questi
|
|
|
6
6
|
const QuestionDescription_1 = tslib_1.__importDefault(require("../QuestionDescription/QuestionDescription"));
|
|
7
7
|
const context_1 = tslib_1.__importDefault(require("../CioQuiz/context"));
|
|
8
8
|
const utils_1 = require("../../utils");
|
|
9
|
-
const ControlBar_1 = tslib_1.__importDefault(require("../ControlBar/ControlBar"));
|
|
10
9
|
const actions_1 = require("../CioQuiz/actions");
|
|
11
10
|
function SelectTypeQuestion() {
|
|
12
11
|
var _a;
|
|
@@ -29,8 +28,7 @@ function SelectTypeQuestion() {
|
|
|
29
28
|
? 'cio-question-options-container-text-only'
|
|
30
29
|
: 'cio-question-options-container'}` }, (_a = question === null || question === void 0 ? void 0 : question.options) === null || _a === void 0 ? void 0 : _a.map((option) => getSelectInputProps && (react_1.default.createElement("div", Object.assign({}, getSelectInputProps(option)),
|
|
31
30
|
option.images ? (0, utils_1.renderImages)(option.images, 'cio-question-option-image') : '',
|
|
32
|
-
react_1.default.createElement("div", { className: 'cio-question-option-value' }, option === null || option === void 0 ? void 0 : option.value)))))
|
|
33
|
-
react_1.default.createElement(ControlBar_1.default, { ctaButtonText: (question === null || question === void 0 ? void 0 : question.cta_text) || 'Continue' })));
|
|
31
|
+
react_1.default.createElement("div", { className: 'cio-question-option-value' }, option === null || option === void 0 ? void 0 : option.value)))))));
|
|
34
32
|
}
|
|
35
33
|
return null;
|
|
36
34
|
}
|
package/lib/cjs/constants.js
CHANGED
|
@@ -14,6 +14,7 @@ exports.componentDescription = `- import \`CioQuiz\` to render in your JSX.
|
|
|
14
14
|
- To use this component, \`quizId\`, \`resultsPageOptions\`, and one of \`apiKey\` or \`cioJsClient\` are required.
|
|
15
15
|
- \`resultsPageOptions\` lets you configure the results page
|
|
16
16
|
- \`onAddToCartClick\` is a callback function that will be called when the "Add to cart" button is clicked
|
|
17
|
+
- \`onAddToFavoritesClick\` is an optional callback function that will be called when the "Add To Favorites" heart icon is clicked
|
|
17
18
|
- \`onQuizResultClick\` is an optional callback function that will be called when the result card is clicked. The default behavior is redirecting the user to the item's URL
|
|
18
19
|
- \`onQuizResultsLoaded\` is an optional callback function that will be called when the quiz results are loaded
|
|
19
20
|
- \`resultCardRegularPriceKey\` is a parameter that specifies the metadata field name for the regular price
|
|
@@ -49,6 +50,7 @@ const {
|
|
|
49
50
|
state: QuizReturnState, // Quiz state
|
|
50
51
|
events: [{...}], // array of quiz events
|
|
51
52
|
getAddToCartButtonProps: () => ({...})), // prop getter for jsx add to cart button for quiz result,
|
|
53
|
+
getAddToFavoritesButtonProps: () => ({...})), // prop getter for jsx add to favorites button for quiz result,
|
|
52
54
|
getCoverQuestionProps: () => ({...})), // prop getter for jsx quiz cover question,
|
|
53
55
|
getHydrateQuizButtonProps: () => ({...})), // prop getter for jsx hydrate quiz button,
|
|
54
56
|
getNextQuestionButtonProps: () => ({...})), // prop getter for jsx next button to traverse the quiz,
|
|
@@ -7,9 +7,10 @@ const useCoverQuestionProps_1 = tslib_1.__importDefault(require("./useCoverQuest
|
|
|
7
7
|
const useOpenTextInputProps_1 = tslib_1.__importDefault(require("./useOpenTextInputProps"));
|
|
8
8
|
const useNextQuestionButtonProps_1 = tslib_1.__importDefault(require("./useNextQuestionButtonProps"));
|
|
9
9
|
const usePreviousQuestionButtonProps_1 = tslib_1.__importDefault(require("./usePreviousQuestionButtonProps"));
|
|
10
|
+
const useAddToFavoritesButtonProps_1 = tslib_1.__importDefault(require("./useAddToFavoritesButtonProps"));
|
|
10
11
|
const usePropsGetters = (quizEvents, quizApiState, quizLocalState) => {
|
|
11
12
|
var _a, _b, _c;
|
|
12
|
-
const { quizAnswerChanged, nextQuestion, previousQuestion, resetQuiz, hydrateQuiz, addToCart, resultClick, } = quizEvents;
|
|
13
|
+
const { quizAnswerChanged, nextQuestion, previousQuestion, resetQuiz, hydrateQuiz, addToCart, addToFavorites, resultClick, } = quizEvents;
|
|
13
14
|
const getOpenTextInputProps = (0, useOpenTextInputProps_1.default)(quizAnswerChanged, nextQuestion, (_a = quizApiState.quizCurrentQuestion) === null || _a === void 0 ? void 0 : _a.next_question, quizLocalState.answerInputs);
|
|
14
15
|
const getCoverQuestionProps = (0, useCoverQuestionProps_1.default)(quizAnswerChanged, (_b = quizApiState.quizCurrentQuestion) === null || _b === void 0 ? void 0 : _b.next_question);
|
|
15
16
|
const getSelectInputProps = (0, useSelectInputProps_1.default)(quizAnswerChanged, nextQuestion, (_c = quizApiState.quizCurrentQuestion) === null || _c === void 0 ? void 0 : _c.next_question, quizLocalState.answerInputs);
|
|
@@ -30,6 +31,7 @@ const usePropsGetters = (quizEvents, quizApiState, quizLocalState) => {
|
|
|
30
31
|
type: 'button',
|
|
31
32
|
onClick: (e) => addToCart(e, result, price),
|
|
32
33
|
}), [addToCart]);
|
|
34
|
+
const getAddToFavoritesButtonProps = (0, useAddToFavoritesButtonProps_1.default)(addToFavorites);
|
|
33
35
|
const quizResultClickDown = (0, react_1.useCallback)((event, result, position) => {
|
|
34
36
|
if ((event === null || event === void 0 ? void 0 : event.key) === ' ' || (event === null || event === void 0 ? void 0 : event.key) === 'Enter') {
|
|
35
37
|
if (resultClick) {
|
|
@@ -78,6 +80,7 @@ const usePropsGetters = (quizEvents, quizApiState, quizLocalState) => {
|
|
|
78
80
|
getResetQuizButtonProps,
|
|
79
81
|
getHydrateQuizButtonProps,
|
|
80
82
|
getAddToCartButtonProps,
|
|
83
|
+
getAddToFavoritesButtonProps,
|
|
81
84
|
getQuizResultButtonProps,
|
|
82
85
|
getQuizResultLinkProps,
|
|
83
86
|
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const react_1 = require("react");
|
|
4
|
+
function useAddToFavoritesButtonProps(addToFavorites) {
|
|
5
|
+
const [favorited, setFavorited] = (0, react_1.useState)({});
|
|
6
|
+
const toggleIdFavorited = (0, react_1.useCallback)((id) => {
|
|
7
|
+
setFavorited(Object.assign(Object.assign({}, favorited), { [id]: !(favorited === null || favorited === void 0 ? void 0 : favorited[id]) }));
|
|
8
|
+
}, [favorited]);
|
|
9
|
+
const getAddToFavoritesButtonProps = (0, react_1.useCallback)((result, price) => {
|
|
10
|
+
var _a;
|
|
11
|
+
return ({
|
|
12
|
+
className: `${'cio-result-card-favorites-button'} ${(favorited === null || favorited === void 0 ? void 0 : favorited[((_a = result === null || result === void 0 ? void 0 : result.data) === null || _a === void 0 ? void 0 : _a.id) || '0']) ? 'favorited' : ''}`,
|
|
13
|
+
onClick: (e) => {
|
|
14
|
+
var _a, _b;
|
|
15
|
+
addToFavorites(e, result, price, !(favorited === null || favorited === void 0 ? void 0 : favorited[((_a = result === null || result === void 0 ? void 0 : result.data) === null || _a === void 0 ? void 0 : _a.id) || '0']));
|
|
16
|
+
toggleIdFavorited(((_b = result === null || result === void 0 ? void 0 : result.data) === null || _b === void 0 ? void 0 : _b.id) || '0');
|
|
17
|
+
},
|
|
18
|
+
type: 'button',
|
|
19
|
+
});
|
|
20
|
+
},
|
|
21
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
22
|
+
[favorited, addToFavorites]);
|
|
23
|
+
return getAddToFavoritesButtonProps;
|
|
24
|
+
}
|
|
25
|
+
exports.default = useAddToFavoritesButtonProps;
|
|
@@ -10,10 +10,11 @@ const useQuizNextClick_1 = tslib_1.__importDefault(require("./useQuizNextClick")
|
|
|
10
10
|
const useQuizResetClick_1 = tslib_1.__importDefault(require("./useQuizResetClick"));
|
|
11
11
|
const useHydrateQuizLocalState_1 = tslib_1.__importDefault(require("./useHydrateQuizLocalState"));
|
|
12
12
|
const utils_1 = require("../../utils");
|
|
13
|
+
const useQuizAddToFavorites_1 = tslib_1.__importDefault(require("./useQuizAddToFavorites"));
|
|
13
14
|
const useQuizEvents = (quizOptions, cioClient, quizState) => {
|
|
14
15
|
const { quizApiState, dispatchLocalState, dispatchApiState, hasQuizStoredState, quizStateKey, quizLocalState, } = quizState;
|
|
15
16
|
const { resultsPageOptions } = quizOptions;
|
|
16
|
-
const { onAddToCartClick, onQuizResultClick, onQuizResultsLoaded } = resultsPageOptions;
|
|
17
|
+
const { onAddToCartClick, onQuizResultClick, onQuizResultsLoaded, onAddToFavoritesClick } = resultsPageOptions;
|
|
17
18
|
// Quiz answer change
|
|
18
19
|
const quizAnswerChanged = (0, useQuizAnswerChangeHandler_1.default)(quizApiState, dispatchLocalState);
|
|
19
20
|
// Quiz Next button click callback
|
|
@@ -24,6 +25,7 @@ const useQuizEvents = (quizOptions, cioClient, quizState) => {
|
|
|
24
25
|
const addToCart = (0, useQuizAddToCart_1.default)(cioClient, quizApiState, onAddToCartClick);
|
|
25
26
|
// Quiz result click callback
|
|
26
27
|
const resultClick = (0, useQuizResultClick_1.default)(cioClient, quizApiState, onQuizResultClick);
|
|
28
|
+
const addToFavorites = (0, useQuizAddToFavorites_1.default)(cioClient, quizApiState, onAddToFavoritesClick);
|
|
27
29
|
// Quiz results loaded event
|
|
28
30
|
(0, useQuizResultsLoaded_1.default)(cioClient, quizApiState, onQuizResultsLoaded);
|
|
29
31
|
// Quiz reset
|
|
@@ -32,6 +34,7 @@ const useQuizEvents = (quizOptions, cioClient, quizState) => {
|
|
|
32
34
|
const hydrateQuizLocalState = (0, useHydrateQuizLocalState_1.default)(quizStateKey, dispatchLocalState);
|
|
33
35
|
return {
|
|
34
36
|
addToCart,
|
|
37
|
+
addToFavorites,
|
|
35
38
|
resultClick,
|
|
36
39
|
quizAnswerChanged,
|
|
37
40
|
previousQuestion,
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const react_1 = require("react");
|
|
4
|
+
const services_1 = require("../../services");
|
|
5
|
+
const utils_1 = require("../../utils");
|
|
6
|
+
const useQuizAddToFavorites = (cioClient, quizApiState, onAddToFavoritesClick) => {
|
|
7
|
+
const quizAddToFavoritesHandler = (0, react_1.useCallback)((e, result, price, sendEvent = true) => {
|
|
8
|
+
e.preventDefault();
|
|
9
|
+
if (quizApiState.quizResults) {
|
|
10
|
+
// Tracking call
|
|
11
|
+
if (sendEvent) {
|
|
12
|
+
(0, services_1.trackQuizConversion)(cioClient, quizApiState.quizResults, result, price, 'add_to_wishlist');
|
|
13
|
+
}
|
|
14
|
+
// User custom callback function
|
|
15
|
+
if ((0, utils_1.isFunction)(onAddToFavoritesClick)) {
|
|
16
|
+
onAddToFavoritesClick(result);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}, [quizApiState, cioClient, onAddToFavoritesClick]);
|
|
20
|
+
return quizAddToFavoritesHandler;
|
|
21
|
+
};
|
|
22
|
+
exports.default = useQuizAddToFavorites;
|
|
@@ -53,7 +53,9 @@ const trackQuizResultClick = (cioClient, quizResults, result, position) => {
|
|
|
53
53
|
}
|
|
54
54
|
};
|
|
55
55
|
exports.trackQuizResultClick = trackQuizResultClick;
|
|
56
|
-
const trackQuizConversion = (cioClient, quizResults, result, price
|
|
56
|
+
const trackQuizConversion = (cioClient, quizResults, result, price, type
|
|
57
|
+
// eslint-disable-next-line max-params
|
|
58
|
+
) => {
|
|
57
59
|
var _a, _b;
|
|
58
60
|
if (quizResults.request) {
|
|
59
61
|
const { quiz_id, quiz_session_id, quiz_version_id, request: { section }, } = quizResults;
|
|
@@ -66,6 +68,7 @@ const trackQuizConversion = (cioClient, quizResults, result, price) => {
|
|
|
66
68
|
section,
|
|
67
69
|
variationId: (_b = result.data) === null || _b === void 0 ? void 0 : _b.variation_id,
|
|
68
70
|
revenue: (price && String(price)) || undefined,
|
|
71
|
+
type,
|
|
69
72
|
});
|
|
70
73
|
}
|
|
71
74
|
};
|
|
@@ -144,7 +144,8 @@ const useMockContextValue = (question) => {
|
|
|
144
144
|
getCoverQuestionProps,
|
|
145
145
|
getOpenTextInputProps,
|
|
146
146
|
getSelectInputProps,
|
|
147
|
-
getAddToCartButtonProps: () => (Object.assign(Object.assign({}, mockElementProps), { className: 'cio-
|
|
147
|
+
getAddToCartButtonProps: () => (Object.assign(Object.assign({}, mockElementProps), { className: 'cio-result-card-cta-button' })),
|
|
148
|
+
getAddToFavoritesButtonProps: () => (Object.assign(Object.assign({}, mockElementProps), { className: 'cio-result-card-favorites-button' })),
|
|
148
149
|
getHydrateQuizButtonProps: () => (Object.assign(Object.assign({}, mockElementProps), { className: 'cio-question-cta-button' })),
|
|
149
150
|
getNextQuestionButtonProps: () => (Object.assign(Object.assign({}, mockElementProps), { className: 'cio-question-cta-button' })),
|
|
150
151
|
getPreviousQuestionButtonProps: () => (Object.assign(Object.assign({}, mockElementProps), { className: 'cio-question-back-button' })),
|
|
@@ -158,6 +159,7 @@ const useMockContextValue = (question) => {
|
|
|
158
159
|
'--primary-color-l': '14',
|
|
159
160
|
},
|
|
160
161
|
customClickItemCallback: false,
|
|
162
|
+
customAddToFavoritesCallback: true,
|
|
161
163
|
};
|
|
162
164
|
};
|
|
163
165
|
exports.useMockContextValue = useMockContextValue;
|
package/lib/cjs/utils.js
CHANGED
|
@@ -45,6 +45,7 @@ exports.getStoryParams = getStoryParams;
|
|
|
45
45
|
exports.functionStrings = {
|
|
46
46
|
onAddToCartClick: `(item) => console.dir(item)`,
|
|
47
47
|
onQuizResultClick: `(result, position) => console.dir(result, position)`,
|
|
48
|
+
onAddToFavoritesClick: `(item) => console.dir(item)`,
|
|
48
49
|
onQuizResultsLoaded: `(results) => console.dir(results)`,
|
|
49
50
|
cioJsClient: `cioJsClient`,
|
|
50
51
|
};
|
|
@@ -2,13 +2,14 @@ import React, { useEffect, useState } from 'react';
|
|
|
2
2
|
import QuizContext from './context';
|
|
3
3
|
import QuizQuestions from '../QuizQuestions';
|
|
4
4
|
import ResultContainer from '../ResultContainer/ResultContainer';
|
|
5
|
+
import ControlBar from '../ControlBar/ControlBar';
|
|
5
6
|
import { RequestStates } from '../../constants';
|
|
6
7
|
import Spinner from '../Spinner/Spinner';
|
|
7
8
|
import useQuiz from '../../hooks/useQuiz';
|
|
8
9
|
import SessionPromptModal from '../SessionPromptModal/SessionPromptModal';
|
|
9
|
-
import { convertPrimaryColorsToString } from '../../utils';
|
|
10
|
+
import { convertPrimaryColorsToString, renderImages } from '../../utils';
|
|
10
11
|
export default function CioQuiz(props) {
|
|
11
|
-
const { cioClient, state, events: { hydrateQuiz, hasSessionStorageState, resetSessionStorageState }, getAddToCartButtonProps, getCoverQuestionProps, getHydrateQuizButtonProps, getNextQuestionButtonProps, getOpenTextInputProps, getPreviousQuestionButtonProps, getQuizImageProps, getQuizResultButtonProps, getQuizResultLinkProps, getResetQuizButtonProps, getSelectInputProps, primaryColorStyles, } = useQuiz(props);
|
|
12
|
+
const { cioClient, state, events: { hydrateQuiz, hasSessionStorageState, resetSessionStorageState }, getAddToCartButtonProps, getAddToFavoritesButtonProps, getCoverQuestionProps, getHydrateQuizButtonProps, getNextQuestionButtonProps, getOpenTextInputProps, getPreviousQuestionButtonProps, getQuizImageProps, getQuizResultButtonProps, getQuizResultLinkProps, getResetQuizButtonProps, getSelectInputProps, primaryColorStyles, } = useQuiz(props);
|
|
12
13
|
const [showSessionPrompt, setShowSessionPrompt] = useState(false);
|
|
13
14
|
const { resultsPageOptions, sessionStateOptions } = props;
|
|
14
15
|
useEffect(() => {
|
|
@@ -29,6 +30,7 @@ export default function CioQuiz(props) {
|
|
|
29
30
|
cioClient,
|
|
30
31
|
state,
|
|
31
32
|
getAddToCartButtonProps,
|
|
33
|
+
getAddToFavoritesButtonProps,
|
|
32
34
|
getCoverQuestionProps,
|
|
33
35
|
getHydrateQuizButtonProps,
|
|
34
36
|
getNextQuestionButtonProps,
|
|
@@ -40,19 +42,27 @@ export default function CioQuiz(props) {
|
|
|
40
42
|
getResetQuizButtonProps,
|
|
41
43
|
getSelectInputProps,
|
|
42
44
|
customClickItemCallback: !!resultsPageOptions?.onQuizResultClick,
|
|
45
|
+
customAddToFavoritesCallback: !!resultsPageOptions?.onAddToFavoritesClick,
|
|
43
46
|
primaryColorStyles,
|
|
44
47
|
};
|
|
45
48
|
if (state.quiz.requestState === RequestStates.Loading) {
|
|
46
|
-
return (React.createElement("div", { className: 'cio-quiz' },
|
|
49
|
+
return (React.createElement("div", { className: 'cio-quiz cio-quiz-loading' },
|
|
47
50
|
React.createElement(Spinner, null)));
|
|
48
51
|
}
|
|
52
|
+
const questionData = state.quiz.currentQuestion?.next_question;
|
|
53
|
+
const questionType = questionData?.type;
|
|
54
|
+
const questionImages = questionData?.images;
|
|
55
|
+
const displayBackgroundImage = (questionType === 'single' || questionType === 'multiple') && questionImages;
|
|
49
56
|
if (state.quiz.requestState === RequestStates.Success) {
|
|
50
57
|
return (React.createElement("div", { className: 'cio-quiz' },
|
|
58
|
+
displayBackgroundImage && renderImages(questionImages, 'cio-question-background-image'),
|
|
51
59
|
React.createElement("style", null,
|
|
52
60
|
".cio-quiz ",
|
|
53
61
|
convertPrimaryColorsToString(primaryColorStyles)),
|
|
54
62
|
React.createElement(SessionPromptModal, { resetStoredState: resetSessionStorageState, continueSession: hydrateQuiz, showSessionPrompt: showSessionPrompt, setShowSessionPrompt: setShowSessionPrompt }),
|
|
55
|
-
React.createElement(QuizContext.Provider, { value: contextValue }, state.quiz.results || state.quiz.skipToResults ? (React.createElement(ResultContainer, { options: resultsPageOptions })) : (state.quiz.currentQuestion && React.createElement(
|
|
63
|
+
React.createElement(QuizContext.Provider, { value: contextValue }, state.quiz.results || state.quiz.skipToResults ? (React.createElement(ResultContainer, { options: resultsPageOptions })) : (state.quiz.currentQuestion && (React.createElement(React.Fragment, null,
|
|
64
|
+
React.createElement(QuizQuestions, null),
|
|
65
|
+
React.createElement(ControlBar, { ctaButtonText: questionData?.cta_text || undefined })))))));
|
|
56
66
|
}
|
|
57
67
|
return null;
|
|
58
68
|
}
|
|
@@ -3,7 +3,6 @@ import QuestionTitle from '../QuestionTitle/QuestionTitle';
|
|
|
3
3
|
import QuizContext from '../CioQuiz/context';
|
|
4
4
|
import QuestionDescription from '../QuestionDescription/QuestionDescription';
|
|
5
5
|
import { renderImages } from '../../utils';
|
|
6
|
-
import ControlBar from '../ControlBar/ControlBar';
|
|
7
6
|
export default function CoverTypeQuestion() {
|
|
8
7
|
const { state } = useContext(QuizContext);
|
|
9
8
|
let question;
|
|
@@ -19,8 +18,7 @@ export default function CoverTypeQuestion() {
|
|
|
19
18
|
hasImage ? renderImages(question.images, 'cio-question-image-container') : '',
|
|
20
19
|
React.createElement("div", { className: 'cio-question-content' },
|
|
21
20
|
React.createElement(QuestionTitle, { title: question?.title }),
|
|
22
|
-
React.createElement(QuestionDescription, { description: question.description })
|
|
23
|
-
React.createElement(ControlBar, { ctaButtonText: question?.cta_text }))));
|
|
21
|
+
React.createElement(QuestionDescription, { description: question.description }))));
|
|
24
22
|
}
|
|
25
23
|
return null;
|
|
26
24
|
}
|
|
@@ -3,7 +3,6 @@ import QuestionTitle from '../QuestionTitle/QuestionTitle';
|
|
|
3
3
|
import QuestionDescription from '../QuestionDescription/QuestionDescription';
|
|
4
4
|
import { renderImages } from '../../utils';
|
|
5
5
|
import QuizContext from '../CioQuiz/context';
|
|
6
|
-
import ControlBar from '../ControlBar/ControlBar';
|
|
7
6
|
function OpenTextQuestion() {
|
|
8
7
|
const { state, getOpenTextInputProps } = useContext(QuizContext);
|
|
9
8
|
let question;
|
|
@@ -20,8 +19,7 @@ function OpenTextQuestion() {
|
|
|
20
19
|
React.createElement("div", { className: 'cio-question-content' },
|
|
21
20
|
React.createElement(QuestionTitle, { title: question.title }),
|
|
22
21
|
React.createElement(QuestionDescription, { description: question.description }),
|
|
23
|
-
getOpenTextInputProps && React.createElement("input", { ...getOpenTextInputProps() })
|
|
24
|
-
React.createElement(ControlBar, { ctaButtonText: question?.cta_text }))));
|
|
22
|
+
getOpenTextInputProps && React.createElement("input", { ...getOpenTextInputProps() }))));
|
|
25
23
|
}
|
|
26
24
|
return null;
|
|
27
25
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import React, { useContext } from 'react';
|
|
2
2
|
import ResultCtaButton from '../ResultCtaButton/ResultCtaButton';
|
|
3
|
+
import ResultFavoritesButton from '../ResultFavoritesButton/ResultFavoritesButton';
|
|
3
4
|
import QuizContext from '../CioQuiz/context';
|
|
4
5
|
export default function ResultCard(props) {
|
|
5
6
|
const { result, salePriceKey, regularPriceKey, resultPosition, ratingCountKey, ratingScoreKey, renderResultCardPriceDetails, } = props;
|
|
6
|
-
const { customClickItemCallback, getQuizResultButtonProps, getQuizResultLinkProps } = useContext(QuizContext);
|
|
7
|
+
const { customAddToFavoritesCallback, customClickItemCallback, getQuizResultButtonProps, getQuizResultLinkProps, } = useContext(QuizContext);
|
|
7
8
|
const salePrice = salePriceKey && result?.data?.[salePriceKey];
|
|
8
9
|
const regularPrice = regularPriceKey && result?.data?.[regularPriceKey];
|
|
9
10
|
const ratingCount = ratingCountKey && result?.data?.[ratingCountKey];
|
|
@@ -32,6 +33,7 @@ export default function ResultCard(props) {
|
|
|
32
33
|
const resultCardContentWithoutLink = () => getQuizResultButtonProps && (React.createElement("div", { ...getQuizResultButtonProps({ result, position: resultPosition, type: 'button' }) }, resultCardContent()));
|
|
33
34
|
const resultCardContentWithLink = () => getQuizResultLinkProps && (React.createElement("a", { className: 'cio-result-card-anchor', rel: 'noreferrer', target: '_blank', ...getQuizResultLinkProps({ result, position: resultPosition, type: 'link' }) }, resultCardContent()));
|
|
34
35
|
return (React.createElement("div", { className: 'cio-result-card' },
|
|
36
|
+
customAddToFavoritesCallback && (React.createElement(ResultFavoritesButton, { item: result, price: salePrice || regularPrice })),
|
|
35
37
|
!customClickItemCallback ? resultCardContentWithLink() : resultCardContentWithoutLink(),
|
|
36
38
|
React.createElement(ResultCtaButton, { item: result, price: salePrice || regularPrice })));
|
|
37
39
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React, { useContext } from 'react';
|
|
2
|
+
import QuizContext from '../CioQuiz/context';
|
|
3
|
+
export default function ResultFavoritesButton(props) {
|
|
4
|
+
const { item, price } = props;
|
|
5
|
+
const { getAddToFavoritesButtonProps } = useContext(QuizContext);
|
|
6
|
+
if (getAddToFavoritesButtonProps) {
|
|
7
|
+
return (
|
|
8
|
+
// eslint-disable-next-line react/button-has-type
|
|
9
|
+
React.createElement("button", { ...getAddToFavoritesButtonProps(item, price) },
|
|
10
|
+
React.createElement("svg", { xmlns: 'http://www.w3.org/2000/svg', viewBox: '-2 -2 35 35' },
|
|
11
|
+
React.createElement("path", { d: 'M 15 28.925781 L 14.808594 28.8125 C 14.789062 28.800781 12.699219 27.566406 10.136719 25.472656 C 7.765625 23.539062 4.488281 20.453125 2.335938 16.730469 C 0.785156 14.046875 0 11.367188 0 8.765625 C 0 7.632812 0.203125 6.570312 0.601562 5.601562 C 0.988281 4.675781 1.542969 3.855469 2.257812 3.171875 C 3.664062 1.820312 5.589844 1.074219 7.6875 1.074219 C 8.960938 1.074219 10.109375 1.277344 11.105469 1.675781 C 12.054688 2.058594 12.867188 2.617188 13.523438 3.339844 C 14.195312 4.085938 14.691406 4.992188 15 6.027344 C 15.308594 4.992188 15.804688 4.085938 16.476562 3.339844 C 17.132812 2.617188 17.945312 2.058594 18.894531 1.675781 C 19.890625 1.277344 21.039062 1.074219 22.3125 1.074219 C 24.410156 1.074219 26.339844 1.820312 27.742188 3.171875 C 28.457031 3.855469 29.011719 4.675781 29.398438 5.601562 C 29.796875 6.570312 30 7.632812 30 8.765625 C 30 11.371094 29.214844 14.046875 27.664062 16.730469 C 26.710938 18.375 25.460938 20.035156 23.949219 21.664062 C 22.746094 22.960938 21.371094 24.242188 19.863281 25.472656 C 17.300781 27.566406 15.210938 28.800781 15.191406 28.8125 Z M 7.6875 1.832031 C 5.789062 1.832031 4.042969 2.5 2.78125 3.714844 C 1.457031 4.988281 0.757812 6.734375 0.757812 8.765625 C 0.757812 11.234375 1.507812 13.785156 2.992188 16.351562 C 4.144531 18.347656 6.40625 21.449219 10.601562 24.878906 C 12.679688 26.574219 14.433594 27.695312 15 28.042969 C 15.566406 27.695312 17.324219 26.574219 19.398438 24.878906 C 21.714844 22.984375 24.914062 19.96875 27.007812 16.351562 C 28.492188 13.785156 29.242188 11.234375 29.242188 8.765625 C 29.246094 6.734375 28.542969 4.988281 27.21875 3.714844 C 25.957031 2.5 24.210938 1.832031 22.3125 1.832031 C 20.023438 1.832031 18.25 2.507812 17.039062 3.847656 C 15.953125 5.050781 15.378906 6.75 15.378906 8.765625 L 14.621094 8.765625 C 14.621094 6.75 14.046875 5.050781 12.960938 3.847656 C 11.75 2.507812 9.976562 1.832031 7.6875 1.832031 Z M 7.6875 1.832031' }))));
|
|
12
|
+
}
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
@@ -3,7 +3,6 @@ import QuestionTitle from '../QuestionTitle/QuestionTitle';
|
|
|
3
3
|
import QuestionDescription from '../QuestionDescription/QuestionDescription';
|
|
4
4
|
import QuizContext from '../CioQuiz/context';
|
|
5
5
|
import { renderImages } from '../../utils';
|
|
6
|
-
import ControlBar from '../ControlBar/ControlBar';
|
|
7
6
|
import { QuestionTypes } from '../CioQuiz/actions';
|
|
8
7
|
function SelectTypeQuestion() {
|
|
9
8
|
const { state, getSelectInputProps } = useContext(QuizContext);
|
|
@@ -25,8 +24,7 @@ function SelectTypeQuestion() {
|
|
|
25
24
|
? 'cio-question-options-container-text-only'
|
|
26
25
|
: 'cio-question-options-container'}` }, question?.options?.map((option) => getSelectInputProps && (React.createElement("div", { ...getSelectInputProps(option) },
|
|
27
26
|
option.images ? renderImages(option.images, 'cio-question-option-image') : '',
|
|
28
|
-
React.createElement("div", { className: 'cio-question-option-value' }, option?.value)))))
|
|
29
|
-
React.createElement(ControlBar, { ctaButtonText: question?.cta_text || 'Continue' })));
|
|
27
|
+
React.createElement("div", { className: 'cio-question-option-value' }, option?.value)))))));
|
|
30
28
|
}
|
|
31
29
|
return null;
|
|
32
30
|
}
|
package/lib/mjs/constants.js
CHANGED
|
@@ -11,6 +11,7 @@ export const componentDescription = `- import \`CioQuiz\` to render in your JSX.
|
|
|
11
11
|
- To use this component, \`quizId\`, \`resultsPageOptions\`, and one of \`apiKey\` or \`cioJsClient\` are required.
|
|
12
12
|
- \`resultsPageOptions\` lets you configure the results page
|
|
13
13
|
- \`onAddToCartClick\` is a callback function that will be called when the "Add to cart" button is clicked
|
|
14
|
+
- \`onAddToFavoritesClick\` is an optional callback function that will be called when the "Add To Favorites" heart icon is clicked
|
|
14
15
|
- \`onQuizResultClick\` is an optional callback function that will be called when the result card is clicked. The default behavior is redirecting the user to the item's URL
|
|
15
16
|
- \`onQuizResultsLoaded\` is an optional callback function that will be called when the quiz results are loaded
|
|
16
17
|
- \`resultCardRegularPriceKey\` is a parameter that specifies the metadata field name for the regular price
|
|
@@ -46,6 +47,7 @@ const {
|
|
|
46
47
|
state: QuizReturnState, // Quiz state
|
|
47
48
|
events: [{...}], // array of quiz events
|
|
48
49
|
getAddToCartButtonProps: () => ({...})), // prop getter for jsx add to cart button for quiz result,
|
|
50
|
+
getAddToFavoritesButtonProps: () => ({...})), // prop getter for jsx add to favorites button for quiz result,
|
|
49
51
|
getCoverQuestionProps: () => ({...})), // prop getter for jsx quiz cover question,
|
|
50
52
|
getHydrateQuizButtonProps: () => ({...})), // prop getter for jsx hydrate quiz button,
|
|
51
53
|
getNextQuestionButtonProps: () => ({...})), // prop getter for jsx next button to traverse the quiz,
|
|
@@ -4,8 +4,9 @@ import useCoverQuestionProps from './useCoverQuestionProps';
|
|
|
4
4
|
import useOpenTextInputProps from './useOpenTextInputProps';
|
|
5
5
|
import useNextQuestionButtonProps from './useNextQuestionButtonProps';
|
|
6
6
|
import usePreviousQuestionButtonProps from './usePreviousQuestionButtonProps';
|
|
7
|
+
import useAddToFavoritesButtonProps from './useAddToFavoritesButtonProps';
|
|
7
8
|
const usePropsGetters = (quizEvents, quizApiState, quizLocalState) => {
|
|
8
|
-
const { quizAnswerChanged, nextQuestion, previousQuestion, resetQuiz, hydrateQuiz, addToCart, resultClick, } = quizEvents;
|
|
9
|
+
const { quizAnswerChanged, nextQuestion, previousQuestion, resetQuiz, hydrateQuiz, addToCart, addToFavorites, resultClick, } = quizEvents;
|
|
9
10
|
const getOpenTextInputProps = useOpenTextInputProps(quizAnswerChanged, nextQuestion, quizApiState.quizCurrentQuestion?.next_question, quizLocalState.answerInputs);
|
|
10
11
|
const getCoverQuestionProps = useCoverQuestionProps(quizAnswerChanged, quizApiState.quizCurrentQuestion?.next_question);
|
|
11
12
|
const getSelectInputProps = useSelectInputProps(quizAnswerChanged, nextQuestion, quizApiState.quizCurrentQuestion?.next_question, quizLocalState.answerInputs);
|
|
@@ -26,6 +27,7 @@ const usePropsGetters = (quizEvents, quizApiState, quizLocalState) => {
|
|
|
26
27
|
type: 'button',
|
|
27
28
|
onClick: (e) => addToCart(e, result, price),
|
|
28
29
|
}), [addToCart]);
|
|
30
|
+
const getAddToFavoritesButtonProps = useAddToFavoritesButtonProps(addToFavorites);
|
|
29
31
|
const quizResultClickDown = useCallback((event, result, position) => {
|
|
30
32
|
if (event?.key === ' ' || event?.key === 'Enter') {
|
|
31
33
|
if (resultClick) {
|
|
@@ -65,6 +67,7 @@ const usePropsGetters = (quizEvents, quizApiState, quizLocalState) => {
|
|
|
65
67
|
getResetQuizButtonProps,
|
|
66
68
|
getHydrateQuizButtonProps,
|
|
67
69
|
getAddToCartButtonProps,
|
|
70
|
+
getAddToFavoritesButtonProps,
|
|
68
71
|
getQuizResultButtonProps,
|
|
69
72
|
getQuizResultLinkProps,
|
|
70
73
|
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { useState, useCallback } from 'react';
|
|
2
|
+
export default function useAddToFavoritesButtonProps(addToFavorites) {
|
|
3
|
+
const [favorited, setFavorited] = useState({});
|
|
4
|
+
const toggleIdFavorited = useCallback((id) => {
|
|
5
|
+
setFavorited({ ...favorited, [id]: !favorited?.[id] });
|
|
6
|
+
}, [favorited]);
|
|
7
|
+
const getAddToFavoritesButtonProps = useCallback((result, price) => ({
|
|
8
|
+
className: `${'cio-result-card-favorites-button'} ${favorited?.[result?.data?.id || '0'] ? 'favorited' : ''}`,
|
|
9
|
+
onClick: (e) => {
|
|
10
|
+
addToFavorites(e, result, price, !favorited?.[result?.data?.id || '0']);
|
|
11
|
+
toggleIdFavorited(result?.data?.id || '0');
|
|
12
|
+
},
|
|
13
|
+
type: 'button',
|
|
14
|
+
}),
|
|
15
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
16
|
+
[favorited, addToFavorites]);
|
|
17
|
+
return getAddToFavoritesButtonProps;
|
|
18
|
+
}
|
|
@@ -7,10 +7,11 @@ import useQuizNextClick from './useQuizNextClick';
|
|
|
7
7
|
import useQuizResetClick from './useQuizResetClick';
|
|
8
8
|
import useHydrateQuizLocalState from './useHydrateQuizLocalState';
|
|
9
9
|
import { resetQuizSessionStorageState } from '../../utils';
|
|
10
|
+
import useQuizAddToFavorites from './useQuizAddToFavorites';
|
|
10
11
|
const useQuizEvents = (quizOptions, cioClient, quizState) => {
|
|
11
12
|
const { quizApiState, dispatchLocalState, dispatchApiState, hasQuizStoredState, quizStateKey, quizLocalState, } = quizState;
|
|
12
13
|
const { resultsPageOptions } = quizOptions;
|
|
13
|
-
const { onAddToCartClick, onQuizResultClick, onQuizResultsLoaded } = resultsPageOptions;
|
|
14
|
+
const { onAddToCartClick, onQuizResultClick, onQuizResultsLoaded, onAddToFavoritesClick } = resultsPageOptions;
|
|
14
15
|
// Quiz answer change
|
|
15
16
|
const quizAnswerChanged = useQuizAnswerChangeHandler(quizApiState, dispatchLocalState);
|
|
16
17
|
// Quiz Next button click callback
|
|
@@ -21,6 +22,7 @@ const useQuizEvents = (quizOptions, cioClient, quizState) => {
|
|
|
21
22
|
const addToCart = useQuizAddToCart(cioClient, quizApiState, onAddToCartClick);
|
|
22
23
|
// Quiz result click callback
|
|
23
24
|
const resultClick = useQuizResultClick(cioClient, quizApiState, onQuizResultClick);
|
|
25
|
+
const addToFavorites = useQuizAddToFavorites(cioClient, quizApiState, onAddToFavoritesClick);
|
|
24
26
|
// Quiz results loaded event
|
|
25
27
|
useQuizResultsLoaded(cioClient, quizApiState, onQuizResultsLoaded);
|
|
26
28
|
// Quiz reset
|
|
@@ -29,6 +31,7 @@ const useQuizEvents = (quizOptions, cioClient, quizState) => {
|
|
|
29
31
|
const hydrateQuizLocalState = useHydrateQuizLocalState(quizStateKey, dispatchLocalState);
|
|
30
32
|
return {
|
|
31
33
|
addToCart,
|
|
34
|
+
addToFavorites,
|
|
32
35
|
resultClick,
|
|
33
36
|
quizAnswerChanged,
|
|
34
37
|
previousQuestion,
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import { trackQuizConversion } from '../../services';
|
|
3
|
+
import { isFunction } from '../../utils';
|
|
4
|
+
const useQuizAddToFavorites = (cioClient, quizApiState, onAddToFavoritesClick) => {
|
|
5
|
+
const quizAddToFavoritesHandler = useCallback((e, result, price, sendEvent = true) => {
|
|
6
|
+
e.preventDefault();
|
|
7
|
+
if (quizApiState.quizResults) {
|
|
8
|
+
// Tracking call
|
|
9
|
+
if (sendEvent) {
|
|
10
|
+
trackQuizConversion(cioClient, quizApiState.quizResults, result, price, 'add_to_wishlist');
|
|
11
|
+
}
|
|
12
|
+
// User custom callback function
|
|
13
|
+
if (isFunction(onAddToFavoritesClick)) {
|
|
14
|
+
onAddToFavoritesClick(result);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}, [quizApiState, cioClient, onAddToFavoritesClick]);
|
|
18
|
+
return quizAddToFavoritesHandler;
|
|
19
|
+
};
|
|
20
|
+
export default useQuizAddToFavorites;
|