@constructor-io/constructorio-ui-quizzes 1.11.1 → 1.12.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/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 +35 -13
- 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 +2 -2
- 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.0';
|
package/lib/styles.css
CHANGED
|
@@ -474,13 +474,6 @@
|
|
|
474
474
|
margin: 0;
|
|
475
475
|
color: var(--gray-dust-500);
|
|
476
476
|
}
|
|
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
477
|
.cio-quiz .cio-results-filter-options {
|
|
485
478
|
display: flex;
|
|
486
479
|
flex-wrap: wrap;
|
|
@@ -671,6 +664,7 @@
|
|
|
671
664
|
display: flex;
|
|
672
665
|
gap: 0.5rem;
|
|
673
666
|
align-items: center;
|
|
667
|
+
white-space: nowrap;
|
|
674
668
|
}
|
|
675
669
|
.cio-quiz .cio-question-redo-button:hover {
|
|
676
670
|
text-decoration: underline;
|
|
@@ -739,9 +733,9 @@
|
|
|
739
733
|
}
|
|
740
734
|
.cio-quiz .cio-results-button-group {
|
|
741
735
|
display: flex;
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
margin-bottom:
|
|
736
|
+
flex-direction: column;
|
|
737
|
+
gap: 1.5rem;
|
|
738
|
+
margin-bottom: 1rem;
|
|
745
739
|
}
|
|
746
740
|
.cio-quiz .cio-results-filter-container {
|
|
747
741
|
margin-bottom: 0;
|
|
@@ -979,11 +973,13 @@
|
|
|
979
973
|
gap: 1rem;
|
|
980
974
|
}
|
|
981
975
|
|
|
982
|
-
.cio-quiz .cio-results-
|
|
976
|
+
.cio-quiz .cio-results-number-and-share-button-group {
|
|
983
977
|
display: flex;
|
|
984
978
|
gap: 8px;
|
|
985
979
|
align-items: end;
|
|
986
980
|
justify-content: space-between;
|
|
981
|
+
font-size: 0.85em;
|
|
982
|
+
color: var(--gray-dust-100);
|
|
987
983
|
}
|
|
988
984
|
|
|
989
985
|
.cio-quiz .cio-share-results-share-button {
|
|
@@ -1072,6 +1068,13 @@
|
|
|
1072
1068
|
.cio-quiz .cio-share-results-share-button {
|
|
1073
1069
|
max-width: 100%;
|
|
1074
1070
|
}
|
|
1071
|
+
|
|
1072
|
+
.cio-results-button-group {
|
|
1073
|
+
display: flex;
|
|
1074
|
+
flex-direction: column;
|
|
1075
|
+
gap: 0.5rem;
|
|
1076
|
+
margin-bottom: 1rem;
|
|
1077
|
+
}
|
|
1075
1078
|
}
|
|
1076
1079
|
|
|
1077
1080
|
@container (min-width: 500px) {
|
|
@@ -1093,8 +1096,27 @@
|
|
|
1093
1096
|
}
|
|
1094
1097
|
|
|
1095
1098
|
.cio-quiz .cio-results-title-container {
|
|
1096
|
-
margin-bottom: 1rem;
|
|
1097
1099
|
display: flex;
|
|
1098
1100
|
flex-direction: column;
|
|
1099
|
-
gap: 0.
|
|
1101
|
+
gap: 0.5rem;
|
|
1102
|
+
margin-bottom: 1.5rem;
|
|
1103
|
+
padding-bottom: 1.5rem;
|
|
1104
|
+
border-bottom: 1px solid var(--gray-dust-100);
|
|
1105
|
+
}
|
|
1106
|
+
|
|
1107
|
+
.cio-quiz .cio-results-explanation {
|
|
1108
|
+
margin: 0;
|
|
1109
|
+
font-size: 0.9em;
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
.cio-quiz .cio-results-explanation > span {
|
|
1113
|
+
font-weight: bold;
|
|
1114
|
+
font-size: 0.95em;
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
.cio-redo-button-container {
|
|
1118
|
+
width: 100%;
|
|
1119
|
+
padding-top: 1.5rem;
|
|
1120
|
+
display: flex;
|
|
1121
|
+
justify-content: center;
|
|
1100
1122
|
}
|
|
@@ -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.0";
|
|
2
2
|
export default _default;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@constructor-io/constructorio-ui-quizzes",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.12.0",
|
|
4
4
|
"description": "Constructor.io Quizzes UI library for web applications",
|
|
5
5
|
"author": "constructor.io",
|
|
6
6
|
"license": "MIT",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"@storybook/addon-links": "7.4.6",
|
|
78
78
|
"@storybook/jest": "^0.2.3",
|
|
79
79
|
"@storybook/react-webpack5": "7.4.6",
|
|
80
|
-
"@storybook/test-runner": "0.
|
|
80
|
+
"@storybook/test-runner": "0.16.0",
|
|
81
81
|
"@storybook/testing-library": "^0.1.0",
|
|
82
82
|
"@types/react": "^18.0.26",
|
|
83
83
|
"@types/react-dom": "^18.0.9",
|
|
@@ -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;
|