@constructor-io/constructorio-ui-quizzes 1.2.2 → 1.3.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 +1 -1
- package/dist/constructorio-ui-quizzes-bundled.js +17 -17
- package/lib/cjs/components/CioQuiz/actions.js +11 -1
- package/lib/cjs/components/CioQuiz/index.js +15 -103
- package/lib/cjs/components/CioQuiz/quizApiReducer.js +32 -0
- package/lib/cjs/components/CioQuiz/{reducer.js → quizLocalReducer.js} +2 -2
- package/lib/cjs/components/CoverTypeQuestion/CoverTypeQuestion.js +6 -12
- package/lib/cjs/components/OpenTextTypeQuestion/OpenTextTypeQuestion.js +12 -18
- package/lib/cjs/components/QuizQuestions/index.js +6 -3
- package/lib/cjs/components/ResultCard/ResultCard.js +10 -30
- package/lib/cjs/components/ResultContainer/ResultContainer.js +8 -31
- package/lib/cjs/components/ResultCtaButton/ResultCtaButton.js +7 -26
- package/lib/cjs/components/ResultFilters/ResultFilters.js +6 -23
- package/lib/cjs/components/Results/Results.js +5 -5
- package/lib/cjs/components/SelectTypeQuestion/SelectTypeQuestion.js +16 -23
- package/lib/cjs/components/ZeroResults/ZeroResults.js +2 -2
- package/lib/cjs/constants.js +3 -2
- package/lib/cjs/hooks/useCioClient.js +4 -3
- package/lib/cjs/hooks/useConsoleErrors.js +20 -0
- package/lib/cjs/hooks/useQuiz.js +48 -0
- package/lib/cjs/hooks/useQuizApiState.js +91 -0
- package/lib/cjs/hooks/useQuizEvents/index.js +36 -0
- package/lib/cjs/hooks/useQuizEvents/useQuizAddToCart.js +20 -0
- package/lib/cjs/hooks/useQuizEvents/useQuizBackClick.js +13 -0
- package/lib/cjs/hooks/useQuizEvents/useQuizNextClick.js +48 -0
- package/lib/cjs/hooks/useQuizEvents/useQuizResultClick.js +19 -0
- package/lib/cjs/hooks/useQuizEvents/useQuizResultsLoaded.js +22 -0
- package/lib/cjs/hooks/useQuizLocalState.js +20 -0
- package/lib/cjs/services/index.js +72 -0
- package/lib/cjs/utils.js +42 -21
- package/lib/mjs/components/CioQuiz/actions.js +10 -0
- package/lib/mjs/components/CioQuiz/index.js +15 -103
- package/lib/mjs/components/CioQuiz/quizApiReducer.js +49 -0
- package/lib/mjs/components/CioQuiz/{reducer.js → quizLocalReducer.js} +1 -1
- package/lib/mjs/components/CoverTypeQuestion/CoverTypeQuestion.js +6 -12
- package/lib/mjs/components/OpenTextTypeQuestion/OpenTextTypeQuestion.js +11 -17
- package/lib/mjs/components/QuizQuestions/index.js +5 -3
- package/lib/mjs/components/ResultCard/ResultCard.js +10 -29
- package/lib/mjs/components/ResultContainer/ResultContainer.js +8 -31
- package/lib/mjs/components/ResultCtaButton/ResultCtaButton.js +7 -25
- package/lib/mjs/components/ResultFilters/ResultFilters.js +5 -23
- package/lib/mjs/components/Results/Results.js +3 -3
- package/lib/mjs/components/SelectTypeQuestion/SelectTypeQuestion.js +13 -20
- package/lib/mjs/components/ZeroResults/ZeroResults.js +2 -2
- package/lib/mjs/constants.js +3 -2
- package/lib/mjs/hooks/useCioClient.js +4 -3
- package/lib/mjs/hooks/useConsoleErrors.js +18 -0
- package/lib/mjs/hooks/useQuiz.js +47 -0
- package/lib/mjs/hooks/useQuizApiState.js +87 -0
- package/lib/mjs/hooks/useQuizEvents/index.js +33 -0
- package/lib/mjs/hooks/useQuizEvents/useQuizAddToCart.js +18 -0
- package/lib/mjs/hooks/useQuizEvents/useQuizBackClick.js +11 -0
- package/lib/mjs/hooks/useQuizEvents/useQuizNextClick.js +45 -0
- package/lib/mjs/hooks/useQuizEvents/useQuizResultClick.js +17 -0
- package/lib/mjs/hooks/useQuizEvents/useQuizResultsLoaded.js +19 -0
- package/lib/mjs/hooks/useQuizLocalState.js +17 -0
- package/lib/mjs/services/index.js +60 -0
- package/lib/mjs/utils.js +39 -17
- package/lib/types/components/CioQuiz/actions.d.ts +20 -0
- package/lib/types/components/CioQuiz/context.d.ts +10 -14
- package/lib/types/components/CioQuiz/index.d.ts +1 -12
- package/lib/types/components/CioQuiz/quizApiReducer.d.ts +14 -0
- package/lib/types/components/CioQuiz/{reducer.d.ts → quizLocalReducer.d.ts} +3 -3
- package/lib/types/components/QuizQuestions/index.d.ts +1 -4
- package/lib/types/components/ResultCard/ResultCard.d.ts +2 -4
- package/lib/types/components/ResultContainer/ResultContainer.d.ts +1 -2
- package/lib/types/components/ResultCtaButton/ResultCtaButton.d.ts +2 -3
- package/lib/types/components/ResultFilters/ResultFilters.d.ts +2 -5
- package/lib/types/components/Results/Results.d.ts +1 -7
- package/lib/types/components/ZeroResults/ZeroResults.d.ts +1 -1
- package/lib/types/constants.d.ts +1 -1
- package/lib/types/hooks/useCioClient.d.ts +1 -1
- package/lib/types/hooks/useConsoleErrors.d.ts +3 -0
- package/lib/types/hooks/useQuiz.d.ts +3 -0
- package/lib/types/hooks/useQuizApiState.d.ts +10 -0
- package/lib/types/hooks/useQuizEvents/index.d.ts +15 -0
- package/lib/types/hooks/useQuizEvents/useQuizAddToCart.d.ts +5 -0
- package/lib/types/hooks/useQuizEvents/useQuizBackClick.d.ts +4 -0
- package/lib/types/hooks/useQuizEvents/useQuizNextClick.d.ts +5 -0
- package/lib/types/hooks/useQuizEvents/useQuizResultClick.d.ts +5 -0
- package/lib/types/hooks/useQuizEvents/useQuizResultsLoaded.d.ts +5 -0
- package/lib/types/hooks/useQuizLocalState.d.ts +6 -0
- package/lib/types/services/index.d.ts +8 -0
- package/lib/types/types.d.ts +63 -0
- package/lib/types/utils.d.ts +12 -7
- package/package.json +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.QuestionTypes = void 0;
|
|
3
|
+
exports.QuizAPIActionTypes = exports.QuestionTypes = void 0;
|
|
4
|
+
// Local Actions
|
|
4
5
|
var QuestionTypes;
|
|
5
6
|
(function (QuestionTypes) {
|
|
6
7
|
QuestionTypes["OpenText"] = "open";
|
|
@@ -10,3 +11,12 @@ var QuestionTypes;
|
|
|
10
11
|
QuestionTypes["Back"] = "back";
|
|
11
12
|
QuestionTypes["Reset"] = "reset";
|
|
12
13
|
})(QuestionTypes = exports.QuestionTypes || (exports.QuestionTypes = {}));
|
|
14
|
+
// API actions
|
|
15
|
+
var QuizAPIActionTypes;
|
|
16
|
+
(function (QuizAPIActionTypes) {
|
|
17
|
+
QuizAPIActionTypes[QuizAPIActionTypes["SET_IS_LOADING"] = 0] = "SET_IS_LOADING";
|
|
18
|
+
QuizAPIActionTypes[QuizAPIActionTypes["SET_IS_ERROR"] = 1] = "SET_IS_ERROR";
|
|
19
|
+
QuizAPIActionTypes[QuizAPIActionTypes["SET_QUIZ_RESULTS"] = 2] = "SET_QUIZ_RESULTS";
|
|
20
|
+
QuizAPIActionTypes[QuizAPIActionTypes["SET_CURRENT_QUESTION"] = 3] = "SET_CURRENT_QUESTION";
|
|
21
|
+
QuizAPIActionTypes[QuizAPIActionTypes["RESET_QUIZ"] = 4] = "RESET_QUIZ";
|
|
22
|
+
})(QuizAPIActionTypes = exports.QuizAPIActionTypes || (exports.QuizAPIActionTypes = {}));
|
|
@@ -1,123 +1,35 @@
|
|
|
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.__importDefault(require("react"));
|
|
5
5
|
const context_1 = tslib_1.__importDefault(require("./context"));
|
|
6
|
-
const reducer_1 = tslib_1.__importStar(require("./reducer"));
|
|
7
|
-
const actions_1 = require("./actions");
|
|
8
6
|
const QuizQuestions_1 = tslib_1.__importDefault(require("../QuizQuestions"));
|
|
9
7
|
const ResultContainer_1 = tslib_1.__importDefault(require("../ResultContainer/ResultContainer"));
|
|
10
8
|
const constants_1 = require("../../constants");
|
|
11
|
-
const utils_1 = require("../../utils");
|
|
12
9
|
const Spinner_1 = tslib_1.__importDefault(require("../Spinner/Spinner"));
|
|
13
|
-
const
|
|
10
|
+
const useQuiz_1 = tslib_1.__importDefault(require("../../hooks/useQuiz"));
|
|
14
11
|
function CioQuiz(props) {
|
|
15
|
-
const {
|
|
16
|
-
|
|
17
|
-
// eslint-disable-next-line no-console
|
|
18
|
-
console.error('quizId is a required field of type string');
|
|
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
|
-
}
|
|
28
|
-
const cioClient = (0, useCioClient_1.default)({ apiKey, cioJsClient });
|
|
29
|
-
const [state, dispatch] = (0, react_1.useReducer)(reducer_1.default, reducer_1.initialState);
|
|
30
|
-
const [requestState, setRequestState] = (0, react_1.useState)(constants_1.RequestStates.Stale);
|
|
31
|
-
const [questionResponse, setQuestionResponse] = (0, react_1.useState)();
|
|
32
|
-
const [resultsResponse, setResultsResponse] = (0, react_1.useState)();
|
|
33
|
-
const [firstQuestion, setFirstQuestion] = (0, react_1.useState)();
|
|
34
|
-
const [quizVersionId, setQuizVersionId] = (0, react_1.useState)(quizVersionIdProp || '');
|
|
35
|
-
const [quizSessionId, setQuizSessionId] = (0, react_1.useState)('');
|
|
36
|
-
const isFirstQuestion = (firstQuestion === null || firstQuestion === void 0 ? void 0 : firstQuestion.next_question.id) === (questionResponse === null || questionResponse === void 0 ? void 0 : questionResponse.next_question.id);
|
|
37
|
-
const quizNextHandler = (0, react_1.useCallback)((action) => {
|
|
38
|
-
if (action) {
|
|
39
|
-
dispatch(action);
|
|
40
|
-
}
|
|
41
|
-
}, [dispatch]);
|
|
42
|
-
const quizBackHandler = (0, react_1.useCallback)(() => {
|
|
43
|
-
if (dispatch) {
|
|
44
|
-
dispatch({ type: actions_1.QuestionTypes.Back });
|
|
45
|
-
}
|
|
46
|
-
}, [dispatch]);
|
|
12
|
+
const { cioClient, state, events: { nextQuestion, previousQuestion, resetQuiz, addToCart, resultClick }, } = (0, useQuiz_1.default)(props);
|
|
13
|
+
const { resultsPageOptions } = props;
|
|
47
14
|
const contextValue = {
|
|
48
|
-
dispatch,
|
|
49
|
-
questionResponse,
|
|
50
|
-
state,
|
|
51
|
-
resultsResponse,
|
|
52
|
-
isFirstQuestion,
|
|
53
|
-
quizNextHandler,
|
|
54
|
-
quizBackHandler,
|
|
55
15
|
cioClient,
|
|
16
|
+
state,
|
|
17
|
+
nextQuestion,
|
|
18
|
+
previousQuestion,
|
|
19
|
+
resetQuiz,
|
|
20
|
+
addToCart,
|
|
21
|
+
resultClick,
|
|
22
|
+
customClickItemCallback: !!(resultsPageOptions === null || resultsPageOptions === void 0 ? void 0 : resultsPageOptions.onQuizResultClick),
|
|
56
23
|
};
|
|
57
|
-
(
|
|
58
|
-
(() => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
59
|
-
if (cioClient) {
|
|
60
|
-
setRequestState(constants_1.RequestStates.Loading);
|
|
61
|
-
if (state.isLastAnswer) {
|
|
62
|
-
try {
|
|
63
|
-
const quizResults = yield (0, utils_1.getQuizResults)(cioClient, quizId, {
|
|
64
|
-
answers: state.answers,
|
|
65
|
-
resultsPerPage: resultsPageOptions === null || resultsPageOptions === void 0 ? void 0 : resultsPageOptions.numResultsToDisplay,
|
|
66
|
-
quizVersionId,
|
|
67
|
-
quizSessionId,
|
|
68
|
-
});
|
|
69
|
-
setResultsResponse(quizResults);
|
|
70
|
-
setRequestState(constants_1.RequestStates.Success);
|
|
71
|
-
setQuestionResponse(undefined);
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
setResultsResponse(undefined);
|
|
75
|
-
setRequestState(constants_1.RequestStates.Error);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
try {
|
|
80
|
-
const questionResult = yield (0, utils_1.getNextQuestion)(cioClient, quizId, {
|
|
81
|
-
answers: state.answers,
|
|
82
|
-
quizVersionId,
|
|
83
|
-
quizSessionId,
|
|
84
|
-
});
|
|
85
|
-
setQuestionResponse(questionResult);
|
|
86
|
-
setRequestState(constants_1.RequestStates.Success);
|
|
87
|
-
setResultsResponse(undefined);
|
|
88
|
-
if (!quizVersionId && (questionResult === null || questionResult === void 0 ? void 0 : questionResult.quiz_version_id)) {
|
|
89
|
-
setQuizVersionId(questionResult.quiz_version_id);
|
|
90
|
-
}
|
|
91
|
-
if (!quizSessionId && (questionResult === null || questionResult === void 0 ? void 0 : questionResult.quiz_session_id)) {
|
|
92
|
-
setQuizSessionId(questionResult.quiz_session_id);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
setRequestState(constants_1.RequestStates.Error);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}))();
|
|
101
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
102
|
-
}, [cioClient, state, quizId, state.isLastAnswer, resultsPageOptions === null || resultsPageOptions === void 0 ? void 0 : resultsPageOptions.numResultsToDisplay]);
|
|
103
|
-
(0, react_1.useEffect)(() => {
|
|
104
|
-
if (!firstQuestion) {
|
|
105
|
-
setFirstQuestion(questionResponse);
|
|
106
|
-
}
|
|
107
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
108
|
-
}, [questionResponse]);
|
|
109
|
-
const resetQuizSessionId = () => {
|
|
110
|
-
setQuizSessionId('');
|
|
111
|
-
};
|
|
112
|
-
if (requestState === constants_1.RequestStates.Loading) {
|
|
24
|
+
if (state.quiz.requestState === constants_1.RequestStates.Loading) {
|
|
113
25
|
return (react_1.default.createElement("div", { className: 'cio-quiz' },
|
|
114
26
|
react_1.default.createElement(Spinner_1.default, null)));
|
|
115
27
|
}
|
|
116
|
-
if (requestState === constants_1.RequestStates.Success) {
|
|
28
|
+
if (state.quiz.requestState === constants_1.RequestStates.Success) {
|
|
117
29
|
return (react_1.default.createElement("div", { className: 'cio-quiz' },
|
|
118
30
|
react_1.default.createElement(context_1.default.Provider, { value: contextValue },
|
|
119
|
-
|
|
120
|
-
|
|
31
|
+
state.quiz.results && react_1.default.createElement(ResultContainer_1.default, { options: resultsPageOptions }),
|
|
32
|
+
state.quiz.currentQuestion && react_1.default.createElement(QuizQuestions_1.default, null))));
|
|
121
33
|
}
|
|
122
34
|
return null;
|
|
123
35
|
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initialState = void 0;
|
|
4
|
+
const constants_1 = require("../../constants");
|
|
5
|
+
const utils_1 = require("../../utils");
|
|
6
|
+
const actions_1 = require("./actions");
|
|
7
|
+
exports.initialState = {
|
|
8
|
+
quizRequestState: constants_1.RequestStates.Stale,
|
|
9
|
+
};
|
|
10
|
+
function apiReducer(state, action) {
|
|
11
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
12
|
+
switch (action.type) {
|
|
13
|
+
case actions_1.QuizAPIActionTypes.SET_IS_LOADING:
|
|
14
|
+
return Object.assign(Object.assign({}, state), { quizRequestState: constants_1.RequestStates.Loading });
|
|
15
|
+
case actions_1.QuizAPIActionTypes.SET_IS_ERROR:
|
|
16
|
+
return Object.assign(Object.assign({}, state), { quizRequestState: constants_1.RequestStates.Error, quizResults: undefined });
|
|
17
|
+
case actions_1.QuizAPIActionTypes.SET_CURRENT_QUESTION:
|
|
18
|
+
return Object.assign(Object.assign(Object.assign({}, state), { quizRequestState: constants_1.RequestStates.Success, quizVersionId: (_a = action.payload) === null || _a === void 0 ? void 0 : _a.quizVersionId, quizSessionId: (_b = action.payload) === null || _b === void 0 ? void 0 : _b.quizSessionId, quizCurrentQuestion: (_c = action.payload) === null || _c === void 0 ? void 0 : _c.quizCurrentQuestion, quizResults: undefined }), (!state.quizCurrentQuestion && {
|
|
19
|
+
quizFirstQuestion: (_d = action.payload) === null || _d === void 0 ? void 0 : _d.quizCurrentQuestion,
|
|
20
|
+
}));
|
|
21
|
+
case actions_1.QuizAPIActionTypes.SET_QUIZ_RESULTS: {
|
|
22
|
+
const filterExpression = ((_g = (_f = (_e = action.payload) === null || _e === void 0 ? void 0 : _e.quizResults) === null || _f === void 0 ? void 0 : _f.request) === null || _g === void 0 ? void 0 : _g.collection_filter_expression) || null;
|
|
23
|
+
const quizResultsFilters = [...new Set((0, utils_1.getFilterValuesFromExpression)(filterExpression))];
|
|
24
|
+
return Object.assign(Object.assign({}, state), { quizRequestState: constants_1.RequestStates.Success, quizResults: (_h = action.payload) === null || _h === void 0 ? void 0 : _h.quizResults, quizResultsFilters, quizCurrentQuestion: undefined });
|
|
25
|
+
}
|
|
26
|
+
case actions_1.QuizAPIActionTypes.RESET_QUIZ:
|
|
27
|
+
return exports.initialState;
|
|
28
|
+
default:
|
|
29
|
+
return state;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.default = apiReducer;
|
|
@@ -10,7 +10,7 @@ exports.initialState = {
|
|
|
10
10
|
function answerInputReducer(state, action) {
|
|
11
11
|
return Object.assign(Object.assign({}, state), { [String(action.payload.questionId)]: action.payload.input });
|
|
12
12
|
}
|
|
13
|
-
function
|
|
13
|
+
function quizLocalReducer(state, action) {
|
|
14
14
|
var _a, _b, _c, _d, _e, _f;
|
|
15
15
|
switch (action.type) {
|
|
16
16
|
case actions_1.QuestionTypes.OpenText:
|
|
@@ -29,4 +29,4 @@ function reducer(state, action) {
|
|
|
29
29
|
return state;
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
-
exports.default =
|
|
32
|
+
exports.default = quizLocalReducer;
|
|
@@ -6,24 +6,18 @@ 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 actions_1 = require("../CioQuiz/actions");
|
|
10
9
|
const ControlBar_1 = tslib_1.__importDefault(require("../ControlBar/ControlBar"));
|
|
11
10
|
function CoverTypeQuestion() {
|
|
12
11
|
var _a;
|
|
13
|
-
const {
|
|
12
|
+
const { state, previousQuestion, nextQuestion } = (0, react_1.useContext)(context_1.default);
|
|
14
13
|
let question;
|
|
15
|
-
if (
|
|
16
|
-
question =
|
|
14
|
+
if (state === null || state === void 0 ? void 0 : state.quiz.currentQuestion) {
|
|
15
|
+
question = state === null || state === void 0 ? void 0 : state.quiz.currentQuestion.next_question;
|
|
17
16
|
}
|
|
18
17
|
const hasImage = (_a = question === null || question === void 0 ? void 0 : question.images) === null || _a === void 0 ? void 0 : _a.primary_url;
|
|
19
18
|
const onNextClick = () => {
|
|
20
|
-
if (
|
|
21
|
-
|
|
22
|
-
type: actions_1.QuestionTypes.Cover,
|
|
23
|
-
payload: {
|
|
24
|
-
isLastQuestion: questionResponse === null || questionResponse === void 0 ? void 0 : questionResponse.is_last_question,
|
|
25
|
-
},
|
|
26
|
-
});
|
|
19
|
+
if (nextQuestion) {
|
|
20
|
+
nextQuestion();
|
|
27
21
|
}
|
|
28
22
|
};
|
|
29
23
|
if (question) {
|
|
@@ -34,7 +28,7 @@ function CoverTypeQuestion() {
|
|
|
34
28
|
react_1.default.createElement("div", { className: 'cio-question-content' },
|
|
35
29
|
react_1.default.createElement(QuestionTitle_1.default, { title: question === null || question === void 0 ? void 0 : question.title }),
|
|
36
30
|
react_1.default.createElement(QuestionDescription_1.default, { description: question.description }),
|
|
37
|
-
react_1.default.createElement(ControlBar_1.default, { nextButtonHandler: onNextClick, backButtonHandler:
|
|
31
|
+
react_1.default.createElement(ControlBar_1.default, { nextButtonHandler: onNextClick, backButtonHandler: previousQuestion, showBackButton: !(state === null || state === void 0 ? void 0 : state.quiz.isFirstQuestion), ctaButtonText: question === null || question === void 0 ? void 0 : question.cta_text })),
|
|
38
32
|
hasImage ? (0, utils_1.renderImages)(question.images, 'cio-question-image-container') : ''));
|
|
39
33
|
}
|
|
40
34
|
return null;
|
|
@@ -6,16 +6,15 @@ 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 actions_1 = require("../CioQuiz/actions");
|
|
10
9
|
const ControlBar_1 = tslib_1.__importDefault(require("../ControlBar/ControlBar"));
|
|
11
10
|
function OpenTextQuestion(props) {
|
|
12
11
|
var _a;
|
|
13
12
|
const { initialValue = '', onChangeHandler: userDefinedHandler = null } = props;
|
|
14
|
-
const {
|
|
13
|
+
const { state, previousQuestion, nextQuestion } = (0, react_1.useContext)(context_1.default);
|
|
15
14
|
const [openTextInput, setOpenTextInput] = (0, react_1.useState)(initialValue);
|
|
16
15
|
let question;
|
|
17
|
-
if (
|
|
18
|
-
question =
|
|
16
|
+
if (state === null || state === void 0 ? void 0 : state.quiz.currentQuestion) {
|
|
17
|
+
question = state === null || state === void 0 ? void 0 : state.quiz.currentQuestion.next_question;
|
|
19
18
|
}
|
|
20
19
|
const onChangeHandler = (e) => {
|
|
21
20
|
setOpenTextInput(e.target.value);
|
|
@@ -24,15 +23,8 @@ function OpenTextQuestion(props) {
|
|
|
24
23
|
}
|
|
25
24
|
};
|
|
26
25
|
const onNextClick = () => {
|
|
27
|
-
if (
|
|
28
|
-
|
|
29
|
-
type: actions_1.QuestionTypes.OpenText,
|
|
30
|
-
payload: {
|
|
31
|
-
questionId: questionResponse.next_question.id,
|
|
32
|
-
input: openTextInput,
|
|
33
|
-
isLastQuestion: questionResponse.is_last_question,
|
|
34
|
-
},
|
|
35
|
-
});
|
|
26
|
+
if (nextQuestion && openTextInput) {
|
|
27
|
+
nextQuestion(openTextInput);
|
|
36
28
|
}
|
|
37
29
|
};
|
|
38
30
|
const onKeyDownHandler = (e) => {
|
|
@@ -42,12 +34,14 @@ function OpenTextQuestion(props) {
|
|
|
42
34
|
}
|
|
43
35
|
};
|
|
44
36
|
(0, react_1.useEffect)(() => {
|
|
45
|
-
var _a;
|
|
46
|
-
if (
|
|
47
|
-
const
|
|
37
|
+
var _a, _b;
|
|
38
|
+
if (state === null || state === void 0 ? void 0 : state.quiz.currentQuestion) {
|
|
39
|
+
const questionId = (_a = state === null || state === void 0 ? void 0 : state.quiz.currentQuestion) === null || _a === void 0 ? void 0 : _a.next_question.id;
|
|
40
|
+
const currentAnswer = (_b = state.answers.inputs) === null || _b === void 0 ? void 0 : _b[questionId];
|
|
41
|
+
const openTextAnswer = currentAnswer || initialValue;
|
|
48
42
|
setOpenTextInput(openTextAnswer);
|
|
49
43
|
}
|
|
50
|
-
}, [
|
|
44
|
+
}, [state, initialValue]);
|
|
51
45
|
if (question) {
|
|
52
46
|
const hasImage = (_a = question === null || question === void 0 ? void 0 : question.images) === null || _a === void 0 ? void 0 : _a.primary_url;
|
|
53
47
|
return (react_1.default.createElement("div", { className: `
|
|
@@ -59,7 +53,7 @@ function OpenTextQuestion(props) {
|
|
|
59
53
|
react_1.default.createElement(QuestionTitle_1.default, { title: question.title }),
|
|
60
54
|
react_1.default.createElement(QuestionDescription_1.default, { description: question.description }),
|
|
61
55
|
react_1.default.createElement("input", { className: 'cio-question-input-text', placeholder: question.input_placeholder || 'Answer here...', value: openTextInput, onChange: onChangeHandler, onKeyDown: onKeyDownHandler }),
|
|
62
|
-
react_1.default.createElement(ControlBar_1.default, { nextButtonHandler: onNextClick, isNextButtonDisabled: !openTextInput, backButtonHandler:
|
|
56
|
+
react_1.default.createElement(ControlBar_1.default, { nextButtonHandler: onNextClick, isNextButtonDisabled: !openTextInput, backButtonHandler: previousQuestion, showBackButton: !(state === null || state === void 0 ? void 0 : state.quiz.isFirstQuestion), ctaButtonText: question === null || question === void 0 ? void 0 : question.cta_text }))));
|
|
63
57
|
}
|
|
64
58
|
return null;
|
|
65
59
|
}
|
|
@@ -1,13 +1,16 @@
|
|
|
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 OpenTextTypeQuestion_1 = tslib_1.__importDefault(require("../OpenTextTypeQuestion/OpenTextTypeQuestion"));
|
|
6
6
|
const CoverTypeQuestion_1 = tslib_1.__importDefault(require("../CoverTypeQuestion/CoverTypeQuestion"));
|
|
7
7
|
const SelectTypeQuestion_1 = tslib_1.__importDefault(require("../SelectTypeQuestion/SelectTypeQuestion"));
|
|
8
8
|
const utils_1 = require("../../utils");
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
const context_1 = tslib_1.__importDefault(require("../CioQuiz/context"));
|
|
10
|
+
function QuizQuestions() {
|
|
11
|
+
var _a;
|
|
12
|
+
const { state } = (0, react_1.useContext)(context_1.default);
|
|
13
|
+
const nextQuestion = (_a = state === null || state === void 0 ? void 0 : state.quiz.currentQuestion) === null || _a === void 0 ? void 0 : _a.next_question;
|
|
11
14
|
const questionTypes = (0, utils_1.getQuestionTypes)(nextQuestion === null || nextQuestion === void 0 ? void 0 : nextQuestion.type);
|
|
12
15
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
13
16
|
questionTypes.isOpenQuestion && react_1.default.createElement(OpenTextTypeQuestion_1.default, { key: nextQuestion === null || nextQuestion === void 0 ? void 0 : nextQuestion.id }),
|
|
@@ -6,40 +6,20 @@ const ResultCtaButton_1 = tslib_1.__importDefault(require("../ResultCtaButton/Re
|
|
|
6
6
|
const context_1 = tslib_1.__importDefault(require("../CioQuiz/context"));
|
|
7
7
|
function ResultCard(props) {
|
|
8
8
|
var _a, _b;
|
|
9
|
-
const { result,
|
|
10
|
-
const {
|
|
9
|
+
const { result, salePriceKey, regularPriceKey, resultPosition } = props;
|
|
10
|
+
const { resultClick, customClickItemCallback } = (0, react_1.useContext)(context_1.default);
|
|
11
11
|
const salePrice = salePriceKey && ((_a = result === null || result === void 0 ? void 0 : result.data) === null || _a === void 0 ? void 0 : _a[salePriceKey]);
|
|
12
12
|
const regularPrice = regularPriceKey && ((_b = result === null || result === void 0 ? void 0 : result.data) === null || _b === void 0 ? void 0 : _b[regularPriceKey]);
|
|
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);
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
13
|
const clickHandler = () => {
|
|
38
|
-
|
|
14
|
+
if (resultClick) {
|
|
15
|
+
resultClick(result, resultPosition);
|
|
16
|
+
}
|
|
39
17
|
};
|
|
40
18
|
const keyDownHandler = (event) => {
|
|
41
19
|
if ((event === null || event === void 0 ? void 0 : event.key) === ' ' || (event === null || event === void 0 ? void 0 : event.key) === 'Enter') {
|
|
42
|
-
|
|
20
|
+
if (resultClick) {
|
|
21
|
+
resultClick(result, resultPosition);
|
|
22
|
+
}
|
|
43
23
|
}
|
|
44
24
|
};
|
|
45
25
|
const resultCardContent = () => {
|
|
@@ -56,12 +36,12 @@ function ResultCard(props) {
|
|
|
56
36
|
regularPrice && (react_1.default.createElement("span", { className: `cio-result-card-regular-price${salePrice ? '--strike-through' : ''}` },
|
|
57
37
|
"$",
|
|
58
38
|
regularPrice)))),
|
|
59
|
-
react_1.default.createElement(ResultCtaButton_1.default, { item: result,
|
|
39
|
+
react_1.default.createElement(ResultCtaButton_1.default, { item: result, price: salePrice || regularPrice })));
|
|
60
40
|
};
|
|
61
41
|
const resultCardContentWithLink = () => {
|
|
62
42
|
var _a;
|
|
63
43
|
return (react_1.default.createElement("a", { className: 'cio-result-card-anchor', href: (_a = result.data) === null || _a === void 0 ? void 0 : _a.url }, resultCardContent()));
|
|
64
44
|
};
|
|
65
|
-
return (react_1.default.createElement("div", { onClick: clickHandler, onKeyDown: keyDownHandler, className: 'cio-result-card', role: 'button', tabIndex: 0 }, !customClickItemCallback ? resultCardContentWithLink() : resultCardContent()));
|
|
45
|
+
return (react_1.default.createElement("div", { onClick: () => clickHandler(), onKeyDown: (e) => keyDownHandler(e), className: 'cio-result-card', role: 'button', tabIndex: 0 }, !customClickItemCallback ? resultCardContentWithLink() : resultCardContent()));
|
|
66
46
|
}
|
|
67
47
|
exports.default = ResultCard;
|
|
@@ -3,47 +3,24 @@ 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 RedoButton_1 = tslib_1.__importDefault(require("../RedoButton/RedoButton"));
|
|
6
|
-
const actions_1 = require("../CioQuiz/actions");
|
|
7
6
|
const context_1 = tslib_1.__importDefault(require("../CioQuiz/context"));
|
|
8
7
|
const ResultFilters_1 = tslib_1.__importDefault(require("../ResultFilters/ResultFilters"));
|
|
9
8
|
const ZeroResults_1 = tslib_1.__importDefault(require("../ZeroResults/ZeroResults"));
|
|
10
9
|
const Results_1 = tslib_1.__importDefault(require("../Results/Results"));
|
|
11
10
|
function ResultContainer(props) {
|
|
12
11
|
var _a, _b, _c;
|
|
13
|
-
const { options
|
|
14
|
-
const {
|
|
15
|
-
const {
|
|
16
|
-
const
|
|
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);
|
|
12
|
+
const { options } = props;
|
|
13
|
+
const { resultCardSalePriceKey, resultCardRegularPriceKey } = options;
|
|
14
|
+
const { state, resetQuiz } = (0, react_1.useContext)(context_1.default);
|
|
15
|
+
const zeroResults = !((_c = (_b = (_a = state === null || state === void 0 ? void 0 : state.quiz.results) === null || _a === void 0 ? void 0 : _a.response) === null || _b === void 0 ? void 0 : _b.results) === null || _c === void 0 ? void 0 : _c.length);
|
|
18
16
|
const resultsTitle = zeroResults ? 'Oops, there are no results' : 'Here are your results';
|
|
19
|
-
|
|
20
|
-
if (dispatch && resultsResponse) {
|
|
21
|
-
resetQuizSessionId();
|
|
22
|
-
dispatch({
|
|
23
|
-
type: actions_1.QuestionTypes.Reset,
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
};
|
|
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
|
-
});
|
|
17
|
+
if (state === null || state === void 0 ? void 0 : state.quiz.results) {
|
|
41
18
|
return (react_1.default.createElement("div", { className: 'cio-results-container' },
|
|
42
19
|
react_1.default.createElement("h1", { className: 'cio-results-title' }, resultsTitle),
|
|
43
20
|
react_1.default.createElement("div", { className: 'cio-results-filter-and-redo-container' },
|
|
44
|
-
react_1.default.createElement(ResultFilters_1.default,
|
|
45
|
-
react_1.default.createElement(RedoButton_1.default, { onClick:
|
|
46
|
-
!zeroResults && (react_1.default.createElement(Results_1.default, {
|
|
21
|
+
react_1.default.createElement(ResultFilters_1.default, null),
|
|
22
|
+
react_1.default.createElement(RedoButton_1.default, { onClick: resetQuiz })),
|
|
23
|
+
!zeroResults && (react_1.default.createElement(Results_1.default, { resultCardSalePriceKey: resultCardSalePriceKey, resultCardRegularPriceKey: resultCardRegularPriceKey })),
|
|
47
24
|
zeroResults && react_1.default.createElement(ZeroResults_1.default, null)));
|
|
48
25
|
}
|
|
49
26
|
return react_1.default.createElement("div", null, "Loading");
|
|
@@ -4,31 +4,12 @@ const tslib_1 = require("tslib");
|
|
|
4
4
|
const react_1 = tslib_1.__importStar(require("react"));
|
|
5
5
|
const context_1 = tslib_1.__importDefault(require("../CioQuiz/context"));
|
|
6
6
|
function ResultCtaButton(props) {
|
|
7
|
-
const { item,
|
|
8
|
-
const {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
}
|
|
27
|
-
if (callback && typeof callback === 'function') {
|
|
28
|
-
e.stopPropagation();
|
|
29
|
-
callback(item);
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
return (react_1.default.createElement("button", { type: 'button', className: `cio-result-card-cta-button ${className || ''}`, onClick: clickHandler }, "Add to Cart"));
|
|
7
|
+
const { item, className, price } = props;
|
|
8
|
+
const { addToCart } = (0, react_1.useContext)(context_1.default);
|
|
9
|
+
return (react_1.default.createElement("button", { type: 'button', className: `cio-result-card-cta-button ${className || ''}`, onClick: (e) => {
|
|
10
|
+
if (addToCart) {
|
|
11
|
+
addToCart(e, item, price);
|
|
12
|
+
}
|
|
13
|
+
} }, "Add to Cart"));
|
|
33
14
|
}
|
|
34
15
|
exports.default = ResultCtaButton;
|
|
@@ -1,30 +1,13 @@
|
|
|
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.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
const isOrFilter = (exp) => 'or' in exp;
|
|
10
|
-
const getFilterValuesFromExpression = (exp) => {
|
|
11
|
-
if (!exp) {
|
|
12
|
-
return [];
|
|
13
|
-
}
|
|
14
|
-
if (isAndFilter(exp)) {
|
|
15
|
-
return exp.and.flatMap((innerExpression) => getFilterValuesFromExpression(innerExpression));
|
|
16
|
-
}
|
|
17
|
-
if (isOrFilter(exp)) {
|
|
18
|
-
return exp.or.flatMap((innerExpression) => getFilterValuesFromExpression(innerExpression));
|
|
19
|
-
}
|
|
20
|
-
if (isValueExpression(exp)) {
|
|
21
|
-
return [exp.value];
|
|
22
|
-
}
|
|
23
|
-
return [];
|
|
24
|
-
};
|
|
25
|
-
const filterValues = [...new Set(getFilterValuesFromExpression(filters))];
|
|
4
|
+
const react_1 = tslib_1.__importStar(require("react"));
|
|
5
|
+
const context_1 = tslib_1.__importDefault(require("../CioQuiz/context"));
|
|
6
|
+
function ResultFilters() {
|
|
7
|
+
var _a;
|
|
8
|
+
const { state } = (0, react_1.useContext)(context_1.default);
|
|
26
9
|
return (react_1.default.createElement("div", { className: 'cio-results-filter-container' },
|
|
27
10
|
react_1.default.createElement("p", null, "Because you answered"),
|
|
28
|
-
react_1.default.createElement("div", { className: 'cio-results-filter-options' },
|
|
11
|
+
react_1.default.createElement("div", { className: 'cio-results-filter-options' }, (_a = state === null || state === void 0 ? void 0 : state.quiz.resultsFilters) === null || _a === void 0 ? void 0 : _a.map((filter) => (react_1.default.createElement("div", { className: 'cio-results-filter-option', key: filter }, filter))))));
|
|
29
12
|
}
|
|
30
13
|
exports.default = ResultFilters;
|
|
@@ -5,12 +5,12 @@ const react_1 = tslib_1.__importStar(require("react"));
|
|
|
5
5
|
const context_1 = tslib_1.__importDefault(require("../CioQuiz/context"));
|
|
6
6
|
const ResultCard_1 = tslib_1.__importDefault(require("../ResultCard/ResultCard"));
|
|
7
7
|
function Results(props) {
|
|
8
|
-
var _a, _b;
|
|
9
|
-
const {
|
|
10
|
-
const {
|
|
11
|
-
return (react_1.default.createElement("div", { className: 'cio-results' }, (_b = (_a =
|
|
8
|
+
var _a, _b, _c, _d;
|
|
9
|
+
const { resultCardSalePriceKey, resultCardRegularPriceKey } = props;
|
|
10
|
+
const { state } = (0, react_1.useContext)(context_1.default);
|
|
11
|
+
return (react_1.default.createElement("div", { className: 'cio-results' }, (_d = (_c = (_b = (_a = state === null || state === void 0 ? void 0 : state.quiz) === null || _a === void 0 ? void 0 : _a.results) === null || _b === void 0 ? void 0 : _b.response) === null || _c === void 0 ? void 0 : _c.results) === null || _d === void 0 ? void 0 : _d.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,
|
|
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, resultPosition: index + 1 }));
|
|
14
14
|
})));
|
|
15
15
|
}
|
|
16
16
|
exports.default = Results;
|