@constructor-io/constructorio-ui-quizzes 1.17.15 → 1.17.17
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 +11 -11
- package/lib/cjs/components/ResultContainer/ResultContainer.js +2 -2
- package/lib/cjs/components/Results/Results.js +4 -3
- package/lib/cjs/hooks/usePrevious.js +13 -0
- package/lib/cjs/hooks/useQuiz.js +20 -0
- package/lib/cjs/stories/Quiz/argTypes.js +14 -0
- package/lib/cjs/version.js +1 -1
- package/lib/mjs/components/ResultContainer/ResultContainer.js +2 -2
- package/lib/mjs/components/Results/Results.js +4 -3
- package/lib/mjs/hooks/usePrevious.js +10 -0
- package/lib/mjs/hooks/useQuiz.js +20 -0
- package/lib/mjs/stories/Quiz/argTypes.js +14 -0
- package/lib/mjs/version.js +1 -1
- package/lib/types/hooks/usePrevious.d.ts +1 -0
- package/lib/types/stories/Quiz/argTypes.d.ts +14 -0
- package/lib/types/types.d.ts +4 -0
- package/lib/types/version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -13,7 +13,7 @@ function ResultContainer(props) {
|
|
|
13
13
|
var _a, _b, _c;
|
|
14
14
|
const { resultCardOptions, onShare, resultsPageOptions } = props;
|
|
15
15
|
const { state } = (0, react_1.useContext)(context_1.default);
|
|
16
|
-
const { resultCardSalePriceKey, resultCardRegularPriceKey, resultCardRatingCountKey, resultCardRatingScoreKey, renderResultCardPriceDetails, } = resultCardOptions || {};
|
|
16
|
+
const { resultCardSalePriceKey, resultCardRegularPriceKey, resultCardRatingCountKey, resultCardRatingScoreKey, renderResultCardPriceDetails, renderResultCard, } = 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;
|
|
@@ -21,7 +21,7 @@ function ResultContainer(props) {
|
|
|
21
21
|
return (react_1.default.createElement("div", { className: 'cio-results-container' },
|
|
22
22
|
!zeroResults && react_1.default.createElement(ResultsHeaderContainer_1.default, { resultsConfig: resultsConfig }),
|
|
23
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 })),
|
|
24
|
+
!zeroResults && (react_1.default.createElement(Results_1.default, { resultCardSalePriceKey: resultCardSalePriceKey, resultCardRegularPriceKey: resultCardRegularPriceKey, resultCardRatingCountKey: resultCardRatingCountKey, resultCardRatingScoreKey: resultCardRatingScoreKey, renderResultCardPriceDetails: renderResultCardPriceDetails, renderResultCard: renderResultCard })),
|
|
25
25
|
zeroResults && react_1.default.createElement(ZeroResults_1.default, null),
|
|
26
26
|
!zeroResults && (react_1.default.createElement("div", { className: 'cio-redo-button-container' },
|
|
27
27
|
react_1.default.createElement(RedoButton_1.default, null)))));
|
|
@@ -6,11 +6,12 @@ const context_1 = tslib_1.__importDefault(require("../CioQuiz/context"));
|
|
|
6
6
|
const ResultCard_1 = tslib_1.__importDefault(require("../ResultCard/ResultCard"));
|
|
7
7
|
function Results(props) {
|
|
8
8
|
var _a, _b, _c, _d;
|
|
9
|
-
const { resultCardSalePriceKey, resultCardRegularPriceKey, resultCardRatingCountKey, resultCardRatingScoreKey, renderResultCardPriceDetails, } = props;
|
|
10
|
-
const { state } = (0, react_1.useContext)(context_1.default);
|
|
9
|
+
const { resultCardSalePriceKey, resultCardRegularPriceKey, resultCardRatingCountKey, resultCardRatingScoreKey, renderResultCardPriceDetails, renderResultCard, } = props;
|
|
10
|
+
const { state, getAddToCartButtonProps, getAddToFavoritesButtonProps } = (0, react_1.useContext)(context_1.default);
|
|
11
|
+
const getters = { getAddToCartButtonProps, getAddToFavoritesButtonProps };
|
|
11
12
|
return (react_1.default.createElement("div", { className: 'cio-results' }, (_d = (_c = (_b = (_a = state === null || state === void 0 ? void 0 : state.quiz) === null || _a === void 0 ? void 0 : _a.results) === null || _b === void 0 ? void 0 : _b.response) === null || _c === void 0 ? void 0 : _c.results) === null || _d === void 0 ? void 0 : _d.map((result, index) => {
|
|
12
13
|
var _a;
|
|
13
|
-
return (react_1.default.createElement(ResultCard_1.default, { result: result, key: (_a = result.data) === null || _a === void 0 ? void 0 : _a.id, salePriceKey: resultCardSalePriceKey, regularPriceKey: resultCardRegularPriceKey, ratingCountKey: resultCardRatingCountKey, ratingScoreKey: resultCardRatingScoreKey, renderResultCardPriceDetails: renderResultCardPriceDetails, resultPosition: index + 1 }));
|
|
14
|
+
return renderResultCard ? (renderResultCard(result, getters)) : (react_1.default.createElement(ResultCard_1.default, { result: result, key: (_a = result.data) === null || _a === void 0 ? void 0 : _a.id, salePriceKey: resultCardSalePriceKey, regularPriceKey: resultCardRegularPriceKey, ratingCountKey: resultCardRatingCountKey, ratingScoreKey: resultCardRatingScoreKey, renderResultCardPriceDetails: renderResultCardPriceDetails, resultPosition: index + 1 }));
|
|
14
15
|
})));
|
|
15
16
|
}
|
|
16
17
|
exports.default = Results;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const react_1 = require("react");
|
|
4
|
+
function usePrevious(value) {
|
|
5
|
+
const latest = (0, react_1.useRef)(value);
|
|
6
|
+
const previous = (0, react_1.useRef)();
|
|
7
|
+
if (latest.current !== value) {
|
|
8
|
+
previous.current = latest.current;
|
|
9
|
+
}
|
|
10
|
+
latest.current = value;
|
|
11
|
+
return previous.current;
|
|
12
|
+
}
|
|
13
|
+
exports.default = usePrevious;
|
package/lib/cjs/hooks/useQuiz.js
CHANGED
|
@@ -8,6 +8,9 @@ const usePropsGetters_1 = tslib_1.__importDefault(require("./usePropsGetters"));
|
|
|
8
8
|
const usePrimaryColorStyles_1 = tslib_1.__importDefault(require("./usePrimaryColorStyles"));
|
|
9
9
|
const useQuizEvents_1 = tslib_1.__importDefault(require("./useQuizEvents"));
|
|
10
10
|
const useQuizState_1 = tslib_1.__importDefault(require("./useQuizState"));
|
|
11
|
+
const usePrevious_1 = tslib_1.__importDefault(require("./usePrevious"));
|
|
12
|
+
const actions_1 = require("../components/CioQuiz/actions");
|
|
13
|
+
const utils_1 = require("../utils");
|
|
11
14
|
const useQuiz = (quizOptions) => {
|
|
12
15
|
var _a;
|
|
13
16
|
const { apiKey, cioJsClient, primaryColor, resultsPageOptions } = quizOptions;
|
|
@@ -29,6 +32,23 @@ const useQuiz = (quizOptions) => {
|
|
|
29
32
|
quizEvents.hydrateQuiz();
|
|
30
33
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
31
34
|
}, []);
|
|
35
|
+
const { quizId } = quizOptions;
|
|
36
|
+
const { dispatchApiState, dispatchLocalState } = quizState;
|
|
37
|
+
const prevQuizId = (0, usePrevious_1.default)(quizId);
|
|
38
|
+
(0, react_1.useEffect)(() => {
|
|
39
|
+
if (quizId === prevQuizId)
|
|
40
|
+
return;
|
|
41
|
+
if (!prevQuizId)
|
|
42
|
+
return;
|
|
43
|
+
dispatchLocalState({
|
|
44
|
+
type: actions_1.QuestionTypes.Reset,
|
|
45
|
+
});
|
|
46
|
+
dispatchApiState({
|
|
47
|
+
type: actions_1.QuizAPIActionTypes.RESET_QUIZ,
|
|
48
|
+
});
|
|
49
|
+
(0, utils_1.resetQuizSessionStorageState)(quizSessionStorageState.key);
|
|
50
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
51
|
+
}, [quizId, prevQuizId]);
|
|
32
52
|
return Object.assign(Object.assign({ cioClient, state: {
|
|
33
53
|
answers: {
|
|
34
54
|
inputs: quizLocalState.answerInputs,
|
|
@@ -213,6 +213,20 @@ exports.argTypes = {
|
|
|
213
213
|
},
|
|
214
214
|
},
|
|
215
215
|
},
|
|
216
|
+
'resultCardOptions.renderResultCard': {
|
|
217
|
+
description: 'Callback function to render custom result card',
|
|
218
|
+
control: false,
|
|
219
|
+
table: {
|
|
220
|
+
subcategory: 'resultCardOptions',
|
|
221
|
+
defaultValue: {
|
|
222
|
+
summary: 'null',
|
|
223
|
+
},
|
|
224
|
+
type: {
|
|
225
|
+
summary: '(result, getters) => JSX.Element',
|
|
226
|
+
detail: '(result: QuizResultDataPartial, getters: {getAddToCartButtonProps, getAddToFavoritesButtonProps}) => JSX.Element',
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
},
|
|
216
230
|
'resultsPageOptions.numResultsToDisplay': {
|
|
217
231
|
description: 'Number of results to display on the results page',
|
|
218
232
|
control: {
|
package/lib/cjs/version.js
CHANGED
|
@@ -9,7 +9,7 @@ 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);
|
|
12
|
-
const { resultCardSalePriceKey, resultCardRegularPriceKey, resultCardRatingCountKey, resultCardRatingScoreKey, renderResultCardPriceDetails, } = resultCardOptions || {};
|
|
12
|
+
const { resultCardSalePriceKey, resultCardRegularPriceKey, resultCardRatingCountKey, resultCardRatingScoreKey, renderResultCardPriceDetails, renderResultCard, } = resultCardOptions || {};
|
|
13
13
|
const numberOfResults = state?.quiz.results?.response?.results?.length;
|
|
14
14
|
const resultsConfig = state?.quiz.resultsConfig;
|
|
15
15
|
const zeroResults = !numberOfResults;
|
|
@@ -17,7 +17,7 @@ export default function ResultContainer(props) {
|
|
|
17
17
|
return (React.createElement("div", { className: 'cio-results-container' },
|
|
18
18
|
!zeroResults && React.createElement(ResultsHeaderContainer, { resultsConfig: resultsConfig }),
|
|
19
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 })),
|
|
20
|
+
!zeroResults && (React.createElement(Results, { resultCardSalePriceKey: resultCardSalePriceKey, resultCardRegularPriceKey: resultCardRegularPriceKey, resultCardRatingCountKey: resultCardRatingCountKey, resultCardRatingScoreKey: resultCardRatingScoreKey, renderResultCardPriceDetails: renderResultCardPriceDetails, renderResultCard: renderResultCard })),
|
|
21
21
|
zeroResults && React.createElement(ZeroResults, null),
|
|
22
22
|
!zeroResults && (React.createElement("div", { className: 'cio-redo-button-container' },
|
|
23
23
|
React.createElement(RedoButton, null)))));
|
|
@@ -2,8 +2,9 @@ import React, { useContext } from 'react';
|
|
|
2
2
|
import QuizContext from '../CioQuiz/context';
|
|
3
3
|
import ResultCard from '../ResultCard/ResultCard';
|
|
4
4
|
function Results(props) {
|
|
5
|
-
const { resultCardSalePriceKey, resultCardRegularPriceKey, resultCardRatingCountKey, resultCardRatingScoreKey, renderResultCardPriceDetails, } = props;
|
|
6
|
-
const { state } = useContext(QuizContext);
|
|
7
|
-
|
|
5
|
+
const { resultCardSalePriceKey, resultCardRegularPriceKey, resultCardRatingCountKey, resultCardRatingScoreKey, renderResultCardPriceDetails, renderResultCard, } = props;
|
|
6
|
+
const { state, getAddToCartButtonProps, getAddToFavoritesButtonProps } = useContext(QuizContext);
|
|
7
|
+
const getters = { getAddToCartButtonProps, getAddToFavoritesButtonProps };
|
|
8
|
+
return (React.createElement("div", { className: 'cio-results' }, state?.quiz?.results?.response?.results?.map((result, index) => renderResultCard ? (renderResultCard(result, getters)) : (React.createElement(ResultCard, { result: result, key: result.data?.id, salePriceKey: resultCardSalePriceKey, regularPriceKey: resultCardRegularPriceKey, ratingCountKey: resultCardRatingCountKey, ratingScoreKey: resultCardRatingScoreKey, renderResultCardPriceDetails: renderResultCardPriceDetails, resultPosition: index + 1 })))));
|
|
8
9
|
}
|
|
9
10
|
export default Results;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { useRef } from 'react';
|
|
2
|
+
export default function usePrevious(value) {
|
|
3
|
+
const latest = useRef(value);
|
|
4
|
+
const previous = useRef();
|
|
5
|
+
if (latest.current !== value) {
|
|
6
|
+
previous.current = latest.current;
|
|
7
|
+
}
|
|
8
|
+
latest.current = value;
|
|
9
|
+
return previous.current;
|
|
10
|
+
}
|
package/lib/mjs/hooks/useQuiz.js
CHANGED
|
@@ -5,6 +5,9 @@ import usePropsGetters from './usePropsGetters';
|
|
|
5
5
|
import usePrimaryColorStyles from './usePrimaryColorStyles';
|
|
6
6
|
import useQuizEvents from './useQuizEvents';
|
|
7
7
|
import useQuizState from './useQuizState';
|
|
8
|
+
import usePrevious from './usePrevious';
|
|
9
|
+
import { QuestionTypes, QuizAPIActionTypes } from '../components/CioQuiz/actions';
|
|
10
|
+
import { resetQuizSessionStorageState } from '../utils';
|
|
8
11
|
const useQuiz = (quizOptions) => {
|
|
9
12
|
const { apiKey, cioJsClient, primaryColor, resultsPageOptions } = quizOptions;
|
|
10
13
|
// Log console errors for required parameters quizId
|
|
@@ -25,6 +28,23 @@ const useQuiz = (quizOptions) => {
|
|
|
25
28
|
quizEvents.hydrateQuiz();
|
|
26
29
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
27
30
|
}, []);
|
|
31
|
+
const { quizId } = quizOptions;
|
|
32
|
+
const { dispatchApiState, dispatchLocalState } = quizState;
|
|
33
|
+
const prevQuizId = usePrevious(quizId);
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
if (quizId === prevQuizId)
|
|
36
|
+
return;
|
|
37
|
+
if (!prevQuizId)
|
|
38
|
+
return;
|
|
39
|
+
dispatchLocalState({
|
|
40
|
+
type: QuestionTypes.Reset,
|
|
41
|
+
});
|
|
42
|
+
dispatchApiState({
|
|
43
|
+
type: QuizAPIActionTypes.RESET_QUIZ,
|
|
44
|
+
});
|
|
45
|
+
resetQuizSessionStorageState(quizSessionStorageState.key);
|
|
46
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
47
|
+
}, [quizId, prevQuizId]);
|
|
28
48
|
return {
|
|
29
49
|
cioClient,
|
|
30
50
|
state: {
|
|
@@ -210,6 +210,20 @@ export const argTypes = {
|
|
|
210
210
|
},
|
|
211
211
|
},
|
|
212
212
|
},
|
|
213
|
+
'resultCardOptions.renderResultCard': {
|
|
214
|
+
description: 'Callback function to render custom result card',
|
|
215
|
+
control: false,
|
|
216
|
+
table: {
|
|
217
|
+
subcategory: 'resultCardOptions',
|
|
218
|
+
defaultValue: {
|
|
219
|
+
summary: 'null',
|
|
220
|
+
},
|
|
221
|
+
type: {
|
|
222
|
+
summary: '(result, getters) => JSX.Element',
|
|
223
|
+
detail: '(result: QuizResultDataPartial, getters: {getAddToCartButtonProps, getAddToFavoritesButtonProps}) => JSX.Element',
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
},
|
|
213
227
|
'resultsPageOptions.numResultsToDisplay': {
|
|
214
228
|
description: 'Number of results to display on the results page',
|
|
215
229
|
control: {
|
package/lib/mjs/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export default '1.17.
|
|
1
|
+
export default '1.17.17';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function usePrevious<Type>(value: Type): Type | undefined;
|
|
@@ -209,6 +209,20 @@ export declare const argTypes: {
|
|
|
209
209
|
};
|
|
210
210
|
};
|
|
211
211
|
};
|
|
212
|
+
'resultCardOptions.renderResultCard': {
|
|
213
|
+
description: string;
|
|
214
|
+
control: boolean;
|
|
215
|
+
table: {
|
|
216
|
+
subcategory: string;
|
|
217
|
+
defaultValue: {
|
|
218
|
+
summary: string;
|
|
219
|
+
};
|
|
220
|
+
type: {
|
|
221
|
+
summary: string;
|
|
222
|
+
detail: string;
|
|
223
|
+
};
|
|
224
|
+
};
|
|
225
|
+
};
|
|
212
226
|
'resultsPageOptions.numResultsToDisplay': {
|
|
213
227
|
description: string;
|
|
214
228
|
control: {
|
package/lib/types/types.d.ts
CHANGED
|
@@ -16,6 +16,10 @@ export interface ResultCardOptions {
|
|
|
16
16
|
resultCardRatingCountKey?: string;
|
|
17
17
|
resultCardRatingScoreKey?: string;
|
|
18
18
|
renderResultCardPriceDetails?: (result: QuizResultDataPartial) => JSX.Element;
|
|
19
|
+
renderResultCard?: (result: QuizResultDataPartial, getters: {
|
|
20
|
+
getAddToCartButtonProps?: GetAddToCartButtonProps;
|
|
21
|
+
getAddToFavoritesButtonProps?: GetAddToFavoritesButtonProps;
|
|
22
|
+
}) => JSX.Element;
|
|
19
23
|
}
|
|
20
24
|
export declare namespace QuizResultsEventsProps {
|
|
21
25
|
type OnQuizResultsLoaded = (results: QuizResultDataPartial) => void;
|
package/lib/types/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default: "1.17.
|
|
1
|
+
declare const _default: "1.17.17";
|
|
2
2
|
export default _default;
|
package/package.json
CHANGED