@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.
@@ -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
- return Object.assign(Object.assign({}, state), { quizRequestState: constants_1.RequestStates.Success, quizResults: (_l = action.payload) === null || _l === void 0 ? void 0 : _l.quizResults, quizCurrentQuestion: undefined, selectedOptionsWithAttributes });
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: (_m = action.payload) === null || _m === void 0 ? void 0 : _m.quizResults, quizCurrentQuestion: undefined, selectedOptionsWithAttributes: (_o = action.payload) === null || _o === void 0 ? void 0 : _o.quizResults.attributes });
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: (_p = action.payload) === null || _p === void 0 ? void 0 : _p.quizResultsConfig.results_config });
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 ResultFilters_1 = tslib_1.__importDefault(require("../ResultFilters/ResultFilters"));
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, _d, _e, _f, _g;
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("div", { className: 'cio-results-title-container' },
49
- react_1.default.createElement("h1", { className: 'cio-results-title' }, resultsTitle),
50
- react_1.default.createElement("p", { className: 'cio-results-description' }, resultsDescription)),
51
- react_1.default.createElement("div", { className: 'cio-results-filter-and-redo-container cio-results-button-group' },
52
- react_1.default.createElement(ResultFilters_1.default, { hasNoResults: zeroResults }),
53
- react_1.default.createElement("div", { className: 'cio-results-redo-and-share-button-group' },
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;
@@ -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.ResultFilters = exports.ResultContainer = exports.ResultCard = exports.Results = exports.SelectQuestion = exports.CoverQuestion = exports.OpenTextQuestion = exports.QuizQuestions = exports.useShareResultsLink = exports.useCioQuiz = void 0;
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 ResultFilters_1 = require("./components/ResultFilters/ResultFilters");
28
- Object.defineProperty(exports, "ResultFilters", { enumerable: true, get: function () { return tslib_1.__importDefault(ResultFilters_1).default; } });
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);
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = '1.11.2';
3
+ exports.default = '1.12.1';
@@ -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 ResultFilters from '../ResultFilters/ResultFilters';
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("div", { className: 'cio-results-title-container' },
45
- React.createElement("h1", { className: 'cio-results-title' }, resultsTitle),
46
- React.createElement("p", { className: 'cio-results-description' }, resultsDescription)),
47
- React.createElement("div", { className: 'cio-results-filter-and-redo-container cio-results-button-group' },
48
- React.createElement(ResultFilters, { hasNoResults: zeroResults }),
49
- React.createElement("div", { className: 'cio-results-redo-and-share-button-group' },
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
+ }
@@ -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 ResultFilters } from './components/ResultFilters/ResultFilters';
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;
@@ -1 +1 @@
1
- export default '1.11.2';
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
- border: 2px solid var(--primary-color-variant-600);
305
+ outline: 1px solid var(--primary-color-variant-600);
301
306
  }
302
307
  .cio-quiz .cio-question-back-button:active {
303
- border: 2px solid var(--primary-color-variant-700);
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
- justify-content: space-between;
743
- align-items: end;
744
- margin-bottom: 1.5rem;
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-redo-and-share-button-group {
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.25rem;
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;
@@ -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 ResultFilters } from './components/ResultFilters/ResultFilters';
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;
@@ -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;
@@ -1,2 +1,2 @@
1
- declare const _default: "1.11.2";
1
+ declare const _default: "1.12.1";
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.11.2",
3
+ "version": "1.12.1",
4
4
  "description": "Constructor.io Quizzes UI library for web applications",
5
5
  "author": "constructor.io",
6
6
  "license": "MIT",
@@ -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;
@@ -1,6 +0,0 @@
1
- /// <reference types="react" />
2
- interface ResultFiltersProps {
3
- hasNoResults: boolean;
4
- }
5
- declare function ResultFilters({ hasNoResults }: ResultFiltersProps): JSX.Element;
6
- export default ResultFilters;