@constructor-io/constructorio-ui-quizzes 1.9.9 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -3
- package/dist/constructorio-ui-quizzes-bundled.js +14 -14
- package/lib/cjs/components/CioQuiz/actions.js +1 -0
- package/lib/cjs/components/CioQuiz/index.js +10 -6
- package/lib/cjs/components/CioQuiz/quizApiReducer.js +4 -1
- package/lib/cjs/components/ResultContainer/ResultContainer.js +25 -19
- package/lib/cjs/components/ShareButton/ShareButton.js +17 -0
- package/lib/cjs/components/ShareButton/ShareSVG.js +11 -0
- package/lib/cjs/components/ShareResultsModal/AlertCircleSVG.js +11 -0
- package/lib/cjs/components/ShareResultsModal/CheckMarkCircleSVG.js +10 -0
- package/lib/cjs/components/ShareResultsModal/CloseSVG.js +10 -0
- package/lib/cjs/components/ShareResultsModal/EmailField.js +50 -0
- package/lib/cjs/components/ShareResultsModal/LinkField.js +30 -0
- package/lib/cjs/components/ShareResultsModal/ShareResultsModal.js +24 -0
- package/lib/cjs/constants.js +3 -42
- package/lib/cjs/hooks/useConsoleErrors.js +4 -8
- package/lib/cjs/hooks/usePropsGetters/index.js +2 -0
- package/lib/cjs/hooks/useQueryParams.js +31 -0
- package/lib/cjs/hooks/useQuiz.js +3 -3
- package/lib/cjs/hooks/useQuizEvents/index.js +10 -5
- package/lib/cjs/hooks/useQuizEvents/useQuizResetClick.js +15 -2
- package/lib/cjs/hooks/useQuizState/useQuizApiState.js +27 -2
- package/lib/cjs/hooks/useShareResultsLink.js +18 -0
- package/lib/cjs/index.js +3 -1
- package/lib/cjs/services/index.js +3 -1
- package/lib/cjs/stories/Quiz/argTypes.js +258 -7
- package/lib/cjs/utils.js +1 -0
- package/lib/cjs/version.js +1 -1
- package/lib/mjs/components/CioQuiz/actions.js +1 -0
- package/lib/mjs/components/CioQuiz/index.js +10 -6
- package/lib/mjs/components/CioQuiz/quizApiReducer.js +9 -0
- package/lib/mjs/components/ResultContainer/ResultContainer.js +25 -19
- package/lib/mjs/components/ShareButton/ShareButton.js +14 -0
- package/lib/mjs/components/ShareButton/ShareSVG.js +7 -0
- package/lib/mjs/components/ShareResultsModal/AlertCircleSVG.js +7 -0
- package/lib/mjs/components/ShareResultsModal/CheckMarkCircleSVG.js +6 -0
- package/lib/mjs/components/ShareResultsModal/CloseSVG.js +6 -0
- package/lib/mjs/components/ShareResultsModal/EmailField.js +46 -0
- package/lib/mjs/components/ShareResultsModal/LinkField.js +26 -0
- package/lib/mjs/components/ShareResultsModal/ShareResultsModal.js +20 -0
- package/lib/mjs/constants.js +2 -41
- package/lib/mjs/hooks/useConsoleErrors.js +4 -8
- package/lib/mjs/hooks/usePropsGetters/index.js +2 -0
- package/lib/mjs/hooks/useQueryParams.js +29 -0
- package/lib/mjs/hooks/useQuiz.js +3 -3
- package/lib/mjs/hooks/useQuizEvents/index.js +10 -5
- package/lib/mjs/hooks/useQuizEvents/useQuizResetClick.js +14 -2
- package/lib/mjs/hooks/useQuizState/useQuizApiState.js +28 -3
- package/lib/mjs/hooks/useShareResultsLink.js +14 -0
- package/lib/mjs/index.js +1 -0
- package/lib/mjs/services/index.js +1 -0
- package/lib/mjs/stories/Quiz/argTypes.js +257 -6
- package/lib/mjs/utils.js +1 -0
- package/lib/mjs/version.js +1 -1
- package/lib/styles.css +194 -2
- package/lib/types/components/CioQuiz/actions.d.ts +7 -3
- package/lib/types/components/CioQuiz/context.d.ts +2 -1
- package/lib/types/components/CioQuiz/quizApiReducer.d.ts +2 -2
- package/lib/types/components/ResultCard/ResultCard.d.ts +2 -2
- package/lib/types/components/ResultContainer/ResultContainer.d.ts +5 -3
- package/lib/types/components/Results/Results.d.ts +2 -2
- package/lib/types/components/ShareButton/ShareButton.d.ts +7 -0
- package/lib/types/components/ShareButton/ShareSVG.d.ts +2 -0
- package/lib/types/components/ShareResultsModal/AlertCircleSVG.d.ts +2 -0
- package/lib/types/components/ShareResultsModal/CheckMarkCircleSVG.d.ts +2 -0
- package/lib/types/components/ShareResultsModal/CloseSVG.d.ts +2 -0
- package/lib/types/components/ShareResultsModal/EmailField.d.ts +6 -0
- package/lib/types/components/ShareResultsModal/LinkField.d.ts +6 -0
- package/lib/types/components/ShareResultsModal/ShareResultsModal.d.ts +9 -0
- package/lib/types/constants.d.ts +1 -5
- package/lib/types/hooks/usePropsGetters/index.d.ts +2 -1
- package/lib/types/hooks/useQueryParams.d.ts +7 -0
- package/lib/types/hooks/useQuizEvents/useQuizNextClick.d.ts +2 -2
- package/lib/types/hooks/useQuizEvents/useQuizResetClick.d.ts +9 -2
- package/lib/types/hooks/useQuizEvents/useQuizSkipClick.d.ts +2 -2
- package/lib/types/hooks/useShareResultsLink.d.ts +2 -0
- package/lib/types/index.d.ts +1 -0
- package/lib/types/services/index.d.ts +6 -5
- package/lib/types/stories/Quiz/argTypes.d.ts +253 -6
- package/lib/types/types.d.ts +32 -14
- package/lib/types/utils.d.ts +2 -1
- package/lib/types/version.d.ts +1 -1
- package/package.json +2 -2
- package/lib/cjs/stories/Quiz/tests/mocks.js +0 -170
- package/lib/mjs/stories/Quiz/tests/mocks.js +0 -198
- package/lib/types/stories/Quiz/tests/mocks.d.ts +0 -44
|
@@ -23,4 +23,5 @@ var QuizAPIActionTypes;
|
|
|
23
23
|
QuizAPIActionTypes[QuizAPIActionTypes["SET_QUIZ_RESULTS"] = 2] = "SET_QUIZ_RESULTS";
|
|
24
24
|
QuizAPIActionTypes[QuizAPIActionTypes["SET_CURRENT_QUESTION"] = 3] = "SET_CURRENT_QUESTION";
|
|
25
25
|
QuizAPIActionTypes[QuizAPIActionTypes["RESET_QUIZ"] = 4] = "RESET_QUIZ";
|
|
26
|
+
QuizAPIActionTypes[QuizAPIActionTypes["SET_QUIZ_SHARED_RESULTS"] = 5] = "SET_QUIZ_SHARED_RESULTS";
|
|
26
27
|
})(QuizAPIActionTypes = exports.QuizAPIActionTypes || (exports.QuizAPIActionTypes = {}));
|
|
@@ -10,13 +10,15 @@ const constants_1 = require("../../constants");
|
|
|
10
10
|
const Spinner_1 = tslib_1.__importDefault(require("../Spinner/Spinner"));
|
|
11
11
|
const useQuiz_1 = tslib_1.__importDefault(require("../../hooks/useQuiz"));
|
|
12
12
|
const SessionPromptModal_1 = tslib_1.__importDefault(require("../SessionPromptModal/SessionPromptModal"));
|
|
13
|
+
const ShareResultsModal_1 = tslib_1.__importDefault(require("../ShareResultsModal/ShareResultsModal"));
|
|
13
14
|
const utils_1 = require("../../utils");
|
|
14
15
|
const ProgressBar_1 = tslib_1.__importDefault(require("../ProgressBar/ProgressBar"));
|
|
15
16
|
function CioQuiz(props) {
|
|
16
17
|
var _a;
|
|
17
|
-
const { cioClient, state, events: { hydrateQuiz, resetSessionStorageState }, getAddToCartButtonProps, getAddToFavoritesButtonProps, getCoverQuestionProps, getHydrateQuizButtonProps, getNextQuestionButtonProps, getSkipQuestionButtonProps, getOpenTextInputProps, getPreviousQuestionButtonProps, getQuizImageProps, getQuizResultButtonProps, getQuizResultLinkProps, getResetQuizButtonProps, getSelectInputProps, primaryColorStyles, } = (0, useQuiz_1.default)(props);
|
|
18
|
+
const { cioClient, state, events: { hydrateQuiz, resetSessionStorageState }, getAddToCartButtonProps, getAddToFavoritesButtonProps, getCoverQuestionProps, getHydrateQuizButtonProps, getNextQuestionButtonProps, getSkipQuestionButtonProps, getOpenTextInputProps, getPreviousQuestionButtonProps, getQuizImageProps, getQuizResultButtonProps, getQuizResultLinkProps, getResetQuizButtonProps, getSelectInputProps, primaryColorStyles, getShareResultsButtonProps, } = (0, useQuiz_1.default)(props);
|
|
18
19
|
const [showSessionPrompt, setShowSessionPrompt] = (0, react_1.useState)(false);
|
|
19
|
-
const
|
|
20
|
+
const [showShareModal, setShowShareModal] = (0, react_1.useState)(false);
|
|
21
|
+
const { callbacks, sessionStateOptions, questionsPageOptions, resultCardOptions, resultsPageOptions, } = props;
|
|
20
22
|
const { quizSessionStorageState: { hasSessionStorageState, skipToResults }, } = state;
|
|
21
23
|
(0, react_1.useEffect)(() => {
|
|
22
24
|
// Respect showSessionModal if defined, else default to true.
|
|
@@ -43,9 +45,10 @@ function CioQuiz(props) {
|
|
|
43
45
|
getQuizResultButtonProps,
|
|
44
46
|
getQuizResultLinkProps,
|
|
45
47
|
getResetQuizButtonProps,
|
|
48
|
+
getShareResultsButtonProps,
|
|
46
49
|
getSelectInputProps,
|
|
47
|
-
customClickItemCallback: !!(
|
|
48
|
-
customAddToFavoritesCallback: !!(
|
|
50
|
+
customClickItemCallback: !!(callbacks === null || callbacks === void 0 ? void 0 : callbacks.onQuizResultClick),
|
|
51
|
+
customAddToFavoritesCallback: !!(callbacks === null || callbacks === void 0 ? void 0 : callbacks.onAddToFavoritesClick),
|
|
49
52
|
primaryColorStyles,
|
|
50
53
|
};
|
|
51
54
|
if (state.quiz.requestState === constants_1.RequestStates.Loading) {
|
|
@@ -57,13 +60,14 @@ function CioQuiz(props) {
|
|
|
57
60
|
const questionImages = questionData === null || questionData === void 0 ? void 0 : questionData.images;
|
|
58
61
|
const displayBackgroundImage = (questionType === 'single' || questionType === 'multiple') && questionImages;
|
|
59
62
|
if (state.quiz.requestState === constants_1.RequestStates.Success) {
|
|
60
|
-
return (react_1.default.createElement("div", { className: 'cio-quiz' },
|
|
63
|
+
return (react_1.default.createElement("div", { className: 'cio-quiz', style: { overflow: showShareModal || showSessionPrompt ? 'hidden' : undefined } },
|
|
61
64
|
displayBackgroundImage && (0, utils_1.renderImages)(questionImages, 'cio-question-background-image'),
|
|
62
65
|
react_1.default.createElement("style", null,
|
|
63
66
|
".cio-quiz ",
|
|
64
67
|
(0, utils_1.convertPrimaryColorsToString)(primaryColorStyles)),
|
|
65
68
|
react_1.default.createElement(SessionPromptModal_1.default, { resetStoredState: resetSessionStorageState, continueSession: hydrateQuiz, showSessionPrompt: showSessionPrompt, setShowSessionPrompt: setShowSessionPrompt }),
|
|
66
|
-
react_1.default.createElement(
|
|
69
|
+
state.quiz && showShareModal && (react_1.default.createElement(ShareResultsModal_1.default, { onClose: () => setShowShareModal(false), quizState: state.quiz, onEmailResults: callbacks === null || callbacks === void 0 ? void 0 : callbacks.onEmailResults })),
|
|
70
|
+
react_1.default.createElement(context_1.default.Provider, { value: contextValue }, state.quiz.results || skipToResults ? (react_1.default.createElement(ResultContainer_1.default, { resultCardOptions: resultCardOptions, onShare: () => setShowShareModal(true), resultsPageOptions: resultsPageOptions })) : (state.quiz.currentQuestion && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
67
71
|
react_1.default.createElement(ProgressBar_1.default, null),
|
|
68
72
|
react_1.default.createElement(QuizQuestions_1.default, null),
|
|
69
73
|
react_1.default.createElement(ControlBar_1.default, { skipQuestionButtonText: questionsPageOptions === null || questionsPageOptions === void 0 ? void 0 : questionsPageOptions.skipQuestionButtonText, ctaButtonText: (questionData === null || questionData === void 0 ? void 0 : questionData.cta_text) || undefined })))))));
|
|
@@ -8,7 +8,7 @@ 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;
|
|
11
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
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 });
|
|
@@ -28,6 +28,9 @@ function apiReducer(state, action) {
|
|
|
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
|
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 });
|
|
30
30
|
}
|
|
31
|
+
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 });
|
|
33
|
+
}
|
|
31
34
|
case actions_1.QuizAPIActionTypes.RESET_QUIZ:
|
|
32
35
|
return exports.initialState;
|
|
33
36
|
default:
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
4
|
const react_1 = tslib_1.__importStar(require("react"));
|
|
5
5
|
const RedoButton_1 = tslib_1.__importDefault(require("../RedoButton/RedoButton"));
|
|
6
|
+
const ShareButton_1 = tslib_1.__importDefault(require("../ShareButton/ShareButton"));
|
|
6
7
|
const context_1 = tslib_1.__importDefault(require("../CioQuiz/context"));
|
|
7
8
|
const ResultFilters_1 = tslib_1.__importDefault(require("../ResultFilters/ResultFilters"));
|
|
8
9
|
const ZeroResults_1 = tslib_1.__importDefault(require("../ZeroResults/ZeroResults"));
|
|
@@ -10,27 +11,32 @@ const Results_1 = tslib_1.__importDefault(require("../Results/Results"));
|
|
|
10
11
|
const Spinner_1 = tslib_1.__importDefault(require("../Spinner/Spinner"));
|
|
11
12
|
function ResultContainer(props) {
|
|
12
13
|
var _a, _b, _c;
|
|
13
|
-
const {
|
|
14
|
-
const { resultCardSalePriceKey, resultCardRegularPriceKey, resultCardRatingCountKey, resultCardRatingScoreKey, renderResultCardPriceDetails, } = options;
|
|
14
|
+
const { resultCardOptions, onShare, resultsPageOptions } = props;
|
|
15
15
|
const { state } = (0, react_1.useContext)(context_1.default);
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
if (resultCardOptions) {
|
|
17
|
+
const { resultCardSalePriceKey, resultCardRegularPriceKey, resultCardRatingCountKey, resultCardRatingScoreKey, renderResultCardPriceDetails, } = resultCardOptions;
|
|
18
|
+
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;
|
|
19
|
+
const zeroResults = !numberOfResults;
|
|
20
|
+
const resultsTitle = zeroResults ? '' : 'Here are your results';
|
|
21
|
+
if (state === null || state === void 0 ? void 0 : state.quiz.results) {
|
|
22
|
+
return (react_1.default.createElement("div", { className: 'cio-results-container' },
|
|
23
|
+
react_1.default.createElement("h1", { className: 'cio-results-title' }, resultsTitle),
|
|
24
|
+
react_1.default.createElement("div", { className: 'cio-results-filter-and-redo-container cio-results-button-group' },
|
|
25
|
+
react_1.default.createElement(ResultFilters_1.default, { hasNoResults: zeroResults }),
|
|
26
|
+
react_1.default.createElement("div", { className: 'cio-results-redo-and-share-button-group' },
|
|
27
|
+
react_1.default.createElement(RedoButton_1.default, null),
|
|
28
|
+
(resultsPageOptions === null || resultsPageOptions === void 0 ? void 0 : resultsPageOptions.showShareResultsButton) && react_1.default.createElement(ShareButton_1.default, { onClick: onShare }))),
|
|
29
|
+
!zeroResults && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
30
|
+
react_1.default.createElement("div", { className: 'cio-results-num-results' },
|
|
31
|
+
numberOfResults,
|
|
32
|
+
" ",
|
|
33
|
+
numberOfResults === 1 ? 'result' : 'results'),
|
|
34
|
+
react_1.default.createElement(Results_1.default, { resultCardSalePriceKey: resultCardSalePriceKey, resultCardRegularPriceKey: resultCardRegularPriceKey, resultCardRatingCountKey: resultCardRatingCountKey, resultCardRatingScoreKey: resultCardRatingScoreKey, renderResultCardPriceDetails: renderResultCardPriceDetails }))),
|
|
35
|
+
zeroResults && react_1.default.createElement(ZeroResults_1.default, null)));
|
|
36
|
+
}
|
|
20
37
|
return (react_1.default.createElement("div", { className: 'cio-results-container' },
|
|
21
|
-
react_1.default.createElement(
|
|
22
|
-
react_1.default.createElement("div", { className: 'cio-results-filter-and-redo-container' },
|
|
23
|
-
react_1.default.createElement(ResultFilters_1.default, { hasNoResults: zeroResults }),
|
|
24
|
-
react_1.default.createElement(RedoButton_1.default, null)),
|
|
25
|
-
!zeroResults && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
26
|
-
react_1.default.createElement("div", { className: 'cio-results-num-results' },
|
|
27
|
-
numberOfResults,
|
|
28
|
-
" ",
|
|
29
|
-
numberOfResults === 1 ? 'result' : 'results'),
|
|
30
|
-
react_1.default.createElement(Results_1.default, { resultCardSalePriceKey: resultCardSalePriceKey, resultCardRegularPriceKey: resultCardRegularPriceKey, resultCardRatingCountKey: resultCardRatingCountKey, resultCardRatingScoreKey: resultCardRatingScoreKey, renderResultCardPriceDetails: renderResultCardPriceDetails }))),
|
|
31
|
-
zeroResults && react_1.default.createElement(ZeroResults_1.default, null)));
|
|
38
|
+
react_1.default.createElement(Spinner_1.default, null)));
|
|
32
39
|
}
|
|
33
|
-
return
|
|
34
|
-
react_1.default.createElement(Spinner_1.default, null)));
|
|
40
|
+
return null;
|
|
35
41
|
}
|
|
36
42
|
exports.default = ResultContainer;
|
|
@@ -0,0 +1,17 @@
|
|
|
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 ShareSVG_1 = tslib_1.__importDefault(require("./ShareSVG"));
|
|
6
|
+
const context_1 = tslib_1.__importDefault(require("../CioQuiz/context"));
|
|
7
|
+
function ShareButton(props) {
|
|
8
|
+
const { shareText = 'Share Results', disabled, onClick } = props, rest = tslib_1.__rest(props, ["shareText", "disabled", "onClick"]);
|
|
9
|
+
const { getShareResultsButtonProps } = (0, react_1.useContext)(context_1.default);
|
|
10
|
+
if (getShareResultsButtonProps) {
|
|
11
|
+
return (react_1.default.createElement("button", Object.assign({}, rest, getShareResultsButtonProps(), { type: 'button', onClick: onClick }),
|
|
12
|
+
react_1.default.createElement(ShareSVG_1.default, null),
|
|
13
|
+
react_1.default.createElement("span", null, shareText)));
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
exports.default = ShareButton;
|
|
@@ -0,0 +1,11 @@
|
|
|
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 ShareSVG() {
|
|
6
|
+
return (react_1.default.createElement("svg", { width: '16', height: '16', viewBox: '0 0 16 16', fill: 'none', xmlns: 'http://www.w3.org/2000/svg' },
|
|
7
|
+
react_1.default.createElement("path", { d: 'M10.5026 6.00201H11.7529C12.0845 6.00201 12.4025 6.13374 12.637 6.36821C12.8714 6.60268 13.0032 6.92069 13.0032 7.25229V13.2536C13.0032 13.5852 12.8714 13.9032 12.637 14.1377C12.4025 14.3721 12.0845 14.5039 11.7529 14.5039H4.25125C3.91966 14.5039 3.60164 14.3721 3.36717 14.1377C3.1327 13.9032 3.00098 13.5852 3.00098 13.2536V7.25229C3.00098 6.92069 3.1327 6.60268 3.36717 6.36821C3.60164 6.13374 3.91966 6.00201 4.25125 6.00201H5.50152', stroke: '#101010', strokeWidth: '1.33', strokeLinecap: 'round', strokeLinejoin: 'round' }),
|
|
8
|
+
react_1.default.createElement("path", { d: 'M10.5026 4.00116L8.00201 1.50061L5.50146 4.00116', stroke: '#101010', strokeWidth: '1.33', strokeLinecap: 'round', strokeLinejoin: 'round' }),
|
|
9
|
+
react_1.default.createElement("path", { d: 'M8.00146 10.0337V1.50061', stroke: '#101010', strokeWidth: '1.33', strokeLinecap: 'round', strokeLinejoin: 'round' })));
|
|
10
|
+
}
|
|
11
|
+
exports.default = ShareSVG;
|
|
@@ -0,0 +1,11 @@
|
|
|
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 AlertCircleSVG() {
|
|
6
|
+
return (react_1.default.createElement("svg", { width: '24', height: '24', viewBox: '0 0 24 24', fill: 'none', xmlns: 'http://www.w3.org/2000/svg' },
|
|
7
|
+
react_1.default.createElement("path", { d: 'M21.0009 11.9995C21.0009 7.03076 16.9697 2.99951 12.0009 2.99951C7.03217 2.99951 3.00092 7.03076 3.00092 11.9995C3.00092 16.9683 7.03217 20.9995 12.0009 20.9995C16.9697 20.9995 21.0009 16.9683 21.0009 11.9995Z', stroke: '#101010', strokeWidth: '1.33', strokeMiterlimit: '10' }),
|
|
8
|
+
react_1.default.createElement("path", { d: 'M11.7311 7.78322L12.0002 13.4996L12.2688 7.78322C12.2705 7.74667 12.2646 7.71017 12.2517 7.67595C12.2388 7.64173 12.219 7.6105 12.1936 7.58418C12.1682 7.55785 12.1377 7.53699 12.104 7.52285C12.0702 7.50872 12.034 7.50161 11.9974 7.50197V7.50197C11.9612 7.50231 11.9255 7.50993 11.8924 7.52437C11.8593 7.53882 11.8294 7.55979 11.8045 7.58604C11.7797 7.61229 11.7604 7.64328 11.7478 7.67716C11.7352 7.71104 11.7295 7.74711 11.7311 7.78322V7.78322Z', stroke: '#101010', strokeWidth: '1.00189', strokeLinecap: 'round', strokeLinejoin: 'round' }),
|
|
9
|
+
react_1.default.createElement("path", { d: 'M12.0028 17.2505C11.8168 17.2505 11.6351 17.1954 11.4805 17.0921C11.3259 16.9888 11.2054 16.8419 11.1342 16.6702C11.0631 16.4984 11.0444 16.3093 11.0807 16.127C11.117 15.9446 11.2065 15.7771 11.338 15.6456C11.4695 15.5141 11.637 15.4246 11.8194 15.3883C12.0017 15.352 12.1908 15.3706 12.3626 15.4418C12.5343 15.513 12.6812 15.6335 12.7845 15.7881C12.8878 15.9427 12.9429 16.1244 12.9429 16.3104C12.9429 16.5597 12.8439 16.7988 12.6676 16.9752C12.4913 17.1515 12.2521 17.2505 12.0028 17.2505Z', fill: '#101010' })));
|
|
10
|
+
}
|
|
11
|
+
exports.default = AlertCircleSVG;
|
|
@@ -0,0 +1,10 @@
|
|
|
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 CheckMarkCircleSVG() {
|
|
6
|
+
return (react_1.default.createElement("svg", { width: '24', height: '24', viewBox: '0 0 24 24', fill: 'none', xmlns: 'http://www.w3.org/2000/svg' },
|
|
7
|
+
react_1.default.createElement("path", { d: 'M21.001 12.0001C21.001 7.03137 16.9697 3.00012 12.001 3.00012C7.03223 3.00012 3.00098 7.03137 3.00098 12.0001C3.00098 16.9689 7.03223 21.0001 12.001 21.0001C16.9697 21.0001 21.001 16.9689 21.001 12.0001Z', stroke: '#101010', strokeWidth: '1.33', strokeMiterlimit: '10' }),
|
|
8
|
+
react_1.default.createElement("path", { d: 'M16.5005 8.24963L10.2005 15.7496L7.50049 12.7496', stroke: '#101010', strokeWidth: '1.33', strokeLinecap: 'round', strokeLinejoin: 'round' })));
|
|
9
|
+
}
|
|
10
|
+
exports.default = CheckMarkCircleSVG;
|
|
@@ -0,0 +1,10 @@
|
|
|
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 CloseSVG() {
|
|
6
|
+
return (react_1.default.createElement("svg", { width: '24', height: '24', viewBox: '0 0 24 24', fill: 'none', xmlns: 'http://www.w3.org/2000/svg' },
|
|
7
|
+
react_1.default.createElement("path", { d: 'M18.4748 4.11089C18.8653 3.72036 19.4985 3.72036 19.889 4.11089C20.2795 4.50141 20.2795 5.13458 19.889 5.5251L5.52503 19.8891C5.13451 20.2796 4.50134 20.2796 4.11082 19.8891C3.72029 19.4985 3.72029 18.8654 4.11082 18.4748L18.4748 4.11089Z', fill: '#505A75' }),
|
|
8
|
+
react_1.default.createElement("path", { d: 'M4.11076 5.5251C3.72024 5.13458 3.72024 4.50141 4.11076 4.11089C4.50129 3.72036 5.13445 3.72036 5.52498 4.11089L19.8889 18.4748C20.2795 18.8654 20.2795 19.4985 19.8889 19.8891C19.4984 20.2796 18.8652 20.2796 18.4747 19.8891L4.11076 5.5251Z', fill: '#505A75' })));
|
|
9
|
+
}
|
|
10
|
+
exports.default = CloseSVG;
|
|
@@ -0,0 +1,50 @@
|
|
|
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 CheckMarkCircleSVG_1 = tslib_1.__importDefault(require("./CheckMarkCircleSVG"));
|
|
6
|
+
const AlertCircleSVG_1 = tslib_1.__importDefault(require("./AlertCircleSVG"));
|
|
7
|
+
function EmailField({ onSubmit }) {
|
|
8
|
+
const [formError, setFormError] = (0, react_1.useState)(null);
|
|
9
|
+
const [isSubmitted, setIsSubmitted] = (0, react_1.useState)(false);
|
|
10
|
+
const [email, setEmail] = (0, react_1.useState)('');
|
|
11
|
+
const validate = () => {
|
|
12
|
+
if (email.length > 0 && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
|
|
13
|
+
setFormError(null);
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
setFormError({ type: 'validate', message: 'Please enter a valid email address' });
|
|
17
|
+
return false;
|
|
18
|
+
};
|
|
19
|
+
const handleSubmit = (e) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
20
|
+
e.preventDefault();
|
|
21
|
+
const isValid = validate();
|
|
22
|
+
if (!isValid)
|
|
23
|
+
return;
|
|
24
|
+
try {
|
|
25
|
+
yield onSubmit(email);
|
|
26
|
+
setIsSubmitted(true);
|
|
27
|
+
}
|
|
28
|
+
catch (_e) {
|
|
29
|
+
setFormError({
|
|
30
|
+
type: 'callback',
|
|
31
|
+
message: 'Sorry, there was an error sending. Please try again.',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
return (react_1.default.createElement("div", { className: 'cio-share-results-feature-group' },
|
|
36
|
+
react_1.default.createElement("form", { onSubmit: handleSubmit },
|
|
37
|
+
react_1.default.createElement("div", { className: 'cio-share-results-description' }, "Share by email"),
|
|
38
|
+
react_1.default.createElement("div", { className: 'cio-share-results-button-group' },
|
|
39
|
+
react_1.default.createElement("div", { className: 'cio-share-results-email-input-group' },
|
|
40
|
+
react_1.default.createElement("input", { className: `cio-share-results-email-input ${formError ? 'cio-share-results-email-input--error' : ''}`, onChange: (e) => setEmail(e.target.value) }),
|
|
41
|
+
(formError === null || formError === void 0 ? void 0 : formError.type) === 'validate' && (react_1.default.createElement("div", { className: 'cio-share-results-email-input-error-message' }, formError.message))),
|
|
42
|
+
react_1.default.createElement("button", { className: 'cio-share-results-share-button', type: 'submit' }, "Send"))),
|
|
43
|
+
isSubmitted && (react_1.default.createElement("div", { className: 'cio-share-results-notification' },
|
|
44
|
+
react_1.default.createElement(CheckMarkCircleSVG_1.default, null),
|
|
45
|
+
react_1.default.createElement("div", null, "Email sent"))),
|
|
46
|
+
(formError === null || formError === void 0 ? void 0 : formError.type) === 'callback' && (react_1.default.createElement("div", { className: 'cio-share-results-notification' },
|
|
47
|
+
react_1.default.createElement(AlertCircleSVG_1.default, null),
|
|
48
|
+
react_1.default.createElement("div", null, formError.message)))));
|
|
49
|
+
}
|
|
50
|
+
exports.default = EmailField;
|
|
@@ -0,0 +1,30 @@
|
|
|
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 CheckMarkCircleSVG_1 = tslib_1.__importDefault(require("./CheckMarkCircleSVG"));
|
|
6
|
+
const AlertCircleSVG_1 = tslib_1.__importDefault(require("./AlertCircleSVG"));
|
|
7
|
+
function LinkField({ url }) {
|
|
8
|
+
const [isCopied, setIsCopied] = (0, react_1.useState)(false);
|
|
9
|
+
const [isError, setIsError] = (0, react_1.useState)(false);
|
|
10
|
+
return (react_1.default.createElement("div", { className: 'cio-share-results-feature-group' },
|
|
11
|
+
react_1.default.createElement("div", { className: 'cio-share-results-description' }, "Share by link"),
|
|
12
|
+
react_1.default.createElement("div", { className: 'cio-share-results-button-group' },
|
|
13
|
+
react_1.default.createElement("input", { className: 'cio-share-results-link-input', value: url, disabled: true }),
|
|
14
|
+
react_1.default.createElement("button", { className: 'cio-share-results-share-button', type: 'button', onClick: () => {
|
|
15
|
+
try {
|
|
16
|
+
navigator.clipboard.writeText(url);
|
|
17
|
+
setIsCopied(true);
|
|
18
|
+
}
|
|
19
|
+
catch (_e) {
|
|
20
|
+
setIsError(true);
|
|
21
|
+
}
|
|
22
|
+
} }, "Copy link")),
|
|
23
|
+
isCopied && (react_1.default.createElement("div", { className: 'cio-share-results-notification' },
|
|
24
|
+
react_1.default.createElement(CheckMarkCircleSVG_1.default, null),
|
|
25
|
+
react_1.default.createElement("div", null, "Link copied to clipboard"))),
|
|
26
|
+
isError && (react_1.default.createElement("div", { className: 'cio-share-results-notification' },
|
|
27
|
+
react_1.default.createElement(AlertCircleSVG_1.default, null),
|
|
28
|
+
react_1.default.createElement("div", null, "Sorry, there was an error copying. Please try again.")))));
|
|
29
|
+
}
|
|
30
|
+
exports.default = LinkField;
|
|
@@ -0,0 +1,24 @@
|
|
|
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
|
+
const CloseSVG_1 = tslib_1.__importDefault(require("./CloseSVG"));
|
|
6
|
+
const LinkField_1 = tslib_1.__importDefault(require("./LinkField"));
|
|
7
|
+
const EmailField_1 = tslib_1.__importDefault(require("./EmailField"));
|
|
8
|
+
const useShareResultsLink_1 = tslib_1.__importDefault(require("../../hooks/useShareResultsLink"));
|
|
9
|
+
function ShareResultsModal({ onClose, quizState, onEmailResults, }) {
|
|
10
|
+
const url = (0, useShareResultsLink_1.default)(quizState);
|
|
11
|
+
return (react_1.default.createElement("div", { className: 'cio-share-results-modal', role: 'presentation', onClick: onClose },
|
|
12
|
+
react_1.default.createElement("div", { className: 'cio-share-results-container' },
|
|
13
|
+
react_1.default.createElement("div", { className: 'cio-share-results-content', onClick: (e) => e.stopPropagation(), role: 'presentation' },
|
|
14
|
+
react_1.default.createElement("div", { className: 'cio-share-results-header' },
|
|
15
|
+
react_1.default.createElement("div", { className: 'cio-share-results-title' }, "Share results"),
|
|
16
|
+
react_1.default.createElement("button", { onClick: onClose, type: 'button', className: 'cio-modal-close-button', "aria-label": 'Close button' },
|
|
17
|
+
react_1.default.createElement(CloseSVG_1.default, null))),
|
|
18
|
+
react_1.default.createElement("div", null, onEmailResults
|
|
19
|
+
? 'Share or save your quiz results through email or using the link below.'
|
|
20
|
+
: 'Share or save your quiz results with this link.'),
|
|
21
|
+
onEmailResults && react_1.default.createElement(EmailField_1.default, { onSubmit: (email) => onEmailResults({ email, url }) }),
|
|
22
|
+
react_1.default.createElement(LinkField_1.default, { url: url })))));
|
|
23
|
+
}
|
|
24
|
+
exports.default = ShareResultsModal;
|
package/lib/cjs/constants.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RequestStates = exports.
|
|
3
|
+
exports.RequestStates = exports.changePrimaryColorDescription = exports.smallContainerDescription = exports.basicDescription = exports.hookDescription = exports.quizSessionStateKey = exports.quizId = exports.apiKey = void 0;
|
|
4
4
|
// Autocomplete key index
|
|
5
5
|
exports.apiKey = 'key_wJSdZSiesX5hiVLt';
|
|
6
6
|
exports.quizId = 'coffee-quiz';
|
|
@@ -9,35 +9,7 @@ exports.quizSessionStateKey = 'constructorIOQuizState';
|
|
|
9
9
|
/// //////////////////////////////
|
|
10
10
|
// Storybook Folder Descriptions
|
|
11
11
|
/// //////////////////////////////
|
|
12
|
-
exports.
|
|
13
|
-
- This component handles state management, data fetching, and rendering logic.
|
|
14
|
-
- To use this component, \`quizId\`, \`resultsPageOptions\`, and one of \`apiKey\` or \`cioJsClient\` are required.
|
|
15
|
-
- \`resultsPageOptions\` lets you configure the results page
|
|
16
|
-
- \`onAddToCartClick\` is a callback function that will be called when the "Add to cart" button is clicked
|
|
17
|
-
- \`onAddToFavoritesClick\` is an optional callback function that will be called when the "Add To Favorites" heart icon is clicked
|
|
18
|
-
- \`onQuizResultClick\` is an optional callback function that will be called when the result card is clicked. The default behavior is redirecting the user to the item's URL
|
|
19
|
-
- \`onQuizResultsLoaded\` is an optional callback function that will be called when the quiz results are loaded
|
|
20
|
-
- \`resultCardRegularPriceKey\` is a parameter that specifies the metadata field name for the regular price
|
|
21
|
-
- \`resultCardSalePriceKey\` is an optional parameter that specifies the metadata field name for the sale price
|
|
22
|
-
- \`resultCardRatingCountKey\` is an optional parameter that specifies the metadata field name for the ratings count
|
|
23
|
-
- \`resultCardRatingScoreKey\` is an optional parameter that specifies the metadata field name for the ratings score
|
|
24
|
-
- \`renderResultCardPriceDetails\` is an optional render function to render custom prices section in result card
|
|
25
|
-
- \`numResultsToDisplay\` is an optional parameter that determines how many results should be displayed on results page
|
|
26
|
-
- \`callbacks\` lets you pass callback functions that will be called on certain actions
|
|
27
|
-
- \`onQuizNextQuestion\` is an optional callback function that will be called when user moves to the next question
|
|
28
|
-
- \`onQuizSkipQuestion\` is an optional callback function that will be called when user skips a question
|
|
29
|
-
- \`sessionStateOptions\` lets you configure the session modal behavior
|
|
30
|
-
- \`showSessionModal\` is a boolean used to decide whether to show the session modal. The default behavior is to show the session modal
|
|
31
|
-
- \`showSessionModalOnResults\` is a boolean to decide whether to show the session modal after reaching the results page. The default behavior is to not show the session modal
|
|
32
|
-
- \`sessionStateKey\` is a custom string that will be used as a session storage key
|
|
33
|
-
- \`questionsPageOptions\` lets you configure the question page
|
|
34
|
-
- \`skipQuestionButtonText\` is an optional string that will be used as the skip button text
|
|
35
|
-
- Use different props to configure the behavior of this component.
|
|
36
|
-
- The following stories show how different props affect the component's behavior
|
|
37
|
-
|
|
38
|
-
> Note: \`cioJsClient\` refers to an instance of the [constructorio-client-javascript](https://www.npmjs.com/package/@constructor-io/constructorio-client-javascript)
|
|
39
|
-
`;
|
|
40
|
-
exports.hookDescription = `- import \`useCioQuiz\` and call this custom hook in a functional component.
|
|
12
|
+
exports.hookDescription = `- Import \`useCioQuiz\` and call this custom hook in a functional component.
|
|
41
13
|
- This hook leaves rendering logic up to you, while handling:
|
|
42
14
|
- state management
|
|
43
15
|
- data fetching
|
|
@@ -46,7 +18,7 @@ exports.hookDescription = `- import \`useCioQuiz\` and call this custom hook in
|
|
|
46
18
|
- focus and submit event handling
|
|
47
19
|
- Since the markup is controlled by you, the default styles might not be applied if you have a different DOM structure
|
|
48
20
|
- To use this hook, an \`apiKey\` and \`quizId\` are required, and \`resultsPageOptions\` must be passed to the \`useCioQuiz\` hook to configure behavior. All other values are optional.
|
|
49
|
-
-
|
|
21
|
+
- Use the <a href="https://kentcdodds.com/blog/how-to-give-rendering-control-to-users-with-prop-getters" target="__blank">prop getters</a> and other variables returned by this hook (below) to leverage the functionality described above with jsx elements in your react component definitions
|
|
50
22
|
|
|
51
23
|
Calling the \`useCioQuiz\` hook returns an object with the following keys:
|
|
52
24
|
|
|
@@ -78,9 +50,6 @@ const {
|
|
|
78
50
|
// Storybook Stories
|
|
79
51
|
/// //////////////////////////////
|
|
80
52
|
exports.basicDescription = `Pass an \`apiKey\` and a \`quizId\` to request questions and quiz results from Constructor's servers`;
|
|
81
|
-
exports.cioJsClientDescription = `If you are already using an instance of the \`ConstructorIOClient\`, you can pass a \`cioJsClient\` instead of an \`apiKey\` to request results from Constructor's servers
|
|
82
|
-
|
|
83
|
-
> Note: \`cioJsClient\` refers to an instance of the [constructorio-client-javascript](https://www.npmjs.com/package/@constructor-io/constructorio-client-javascript)`;
|
|
84
53
|
exports.smallContainerDescription = `If you are using the provided styles, CioQuiz component will respect the height and width of its parent container and use responsive styles based on the parent container's dimensions`;
|
|
85
54
|
exports.changePrimaryColorDescription = `
|
|
86
55
|
If you would like to use a different primary color, pass a \`primaryColor\` string in RGB format ('R, G, B').
|
|
@@ -93,14 +62,6 @@ In the example below, the \`primaryColor\` prop has been used to override this c
|
|
|
93
62
|
|
|
94
63
|
> Advanced Option: Instead of passing a primaryColor prop, you can also override \`--primary-color-h\`, \`--primary-color-s\`, and \`--primary-color-l\` CSS variables within a \`.cio-quiz\` container element. If explicitly given a value in your CSS, then the values of these variables will be used as the HSL values for your quiz.
|
|
95
64
|
`;
|
|
96
|
-
exports.callbacksDescription = `Pass an \`apiKey\`, a \`quizId\`, and \`callbacks\``;
|
|
97
|
-
exports.favoritesDescription = `
|
|
98
|
-
Add \`const [favorites, setFavorites] = useState([]);\` or equivalent to manage the favorite items' state.
|
|
99
|
-
|
|
100
|
-
Pass favorites as an array to \`favoriteItems\` in \`resultsPageOptions\` as a prop to CioQuiz.
|
|
101
|
-
|
|
102
|
-
Pass a callback function to \`onAddToFavoritesClick\` in \`resultsPageOptions\` as a prop to CioQuiz to handle favorites state changes to update \`favorites\` array.
|
|
103
|
-
`;
|
|
104
65
|
var RequestStates;
|
|
105
66
|
(function (RequestStates) {
|
|
106
67
|
RequestStates["Stale"] = "STALE";
|
|
@@ -2,20 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const react_1 = require("react");
|
|
4
4
|
const useConsoleErrors = (quizOptions) => {
|
|
5
|
-
const { quizId, resultsPageOptions } = quizOptions;
|
|
5
|
+
const { quizId, resultsPageOptions, callbacks } = quizOptions;
|
|
6
6
|
(0, react_1.useEffect)(() => {
|
|
7
7
|
if (!quizId) {
|
|
8
8
|
// eslint-disable-next-line no-console
|
|
9
9
|
console.error('quizId is a required field of type string');
|
|
10
10
|
}
|
|
11
|
-
if (!
|
|
11
|
+
if (!(callbacks === null || callbacks === void 0 ? void 0 : callbacks.onAddToCartClick)) {
|
|
12
12
|
// eslint-disable-next-line no-console
|
|
13
|
-
console.error('
|
|
13
|
+
console.error('callbacks.onAddToCartClick is a required field of type function');
|
|
14
14
|
}
|
|
15
|
-
|
|
16
|
-
// eslint-disable-next-line no-console
|
|
17
|
-
console.error('resultsPageOptions.onAddToCartClick is a required field of type function');
|
|
18
|
-
}
|
|
19
|
-
}, [quizId, resultsPageOptions, resultsPageOptions === null || resultsPageOptions === void 0 ? void 0 : resultsPageOptions.onAddToCartClick]);
|
|
15
|
+
}, [quizId, resultsPageOptions, callbacks === null || callbacks === void 0 ? void 0 : callbacks.onAddToCartClick]);
|
|
20
16
|
};
|
|
21
17
|
exports.default = useConsoleErrors;
|
|
@@ -23,6 +23,7 @@ const usePropsGetters = (quizEvents, quizApiState, quizLocalState, favoriteItems
|
|
|
23
23
|
type: 'button',
|
|
24
24
|
onClick: () => resetQuiz(),
|
|
25
25
|
}), [resetQuiz]);
|
|
26
|
+
const getShareResultsButtonProps = (0, react_1.useCallback)(() => ({ className: 'cio-question-share-results-button' }), []);
|
|
26
27
|
const getHydrateQuizButtonProps = (0, react_1.useCallback)(() => ({
|
|
27
28
|
className: '',
|
|
28
29
|
type: 'button',
|
|
@@ -80,6 +81,7 @@ const usePropsGetters = (quizEvents, quizApiState, quizLocalState, favoriteItems
|
|
|
80
81
|
getSelectInputProps,
|
|
81
82
|
getCoverQuestionProps,
|
|
82
83
|
getResetQuizButtonProps,
|
|
84
|
+
getShareResultsButtonProps,
|
|
83
85
|
getHydrateQuizButtonProps,
|
|
84
86
|
getAddToCartButtonProps,
|
|
85
87
|
getAddToFavoritesButtonProps,
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const react_1 = require("react");
|
|
4
|
+
const useQueryParams = () => {
|
|
5
|
+
const getParsedQueryParam = (queryName) => {
|
|
6
|
+
const queryParams = new URLSearchParams(window.location.search);
|
|
7
|
+
const queryParam = queryParams.get(queryName);
|
|
8
|
+
if (!queryParam)
|
|
9
|
+
return [];
|
|
10
|
+
return queryParam === null || queryParam === void 0 ? void 0 : queryParam.split(',');
|
|
11
|
+
};
|
|
12
|
+
const queryItems = getParsedQueryParam('items');
|
|
13
|
+
const queryAttributes = getParsedQueryParam('attributes');
|
|
14
|
+
const isSharedResultsQuery = !!queryItems.length && !!queryAttributes.length;
|
|
15
|
+
const removeSharedResultsQueryParams = (0, react_1.useCallback)(() => {
|
|
16
|
+
const updatedUrl = new URL(window.location.href);
|
|
17
|
+
updatedUrl.searchParams.delete('items');
|
|
18
|
+
updatedUrl.searchParams.delete('attributes');
|
|
19
|
+
if (!updatedUrl.searchParams.toString().length) {
|
|
20
|
+
updatedUrl.search = '';
|
|
21
|
+
}
|
|
22
|
+
window.history.replaceState({}, '', updatedUrl.toString());
|
|
23
|
+
}, []);
|
|
24
|
+
return {
|
|
25
|
+
queryItems,
|
|
26
|
+
queryAttributes,
|
|
27
|
+
isSharedResultsQuery,
|
|
28
|
+
removeSharedResultsQueryParams,
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
exports.default = useQueryParams;
|
package/lib/cjs/hooks/useQuiz.js
CHANGED
|
@@ -9,8 +9,8 @@ const usePrimaryColorStyles_1 = tslib_1.__importDefault(require("./usePrimaryCol
|
|
|
9
9
|
const useQuizEvents_1 = tslib_1.__importDefault(require("./useQuizEvents"));
|
|
10
10
|
const useQuizState_1 = tslib_1.__importDefault(require("./useQuizState"));
|
|
11
11
|
const useQuiz = (quizOptions) => {
|
|
12
|
-
const { apiKey, cioJsClient, primaryColor, resultsPageOptions
|
|
13
|
-
// Log console errors for required parameters quizId
|
|
12
|
+
const { apiKey, cioJsClient, primaryColor, resultsPageOptions } = quizOptions;
|
|
13
|
+
// Log console errors for required parameters quizId
|
|
14
14
|
(0, useConsoleErrors_1.default)(quizOptions);
|
|
15
15
|
// Quiz Cio Client
|
|
16
16
|
const cioClient = (0, useCioClient_1.default)({ apiKey, cioJsClient });
|
|
@@ -21,7 +21,7 @@ const useQuiz = (quizOptions) => {
|
|
|
21
21
|
// Props getters
|
|
22
22
|
const { quizApiState, quizLocalState, quizSessionStorageState } = quizState;
|
|
23
23
|
const { skipToResults } = quizSessionStorageState;
|
|
24
|
-
const propGetters = (0, usePropsGetters_1.default)(quizEvents, quizApiState, quizLocalState, favoriteItems);
|
|
24
|
+
const propGetters = (0, usePropsGetters_1.default)(quizEvents, quizApiState, quizLocalState, resultsPageOptions === null || resultsPageOptions === void 0 ? void 0 : resultsPageOptions.favoriteItems);
|
|
25
25
|
const primaryColorStyles = (0, usePrimaryColorStyles_1.default)(primaryColor);
|
|
26
26
|
(0, react_1.useEffect)(() => {
|
|
27
27
|
if (skipToResults)
|
|
@@ -14,13 +14,13 @@ const useQuizAddToFavorites_1 = tslib_1.__importDefault(require("./useQuizAddToF
|
|
|
14
14
|
const useQuizSkipClick_1 = tslib_1.__importDefault(require("./useQuizSkipClick"));
|
|
15
15
|
const useQuizEvents = (quizOptions, cioClient, quizState) => {
|
|
16
16
|
const { quizApiState, dispatchLocalState, dispatchApiState, quizLocalState, quizSessionStorageState, } = quizState;
|
|
17
|
-
const {
|
|
18
|
-
const { onAddToCartClick, onQuizResultClick, onQuizResultsLoaded,
|
|
17
|
+
const { callbacks } = quizOptions;
|
|
18
|
+
const { onAddToCartClick, onAddToFavoritesClick, onQuizNextQuestion, onQuizResultClick, onQuizResultsLoaded, onQuizSkipQuestion, } = callbacks || {};
|
|
19
19
|
// Quiz answer change
|
|
20
20
|
const quizAnswerChanged = (0, useQuizAnswerChangeHandler_1.default)(quizApiState, dispatchLocalState);
|
|
21
21
|
// Quiz Next button click callback
|
|
22
|
-
const nextQuestion = (0, useQuizNextClick_1.default)(quizApiState, quizLocalState, dispatchLocalState,
|
|
23
|
-
const skipQuestion = (0, useQuizSkipClick_1.default)(quizApiState, quizLocalState, dispatchLocalState,
|
|
22
|
+
const nextQuestion = (0, useQuizNextClick_1.default)(quizApiState, quizLocalState, dispatchLocalState, onQuizNextQuestion);
|
|
23
|
+
const skipQuestion = (0, useQuizSkipClick_1.default)(quizApiState, quizLocalState, dispatchLocalState, onQuizSkipQuestion);
|
|
24
24
|
// Quiz Back button click callback
|
|
25
25
|
const previousQuestion = (0, useQuizBackClick_1.default)(quizApiState, dispatchLocalState);
|
|
26
26
|
// Quiz result add to cart callback
|
|
@@ -31,7 +31,12 @@ const useQuizEvents = (quizOptions, cioClient, quizState) => {
|
|
|
31
31
|
// Quiz results loaded event
|
|
32
32
|
(0, useQuizResultsLoaded_1.default)(cioClient, quizApiState, onQuizResultsLoaded);
|
|
33
33
|
// Quiz reset
|
|
34
|
-
const resetQuiz = (0, useQuizResetClick_1.default)(
|
|
34
|
+
const resetQuiz = (0, useQuizResetClick_1.default)({
|
|
35
|
+
resetQuizSessionStorageState: (0, utils_1.resetQuizSessionStorageState)(quizSessionStorageState.key),
|
|
36
|
+
dispatchLocalState,
|
|
37
|
+
dispatchApiState,
|
|
38
|
+
quizResults: quizApiState.quizResults,
|
|
39
|
+
});
|
|
35
40
|
// Quiz rehydrate
|
|
36
41
|
const hydrateQuizLocalState = (0, useHydrateQuizLocalState_1.default)(quizSessionStorageState.key, dispatchLocalState);
|
|
37
42
|
return {
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
3
4
|
const react_1 = require("react");
|
|
4
5
|
const actions_1 = require("../../components/CioQuiz/actions");
|
|
5
|
-
const
|
|
6
|
+
const useQueryParams_1 = tslib_1.__importDefault(require("../useQueryParams"));
|
|
7
|
+
const useQuizResetClick = (props) => {
|
|
8
|
+
const { resetQuizSessionStorageState, dispatchLocalState, dispatchApiState, quizResults } = props;
|
|
9
|
+
const { removeSharedResultsQueryParams, isSharedResultsQuery } = (0, useQueryParams_1.default)();
|
|
6
10
|
const quizResetClickHandler = (0, react_1.useCallback)(() => {
|
|
7
11
|
if (quizResults) {
|
|
8
12
|
dispatchLocalState({
|
|
@@ -12,8 +16,17 @@ const useQuizResetClick = (resetQuizSessionStorageState, dispatchLocalState, dis
|
|
|
12
16
|
type: actions_1.QuizAPIActionTypes.RESET_QUIZ,
|
|
13
17
|
});
|
|
14
18
|
resetQuizSessionStorageState();
|
|
19
|
+
if (isSharedResultsQuery)
|
|
20
|
+
removeSharedResultsQueryParams();
|
|
15
21
|
}
|
|
16
|
-
}, [
|
|
22
|
+
}, [
|
|
23
|
+
dispatchLocalState,
|
|
24
|
+
dispatchApiState,
|
|
25
|
+
resetQuizSessionStorageState,
|
|
26
|
+
quizResults,
|
|
27
|
+
removeSharedResultsQueryParams,
|
|
28
|
+
isSharedResultsQuery,
|
|
29
|
+
]);
|
|
17
30
|
return quizResetClickHandler;
|
|
18
31
|
};
|
|
19
32
|
exports.default = useQuizResetClick;
|