@constructor-io/constructorio-ui-quizzes 1.9.10 → 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/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
|
@@ -5,11 +5,13 @@ const react_1 = require("react");
|
|
|
5
5
|
const actions_1 = require("../../components/CioQuiz/actions");
|
|
6
6
|
const quizApiReducer_1 = tslib_1.__importStar(require("../../components/CioQuiz/quizApiReducer"));
|
|
7
7
|
const services_1 = require("../../services");
|
|
8
|
+
const useQueryParams_1 = tslib_1.__importDefault(require("../useQueryParams"));
|
|
8
9
|
const useQuizApiState = (quizOptions, cioClient, quizLocalState, skipToResults, dispatchLocalState
|
|
9
10
|
// eslint-disable-next-line max-params
|
|
10
11
|
) => {
|
|
11
12
|
const [quizApiState, dispatchApiState] = (0, react_1.useReducer)(quizApiReducer_1.default, quizApiReducer_1.initialState);
|
|
12
13
|
const { quizId, quizVersionId: quizVersionIdProp, resultsPageOptions } = quizOptions;
|
|
14
|
+
const { queryItems, queryAttributes, isSharedResultsQuery } = (0, useQueryParams_1.default)();
|
|
13
15
|
const dispatchQuizResults = () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
14
16
|
try {
|
|
15
17
|
const quizResults = yield (0, services_1.getQuizResults)(cioClient, quizId, {
|
|
@@ -36,12 +38,29 @@ const useQuizApiState = (quizOptions, cioClient, quizLocalState, skipToResults,
|
|
|
36
38
|
});
|
|
37
39
|
}
|
|
38
40
|
});
|
|
41
|
+
const dispatchSharedQuizResults = () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
42
|
+
try {
|
|
43
|
+
const quizResults = yield (0, services_1.getBrowseResultsForItemIds)(cioClient, queryItems);
|
|
44
|
+
dispatchApiState({
|
|
45
|
+
type: actions_1.QuizAPIActionTypes.SET_QUIZ_SHARED_RESULTS,
|
|
46
|
+
payload: { quizResults: Object.assign(Object.assign({}, quizResults), { attributes: queryAttributes }) },
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
dispatchApiState({
|
|
51
|
+
type: actions_1.QuizAPIActionTypes.SET_IS_ERROR,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
});
|
|
39
55
|
(0, react_1.useEffect)(() => {
|
|
40
56
|
(() => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
41
57
|
dispatchApiState({
|
|
42
58
|
type: actions_1.QuizAPIActionTypes.SET_IS_LOADING,
|
|
43
59
|
});
|
|
44
|
-
if (
|
|
60
|
+
if (isSharedResultsQuery) {
|
|
61
|
+
yield dispatchSharedQuizResults();
|
|
62
|
+
}
|
|
63
|
+
else if (skipToResults) {
|
|
45
64
|
yield dispatchQuizResults();
|
|
46
65
|
}
|
|
47
66
|
else {
|
|
@@ -84,7 +103,13 @@ const useQuizApiState = (quizOptions, cioClient, quizLocalState, skipToResults,
|
|
|
84
103
|
}
|
|
85
104
|
}))();
|
|
86
105
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
87
|
-
}, [
|
|
106
|
+
}, [
|
|
107
|
+
cioClient,
|
|
108
|
+
quizId,
|
|
109
|
+
quizLocalState.answers,
|
|
110
|
+
resultsPageOptions === null || resultsPageOptions === void 0 ? void 0 : resultsPageOptions.numResultsToDisplay,
|
|
111
|
+
isSharedResultsQuery,
|
|
112
|
+
]);
|
|
88
113
|
return {
|
|
89
114
|
quizApiState,
|
|
90
115
|
dispatchApiState,
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
function useShareResultsLink(quizState) {
|
|
4
|
+
var _a, _b, _c;
|
|
5
|
+
const urlObj = new URL(window.location.href);
|
|
6
|
+
const existingParams = urlObj.searchParams;
|
|
7
|
+
if (!((_b = (_a = quizState.results) === null || _a === void 0 ? void 0 : _a.response) === null || _b === void 0 ? void 0 : _b.results)) {
|
|
8
|
+
throw new Error("Can't generate share link without results");
|
|
9
|
+
}
|
|
10
|
+
existingParams.set('items', quizState.results.response.results
|
|
11
|
+
.filter((item) => { var _a; return (_a = item.data) === null || _a === void 0 ? void 0 : _a.id; })
|
|
12
|
+
.map((item) => item.data.id)
|
|
13
|
+
.join(',') || '');
|
|
14
|
+
existingParams.set('attributes', ((_c = quizState.selectedOptionsWithAttributes) === null || _c === void 0 ? void 0 : _c.map((option) => option).join(',')) || '');
|
|
15
|
+
const value = urlObj.toString();
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
exports.default = useShareResultsLink;
|
package/lib/cjs/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
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.useCioQuiz = void 0;
|
|
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;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const CioQuiz_1 = tslib_1.__importDefault(require("./components/CioQuiz"));
|
|
6
6
|
// Hook
|
|
7
7
|
var useQuiz_1 = require("./hooks/useQuiz");
|
|
8
8
|
Object.defineProperty(exports, "useCioQuiz", { enumerable: true, get: function () { return tslib_1.__importDefault(useQuiz_1).default; } });
|
|
9
|
+
var useShareResultsLink_1 = require("./hooks/useShareResultsLink");
|
|
10
|
+
Object.defineProperty(exports, "useShareResultsLink", { enumerable: true, get: function () { return tslib_1.__importDefault(useShareResultsLink_1).default; } });
|
|
9
11
|
// Questions Components
|
|
10
12
|
var index_1 = require("./components/QuizQuestions/index");
|
|
11
13
|
Object.defineProperty(exports, "QuizQuestions", { enumerable: true, get: function () { return tslib_1.__importDefault(index_1).default; } });
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.trackQuizConversion = exports.trackQuizResultClick = exports.trackQuizResultsLoaded = exports.getQuizResults = exports.getNextQuestion = exports.getCioClient = void 0;
|
|
3
|
+
exports.trackQuizConversion = exports.trackQuizResultClick = exports.trackQuizResultsLoaded = exports.getBrowseResultsForItemIds = exports.getQuizResults = exports.getNextQuestion = exports.getCioClient = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
/* eslint-disable @typescript-eslint/naming-convention */
|
|
6
6
|
const constructorio_client_javascript_1 = tslib_1.__importDefault(require("@constructor-io/constructorio-client-javascript"));
|
|
@@ -20,6 +20,8 @@ const getNextQuestion = (cioClient, quizId, parameters) => cioClient === null ||
|
|
|
20
20
|
exports.getNextQuestion = getNextQuestion;
|
|
21
21
|
const getQuizResults = (cioClient, quizId, parameters) => tslib_1.__awaiter(void 0, void 0, void 0, function* () { return cioClient === null || cioClient === void 0 ? void 0 : cioClient.quizzes.getQuizResults(quizId, parameters); });
|
|
22
22
|
exports.getQuizResults = getQuizResults;
|
|
23
|
+
const getBrowseResultsForItemIds = (cioClient, itemIds) => tslib_1.__awaiter(void 0, void 0, void 0, function* () { return cioClient === null || cioClient === void 0 ? void 0 : cioClient.browse.getBrowseResultsForItemIds(itemIds); });
|
|
24
|
+
exports.getBrowseResultsForItemIds = getBrowseResultsForItemIds;
|
|
23
25
|
// Tracking requests
|
|
24
26
|
const trackQuizResultsLoaded = (cioClient, quizResults) => {
|
|
25
27
|
var _a;
|
|
@@ -1,35 +1,286 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.argTypes = void 0;
|
|
3
|
+
exports.storiesControls = exports.docsControls = exports.argTypes = void 0;
|
|
4
4
|
// eslint-disable-next-line
|
|
5
5
|
exports.argTypes = {
|
|
6
|
+
quizId: {
|
|
7
|
+
description: 'ID of the quiz',
|
|
8
|
+
control: {
|
|
9
|
+
type: 'text',
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
quizVersionId: {
|
|
13
|
+
description: 'Optional quiz version Id',
|
|
14
|
+
},
|
|
6
15
|
apiKey: {
|
|
7
|
-
|
|
8
|
-
|
|
16
|
+
description: 'Your Constructor API key. Either `apiKey` or `cioJsClient` are required',
|
|
17
|
+
},
|
|
18
|
+
'callbacks.onQuizNextQuestion': {
|
|
19
|
+
description: 'Callback function to be called when the next question is loaded',
|
|
20
|
+
control: false,
|
|
9
21
|
table: {
|
|
22
|
+
subcategory: 'callbacks',
|
|
23
|
+
defaultValue: {
|
|
24
|
+
summary: 'null',
|
|
25
|
+
},
|
|
26
|
+
type: {
|
|
27
|
+
summary: '(question) => void',
|
|
28
|
+
detail: '(question: QuestionWithAnswer) => void',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
'callbacks.onQuizResultsLoaded': {
|
|
33
|
+
description: 'Callback function to be called when the quiz results are loaded',
|
|
34
|
+
control: false,
|
|
35
|
+
table: {
|
|
36
|
+
subcategory: 'callbacks',
|
|
37
|
+
defaultValue: {
|
|
38
|
+
summary: 'null',
|
|
39
|
+
},
|
|
40
|
+
type: {
|
|
41
|
+
summary: '(results) => void',
|
|
42
|
+
detail: '(results: QuizResultDataPartial) => void',
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
'callbacks.onQuizResultClick': {
|
|
47
|
+
description: 'Callback function to be called when a quiz result is clicked',
|
|
48
|
+
control: false,
|
|
49
|
+
table: {
|
|
50
|
+
subcategory: 'callbacks',
|
|
51
|
+
defaultValue: {
|
|
52
|
+
summary: 'null',
|
|
53
|
+
},
|
|
54
|
+
type: {
|
|
55
|
+
summary: '(result, position: number) => void',
|
|
56
|
+
detail: '(result: QuizResultDataPartial, position: number) => void',
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
'callbacks.onAddToCartClick': {
|
|
61
|
+
description: 'Callback function to be called when the add to cart button is clicked',
|
|
62
|
+
control: false,
|
|
63
|
+
table: {
|
|
64
|
+
subcategory: 'callbacks',
|
|
65
|
+
defaultValue: {
|
|
66
|
+
summary: 'null',
|
|
67
|
+
},
|
|
68
|
+
type: {
|
|
69
|
+
summary: '(result) => void',
|
|
70
|
+
detail: '(result: QuizResultDataPartial) => void',
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
'callbacks.onAddToFavoritesClick': {
|
|
75
|
+
description: 'Callback function to be called when the add to favorites button is clicked',
|
|
76
|
+
control: false,
|
|
77
|
+
table: {
|
|
78
|
+
subcategory: 'callbacks',
|
|
79
|
+
defaultValue: {
|
|
80
|
+
summary: 'null',
|
|
81
|
+
},
|
|
82
|
+
type: {
|
|
83
|
+
summary: '(result) => void',
|
|
84
|
+
detail: '(result: QuizResultDataPartial) => void',
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
'callbacks.onEmailResults': {
|
|
89
|
+
description: 'Callback function to be called when emailing results.',
|
|
90
|
+
control: false,
|
|
91
|
+
table: {
|
|
92
|
+
subcategory: 'callbacks',
|
|
93
|
+
defaultValue: {
|
|
94
|
+
summary: 'null',
|
|
95
|
+
},
|
|
96
|
+
type: {
|
|
97
|
+
summary: '(args) => void',
|
|
98
|
+
detail: '(args: QuizEmailResults) => void',
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
cioJsClient: {
|
|
103
|
+
description: 'Optional custom constructor instance. Either `apiKey` or `cioJsClient` are required',
|
|
104
|
+
},
|
|
105
|
+
primaryColor: {
|
|
106
|
+
description: "RGB value string for quiz primary theme color ie: `'255, 82, 48'`",
|
|
107
|
+
control: {
|
|
108
|
+
type: 'text',
|
|
109
|
+
},
|
|
110
|
+
defaultValue: {
|
|
111
|
+
summary: '35, 71, 199',
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
'resultCardOptions.resultCardRegularPriceKey': {
|
|
115
|
+
description: 'Key name for the regular price in the API response',
|
|
116
|
+
control: {
|
|
117
|
+
type: 'text',
|
|
118
|
+
},
|
|
119
|
+
table: {
|
|
120
|
+
subcategory: 'resultCardOptions',
|
|
121
|
+
defaultValue: {
|
|
122
|
+
summary: 'regular_price',
|
|
123
|
+
},
|
|
10
124
|
type: {
|
|
11
125
|
summary: 'string',
|
|
12
126
|
},
|
|
13
127
|
},
|
|
128
|
+
},
|
|
129
|
+
'resultCardOptions.resultCardSalePriceKey': {
|
|
130
|
+
description: 'Key name for the sale price in the API response',
|
|
14
131
|
control: {
|
|
15
132
|
type: 'text',
|
|
16
133
|
},
|
|
134
|
+
table: {
|
|
135
|
+
subcategory: 'resultCardOptions',
|
|
136
|
+
defaultValue: {
|
|
137
|
+
summary: 'sale_price',
|
|
138
|
+
},
|
|
139
|
+
type: {
|
|
140
|
+
summary: 'string',
|
|
141
|
+
},
|
|
142
|
+
},
|
|
17
143
|
},
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
144
|
+
'resultCardOptions.resultCardRatingCountKey': {
|
|
145
|
+
description: 'Key name for the rating count in the API response',
|
|
146
|
+
control: {
|
|
147
|
+
type: 'text',
|
|
148
|
+
},
|
|
21
149
|
table: {
|
|
150
|
+
subcategory: 'resultCardOptions',
|
|
151
|
+
defaultValue: {
|
|
152
|
+
summary: 'rating_count',
|
|
153
|
+
},
|
|
22
154
|
type: {
|
|
23
155
|
summary: 'string',
|
|
24
156
|
},
|
|
25
157
|
},
|
|
158
|
+
},
|
|
159
|
+
'resultCardOptions.resultCardRatingScoreKey': {
|
|
160
|
+
description: 'Key name for the rating score in the API response',
|
|
26
161
|
control: {
|
|
27
162
|
type: 'text',
|
|
28
163
|
},
|
|
164
|
+
table: {
|
|
165
|
+
subcategory: 'resultCardOptions',
|
|
166
|
+
defaultValue: {
|
|
167
|
+
summary: 'rating_score',
|
|
168
|
+
},
|
|
169
|
+
type: {
|
|
170
|
+
summary: 'string',
|
|
171
|
+
},
|
|
172
|
+
},
|
|
29
173
|
},
|
|
30
|
-
|
|
174
|
+
'resultCardOptions.renderResultCardPriceDetails': {
|
|
175
|
+
description: 'Callback function to render result card price details',
|
|
176
|
+
control: false,
|
|
177
|
+
table: {
|
|
178
|
+
subcategory: 'resultCardOptions',
|
|
179
|
+
defaultValue: {
|
|
180
|
+
summary: 'null',
|
|
181
|
+
},
|
|
182
|
+
type: {
|
|
183
|
+
summary: '(result) => JSX.Element',
|
|
184
|
+
detail: '(result: QuizResultDataPartial) => JSX.Element',
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
'resultsPageOptions.numResultsToDisplay': {
|
|
189
|
+
description: 'Number of results to display on the results page',
|
|
190
|
+
control: {
|
|
191
|
+
type: 'number',
|
|
192
|
+
},
|
|
193
|
+
table: {
|
|
194
|
+
subcategory: 'resultsPageOptions',
|
|
195
|
+
defaultValue: {
|
|
196
|
+
summary: 5,
|
|
197
|
+
},
|
|
198
|
+
type: {
|
|
199
|
+
summary: 'number',
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
'resultsPageOptions.favoriteItems': {
|
|
204
|
+
description: 'Array of favorite item IDs',
|
|
205
|
+
control: false,
|
|
206
|
+
table: {
|
|
207
|
+
subcategory: 'resultsPageOptions',
|
|
208
|
+
type: {
|
|
209
|
+
summary: 'string[]',
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
'resultsPageOptions.showShareResultsButton': {
|
|
214
|
+
description: 'Boolean for whether or not to show share results button on the results page',
|
|
215
|
+
control: {
|
|
216
|
+
type: 'boolean',
|
|
217
|
+
},
|
|
218
|
+
table: {
|
|
219
|
+
subcategory: 'resultCardOptions',
|
|
220
|
+
defaultValue: {
|
|
221
|
+
summary: true,
|
|
222
|
+
},
|
|
223
|
+
type: {
|
|
224
|
+
summary: 'boolean',
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
'sessionStateOptions.showSessionModal': {
|
|
229
|
+
description: 'Boolean for whether or not to show session modal to hydrate quiz on the results page',
|
|
230
|
+
control: {
|
|
231
|
+
type: 'boolean',
|
|
232
|
+
},
|
|
233
|
+
table: {
|
|
234
|
+
subcategory: 'sessionStateOptions',
|
|
235
|
+
defaultValue: {
|
|
236
|
+
summary: false,
|
|
237
|
+
},
|
|
238
|
+
type: {
|
|
239
|
+
summary: 'boolean',
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
'sessionStateOptions.showSessionModalOnResults': {
|
|
244
|
+
description: 'Boolean for whether or not to show session modal to hydrate quiz',
|
|
245
|
+
control: {
|
|
246
|
+
type: 'boolean',
|
|
247
|
+
},
|
|
248
|
+
table: {
|
|
249
|
+
subcategory: 'sessionStateOptions',
|
|
250
|
+
defaultValue: {
|
|
251
|
+
summary: false,
|
|
252
|
+
},
|
|
253
|
+
type: {
|
|
254
|
+
summary: 'boolean',
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
},
|
|
258
|
+
'sessionStateOptions.sessionStateKey': {
|
|
259
|
+
description: 'Key name where session storage state is saved',
|
|
31
260
|
control: {
|
|
32
261
|
type: 'text',
|
|
33
262
|
},
|
|
263
|
+
table: {
|
|
264
|
+
subcategory: 'sessionStateOptions',
|
|
265
|
+
defaultValue: {
|
|
266
|
+
summary: 'quizState',
|
|
267
|
+
},
|
|
268
|
+
type: {
|
|
269
|
+
summary: 'string',
|
|
270
|
+
},
|
|
271
|
+
},
|
|
34
272
|
},
|
|
273
|
+
enableHydration: {
|
|
274
|
+
description: 'Boolean for whether or not to hydrate quiz questions and results on page reload',
|
|
275
|
+
defaultValue: {
|
|
276
|
+
summary: 'true',
|
|
277
|
+
},
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
exports.docsControls = {
|
|
281
|
+
sort: 'requiredFirst',
|
|
282
|
+
exclude: ['sessionStateOptions', 'callbacks', 'resultsPageOptions', 'resultCardOptions'],
|
|
283
|
+
};
|
|
284
|
+
exports.storiesControls = {
|
|
285
|
+
include: ['apiKey', 'quizId', 'quizVersionId', 'primaryColor'],
|
|
35
286
|
};
|
package/lib/cjs/utils.js
CHANGED
|
@@ -57,6 +57,7 @@ exports.functionStrings = {
|
|
|
57
57
|
onQuizResultsLoaded: `(results) => console.dir(results)`,
|
|
58
58
|
onQuizNextQuestion: `(question) => console.dir(question)`,
|
|
59
59
|
onQuizSkipQuestion: `(question) => console.dir(question)`,
|
|
60
|
+
onEmailResults: `(data) => console.dir(data)`,
|
|
60
61
|
cioJsClient: `cioJsClient`,
|
|
61
62
|
};
|
|
62
63
|
const stringifyWithDefaults = (obj) => {
|
package/lib/cjs/version.js
CHANGED
|
@@ -20,4 +20,5 @@ export var QuizAPIActionTypes;
|
|
|
20
20
|
QuizAPIActionTypes[QuizAPIActionTypes["SET_QUIZ_RESULTS"] = 2] = "SET_QUIZ_RESULTS";
|
|
21
21
|
QuizAPIActionTypes[QuizAPIActionTypes["SET_CURRENT_QUESTION"] = 3] = "SET_CURRENT_QUESTION";
|
|
22
22
|
QuizAPIActionTypes[QuizAPIActionTypes["RESET_QUIZ"] = 4] = "RESET_QUIZ";
|
|
23
|
+
QuizAPIActionTypes[QuizAPIActionTypes["SET_QUIZ_SHARED_RESULTS"] = 5] = "SET_QUIZ_SHARED_RESULTS";
|
|
23
24
|
})(QuizAPIActionTypes || (QuizAPIActionTypes = {}));
|
|
@@ -7,12 +7,14 @@ import { RequestStates } from '../../constants';
|
|
|
7
7
|
import Spinner from '../Spinner/Spinner';
|
|
8
8
|
import useQuiz from '../../hooks/useQuiz';
|
|
9
9
|
import SessionPromptModal from '../SessionPromptModal/SessionPromptModal';
|
|
10
|
+
import ShareResultsModal from '../ShareResultsModal/ShareResultsModal';
|
|
10
11
|
import { convertPrimaryColorsToString, renderImages } from '../../utils';
|
|
11
12
|
import ProgressBar from '../ProgressBar/ProgressBar';
|
|
12
13
|
export default function CioQuiz(props) {
|
|
13
|
-
const { cioClient, state, events: { hydrateQuiz, resetSessionStorageState }, getAddToCartButtonProps, getAddToFavoritesButtonProps, getCoverQuestionProps, getHydrateQuizButtonProps, getNextQuestionButtonProps, getSkipQuestionButtonProps, getOpenTextInputProps, getPreviousQuestionButtonProps, getQuizImageProps, getQuizResultButtonProps, getQuizResultLinkProps, getResetQuizButtonProps, getSelectInputProps, primaryColorStyles, } = useQuiz(props);
|
|
14
|
+
const { cioClient, state, events: { hydrateQuiz, resetSessionStorageState }, getAddToCartButtonProps, getAddToFavoritesButtonProps, getCoverQuestionProps, getHydrateQuizButtonProps, getNextQuestionButtonProps, getSkipQuestionButtonProps, getOpenTextInputProps, getPreviousQuestionButtonProps, getQuizImageProps, getQuizResultButtonProps, getQuizResultLinkProps, getResetQuizButtonProps, getSelectInputProps, primaryColorStyles, getShareResultsButtonProps, } = useQuiz(props);
|
|
14
15
|
const [showSessionPrompt, setShowSessionPrompt] = useState(false);
|
|
15
|
-
const
|
|
16
|
+
const [showShareModal, setShowShareModal] = useState(false);
|
|
17
|
+
const { callbacks, sessionStateOptions, questionsPageOptions, resultCardOptions, resultsPageOptions, } = props;
|
|
16
18
|
const { quizSessionStorageState: { hasSessionStorageState, skipToResults }, } = state;
|
|
17
19
|
useEffect(() => {
|
|
18
20
|
// Respect showSessionModal if defined, else default to true.
|
|
@@ -39,9 +41,10 @@ export default function CioQuiz(props) {
|
|
|
39
41
|
getQuizResultButtonProps,
|
|
40
42
|
getQuizResultLinkProps,
|
|
41
43
|
getResetQuizButtonProps,
|
|
44
|
+
getShareResultsButtonProps,
|
|
42
45
|
getSelectInputProps,
|
|
43
|
-
customClickItemCallback: !!
|
|
44
|
-
customAddToFavoritesCallback: !!
|
|
46
|
+
customClickItemCallback: !!callbacks?.onQuizResultClick,
|
|
47
|
+
customAddToFavoritesCallback: !!callbacks?.onAddToFavoritesClick,
|
|
45
48
|
primaryColorStyles,
|
|
46
49
|
};
|
|
47
50
|
if (state.quiz.requestState === RequestStates.Loading) {
|
|
@@ -53,13 +56,14 @@ export default function CioQuiz(props) {
|
|
|
53
56
|
const questionImages = questionData?.images;
|
|
54
57
|
const displayBackgroundImage = (questionType === 'single' || questionType === 'multiple') && questionImages;
|
|
55
58
|
if (state.quiz.requestState === RequestStates.Success) {
|
|
56
|
-
return (React.createElement("div", { className: 'cio-quiz' },
|
|
59
|
+
return (React.createElement("div", { className: 'cio-quiz', style: { overflow: showShareModal || showSessionPrompt ? 'hidden' : undefined } },
|
|
57
60
|
displayBackgroundImage && renderImages(questionImages, 'cio-question-background-image'),
|
|
58
61
|
React.createElement("style", null,
|
|
59
62
|
".cio-quiz ",
|
|
60
63
|
convertPrimaryColorsToString(primaryColorStyles)),
|
|
61
64
|
React.createElement(SessionPromptModal, { resetStoredState: resetSessionStorageState, continueSession: hydrateQuiz, showSessionPrompt: showSessionPrompt, setShowSessionPrompt: setShowSessionPrompt }),
|
|
62
|
-
|
|
65
|
+
state.quiz && showShareModal && (React.createElement(ShareResultsModal, { onClose: () => setShowShareModal(false), quizState: state.quiz, onEmailResults: callbacks?.onEmailResults })),
|
|
66
|
+
React.createElement(QuizContext.Provider, { value: contextValue }, state.quiz.results || skipToResults ? (React.createElement(ResultContainer, { resultCardOptions: resultCardOptions, onShare: () => setShowShareModal(true), resultsPageOptions: resultsPageOptions })) : (state.quiz.currentQuestion && (React.createElement(React.Fragment, null,
|
|
63
67
|
React.createElement(ProgressBar, null),
|
|
64
68
|
React.createElement(QuizQuestions, null),
|
|
65
69
|
React.createElement(ControlBar, { skipQuestionButtonText: questionsPageOptions?.skipQuestionButtonText, ctaButtonText: questionData?.cta_text || undefined })))))));
|
|
@@ -54,6 +54,15 @@ export default function apiReducer(state, action) {
|
|
|
54
54
|
selectedOptionsWithAttributes,
|
|
55
55
|
};
|
|
56
56
|
}
|
|
57
|
+
case QuizAPIActionTypes.SET_QUIZ_SHARED_RESULTS: {
|
|
58
|
+
return {
|
|
59
|
+
...state,
|
|
60
|
+
quizRequestState: RequestStates.Success,
|
|
61
|
+
quizResults: action.payload?.quizResults,
|
|
62
|
+
quizCurrentQuestion: undefined,
|
|
63
|
+
selectedOptionsWithAttributes: action.payload?.quizResults.attributes,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
57
66
|
case QuizAPIActionTypes.RESET_QUIZ:
|
|
58
67
|
return initialState;
|
|
59
68
|
default:
|
|
@@ -1,31 +1,37 @@
|
|
|
1
1
|
import React, { useContext } from 'react';
|
|
2
2
|
import RedoButton from '../RedoButton/RedoButton';
|
|
3
|
+
import ShareButton from '../ShareButton/ShareButton';
|
|
3
4
|
import QuizContext from '../CioQuiz/context';
|
|
4
5
|
import ResultFilters from '../ResultFilters/ResultFilters';
|
|
5
6
|
import ZeroResults from '../ZeroResults/ZeroResults';
|
|
6
7
|
import Results from '../Results/Results';
|
|
7
8
|
import Spinner from '../Spinner/Spinner';
|
|
8
9
|
export default function ResultContainer(props) {
|
|
9
|
-
const {
|
|
10
|
-
const { resultCardSalePriceKey, resultCardRegularPriceKey, resultCardRatingCountKey, resultCardRatingScoreKey, renderResultCardPriceDetails, } = options;
|
|
10
|
+
const { resultCardOptions, onShare, resultsPageOptions } = props;
|
|
11
11
|
const { state } = useContext(QuizContext);
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
if (resultCardOptions) {
|
|
13
|
+
const { resultCardSalePriceKey, resultCardRegularPriceKey, resultCardRatingCountKey, resultCardRatingScoreKey, renderResultCardPriceDetails, } = resultCardOptions;
|
|
14
|
+
const numberOfResults = state?.quiz.results?.response?.results?.length;
|
|
15
|
+
const zeroResults = !numberOfResults;
|
|
16
|
+
const resultsTitle = zeroResults ? '' : 'Here are your results';
|
|
17
|
+
if (state?.quiz.results) {
|
|
18
|
+
return (React.createElement("div", { className: 'cio-results-container' },
|
|
19
|
+
React.createElement("h1", { className: 'cio-results-title' }, resultsTitle),
|
|
20
|
+
React.createElement("div", { className: 'cio-results-filter-and-redo-container cio-results-button-group' },
|
|
21
|
+
React.createElement(ResultFilters, { hasNoResults: zeroResults }),
|
|
22
|
+
React.createElement("div", { className: 'cio-results-redo-and-share-button-group' },
|
|
23
|
+
React.createElement(RedoButton, null),
|
|
24
|
+
resultsPageOptions?.showShareResultsButton && React.createElement(ShareButton, { onClick: onShare }))),
|
|
25
|
+
!zeroResults && (React.createElement(React.Fragment, null,
|
|
26
|
+
React.createElement("div", { className: 'cio-results-num-results' },
|
|
27
|
+
numberOfResults,
|
|
28
|
+
" ",
|
|
29
|
+
numberOfResults === 1 ? 'result' : 'results'),
|
|
30
|
+
React.createElement(Results, { resultCardSalePriceKey: resultCardSalePriceKey, resultCardRegularPriceKey: resultCardRegularPriceKey, resultCardRatingCountKey: resultCardRatingCountKey, resultCardRatingScoreKey: resultCardRatingScoreKey, renderResultCardPriceDetails: renderResultCardPriceDetails }))),
|
|
31
|
+
zeroResults && React.createElement(ZeroResults, null)));
|
|
32
|
+
}
|
|
16
33
|
return (React.createElement("div", { className: 'cio-results-container' },
|
|
17
|
-
React.createElement(
|
|
18
|
-
React.createElement("div", { className: 'cio-results-filter-and-redo-container' },
|
|
19
|
-
React.createElement(ResultFilters, { hasNoResults: zeroResults }),
|
|
20
|
-
React.createElement(RedoButton, null)),
|
|
21
|
-
!zeroResults && (React.createElement(React.Fragment, null,
|
|
22
|
-
React.createElement("div", { className: 'cio-results-num-results' },
|
|
23
|
-
numberOfResults,
|
|
24
|
-
" ",
|
|
25
|
-
numberOfResults === 1 ? 'result' : 'results'),
|
|
26
|
-
React.createElement(Results, { resultCardSalePriceKey: resultCardSalePriceKey, resultCardRegularPriceKey: resultCardRegularPriceKey, resultCardRatingCountKey: resultCardRatingCountKey, resultCardRatingScoreKey: resultCardRatingScoreKey, renderResultCardPriceDetails: renderResultCardPriceDetails }))),
|
|
27
|
-
zeroResults && React.createElement(ZeroResults, null)));
|
|
34
|
+
React.createElement(Spinner, null)));
|
|
28
35
|
}
|
|
29
|
-
return
|
|
30
|
-
React.createElement(Spinner, null)));
|
|
36
|
+
return null;
|
|
31
37
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React, { useContext } from 'react';
|
|
2
|
+
import ShareSVG from './ShareSVG';
|
|
3
|
+
import QuizContext from '../CioQuiz/context';
|
|
4
|
+
function ShareButton(props) {
|
|
5
|
+
const { shareText = 'Share Results', disabled, onClick, ...rest } = props;
|
|
6
|
+
const { getShareResultsButtonProps } = useContext(QuizContext);
|
|
7
|
+
if (getShareResultsButtonProps) {
|
|
8
|
+
return (React.createElement("button", { ...rest, ...getShareResultsButtonProps(), type: 'button', onClick: onClick },
|
|
9
|
+
React.createElement(ShareSVG, null),
|
|
10
|
+
React.createElement("span", null, shareText)));
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
export default ShareButton;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export default function ShareSVG() {
|
|
3
|
+
return (React.createElement("svg", { width: '16', height: '16', viewBox: '0 0 16 16', fill: 'none', xmlns: 'http://www.w3.org/2000/svg' },
|
|
4
|
+
React.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' }),
|
|
5
|
+
React.createElement("path", { d: 'M10.5026 4.00116L8.00201 1.50061L5.50146 4.00116', stroke: '#101010', strokeWidth: '1.33', strokeLinecap: 'round', strokeLinejoin: 'round' }),
|
|
6
|
+
React.createElement("path", { d: 'M8.00146 10.0337V1.50061', stroke: '#101010', strokeWidth: '1.33', strokeLinecap: 'round', strokeLinejoin: 'round' })));
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export default function AlertCircleSVG() {
|
|
3
|
+
return (React.createElement("svg", { width: '24', height: '24', viewBox: '0 0 24 24', fill: 'none', xmlns: 'http://www.w3.org/2000/svg' },
|
|
4
|
+
React.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' }),
|
|
5
|
+
React.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' }),
|
|
6
|
+
React.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' })));
|
|
7
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export default function CheckMarkCircleSVG() {
|
|
3
|
+
return (React.createElement("svg", { width: '24', height: '24', viewBox: '0 0 24 24', fill: 'none', xmlns: 'http://www.w3.org/2000/svg' },
|
|
4
|
+
React.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' }),
|
|
5
|
+
React.createElement("path", { d: 'M16.5005 8.24963L10.2005 15.7496L7.50049 12.7496', stroke: '#101010', strokeWidth: '1.33', strokeLinecap: 'round', strokeLinejoin: 'round' })));
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export default function CloseSVG() {
|
|
3
|
+
return (React.createElement("svg", { width: '24', height: '24', viewBox: '0 0 24 24', fill: 'none', xmlns: 'http://www.w3.org/2000/svg' },
|
|
4
|
+
React.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' }),
|
|
5
|
+
React.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' })));
|
|
6
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import CheckMarkCircleSVG from './CheckMarkCircleSVG';
|
|
3
|
+
import AlertCircleSVG from './AlertCircleSVG';
|
|
4
|
+
export default function EmailField({ onSubmit }) {
|
|
5
|
+
const [formError, setFormError] = useState(null);
|
|
6
|
+
const [isSubmitted, setIsSubmitted] = useState(false);
|
|
7
|
+
const [email, setEmail] = useState('');
|
|
8
|
+
const validate = () => {
|
|
9
|
+
if (email.length > 0 && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
|
|
10
|
+
setFormError(null);
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
setFormError({ type: 'validate', message: 'Please enter a valid email address' });
|
|
14
|
+
return false;
|
|
15
|
+
};
|
|
16
|
+
const handleSubmit = async (e) => {
|
|
17
|
+
e.preventDefault();
|
|
18
|
+
const isValid = validate();
|
|
19
|
+
if (!isValid)
|
|
20
|
+
return;
|
|
21
|
+
try {
|
|
22
|
+
await onSubmit(email);
|
|
23
|
+
setIsSubmitted(true);
|
|
24
|
+
}
|
|
25
|
+
catch (_e) {
|
|
26
|
+
setFormError({
|
|
27
|
+
type: 'callback',
|
|
28
|
+
message: 'Sorry, there was an error sending. Please try again.',
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
return (React.createElement("div", { className: 'cio-share-results-feature-group' },
|
|
33
|
+
React.createElement("form", { onSubmit: handleSubmit },
|
|
34
|
+
React.createElement("div", { className: 'cio-share-results-description' }, "Share by email"),
|
|
35
|
+
React.createElement("div", { className: 'cio-share-results-button-group' },
|
|
36
|
+
React.createElement("div", { className: 'cio-share-results-email-input-group' },
|
|
37
|
+
React.createElement("input", { className: `cio-share-results-email-input ${formError ? 'cio-share-results-email-input--error' : ''}`, onChange: (e) => setEmail(e.target.value) }),
|
|
38
|
+
formError?.type === 'validate' && (React.createElement("div", { className: 'cio-share-results-email-input-error-message' }, formError.message))),
|
|
39
|
+
React.createElement("button", { className: 'cio-share-results-share-button', type: 'submit' }, "Send"))),
|
|
40
|
+
isSubmitted && (React.createElement("div", { className: 'cio-share-results-notification' },
|
|
41
|
+
React.createElement(CheckMarkCircleSVG, null),
|
|
42
|
+
React.createElement("div", null, "Email sent"))),
|
|
43
|
+
formError?.type === 'callback' && (React.createElement("div", { className: 'cio-share-results-notification' },
|
|
44
|
+
React.createElement(AlertCircleSVG, null),
|
|
45
|
+
React.createElement("div", null, formError.message)))));
|
|
46
|
+
}
|