@constructor-io/constructorio-ui-quizzes 1.7.3 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constructorio-ui-quizzes-bundled.js +13 -13
- package/lib/cjs/components/CioQuiz/index.js +5 -8
- package/lib/cjs/components/CioQuiz/quizApiReducer.js +5 -5
- package/lib/cjs/components/CioQuiz/quizLocalReducer.js +7 -4
- package/lib/cjs/components/ProgressBar/ProgressBar.js +1 -1
- package/lib/cjs/components/SelectTypeQuestion/SelectTypeQuestion.js +2 -2
- package/lib/cjs/hooks/usePropsGetters/useNextQuestionButtonProps.js +5 -5
- package/lib/cjs/hooks/useQuiz.js +9 -2
- package/lib/cjs/hooks/useQuizEvents/index.js +4 -5
- package/lib/cjs/hooks/useQuizEvents/useHydrateQuizLocalState.js +5 -5
- package/lib/cjs/hooks/useQuizEvents/useQuizAnswerChangeHandler.js +38 -36
- package/lib/cjs/hooks/useQuizState/index.js +10 -5
- package/lib/cjs/hooks/useQuizState/useQuizApiState.js +31 -24
- package/lib/cjs/hooks/useQuizState/useQuizLocalState.js +1 -17
- package/lib/cjs/hooks/useQuizState/useSessionStorageState.js +26 -0
- package/lib/cjs/stories/Quiz/tests/mocks.js +5 -1
- package/lib/mjs/components/CioQuiz/index.js +5 -8
- package/lib/mjs/components/CioQuiz/quizApiReducer.js +1 -1
- package/lib/mjs/components/CioQuiz/quizLocalReducer.js +6 -3
- package/lib/mjs/components/ProgressBar/ProgressBar.js +1 -1
- package/lib/mjs/components/SelectTypeQuestion/SelectTypeQuestion.js +2 -2
- package/lib/mjs/hooks/usePropsGetters/useNextQuestionButtonProps.js +1 -1
- package/lib/mjs/hooks/useQuiz.js +9 -2
- package/lib/mjs/hooks/useQuizEvents/index.js +4 -5
- package/lib/mjs/hooks/useQuizEvents/useHydrateQuizLocalState.js +5 -5
- package/lib/mjs/hooks/useQuizEvents/useQuizAnswerChangeHandler.js +37 -35
- package/lib/mjs/hooks/useQuizState/index.js +10 -5
- package/lib/mjs/hooks/useQuizState/useQuizApiState.js +31 -24
- package/lib/mjs/hooks/useQuizState/useQuizLocalState.js +3 -17
- package/lib/mjs/hooks/useQuizState/useSessionStorageState.js +22 -0
- package/lib/mjs/stories/Quiz/tests/mocks.js +6 -2
- package/lib/types/components/CioQuiz/quizLocalReducer.d.ts +1 -0
- package/lib/types/hooks/usePropsGetters/useCoverQuestionProps.d.ts +2 -1
- package/lib/types/hooks/usePropsGetters/useOpenTextInputProps.d.ts +2 -1
- package/lib/types/hooks/usePropsGetters/useSelectInputProps.d.ts +2 -1
- package/lib/types/hooks/useQuizEvents/useHydrateQuizLocalState.d.ts +1 -1
- package/lib/types/hooks/useQuizState/index.d.ts +2 -4
- package/lib/types/hooks/useQuizState/useQuizLocalState.d.ts +1 -5
- package/lib/types/hooks/useQuizState/useSessionStorageState.d.ts +8 -0
- package/lib/types/types.d.ts +7 -3
- package/package.json +1 -1
package/lib/mjs/hooks/useQuiz.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
1
2
|
import useCioClient from './useCioClient';
|
|
2
3
|
import useConsoleErrors from './useConsoleErrors';
|
|
3
4
|
import usePropsGetters from './usePropsGetters';
|
|
@@ -15,9 +16,15 @@ const useQuiz = (quizOptions) => {
|
|
|
15
16
|
// Quiz callback events
|
|
16
17
|
const quizEvents = useQuizEvents(quizOptions, cioClient, quizState);
|
|
17
18
|
// Props getters
|
|
18
|
-
const { quizApiState, quizLocalState,
|
|
19
|
+
const { quizApiState, quizLocalState, quizSessionStorageState } = quizState;
|
|
20
|
+
const { skipToResults } = quizSessionStorageState;
|
|
19
21
|
const propGetters = usePropsGetters(quizEvents, quizApiState, quizLocalState);
|
|
20
22
|
const primaryColorStyles = usePrimaryColorStyles(primaryColor);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (skipToResults)
|
|
25
|
+
quizEvents.hydrateQuiz();
|
|
26
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
27
|
+
}, []);
|
|
21
28
|
return {
|
|
22
29
|
cioClient,
|
|
23
30
|
state: {
|
|
@@ -29,11 +36,11 @@ const useQuiz = (quizOptions) => {
|
|
|
29
36
|
requestState: quizApiState.quizRequestState,
|
|
30
37
|
versionId: quizLocalState.quizVersionId,
|
|
31
38
|
sessionId: quizLocalState.quizSessionId,
|
|
32
|
-
skipToResults,
|
|
33
39
|
currentQuestion: quizApiState.quizCurrentQuestion,
|
|
34
40
|
results: quizApiState.quizResults,
|
|
35
41
|
selectedOptionsWithAttributes: quizApiState.selectedOptionsWithAttributes,
|
|
36
42
|
},
|
|
43
|
+
quizSessionStorageState,
|
|
37
44
|
},
|
|
38
45
|
events: {
|
|
39
46
|
...quizEvents,
|
|
@@ -9,7 +9,7 @@ import useHydrateQuizLocalState from './useHydrateQuizLocalState';
|
|
|
9
9
|
import { resetQuizSessionStorageState } from '../../utils';
|
|
10
10
|
import useQuizAddToFavorites from './useQuizAddToFavorites';
|
|
11
11
|
const useQuizEvents = (quizOptions, cioClient, quizState) => {
|
|
12
|
-
const { quizApiState, dispatchLocalState, dispatchApiState,
|
|
12
|
+
const { quizApiState, dispatchLocalState, dispatchApiState, quizLocalState, quizSessionStorageState, } = quizState;
|
|
13
13
|
const { resultsPageOptions, callbacks } = quizOptions;
|
|
14
14
|
const { onAddToCartClick, onQuizResultClick, onQuizResultsLoaded, onAddToFavoritesClick } = resultsPageOptions;
|
|
15
15
|
// Quiz answer change
|
|
@@ -26,9 +26,9 @@ const useQuizEvents = (quizOptions, cioClient, quizState) => {
|
|
|
26
26
|
// Quiz results loaded event
|
|
27
27
|
useQuizResultsLoaded(cioClient, quizApiState, onQuizResultsLoaded);
|
|
28
28
|
// Quiz reset
|
|
29
|
-
const resetQuiz = useQuizResetClick(resetQuizSessionStorageState(
|
|
29
|
+
const resetQuiz = useQuizResetClick(resetQuizSessionStorageState(quizSessionStorageState.key), dispatchLocalState, dispatchApiState, quizApiState.quizResults);
|
|
30
30
|
// Quiz rehydrate
|
|
31
|
-
const hydrateQuizLocalState = useHydrateQuizLocalState(
|
|
31
|
+
const hydrateQuizLocalState = useHydrateQuizLocalState(quizSessionStorageState.key, dispatchLocalState);
|
|
32
32
|
return {
|
|
33
33
|
addToCart,
|
|
34
34
|
addToFavorites,
|
|
@@ -38,8 +38,7 @@ const useQuizEvents = (quizOptions, cioClient, quizState) => {
|
|
|
38
38
|
nextQuestion,
|
|
39
39
|
resetQuiz,
|
|
40
40
|
hydrateQuiz: hydrateQuizLocalState,
|
|
41
|
-
|
|
42
|
-
resetSessionStorageState: resetQuizSessionStorageState(quizStateKey),
|
|
41
|
+
resetSessionStorageState: resetQuizSessionStorageState(quizSessionStorageState.key),
|
|
43
42
|
};
|
|
44
43
|
};
|
|
45
44
|
export default useQuizEvents;
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { useCallback } from 'react';
|
|
2
2
|
import { QuestionTypes } from '../../components/CioQuiz/actions';
|
|
3
3
|
import { getStateFromSessionStorage } from '../../utils';
|
|
4
|
-
const useHydrateQuizLocalState = (
|
|
5
|
-
const
|
|
4
|
+
const useHydrateQuizLocalState = (quizSessionStorageStateKey, dispatchLocalState) => {
|
|
5
|
+
const sessionStorageQuizState = getStateFromSessionStorage(quizSessionStorageStateKey);
|
|
6
6
|
const hydrateQuizLocalStateHandler = useCallback(() => {
|
|
7
|
-
if (
|
|
7
|
+
if (sessionStorageQuizState) {
|
|
8
8
|
dispatchLocalState({
|
|
9
9
|
type: QuestionTypes.Hydrate,
|
|
10
|
-
payload:
|
|
10
|
+
payload: sessionStorageQuizState,
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
|
-
}, [dispatchLocalState,
|
|
13
|
+
}, [dispatchLocalState, sessionStorageQuizState]);
|
|
14
14
|
return hydrateQuizLocalStateHandler;
|
|
15
15
|
};
|
|
16
16
|
export default useHydrateQuizLocalState;
|
|
@@ -2,42 +2,44 @@ import { useCallback } from 'react';
|
|
|
2
2
|
import { QuestionTypes } from '../../components/CioQuiz/actions';
|
|
3
3
|
const useQuizAnswerChangeHandler = (quizApiState, dispatchLocalState) => {
|
|
4
4
|
const quizAnswerChangedHandler = useCallback((payload) => {
|
|
5
|
-
const questionType = quizApiState.quizCurrentQuestion?.next_question
|
|
5
|
+
const questionType = quizApiState.quizCurrentQuestion?.next_question?.type;
|
|
6
6
|
const currentQuestion = quizApiState.quizCurrentQuestion;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
7
|
+
if (currentQuestion?.next_question) {
|
|
8
|
+
switch (questionType) {
|
|
9
|
+
case QuestionTypes.Cover:
|
|
10
|
+
dispatchLocalState({
|
|
11
|
+
type: QuestionTypes.Cover,
|
|
12
|
+
payload: {
|
|
13
|
+
questionId: currentQuestion.next_question.id,
|
|
14
|
+
input: '',
|
|
15
|
+
isLastQuestion: currentQuestion.is_last_question,
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
break;
|
|
19
|
+
case QuestionTypes.OpenText:
|
|
20
|
+
dispatchLocalState({
|
|
21
|
+
type: QuestionTypes.OpenText,
|
|
22
|
+
payload: {
|
|
23
|
+
questionId: currentQuestion.next_question.id,
|
|
24
|
+
input: payload,
|
|
25
|
+
isLastQuestion: currentQuestion.is_last_question,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
break;
|
|
29
|
+
case QuestionTypes.SingleSelect:
|
|
30
|
+
case QuestionTypes.MultipleSelect:
|
|
31
|
+
dispatchLocalState({
|
|
32
|
+
type: currentQuestion.next_question.type,
|
|
33
|
+
payload: {
|
|
34
|
+
questionId: currentQuestion.next_question.id,
|
|
35
|
+
input: payload,
|
|
36
|
+
isLastQuestion: currentQuestion.is_last_question,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
break;
|
|
40
|
+
default:
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
41
43
|
}
|
|
42
44
|
}, [quizApiState, dispatchLocalState]);
|
|
43
45
|
return quizAnswerChangedHandler;
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import useQuizApiState from './useQuizApiState';
|
|
2
2
|
import useQuizLocalState from './useQuizLocalState';
|
|
3
|
+
import useSessionStorageState from './useSessionStorageState';
|
|
3
4
|
const useQuizState = (quizOptions, cioClient) => {
|
|
4
|
-
const { sessionStateOptions } = quizOptions;
|
|
5
|
+
const { sessionStateOptions, enableHydration } = quizOptions;
|
|
5
6
|
// Quiz Local state
|
|
6
|
-
const { quizLocalState, dispatchLocalState
|
|
7
|
+
const { quizLocalState, dispatchLocalState } = useQuizLocalState();
|
|
8
|
+
// Quiz Session Storage state
|
|
9
|
+
const { skipToResults, quizSessionStorageStateKey, hasSessionStorageState } = useSessionStorageState(quizLocalState, sessionStateOptions, enableHydration === undefined ? true : enableHydration);
|
|
7
10
|
// Quiz API state
|
|
8
11
|
const { quizApiState, dispatchApiState } = useQuizApiState(quizOptions, cioClient, quizLocalState, skipToResults, dispatchLocalState);
|
|
9
12
|
return {
|
|
@@ -11,9 +14,11 @@ const useQuizState = (quizOptions, cioClient) => {
|
|
|
11
14
|
quizLocalState,
|
|
12
15
|
dispatchApiState,
|
|
13
16
|
dispatchLocalState,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
quizSessionStorageState: {
|
|
18
|
+
skipToResults,
|
|
19
|
+
key: quizSessionStorageStateKey,
|
|
20
|
+
hasSessionStorageState,
|
|
21
|
+
},
|
|
17
22
|
};
|
|
18
23
|
};
|
|
19
24
|
export default useQuizState;
|
|
@@ -7,36 +7,39 @@ const useQuizApiState = (quizOptions, cioClient, quizLocalState, skipToResults,
|
|
|
7
7
|
) => {
|
|
8
8
|
const [quizApiState, dispatchApiState] = useReducer(apiReducer, initialState);
|
|
9
9
|
const { quizId, quizVersionId: quizVersionIdProp, resultsPageOptions } = quizOptions;
|
|
10
|
+
const dispatchQuizResults = async () => {
|
|
11
|
+
try {
|
|
12
|
+
const quizResults = await getQuizResults(cioClient, quizId, {
|
|
13
|
+
answers: quizLocalState.answers,
|
|
14
|
+
resultsPerPage: resultsPageOptions?.numResultsToDisplay,
|
|
15
|
+
quizVersionId: quizLocalState.quizVersionId,
|
|
16
|
+
quizSessionId: quizLocalState.quizSessionId,
|
|
17
|
+
});
|
|
18
|
+
// Set quiz results state
|
|
19
|
+
dispatchApiState({
|
|
20
|
+
type: QuizAPIActionTypes.SET_QUIZ_RESULTS,
|
|
21
|
+
payload: {
|
|
22
|
+
quizResults,
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
if (!quizLocalState.isQuizCompleted)
|
|
26
|
+
dispatchLocalState({
|
|
27
|
+
type: QuestionTypes.Complete,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
dispatchApiState({
|
|
32
|
+
type: QuizAPIActionTypes.SET_IS_ERROR,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
};
|
|
10
36
|
useEffect(() => {
|
|
11
37
|
(async () => {
|
|
12
38
|
dispatchApiState({
|
|
13
39
|
type: QuizAPIActionTypes.SET_IS_LOADING,
|
|
14
40
|
});
|
|
15
41
|
if (quizLocalState.isLastAnswer || skipToResults) {
|
|
16
|
-
|
|
17
|
-
const quizResults = await getQuizResults(cioClient, quizId, {
|
|
18
|
-
answers: quizLocalState.answers,
|
|
19
|
-
resultsPerPage: resultsPageOptions?.numResultsToDisplay,
|
|
20
|
-
quizVersionId: quizLocalState.quizVersionId,
|
|
21
|
-
quizSessionId: quizLocalState.quizSessionId,
|
|
22
|
-
});
|
|
23
|
-
// Set quiz results state
|
|
24
|
-
dispatchApiState({
|
|
25
|
-
type: QuizAPIActionTypes.SET_QUIZ_RESULTS,
|
|
26
|
-
payload: {
|
|
27
|
-
quizResults,
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
if (!quizLocalState.isQuizCompleted)
|
|
31
|
-
dispatchLocalState({
|
|
32
|
-
type: QuestionTypes.Complete,
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
catch (error) {
|
|
36
|
-
dispatchApiState({
|
|
37
|
-
type: QuizAPIActionTypes.SET_IS_ERROR,
|
|
38
|
-
});
|
|
39
|
-
}
|
|
42
|
+
await dispatchQuizResults();
|
|
40
43
|
}
|
|
41
44
|
else {
|
|
42
45
|
try {
|
|
@@ -47,6 +50,10 @@ const useQuizApiState = (quizOptions, cioClient, quizLocalState, skipToResults,
|
|
|
47
50
|
quizVersionId,
|
|
48
51
|
quizSessionId,
|
|
49
52
|
});
|
|
53
|
+
if (!questionResult.next_question) {
|
|
54
|
+
await dispatchQuizResults();
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
50
57
|
// Update quizSessionId, quizVersionId
|
|
51
58
|
if ((!quizSessionId && questionResult?.quiz_session_id) ||
|
|
52
59
|
(!quizVersionId && questionResult.quiz_version_id)) {
|
|
@@ -1,29 +1,15 @@
|
|
|
1
|
-
import { useCallback,
|
|
1
|
+
import { useCallback, useReducer } from 'react';
|
|
2
2
|
import quizLocalReducer, { initialState } from '../../components/CioQuiz/quizLocalReducer';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
const useQuizLocalState = (sessionStateOptions) => {
|
|
3
|
+
import { logger } from '../../utils';
|
|
4
|
+
const useQuizLocalState = () => {
|
|
6
5
|
const [quizLocalState, dispatch] = useReducer(quizLocalReducer, initialState);
|
|
7
|
-
const quizStateKey = sessionStateOptions?.sessionStateKey || quizSessionStateKey;
|
|
8
|
-
useEffect(() => {
|
|
9
|
-
// don't save state if initial state
|
|
10
|
-
if (quizLocalState?.answers?.length) {
|
|
11
|
-
window?.sessionStorage?.setItem(quizStateKey, JSON.stringify(quizLocalState));
|
|
12
|
-
}
|
|
13
|
-
}, [quizLocalState, quizStateKey]);
|
|
14
|
-
const hasQuizStoredState = () => getStateFromSessionStorage(quizStateKey) !== null;
|
|
15
|
-
const skipToResults = !!getStateFromSessionStorage(quizStateKey)?.isQuizCompleted &&
|
|
16
|
-
!sessionStateOptions?.showSessionModalOnResults;
|
|
17
6
|
const dispatchLocalState = useCallback((action) => {
|
|
18
7
|
logger(action);
|
|
19
8
|
dispatch(action);
|
|
20
9
|
}, []);
|
|
21
10
|
return {
|
|
22
11
|
quizLocalState,
|
|
23
|
-
hasQuizStoredState,
|
|
24
12
|
dispatchLocalState,
|
|
25
|
-
skipToResults,
|
|
26
|
-
quizStateKey,
|
|
27
13
|
};
|
|
28
14
|
};
|
|
29
15
|
export default useQuizLocalState;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { getStateFromSessionStorage } from '../../utils';
|
|
3
|
+
import { quizSessionStateKey } from '../../constants';
|
|
4
|
+
const useSessionStorageState = (quizLocalState, sessionStateOptions, enableHydration) => {
|
|
5
|
+
const quizSessionStorageStateKey = sessionStateOptions?.sessionStateKey || quizSessionStateKey;
|
|
6
|
+
// Save state to session storage
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
// don't save state if initial state
|
|
9
|
+
if (enableHydration && quizLocalState?.answers?.length) {
|
|
10
|
+
window?.sessionStorage?.setItem(quizSessionStorageStateKey, JSON.stringify(quizLocalState));
|
|
11
|
+
}
|
|
12
|
+
}, [quizLocalState, quizSessionStorageStateKey, enableHydration]);
|
|
13
|
+
const skipToResults = !!enableHydration &&
|
|
14
|
+
!!getStateFromSessionStorage(quizSessionStorageStateKey)?.isQuizCompleted &&
|
|
15
|
+
!sessionStateOptions?.showSessionModalOnResults;
|
|
16
|
+
return {
|
|
17
|
+
skipToResults,
|
|
18
|
+
quizSessionStorageStateKey,
|
|
19
|
+
hasSessionStorageState: () => getStateFromSessionStorage(quizSessionStorageStateKey) !== null,
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
export default useSessionStorageState;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RequestStates } from '../../../constants';
|
|
1
|
+
import { quizSessionStateKey, RequestStates } from '../../../constants';
|
|
2
2
|
import useOpenTextInputProps from '../../../hooks/usePropsGetters/useOpenTextInputProps';
|
|
3
3
|
import useCoverQuestionProps from '../../../hooks/usePropsGetters/useCoverQuestionProps';
|
|
4
4
|
import useSelectInputProps from '../../../hooks/usePropsGetters/useSelectInputProps';
|
|
@@ -67,7 +67,6 @@ export const getMockState = (question) => ({
|
|
|
67
67
|
requestState: RequestStates.Success,
|
|
68
68
|
versionId: '',
|
|
69
69
|
sessionId: '',
|
|
70
|
-
skipToResults: false,
|
|
71
70
|
currentQuestion: {
|
|
72
71
|
next_question: question,
|
|
73
72
|
isFirstQuestion: false,
|
|
@@ -133,6 +132,11 @@ export const getMockState = (question) => ({
|
|
|
133
132
|
},
|
|
134
133
|
selectedOptionsWithAttributes: ['Chocolate', 'Medium'],
|
|
135
134
|
},
|
|
135
|
+
quizSessionStorageState: {
|
|
136
|
+
key: quizSessionStateKey,
|
|
137
|
+
skipToResults: true,
|
|
138
|
+
hasSessionStorageState: () => true,
|
|
139
|
+
},
|
|
136
140
|
});
|
|
137
141
|
const mockElementProps = {
|
|
138
142
|
className: '',
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
+
import { Nullable } from '@constructor-io/constructorio-client-javascript/lib/types';
|
|
1
2
|
import { GetCoverQuestionProps, Question, QuizEventsReturn } from '../../types';
|
|
2
|
-
export default function useCoverQuestionProps(setQuizAnswers: QuizEventsReturn.QuizAnswerChanged, currentQuestionData?: Question): GetCoverQuestionProps;
|
|
3
|
+
export default function useCoverQuestionProps(setQuizAnswers: QuizEventsReturn.QuizAnswerChanged, currentQuestionData?: Nullable<Question>): GetCoverQuestionProps;
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
+
import { Nullable } from '@constructor-io/constructorio-client-javascript/lib/types';
|
|
1
2
|
import { AnswerInputState, GetOpenTextInputProps, Question, QuizEventsReturn } from '../../types';
|
|
2
|
-
export default function useOpenTextInputProps(setQuizAnswers: QuizEventsReturn.QuizAnswerChanged, nextQuestion: QuizEventsReturn.NextQuestion, currentQuestionData?: Question
|
|
3
|
+
export default function useOpenTextInputProps(setQuizAnswers: QuizEventsReturn.QuizAnswerChanged, nextQuestion: QuizEventsReturn.NextQuestion, currentQuestionData?: Nullable<Question>, answerInputs?: AnswerInputState): GetOpenTextInputProps;
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
+
import { Nullable } from '@constructor-io/constructorio-client-javascript/lib/types';
|
|
1
2
|
import { AnswerInputState, GetSelectInputProps, Question, QuizEventsReturn } from '../../types';
|
|
2
|
-
export default function useSelectInputProps(quizAnswerChanged: QuizEventsReturn.QuizAnswerChanged, nextQuestion: QuizEventsReturn.NextQuestion, currentQuestionData?: Question
|
|
3
|
+
export default function useSelectInputProps(quizAnswerChanged: QuizEventsReturn.QuizAnswerChanged, nextQuestion: QuizEventsReturn.NextQuestion, currentQuestionData?: Nullable<Question>, answerInputs?: AnswerInputState): GetSelectInputProps;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { ActionAnswerQuestion } from '../../components/CioQuiz/actions';
|
|
2
2
|
import { QuizEventsReturn } from '../../types';
|
|
3
|
-
declare const useHydrateQuizLocalState: (
|
|
3
|
+
declare const useHydrateQuizLocalState: (quizSessionStorageStateKey: string, dispatchLocalState: React.Dispatch<ActionAnswerQuestion>) => QuizEventsReturn.NextQuestion;
|
|
4
4
|
export default useHydrateQuizLocalState;
|
|
@@ -3,15 +3,13 @@ import ConstructorIOClient from '@constructor-io/constructorio-client-javascript
|
|
|
3
3
|
import { ActionAnswerQuestion, ActionQuizAPI } from '../../components/CioQuiz/actions';
|
|
4
4
|
import { QuizAPIReducerState } from '../../components/CioQuiz/quizApiReducer';
|
|
5
5
|
import { QuizLocalReducerState } from '../../components/CioQuiz/quizLocalReducer';
|
|
6
|
-
import { IQuizProps } from '../../types';
|
|
6
|
+
import { IQuizProps, QuizSessionStorageState } from '../../types';
|
|
7
7
|
type UseQuizState = (quizOptions: IQuizProps, cioClient: ConstructorIOClient) => {
|
|
8
8
|
quizApiState: QuizAPIReducerState;
|
|
9
9
|
quizLocalState: QuizLocalReducerState;
|
|
10
10
|
dispatchApiState: React.Dispatch<ActionQuizAPI>;
|
|
11
11
|
dispatchLocalState: React.Dispatch<ActionAnswerQuestion>;
|
|
12
|
-
|
|
13
|
-
skipToResults: boolean;
|
|
14
|
-
quizStateKey: string;
|
|
12
|
+
quizSessionStorageState: QuizSessionStorageState;
|
|
15
13
|
};
|
|
16
14
|
declare const useQuizState: UseQuizState;
|
|
17
15
|
export default useQuizState;
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { ActionAnswerQuestion } from '../../components/CioQuiz/actions';
|
|
2
|
-
|
|
3
|
-
declare const useQuizLocalState: (sessionStateOptions?: SessionStateOptions) => {
|
|
2
|
+
declare const useQuizLocalState: () => {
|
|
4
3
|
quizLocalState: import("../../components/CioQuiz/quizLocalReducer").QuizLocalReducerState;
|
|
5
|
-
hasQuizStoredState: () => boolean;
|
|
6
4
|
dispatchLocalState: (action: ActionAnswerQuestion) => void;
|
|
7
|
-
skipToResults: boolean;
|
|
8
|
-
quizStateKey: string;
|
|
9
5
|
};
|
|
10
6
|
export default useQuizLocalState;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { SessionStateOptions } from '../../types';
|
|
2
|
+
import { QuizLocalReducerState } from '../../components/CioQuiz/quizLocalReducer';
|
|
3
|
+
declare const useSessionStorageState: (quizLocalState?: QuizLocalReducerState, sessionStateOptions?: SessionStateOptions, enableHydration?: boolean) => {
|
|
4
|
+
skipToResults: boolean;
|
|
5
|
+
quizSessionStorageStateKey: string;
|
|
6
|
+
hasSessionStorageState: () => boolean;
|
|
7
|
+
};
|
|
8
|
+
export default useSessionStorageState;
|
package/lib/types/types.d.ts
CHANGED
|
@@ -45,6 +45,7 @@ export interface IQuizProps {
|
|
|
45
45
|
resultsPageOptions: ResultsPageOptions;
|
|
46
46
|
sessionStateOptions?: SessionStateOptions;
|
|
47
47
|
primaryColor?: string;
|
|
48
|
+
enableHydration?: boolean;
|
|
48
49
|
callbacks?: Callbacks;
|
|
49
50
|
}
|
|
50
51
|
export interface QuizReturnState {
|
|
@@ -58,9 +59,9 @@ export interface QuizReturnState {
|
|
|
58
59
|
sessionId?: string;
|
|
59
60
|
currentQuestion?: CurrentQuestion | undefined;
|
|
60
61
|
results?: QuizResultsResponse | undefined;
|
|
61
|
-
skipToResults: boolean;
|
|
62
62
|
selectedOptionsWithAttributes?: string[];
|
|
63
63
|
};
|
|
64
|
+
quizSessionStorageState: QuizSessionStorageState;
|
|
64
65
|
}
|
|
65
66
|
export type AnswerInput = {
|
|
66
67
|
type: InputQuestionsTypes;
|
|
@@ -69,6 +70,11 @@ export type AnswerInput = {
|
|
|
69
70
|
export type AnswerInputState = {
|
|
70
71
|
[key: string]: AnswerInput;
|
|
71
72
|
};
|
|
73
|
+
export interface QuizSessionStorageState {
|
|
74
|
+
key: string;
|
|
75
|
+
skipToResults: boolean;
|
|
76
|
+
hasSessionStorageState: () => boolean;
|
|
77
|
+
}
|
|
72
78
|
export type InputQuestionsTypes = QuestionTypes.OpenText | QuestionTypes.Cover | QuestionTypes.SingleSelect | QuestionTypes.MultipleSelect;
|
|
73
79
|
export type CurrentQuestion = NextQuestionResponse & {
|
|
74
80
|
isFirstQuestion: boolean;
|
|
@@ -87,7 +93,6 @@ export declare namespace QuizEventsReturn {
|
|
|
87
93
|
type AddToCart = (e: React.MouseEvent<HTMLElement>, result: QuizResultDataPartial, price?: number) => void;
|
|
88
94
|
type AddToFavorites = (e: React.MouseEvent<HTMLElement>, result: QuizResultDataPartial, price?: number, sendEvent?: boolean) => void;
|
|
89
95
|
type HydrateQuiz = () => void;
|
|
90
|
-
type HasSessionStorageState = () => boolean;
|
|
91
96
|
type ResetSessionStorageState = () => void;
|
|
92
97
|
}
|
|
93
98
|
export interface QuizEventsReturn {
|
|
@@ -99,7 +104,6 @@ export interface QuizEventsReturn {
|
|
|
99
104
|
addToCart: QuizEventsReturn.AddToCart;
|
|
100
105
|
addToFavorites: QuizEventsReturn.AddToFavorites;
|
|
101
106
|
hydrateQuiz: QuizEventsReturn.HydrateQuiz;
|
|
102
|
-
hasSessionStorageState: QuizEventsReturn.HasSessionStorageState;
|
|
103
107
|
resetSessionStorageState: QuizEventsReturn.ResetSessionStorageState;
|
|
104
108
|
}
|
|
105
109
|
export interface OpenTextInputProps {
|