@constructor-io/constructorio-ui-quizzes 1.11.2 → 1.12.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 +5 -5
- package/lib/cjs/components/CioQuiz/quizApiReducer.js +8 -6
- package/lib/cjs/components/ResultContainer/ResultContainer.js +10 -45
- package/lib/cjs/components/ResultFiltersAndShare/ResultFiltersAndShare.js +22 -0
- package/lib/cjs/components/ResultsHeaderContainer/ResultsHeaderContainer.js +23 -0
- package/lib/cjs/hooks/useQuiz.js +1 -0
- package/lib/cjs/index.js +3 -3
- package/lib/cjs/version.js +1 -1
- package/lib/mjs/components/CioQuiz/quizApiReducer.js +6 -0
- package/lib/mjs/components/ResultContainer/ResultContainer.js +9 -44
- package/lib/mjs/components/ResultFiltersAndShare/ResultFiltersAndShare.js +18 -0
- package/lib/mjs/components/ResultsHeaderContainer/ResultsHeaderContainer.js +18 -0
- package/lib/mjs/hooks/useQuiz.js +1 -0
- package/lib/mjs/index.js +1 -1
- package/lib/mjs/version.js +1 -1
- package/lib/styles.css +43 -16
- package/lib/types/components/CioQuiz/quizApiReducer.d.ts +1 -0
- package/lib/types/components/ResultFiltersAndShare/ResultFiltersAndShare.d.ts +8 -0
- package/lib/types/components/ResultsHeaderContainer/ResultsHeaderContainer.d.ts +6 -0
- package/lib/types/index.d.ts +1 -1
- package/lib/types/types.d.ts +1 -0
- package/lib/types/version.d.ts +1 -1
- package/package.json +1 -1
- package/lib/cjs/components/ResultFilters/ResultFilters.js +0 -13
- package/lib/mjs/components/ResultFilters/ResultFilters.js +0 -9
- package/lib/types/components/ResultFilters/ResultFilters.d.ts +0 -6
|
@@ -8,12 +8,12 @@ exports.initialState = {
|
|
|
8
8
|
quizRequestState: constants_1.RequestStates.Stale,
|
|
9
9
|
};
|
|
10
10
|
function apiReducer(state, action) {
|
|
11
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
11
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
|
|
12
12
|
switch (action.type) {
|
|
13
13
|
case actions_1.QuizAPIActionTypes.SET_IS_LOADING:
|
|
14
14
|
return Object.assign(Object.assign({}, state), { quizRequestState: constants_1.RequestStates.Loading, quizCurrentQuestion: undefined, quizResults: undefined });
|
|
15
15
|
case actions_1.QuizAPIActionTypes.SET_IS_ERROR:
|
|
16
|
-
return Object.assign(Object.assign({}, state), { quizRequestState: constants_1.RequestStates.Error, quizCurrentQuestion: undefined, quizResults: undefined, selectedOptionsWithAttributes: undefined });
|
|
16
|
+
return Object.assign(Object.assign({}, state), { quizRequestState: constants_1.RequestStates.Error, quizCurrentQuestion: undefined, quizResults: undefined, selectedOptionsWithAttributes: undefined, matchedOptions: undefined });
|
|
17
17
|
case actions_1.QuizAPIActionTypes.SET_CURRENT_QUESTION: {
|
|
18
18
|
const { isOpenQuestion, isCoverQuestion, isSingleQuestion, isMultipleQuestion, isSelectQuestion, } = (0, utils_1.getQuestionTypes)((_c = (_b = (_a = action.payload) === null || _a === void 0 ? void 0 : _a.quizCurrentQuestion) === null || _b === void 0 ? void 0 : _b.next_question) === null || _c === void 0 ? void 0 : _c.type);
|
|
19
19
|
const quizFirstQuestion = state.quizFirstQuestion || ((_d = action.payload) === null || _d === void 0 ? void 0 : _d.quizCurrentQuestion);
|
|
@@ -22,17 +22,19 @@ function apiReducer(state, action) {
|
|
|
22
22
|
isCoverQuestion,
|
|
23
23
|
isSingleQuestion,
|
|
24
24
|
isMultipleQuestion,
|
|
25
|
-
isSelectQuestion }), quizFirstQuestion, quizResults: undefined, selectedOptionsWithAttributes: undefined });
|
|
25
|
+
isSelectQuestion }), quizFirstQuestion, quizResults: undefined, selectedOptionsWithAttributes: undefined, matchedOptions: undefined });
|
|
26
26
|
}
|
|
27
27
|
case actions_1.QuizAPIActionTypes.SET_QUIZ_RESULTS: {
|
|
28
28
|
const selectedOptionsWithAttributes = ((_k = action.payload) === null || _k === void 0 ? void 0 : _k.quizResults.quiz_selected_options.filter((option) => option.has_attribute).map((option) => option.value)) || [];
|
|
29
|
-
|
|
29
|
+
const matchedOptions = ((_l = action.payload) === null || _l === void 0 ? void 0 : _l.quizResults.quiz_selected_options.filter((option) => option.is_matched && option.has_attribute).map((option) => option.value)) || [];
|
|
30
|
+
return Object.assign(Object.assign({}, state), { quizRequestState: constants_1.RequestStates.Success, quizResults: (_m = action.payload) === null || _m === void 0 ? void 0 : _m.quizResults, quizCurrentQuestion: undefined, selectedOptionsWithAttributes,
|
|
31
|
+
matchedOptions });
|
|
30
32
|
}
|
|
31
33
|
case actions_1.QuizAPIActionTypes.SET_QUIZ_SHARED_RESULTS: {
|
|
32
|
-
return Object.assign(Object.assign({}, state), { quizRequestState: constants_1.RequestStates.Success, quizResults: (
|
|
34
|
+
return Object.assign(Object.assign({}, state), { quizRequestState: constants_1.RequestStates.Success, quizResults: (_o = action.payload) === null || _o === void 0 ? void 0 : _o.quizResults, quizCurrentQuestion: undefined, selectedOptionsWithAttributes: (_p = action.payload) === null || _p === void 0 ? void 0 : _p.quizResults.attributes });
|
|
33
35
|
}
|
|
34
36
|
case actions_1.QuizAPIActionTypes.SET_QUIZ_RESULTS_CONFIG: {
|
|
35
|
-
return Object.assign(Object.assign({}, state), { resultsConfig: (
|
|
37
|
+
return Object.assign(Object.assign({}, state), { resultsConfig: (_q = action.payload) === null || _q === void 0 ? void 0 : _q.quizResultsConfig.results_config });
|
|
36
38
|
}
|
|
37
39
|
case actions_1.QuizAPIActionTypes.SET_QUIZ_RESULTS_CONFIG_ERROR: {
|
|
38
40
|
return Object.assign(Object.assign({}, state), { resultsConfig: null });
|
|
@@ -2,64 +2,29 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
4
|
const react_1 = tslib_1.__importStar(require("react"));
|
|
5
|
-
const RedoButton_1 = tslib_1.__importDefault(require("../RedoButton/RedoButton"));
|
|
6
|
-
const ShareButton_1 = tslib_1.__importDefault(require("../ShareButton/ShareButton"));
|
|
7
5
|
const context_1 = tslib_1.__importDefault(require("../CioQuiz/context"));
|
|
8
|
-
const
|
|
6
|
+
const ResultFiltersAndShare_1 = tslib_1.__importDefault(require("../ResultFiltersAndShare/ResultFiltersAndShare"));
|
|
9
7
|
const ZeroResults_1 = tslib_1.__importDefault(require("../ZeroResults/ZeroResults"));
|
|
10
8
|
const Results_1 = tslib_1.__importDefault(require("../Results/Results"));
|
|
11
9
|
const Spinner_1 = tslib_1.__importDefault(require("../Spinner/Spinner"));
|
|
10
|
+
const ResultsHeaderContainer_1 = tslib_1.__importDefault(require("../ResultsHeaderContainer/ResultsHeaderContainer"));
|
|
11
|
+
const RedoButton_1 = tslib_1.__importDefault(require("../RedoButton/RedoButton"));
|
|
12
12
|
function ResultContainer(props) {
|
|
13
|
-
var _a, _b, _c
|
|
13
|
+
var _a, _b, _c;
|
|
14
14
|
const { resultCardOptions, onShare, resultsPageOptions } = props;
|
|
15
15
|
const { state } = (0, react_1.useContext)(context_1.default);
|
|
16
16
|
const { resultCardSalePriceKey, resultCardRegularPriceKey, resultCardRatingCountKey, resultCardRatingScoreKey, renderResultCardPriceDetails, } = resultCardOptions || {};
|
|
17
17
|
const numberOfResults = (_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
18
|
const resultsConfig = state === null || state === void 0 ? void 0 : state.quiz.resultsConfig;
|
|
19
19
|
const zeroResults = !numberOfResults;
|
|
20
|
-
let resultsTitle;
|
|
21
|
-
if (zeroResults) {
|
|
22
|
-
resultsTitle = '';
|
|
23
|
-
}
|
|
24
|
-
else if (resultsConfig === null) {
|
|
25
|
-
resultsTitle = 'Here are your results';
|
|
26
|
-
}
|
|
27
|
-
else if ((_d = resultsConfig === null || resultsConfig === void 0 ? void 0 : resultsConfig.desktop.title) === null || _d === void 0 ? void 0 : _d.is_active) {
|
|
28
|
-
resultsTitle = (_e = resultsConfig.desktop.title.text) !== null && _e !== void 0 ? _e : '';
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
resultsTitle = '';
|
|
32
|
-
}
|
|
33
|
-
let resultsDescription;
|
|
34
|
-
if (zeroResults) {
|
|
35
|
-
resultsDescription = '';
|
|
36
|
-
}
|
|
37
|
-
else if (resultsConfig === null) {
|
|
38
|
-
resultsDescription = '';
|
|
39
|
-
}
|
|
40
|
-
else if ((_f = resultsConfig === null || resultsConfig === void 0 ? void 0 : resultsConfig.desktop.description) === null || _f === void 0 ? void 0 : _f.is_active) {
|
|
41
|
-
resultsDescription = (_g = resultsConfig.desktop.description.text) !== null && _g !== void 0 ? _g : '';
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
resultsDescription = '';
|
|
45
|
-
}
|
|
46
20
|
if (state === null || state === void 0 ? void 0 : state.quiz.results) {
|
|
47
21
|
return (react_1.default.createElement("div", { className: 'cio-results-container' },
|
|
48
|
-
react_1.default.createElement(
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
react_1.default.createElement(
|
|
52
|
-
|
|
53
|
-
react_1.default.createElement(
|
|
54
|
-
react_1.default.createElement(RedoButton_1.default, null),
|
|
55
|
-
(resultsPageOptions === null || resultsPageOptions === void 0 ? void 0 : resultsPageOptions.showShareResultsButton) && react_1.default.createElement(ShareButton_1.default, { onClick: onShare }))),
|
|
56
|
-
!zeroResults && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
57
|
-
react_1.default.createElement("div", { className: 'cio-results-num-results' },
|
|
58
|
-
numberOfResults,
|
|
59
|
-
" ",
|
|
60
|
-
numberOfResults === 1 ? 'result' : 'results'),
|
|
61
|
-
react_1.default.createElement(Results_1.default, { resultCardSalePriceKey: resultCardSalePriceKey, resultCardRegularPriceKey: resultCardRegularPriceKey, resultCardRatingCountKey: resultCardRatingCountKey, resultCardRatingScoreKey: resultCardRatingScoreKey, renderResultCardPriceDetails: renderResultCardPriceDetails }))),
|
|
62
|
-
zeroResults && react_1.default.createElement(ZeroResults_1.default, null)));
|
|
22
|
+
!zeroResults && react_1.default.createElement(ResultsHeaderContainer_1.default, { resultsConfig: resultsConfig }),
|
|
23
|
+
!zeroResults && (react_1.default.createElement(ResultFiltersAndShare_1.default, { numberOfResults: numberOfResults, onShare: onShare, showShareButton: !!(resultsPageOptions === null || resultsPageOptions === void 0 ? void 0 : resultsPageOptions.showShareResultsButton) })),
|
|
24
|
+
!zeroResults && (react_1.default.createElement(Results_1.default, { resultCardSalePriceKey: resultCardSalePriceKey, resultCardRegularPriceKey: resultCardRegularPriceKey, resultCardRatingCountKey: resultCardRatingCountKey, resultCardRatingScoreKey: resultCardRatingScoreKey, renderResultCardPriceDetails: renderResultCardPriceDetails })),
|
|
25
|
+
zeroResults && react_1.default.createElement(ZeroResults_1.default, null),
|
|
26
|
+
!zeroResults && (react_1.default.createElement("div", { className: 'cio-redo-button-container' },
|
|
27
|
+
react_1.default.createElement(RedoButton_1.default, null)))));
|
|
63
28
|
}
|
|
64
29
|
return (react_1.default.createElement("div", { className: 'cio-results-container' },
|
|
65
30
|
react_1.default.createElement(Spinner_1.default, null)));
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
const ShareButton_1 = tslib_1.__importDefault(require("../ShareButton/ShareButton"));
|
|
7
|
+
function ResultFiltersAndShare({ onShare, numberOfResults, showShareButton, }) {
|
|
8
|
+
var _a;
|
|
9
|
+
const { state } = (0, react_1.useContext)(context_1.default);
|
|
10
|
+
const matchedOptions = ((_a = state === null || state === void 0 ? void 0 : state.quiz) === null || _a === void 0 ? void 0 : _a.matchedOptions) || [];
|
|
11
|
+
return (react_1.default.createElement("div", { className: 'cio-results-filter-and-redo-container cio-results-button-group' },
|
|
12
|
+
react_1.default.createElement("div", { className: 'cio-results-filter-container' }, !!matchedOptions.length && (react_1.default.createElement("p", { className: 'cio-results-explanation' },
|
|
13
|
+
"Based on your answers ",
|
|
14
|
+
react_1.default.createElement("span", null, matchedOptions.join(', ')),
|
|
15
|
+
" we recommend these matches."))),
|
|
16
|
+
react_1.default.createElement("div", { className: 'cio-results-number-and-share-button-group' },
|
|
17
|
+
numberOfResults,
|
|
18
|
+
" ",
|
|
19
|
+
numberOfResults === 1 ? 'result' : 'results',
|
|
20
|
+
showShareButton && react_1.default.createElement(ShareButton_1.default, { onClick: onShare }))));
|
|
21
|
+
}
|
|
22
|
+
exports.default = ResultFiltersAndShare;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const react_1 = tslib_1.__importDefault(require("react"));
|
|
5
|
+
function ResultsHeaderContainer({ resultsConfig }) {
|
|
6
|
+
var _a, _b, _c, _d;
|
|
7
|
+
let resultsTitle = '';
|
|
8
|
+
let resultsDescription = '';
|
|
9
|
+
if (resultsConfig === null) {
|
|
10
|
+
resultsTitle = 'Here are your results';
|
|
11
|
+
}
|
|
12
|
+
if ((_a = resultsConfig === null || resultsConfig === void 0 ? void 0 : resultsConfig.desktop.title) === null || _a === void 0 ? void 0 : _a.is_active) {
|
|
13
|
+
resultsTitle = (_b = resultsConfig.desktop.title.text) !== null && _b !== void 0 ? _b : '';
|
|
14
|
+
}
|
|
15
|
+
if ((_c = resultsConfig === null || resultsConfig === void 0 ? void 0 : resultsConfig.desktop.description) === null || _c === void 0 ? void 0 : _c.is_active) {
|
|
16
|
+
resultsDescription = (_d = resultsConfig.desktop.description.text) !== null && _d !== void 0 ? _d : '';
|
|
17
|
+
}
|
|
18
|
+
const hasContent = !!(resultsTitle || resultsDescription);
|
|
19
|
+
return hasContent ? (react_1.default.createElement("div", { className: 'cio-results-title-container' },
|
|
20
|
+
react_1.default.createElement("h1", { className: 'cio-results-title' }, resultsTitle),
|
|
21
|
+
react_1.default.createElement("p", { className: 'cio-results-description' }, resultsDescription))) : null;
|
|
22
|
+
}
|
|
23
|
+
exports.default = ResultsHeaderContainer;
|
package/lib/cjs/hooks/useQuiz.js
CHANGED
|
@@ -40,6 +40,7 @@ const useQuiz = (quizOptions) => {
|
|
|
40
40
|
currentQuestion: quizApiState.quizCurrentQuestion,
|
|
41
41
|
results: quizApiState.quizResults,
|
|
42
42
|
selectedOptionsWithAttributes: quizApiState.selectedOptionsWithAttributes,
|
|
43
|
+
matchedOptions: quizApiState.matchedOptions,
|
|
43
44
|
resultsConfig: (_a = quizApiState.resultsConfig) !== null && _a !== void 0 ? _a : null,
|
|
44
45
|
},
|
|
45
46
|
quizSessionStorageState,
|
package/lib/cjs/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ResultHeroCard = exports.
|
|
3
|
+
exports.ResultHeroCard = exports.ResultFiltersAndShare = exports.ResultContainer = exports.ResultCard = exports.Results = exports.SelectQuestion = exports.CoverQuestion = exports.OpenTextQuestion = exports.QuizQuestions = exports.useShareResultsLink = exports.useCioQuiz = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const CioQuiz_1 = tslib_1.__importDefault(require("./components/CioQuiz"));
|
|
6
6
|
// Hook
|
|
@@ -24,8 +24,8 @@ var ResultCard_1 = require("./components/ResultCard/ResultCard");
|
|
|
24
24
|
Object.defineProperty(exports, "ResultCard", { enumerable: true, get: function () { return tslib_1.__importDefault(ResultCard_1).default; } });
|
|
25
25
|
var ResultContainer_1 = require("./components/ResultContainer/ResultContainer");
|
|
26
26
|
Object.defineProperty(exports, "ResultContainer", { enumerable: true, get: function () { return tslib_1.__importDefault(ResultContainer_1).default; } });
|
|
27
|
-
var
|
|
28
|
-
Object.defineProperty(exports, "
|
|
27
|
+
var ResultFiltersAndShare_1 = require("./components/ResultFiltersAndShare/ResultFiltersAndShare");
|
|
28
|
+
Object.defineProperty(exports, "ResultFiltersAndShare", { enumerable: true, get: function () { return tslib_1.__importDefault(ResultFiltersAndShare_1).default; } });
|
|
29
29
|
var ResultHeroCard_1 = require("./components/ResultHeroCard/ResultHeroCard");
|
|
30
30
|
Object.defineProperty(exports, "ResultHeroCard", { enumerable: true, get: function () { return tslib_1.__importDefault(ResultHeroCard_1).default; } });
|
|
31
31
|
tslib_1.__exportStar(require("./types"), exports);
|
package/lib/cjs/version.js
CHANGED
|
@@ -20,6 +20,7 @@ export default function apiReducer(state, action) {
|
|
|
20
20
|
quizCurrentQuestion: undefined,
|
|
21
21
|
quizResults: undefined,
|
|
22
22
|
selectedOptionsWithAttributes: undefined,
|
|
23
|
+
matchedOptions: undefined,
|
|
23
24
|
};
|
|
24
25
|
case QuizAPIActionTypes.SET_CURRENT_QUESTION: {
|
|
25
26
|
const { isOpenQuestion, isCoverQuestion, isSingleQuestion, isMultipleQuestion, isSelectQuestion, } = getQuestionTypes(action.payload?.quizCurrentQuestion?.next_question?.type);
|
|
@@ -40,18 +41,23 @@ export default function apiReducer(state, action) {
|
|
|
40
41
|
quizFirstQuestion,
|
|
41
42
|
quizResults: undefined,
|
|
42
43
|
selectedOptionsWithAttributes: undefined,
|
|
44
|
+
matchedOptions: undefined,
|
|
43
45
|
};
|
|
44
46
|
}
|
|
45
47
|
case QuizAPIActionTypes.SET_QUIZ_RESULTS: {
|
|
46
48
|
const selectedOptionsWithAttributes = action.payload?.quizResults.quiz_selected_options
|
|
47
49
|
.filter((option) => option.has_attribute)
|
|
48
50
|
.map((option) => option.value) || [];
|
|
51
|
+
const matchedOptions = action.payload?.quizResults.quiz_selected_options
|
|
52
|
+
.filter((option) => option.is_matched && option.has_attribute)
|
|
53
|
+
.map((option) => option.value) || [];
|
|
49
54
|
return {
|
|
50
55
|
...state,
|
|
51
56
|
quizRequestState: RequestStates.Success,
|
|
52
57
|
quizResults: action.payload?.quizResults,
|
|
53
58
|
quizCurrentQuestion: undefined,
|
|
54
59
|
selectedOptionsWithAttributes,
|
|
60
|
+
matchedOptions,
|
|
55
61
|
};
|
|
56
62
|
}
|
|
57
63
|
case QuizAPIActionTypes.SET_QUIZ_SHARED_RESULTS: {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import React, { useContext } from 'react';
|
|
2
|
-
import RedoButton from '../RedoButton/RedoButton';
|
|
3
|
-
import ShareButton from '../ShareButton/ShareButton';
|
|
4
2
|
import QuizContext from '../CioQuiz/context';
|
|
5
|
-
import
|
|
3
|
+
import ResultFiltersAndShare from '../ResultFiltersAndShare/ResultFiltersAndShare';
|
|
6
4
|
import ZeroResults from '../ZeroResults/ZeroResults';
|
|
7
5
|
import Results from '../Results/Results';
|
|
8
6
|
import Spinner from '../Spinner/Spinner';
|
|
7
|
+
import ResultsHeaderContainer from '../ResultsHeaderContainer/ResultsHeaderContainer';
|
|
8
|
+
import RedoButton from '../RedoButton/RedoButton';
|
|
9
9
|
export default function ResultContainer(props) {
|
|
10
10
|
const { resultCardOptions, onShare, resultsPageOptions } = props;
|
|
11
11
|
const { state } = useContext(QuizContext);
|
|
@@ -13,49 +13,14 @@ export default function ResultContainer(props) {
|
|
|
13
13
|
const numberOfResults = state?.quiz.results?.response?.results?.length;
|
|
14
14
|
const resultsConfig = state?.quiz.resultsConfig;
|
|
15
15
|
const zeroResults = !numberOfResults;
|
|
16
|
-
let resultsTitle;
|
|
17
|
-
if (zeroResults) {
|
|
18
|
-
resultsTitle = '';
|
|
19
|
-
}
|
|
20
|
-
else if (resultsConfig === null) {
|
|
21
|
-
resultsTitle = 'Here are your results';
|
|
22
|
-
}
|
|
23
|
-
else if (resultsConfig?.desktop.title?.is_active) {
|
|
24
|
-
resultsTitle = resultsConfig.desktop.title.text ?? '';
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
resultsTitle = '';
|
|
28
|
-
}
|
|
29
|
-
let resultsDescription;
|
|
30
|
-
if (zeroResults) {
|
|
31
|
-
resultsDescription = '';
|
|
32
|
-
}
|
|
33
|
-
else if (resultsConfig === null) {
|
|
34
|
-
resultsDescription = '';
|
|
35
|
-
}
|
|
36
|
-
else if (resultsConfig?.desktop.description?.is_active) {
|
|
37
|
-
resultsDescription = resultsConfig.desktop.description.text ?? '';
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
resultsDescription = '';
|
|
41
|
-
}
|
|
42
16
|
if (state?.quiz.results) {
|
|
43
17
|
return (React.createElement("div", { className: 'cio-results-container' },
|
|
44
|
-
React.createElement(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
React.createElement(
|
|
48
|
-
|
|
49
|
-
React.createElement(
|
|
50
|
-
React.createElement(RedoButton, null),
|
|
51
|
-
resultsPageOptions?.showShareResultsButton && React.createElement(ShareButton, { onClick: onShare }))),
|
|
52
|
-
!zeroResults && (React.createElement(React.Fragment, null,
|
|
53
|
-
React.createElement("div", { className: 'cio-results-num-results' },
|
|
54
|
-
numberOfResults,
|
|
55
|
-
" ",
|
|
56
|
-
numberOfResults === 1 ? 'result' : 'results'),
|
|
57
|
-
React.createElement(Results, { resultCardSalePriceKey: resultCardSalePriceKey, resultCardRegularPriceKey: resultCardRegularPriceKey, resultCardRatingCountKey: resultCardRatingCountKey, resultCardRatingScoreKey: resultCardRatingScoreKey, renderResultCardPriceDetails: renderResultCardPriceDetails }))),
|
|
58
|
-
zeroResults && React.createElement(ZeroResults, null)));
|
|
18
|
+
!zeroResults && React.createElement(ResultsHeaderContainer, { resultsConfig: resultsConfig }),
|
|
19
|
+
!zeroResults && (React.createElement(ResultFiltersAndShare, { numberOfResults: numberOfResults, onShare: onShare, showShareButton: !!resultsPageOptions?.showShareResultsButton })),
|
|
20
|
+
!zeroResults && (React.createElement(Results, { resultCardSalePriceKey: resultCardSalePriceKey, resultCardRegularPriceKey: resultCardRegularPriceKey, resultCardRatingCountKey: resultCardRatingCountKey, resultCardRatingScoreKey: resultCardRatingScoreKey, renderResultCardPriceDetails: renderResultCardPriceDetails })),
|
|
21
|
+
zeroResults && React.createElement(ZeroResults, null),
|
|
22
|
+
!zeroResults && (React.createElement("div", { className: 'cio-redo-button-container' },
|
|
23
|
+
React.createElement(RedoButton, null)))));
|
|
59
24
|
}
|
|
60
25
|
return (React.createElement("div", { className: 'cio-results-container' },
|
|
61
26
|
React.createElement(Spinner, null)));
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React, { useContext } from 'react';
|
|
2
|
+
import QuizContext from '../CioQuiz/context';
|
|
3
|
+
import ShareButton from '../ShareButton/ShareButton';
|
|
4
|
+
function ResultFiltersAndShare({ onShare, numberOfResults, showShareButton, }) {
|
|
5
|
+
const { state } = useContext(QuizContext);
|
|
6
|
+
const matchedOptions = state?.quiz?.matchedOptions || [];
|
|
7
|
+
return (React.createElement("div", { className: 'cio-results-filter-and-redo-container cio-results-button-group' },
|
|
8
|
+
React.createElement("div", { className: 'cio-results-filter-container' }, !!matchedOptions.length && (React.createElement("p", { className: 'cio-results-explanation' },
|
|
9
|
+
"Based on your answers ",
|
|
10
|
+
React.createElement("span", null, matchedOptions.join(', ')),
|
|
11
|
+
" we recommend these matches."))),
|
|
12
|
+
React.createElement("div", { className: 'cio-results-number-and-share-button-group' },
|
|
13
|
+
numberOfResults,
|
|
14
|
+
" ",
|
|
15
|
+
numberOfResults === 1 ? 'result' : 'results',
|
|
16
|
+
showShareButton && React.createElement(ShareButton, { onClick: onShare }))));
|
|
17
|
+
}
|
|
18
|
+
export default ResultFiltersAndShare;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export default function ResultsHeaderContainer({ resultsConfig }) {
|
|
3
|
+
let resultsTitle = '';
|
|
4
|
+
let resultsDescription = '';
|
|
5
|
+
if (resultsConfig === null) {
|
|
6
|
+
resultsTitle = 'Here are your results';
|
|
7
|
+
}
|
|
8
|
+
if (resultsConfig?.desktop.title?.is_active) {
|
|
9
|
+
resultsTitle = resultsConfig.desktop.title.text ?? '';
|
|
10
|
+
}
|
|
11
|
+
if (resultsConfig?.desktop.description?.is_active) {
|
|
12
|
+
resultsDescription = resultsConfig.desktop.description.text ?? '';
|
|
13
|
+
}
|
|
14
|
+
const hasContent = !!(resultsTitle || resultsDescription);
|
|
15
|
+
return hasContent ? (React.createElement("div", { className: 'cio-results-title-container' },
|
|
16
|
+
React.createElement("h1", { className: 'cio-results-title' }, resultsTitle),
|
|
17
|
+
React.createElement("p", { className: 'cio-results-description' }, resultsDescription))) : null;
|
|
18
|
+
}
|
package/lib/mjs/hooks/useQuiz.js
CHANGED
|
@@ -38,6 +38,7 @@ const useQuiz = (quizOptions) => {
|
|
|
38
38
|
currentQuestion: quizApiState.quizCurrentQuestion,
|
|
39
39
|
results: quizApiState.quizResults,
|
|
40
40
|
selectedOptionsWithAttributes: quizApiState.selectedOptionsWithAttributes,
|
|
41
|
+
matchedOptions: quizApiState.matchedOptions,
|
|
41
42
|
resultsConfig: quizApiState.resultsConfig ?? null,
|
|
42
43
|
},
|
|
43
44
|
quizSessionStorageState,
|
package/lib/mjs/index.js
CHANGED
|
@@ -11,7 +11,7 @@ export { default as SelectQuestion } from './components/SelectTypeQuestion/Selec
|
|
|
11
11
|
export { default as Results } from './components/Results/Results';
|
|
12
12
|
export { default as ResultCard } from './components/ResultCard/ResultCard';
|
|
13
13
|
export { default as ResultContainer } from './components/ResultContainer/ResultContainer';
|
|
14
|
-
export { default as
|
|
14
|
+
export { default as ResultFiltersAndShare } from './components/ResultFiltersAndShare/ResultFiltersAndShare';
|
|
15
15
|
export { default as ResultHeroCard } from './components/ResultHeroCard/ResultHeroCard';
|
|
16
16
|
export * from './types';
|
|
17
17
|
export default CioQuiz;
|
package/lib/mjs/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export default '1.
|
|
1
|
+
export default '1.12.1';
|
package/lib/styles.css
CHANGED
|
@@ -236,6 +236,7 @@
|
|
|
236
236
|
flex-grow: 1;
|
|
237
237
|
margin-left: auto;
|
|
238
238
|
width: 100%;
|
|
239
|
+
transition: background 0.2s ease-in-out;
|
|
239
240
|
}
|
|
240
241
|
.cio-quiz .cio-button-container {
|
|
241
242
|
max-width: 10rem;
|
|
@@ -292,15 +293,19 @@
|
|
|
292
293
|
border: 1px solid var(--primary-color);
|
|
293
294
|
border-radius: 4px;
|
|
294
295
|
height: 3rem;
|
|
295
|
-
width: 3rem;
|
|
296
296
|
font-size: 1rem;
|
|
297
297
|
margin-right: 4rem;
|
|
298
|
+
/* Rather than setting a prefix-ed width, we add padding to allow different contents to fit nicely */
|
|
299
|
+
/* 1.2rem padding + arrow ~= 48px */
|
|
300
|
+
padding: 0 1.2rem;
|
|
301
|
+
outline: 1px solid transparent;
|
|
302
|
+
transition: outline 0.2s ease-in-out;
|
|
298
303
|
}
|
|
299
304
|
.cio-quiz .cio-question-back-button:hover {
|
|
300
|
-
|
|
305
|
+
outline: 1px solid var(--primary-color-variant-600);
|
|
301
306
|
}
|
|
302
307
|
.cio-quiz .cio-question-back-button:active {
|
|
303
|
-
border:
|
|
308
|
+
border: 1px solid var(--primary-color-variant-700);
|
|
304
309
|
}
|
|
305
310
|
.cio-quiz .cio-question-back-button:focus {
|
|
306
311
|
outline: 3px solid var(--primary-color-variant-100);
|
|
@@ -474,13 +479,6 @@
|
|
|
474
479
|
margin: 0;
|
|
475
480
|
color: var(--gray-dust-500);
|
|
476
481
|
}
|
|
477
|
-
.cio-quiz .cio-results-filter-container {
|
|
478
|
-
margin-bottom: 1.5rem;
|
|
479
|
-
}
|
|
480
|
-
.cio-quiz .cio-results-filter-container p {
|
|
481
|
-
color: var(--gray-dust-500);
|
|
482
|
-
margin-bottom: 1.5rem;
|
|
483
|
-
}
|
|
484
482
|
.cio-quiz .cio-results-filter-options {
|
|
485
483
|
display: flex;
|
|
486
484
|
flex-wrap: wrap;
|
|
@@ -671,6 +669,7 @@
|
|
|
671
669
|
display: flex;
|
|
672
670
|
gap: 0.5rem;
|
|
673
671
|
align-items: center;
|
|
672
|
+
white-space: nowrap;
|
|
674
673
|
}
|
|
675
674
|
.cio-quiz .cio-question-redo-button:hover {
|
|
676
675
|
text-decoration: underline;
|
|
@@ -739,9 +738,9 @@
|
|
|
739
738
|
}
|
|
740
739
|
.cio-quiz .cio-results-button-group {
|
|
741
740
|
display: flex;
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
margin-bottom:
|
|
741
|
+
flex-direction: column;
|
|
742
|
+
gap: 1.5rem;
|
|
743
|
+
margin-bottom: 1rem;
|
|
745
744
|
}
|
|
746
745
|
.cio-quiz .cio-results-filter-container {
|
|
747
746
|
margin-bottom: 0;
|
|
@@ -979,11 +978,13 @@
|
|
|
979
978
|
gap: 1rem;
|
|
980
979
|
}
|
|
981
980
|
|
|
982
|
-
.cio-quiz .cio-results-
|
|
981
|
+
.cio-quiz .cio-results-number-and-share-button-group {
|
|
983
982
|
display: flex;
|
|
984
983
|
gap: 8px;
|
|
985
984
|
align-items: end;
|
|
986
985
|
justify-content: space-between;
|
|
986
|
+
font-size: 0.85em;
|
|
987
|
+
color: var(--gray-dust-100);
|
|
987
988
|
}
|
|
988
989
|
|
|
989
990
|
.cio-quiz .cio-share-results-share-button {
|
|
@@ -1072,6 +1073,13 @@
|
|
|
1072
1073
|
.cio-quiz .cio-share-results-share-button {
|
|
1073
1074
|
max-width: 100%;
|
|
1074
1075
|
}
|
|
1076
|
+
|
|
1077
|
+
.cio-results-button-group {
|
|
1078
|
+
display: flex;
|
|
1079
|
+
flex-direction: column;
|
|
1080
|
+
gap: 0.5rem;
|
|
1081
|
+
margin-bottom: 1rem;
|
|
1082
|
+
}
|
|
1075
1083
|
}
|
|
1076
1084
|
|
|
1077
1085
|
@container (min-width: 500px) {
|
|
@@ -1093,8 +1101,27 @@
|
|
|
1093
1101
|
}
|
|
1094
1102
|
|
|
1095
1103
|
.cio-quiz .cio-results-title-container {
|
|
1096
|
-
margin-bottom: 1rem;
|
|
1097
1104
|
display: flex;
|
|
1098
1105
|
flex-direction: column;
|
|
1099
|
-
gap: 0.
|
|
1106
|
+
gap: 0.5rem;
|
|
1107
|
+
margin-bottom: 1.5rem;
|
|
1108
|
+
padding-bottom: 1.5rem;
|
|
1109
|
+
border-bottom: 1px solid var(--gray-dust-100);
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
.cio-quiz .cio-results-explanation {
|
|
1113
|
+
margin: 0;
|
|
1114
|
+
font-size: 0.9em;
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
.cio-quiz .cio-results-explanation > span {
|
|
1118
|
+
font-weight: bold;
|
|
1119
|
+
font-size: 0.95em;
|
|
1120
|
+
}
|
|
1121
|
+
|
|
1122
|
+
.cio-redo-button-container {
|
|
1123
|
+
width: 100%;
|
|
1124
|
+
padding-top: 1.5rem;
|
|
1125
|
+
display: flex;
|
|
1126
|
+
justify-content: center;
|
|
1100
1127
|
}
|
|
@@ -7,6 +7,7 @@ export type QuizAPIReducerState = {
|
|
|
7
7
|
quizFirstQuestion?: NextQuestionResponse;
|
|
8
8
|
quizResults?: QuizResultsResponse | QuizSharedResultsData;
|
|
9
9
|
selectedOptionsWithAttributes?: string[];
|
|
10
|
+
matchedOptions?: string[];
|
|
10
11
|
resultsConfig?: QuizResultsConfig | null;
|
|
11
12
|
};
|
|
12
13
|
export declare const initialState: QuizAPIReducerState;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
interface ResultFiltersAndShareProps {
|
|
3
|
+
onShare: () => void;
|
|
4
|
+
numberOfResults?: number;
|
|
5
|
+
showShareButton: boolean;
|
|
6
|
+
}
|
|
7
|
+
declare function ResultFiltersAndShare({ onShare, numberOfResults, showShareButton, }: ResultFiltersAndShareProps): JSX.Element;
|
|
8
|
+
export default ResultFiltersAndShare;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { QuizResultsConfig } from '../../types';
|
|
3
|
+
export interface IResultHeaderContainerProps {
|
|
4
|
+
resultsConfig?: QuizResultsConfig | null;
|
|
5
|
+
}
|
|
6
|
+
export default function ResultsHeaderContainer({ resultsConfig }: IResultHeaderContainerProps): JSX.Element | null;
|
package/lib/types/index.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export { default as SelectQuestion } from './components/SelectTypeQuestion/Selec
|
|
|
8
8
|
export { default as Results } from './components/Results/Results';
|
|
9
9
|
export { default as ResultCard } from './components/ResultCard/ResultCard';
|
|
10
10
|
export { default as ResultContainer } from './components/ResultContainer/ResultContainer';
|
|
11
|
-
export { default as
|
|
11
|
+
export { default as ResultFiltersAndShare } from './components/ResultFiltersAndShare/ResultFiltersAndShare';
|
|
12
12
|
export { default as ResultHeroCard } from './components/ResultHeroCard/ResultHeroCard';
|
|
13
13
|
export * from './types';
|
|
14
14
|
export default CioQuiz;
|
package/lib/types/types.d.ts
CHANGED
|
@@ -74,6 +74,7 @@ export interface QuizReturnState {
|
|
|
74
74
|
currentQuestion?: CurrentQuestion | undefined;
|
|
75
75
|
results?: QuizResultsResponse | QuizSharedResultsData | undefined;
|
|
76
76
|
selectedOptionsWithAttributes?: string[];
|
|
77
|
+
matchedOptions?: string[];
|
|
77
78
|
resultsConfig: QuizResultsConfig | null;
|
|
78
79
|
};
|
|
79
80
|
quizSessionStorageState: QuizSessionStorageState;
|
package/lib/types/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default: "1.
|
|
1
|
+
declare const _default: "1.12.1";
|
|
2
2
|
export default _default;
|
package/package.json
CHANGED
|
@@ -1,13 +0,0 @@
|
|
|
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 ResultFilters({ hasNoResults }) {
|
|
7
|
-
var _a;
|
|
8
|
-
const { state } = (0, react_1.useContext)(context_1.default);
|
|
9
|
-
return (react_1.default.createElement("div", { className: 'cio-results-filter-container' },
|
|
10
|
-
react_1.default.createElement("p", null, hasNoResults ? 'Your preferences' : 'Because you answered'),
|
|
11
|
-
react_1.default.createElement("div", { className: 'cio-results-filter-options' }, (_a = state === null || state === void 0 ? void 0 : state.quiz.selectedOptionsWithAttributes) === null || _a === void 0 ? void 0 : _a.map((option) => (react_1.default.createElement("div", { className: 'cio-results-filter-option', key: option }, option))))));
|
|
12
|
-
}
|
|
13
|
-
exports.default = ResultFilters;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import React, { useContext } from 'react';
|
|
2
|
-
import QuizContext from '../CioQuiz/context';
|
|
3
|
-
function ResultFilters({ hasNoResults }) {
|
|
4
|
-
const { state } = useContext(QuizContext);
|
|
5
|
-
return (React.createElement("div", { className: 'cio-results-filter-container' },
|
|
6
|
-
React.createElement("p", null, hasNoResults ? 'Your preferences' : 'Because you answered'),
|
|
7
|
-
React.createElement("div", { className: 'cio-results-filter-options' }, state?.quiz.selectedOptionsWithAttributes?.map((option) => (React.createElement("div", { className: 'cio-results-filter-option', key: option }, option))))));
|
|
8
|
-
}
|
|
9
|
-
export default ResultFilters;
|