@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.
Files changed (86) hide show
  1. package/README.md +1 -1
  2. package/dist/constructorio-ui-quizzes-bundled.js +17 -17
  3. package/lib/cjs/components/CioQuiz/actions.js +11 -1
  4. package/lib/cjs/components/CioQuiz/index.js +15 -103
  5. package/lib/cjs/components/CioQuiz/quizApiReducer.js +32 -0
  6. package/lib/cjs/components/CioQuiz/{reducer.js → quizLocalReducer.js} +2 -2
  7. package/lib/cjs/components/CoverTypeQuestion/CoverTypeQuestion.js +6 -12
  8. package/lib/cjs/components/OpenTextTypeQuestion/OpenTextTypeQuestion.js +12 -18
  9. package/lib/cjs/components/QuizQuestions/index.js +6 -3
  10. package/lib/cjs/components/ResultCard/ResultCard.js +10 -30
  11. package/lib/cjs/components/ResultContainer/ResultContainer.js +8 -31
  12. package/lib/cjs/components/ResultCtaButton/ResultCtaButton.js +7 -26
  13. package/lib/cjs/components/ResultFilters/ResultFilters.js +6 -23
  14. package/lib/cjs/components/Results/Results.js +5 -5
  15. package/lib/cjs/components/SelectTypeQuestion/SelectTypeQuestion.js +16 -23
  16. package/lib/cjs/components/ZeroResults/ZeroResults.js +2 -2
  17. package/lib/cjs/constants.js +3 -2
  18. package/lib/cjs/hooks/useCioClient.js +4 -3
  19. package/lib/cjs/hooks/useConsoleErrors.js +20 -0
  20. package/lib/cjs/hooks/useQuiz.js +48 -0
  21. package/lib/cjs/hooks/useQuizApiState.js +91 -0
  22. package/lib/cjs/hooks/useQuizEvents/index.js +36 -0
  23. package/lib/cjs/hooks/useQuizEvents/useQuizAddToCart.js +20 -0
  24. package/lib/cjs/hooks/useQuizEvents/useQuizBackClick.js +13 -0
  25. package/lib/cjs/hooks/useQuizEvents/useQuizNextClick.js +48 -0
  26. package/lib/cjs/hooks/useQuizEvents/useQuizResultClick.js +19 -0
  27. package/lib/cjs/hooks/useQuizEvents/useQuizResultsLoaded.js +22 -0
  28. package/lib/cjs/hooks/useQuizLocalState.js +20 -0
  29. package/lib/cjs/services/index.js +72 -0
  30. package/lib/cjs/utils.js +42 -21
  31. package/lib/mjs/components/CioQuiz/actions.js +10 -0
  32. package/lib/mjs/components/CioQuiz/index.js +15 -103
  33. package/lib/mjs/components/CioQuiz/quizApiReducer.js +49 -0
  34. package/lib/mjs/components/CioQuiz/{reducer.js → quizLocalReducer.js} +1 -1
  35. package/lib/mjs/components/CoverTypeQuestion/CoverTypeQuestion.js +6 -12
  36. package/lib/mjs/components/OpenTextTypeQuestion/OpenTextTypeQuestion.js +11 -17
  37. package/lib/mjs/components/QuizQuestions/index.js +5 -3
  38. package/lib/mjs/components/ResultCard/ResultCard.js +10 -29
  39. package/lib/mjs/components/ResultContainer/ResultContainer.js +8 -31
  40. package/lib/mjs/components/ResultCtaButton/ResultCtaButton.js +7 -25
  41. package/lib/mjs/components/ResultFilters/ResultFilters.js +5 -23
  42. package/lib/mjs/components/Results/Results.js +3 -3
  43. package/lib/mjs/components/SelectTypeQuestion/SelectTypeQuestion.js +13 -20
  44. package/lib/mjs/components/ZeroResults/ZeroResults.js +2 -2
  45. package/lib/mjs/constants.js +3 -2
  46. package/lib/mjs/hooks/useCioClient.js +4 -3
  47. package/lib/mjs/hooks/useConsoleErrors.js +18 -0
  48. package/lib/mjs/hooks/useQuiz.js +47 -0
  49. package/lib/mjs/hooks/useQuizApiState.js +87 -0
  50. package/lib/mjs/hooks/useQuizEvents/index.js +33 -0
  51. package/lib/mjs/hooks/useQuizEvents/useQuizAddToCart.js +18 -0
  52. package/lib/mjs/hooks/useQuizEvents/useQuizBackClick.js +11 -0
  53. package/lib/mjs/hooks/useQuizEvents/useQuizNextClick.js +45 -0
  54. package/lib/mjs/hooks/useQuizEvents/useQuizResultClick.js +17 -0
  55. package/lib/mjs/hooks/useQuizEvents/useQuizResultsLoaded.js +19 -0
  56. package/lib/mjs/hooks/useQuizLocalState.js +17 -0
  57. package/lib/mjs/services/index.js +60 -0
  58. package/lib/mjs/utils.js +39 -17
  59. package/lib/types/components/CioQuiz/actions.d.ts +20 -0
  60. package/lib/types/components/CioQuiz/context.d.ts +10 -14
  61. package/lib/types/components/CioQuiz/index.d.ts +1 -12
  62. package/lib/types/components/CioQuiz/quizApiReducer.d.ts +14 -0
  63. package/lib/types/components/CioQuiz/{reducer.d.ts → quizLocalReducer.d.ts} +3 -3
  64. package/lib/types/components/QuizQuestions/index.d.ts +1 -4
  65. package/lib/types/components/ResultCard/ResultCard.d.ts +2 -4
  66. package/lib/types/components/ResultContainer/ResultContainer.d.ts +1 -2
  67. package/lib/types/components/ResultCtaButton/ResultCtaButton.d.ts +2 -3
  68. package/lib/types/components/ResultFilters/ResultFilters.d.ts +2 -5
  69. package/lib/types/components/Results/Results.d.ts +1 -7
  70. package/lib/types/components/ZeroResults/ZeroResults.d.ts +1 -1
  71. package/lib/types/constants.d.ts +1 -1
  72. package/lib/types/hooks/useCioClient.d.ts +1 -1
  73. package/lib/types/hooks/useConsoleErrors.d.ts +3 -0
  74. package/lib/types/hooks/useQuiz.d.ts +3 -0
  75. package/lib/types/hooks/useQuizApiState.d.ts +10 -0
  76. package/lib/types/hooks/useQuizEvents/index.d.ts +15 -0
  77. package/lib/types/hooks/useQuizEvents/useQuizAddToCart.d.ts +5 -0
  78. package/lib/types/hooks/useQuizEvents/useQuizBackClick.d.ts +4 -0
  79. package/lib/types/hooks/useQuizEvents/useQuizNextClick.d.ts +5 -0
  80. package/lib/types/hooks/useQuizEvents/useQuizResultClick.d.ts +5 -0
  81. package/lib/types/hooks/useQuizEvents/useQuizResultsLoaded.d.ts +5 -0
  82. package/lib/types/hooks/useQuizLocalState.d.ts +6 -0
  83. package/lib/types/services/index.d.ts +8 -0
  84. package/lib/types/types.d.ts +63 -0
  85. package/lib/types/utils.d.ts +12 -7
  86. 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.__importStar(require("react"));
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 useCioClient_1 = tslib_1.__importDefault(require("../../hooks/useCioClient"));
10
+ const useQuiz_1 = tslib_1.__importDefault(require("../../hooks/useQuiz"));
14
11
  function CioQuiz(props) {
15
- const { quizId, apiKey, cioJsClient, resultsPageOptions, quizVersionId: quizVersionIdProp, } = props;
16
- if (!quizId) {
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
- (0, react_1.useEffect)(() => {
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
- resultsResponse && (react_1.default.createElement(ResultContainer_1.default, { options: resultsPageOptions, resetQuizSessionId: resetQuizSessionId })),
120
- questionResponse && react_1.default.createElement(QuizQuestions_1.default, { questionResponse: questionResponse }))));
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 reducer(state, action) {
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 = reducer;
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 { questionResponse, quizBackHandler, quizNextHandler, isFirstQuestion } = (0, react_1.useContext)(context_1.default);
12
+ const { state, previousQuestion, nextQuestion } = (0, react_1.useContext)(context_1.default);
14
13
  let question;
15
- if (questionResponse) {
16
- question = questionResponse.next_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 (quizNextHandler) {
21
- quizNextHandler({
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: quizBackHandler, showBackButton: !isFirstQuestion, ctaButtonText: question === null || question === void 0 ? void 0 : question.cta_text })),
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 { questionResponse, quizBackHandler, quizNextHandler, isFirstQuestion, state } = (0, react_1.useContext)(context_1.default);
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 (questionResponse) {
18
- question = questionResponse.next_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 (quizNextHandler && openTextInput && questionResponse) {
28
- quizNextHandler({
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 (questionResponse) {
47
- const openTextAnswer = ((_a = state === null || state === void 0 ? void 0 : state.answerInputs) === null || _a === void 0 ? void 0 : _a[questionResponse === null || questionResponse === void 0 ? void 0 : questionResponse.next_question.id]) || initialValue;
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
- }, [questionResponse, state, initialValue]);
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: quizBackHandler, showBackButton: !isFirstQuestion, ctaButtonText: question === null || question === void 0 ? void 0 : question.cta_text }))));
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.__importDefault(require("react"));
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
- function QuizQuestions(props) {
10
- const { questionResponse: { next_question: nextQuestion }, } = props;
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, addToCartCallback, clickItemCallback: customClickItemCallback, salePriceKey, regularPriceKey, resultPosition, } = props;
10
- const { resultsResponse, cioClient } = (0, react_1.useContext)(context_1.default);
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
- clickItemCallback();
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
- clickItemCallback();
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, callback: addToCartCallback, price: salePrice || regularPrice })));
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, resetQuizSessionId } = props;
14
- const { addToCartCallback, clickItemCallback, resultCardSalePriceKey, resultCardRegularPriceKey, } = options;
15
- const { resultsResponse, cioClient, dispatch } = (0, react_1.useContext)(context_1.default);
16
- const filterExpression = (_a = resultsResponse === null || resultsResponse === void 0 ? void 0 : resultsResponse.request) === null || _a === void 0 ? void 0 : _a.collection_filter_expression;
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
- const onResetClick = () => {
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, { filters: filterExpression }),
45
- react_1.default.createElement(RedoButton_1.default, { onClick: onResetClick })),
46
- !zeroResults && (react_1.default.createElement(Results_1.default, { addToCartCallback: addToCartCallback, clickItemCallback: clickItemCallback, resultCardSalePriceKey: resultCardSalePriceKey, resultCardRegularPriceKey: resultCardRegularPriceKey })),
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, callback, className, price } = props;
8
- const { resultsResponse, cioClient } = (0, react_1.useContext)(context_1.default);
9
- const clickHandler = (e) => {
10
- var _a, _b;
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
- }
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.__importDefault(require("react"));
5
- function ResultFilters(props) {
6
- const { filters } = props;
7
- const isValueExpression = (exp) => 'name' in exp && 'value' in exp;
8
- const isAndFilter = (exp) => 'and' in exp;
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' }, filterValues === null || filterValues === void 0 ? void 0 : filterValues.map((filter) => (react_1.default.createElement("div", { className: 'cio-results-filter-option', key: filter }, filter))))));
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 { addToCartCallback, clickItemCallback, resultCardSalePriceKey, resultCardRegularPriceKey, } = props;
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, index) => {
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, addToCartCallback: addToCartCallback, clickItemCallback: clickItemCallback, resultPosition: index + 1 }));
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;