@constructor-io/constructorio-ui-quizzes 1.18.2 → 1.19.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 +15 -15
- package/lib/cjs/components/CioQuiz/actions.js +5 -3
- package/lib/cjs/components/CioQuiz/index.js +2 -1
- package/lib/cjs/components/CioQuiz/quizApiReducer.js +3 -0
- package/lib/cjs/components/CioQuiz/quizLocalReducer.js +23 -12
- package/lib/cjs/hooks/usePropsGetters/index.js +6 -3
- package/lib/cjs/hooks/usePropsGetters/useJumpToQuestionButtonProps.js +34 -0
- package/lib/cjs/hooks/usePropsGetters/useSelectInputProps.js +3 -2
- package/lib/cjs/hooks/useQuiz.js +7 -1
- package/lib/cjs/hooks/useQuizEvents/index.js +7 -0
- package/lib/cjs/hooks/useQuizEvents/useJumpToQuestion.js +25 -0
- package/lib/cjs/hooks/useQuizState/useQuizApiState.js +1 -1
- package/lib/cjs/hooks/useQuizState/useSessionStorageState.js +2 -1
- package/lib/cjs/version.js +1 -1
- package/lib/mjs/components/CioQuiz/actions.js +5 -3
- package/lib/mjs/components/CioQuiz/index.js +2 -1
- package/lib/mjs/components/CioQuiz/quizApiReducer.js +8 -0
- package/lib/mjs/components/CioQuiz/quizLocalReducer.js +35 -39
- package/lib/mjs/hooks/usePropsGetters/index.js +6 -3
- package/lib/mjs/hooks/usePropsGetters/useJumpToQuestionButtonProps.js +29 -0
- package/lib/mjs/hooks/usePropsGetters/useSelectInputProps.js +3 -2
- package/lib/mjs/hooks/useQuiz.js +7 -1
- package/lib/mjs/hooks/useQuizEvents/index.js +7 -0
- package/lib/mjs/hooks/useQuizEvents/useJumpToQuestion.js +21 -0
- package/lib/mjs/hooks/useQuizState/useQuizApiState.js +1 -1
- package/lib/mjs/hooks/useQuizState/useSessionStorageState.js +3 -2
- package/lib/mjs/version.js +1 -1
- package/lib/types/components/CioQuiz/actions.d.ts +13 -6
- package/lib/types/components/CioQuiz/context.d.ts +2 -1
- package/lib/types/hooks/usePropsGetters/index.d.ts +9 -2
- package/lib/types/hooks/usePropsGetters/useJumpToQuestionButtonProps.d.ts +4 -0
- package/lib/types/hooks/usePropsGetters/useSelectInputProps.d.ts +1 -1
- package/lib/types/hooks/useQuizEvents/useJumpToQuestion.d.ts +11 -0
- package/lib/types/hooks/useQuizEvents/useQuizResetClick.d.ts +1 -1
- package/lib/types/types.d.ts +11 -0
- package/lib/types/version.d.ts +1 -1
- package/package.json +2 -2
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { useEffect } from 'react';
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
2
|
import { getStateFromSessionStorage } from '../../utils';
|
|
3
3
|
import { quizSessionStateKey } from '../../constants';
|
|
4
4
|
const useSessionStorageState = (quizId, quizLocalState, sessionStateOptions, enableHydration) => {
|
|
5
5
|
const quizSessionStorageStateKey = sessionStateOptions?.sessionStateKey || quizSessionStateKey;
|
|
6
|
+
const [quizData, setQuizData] = useState(getStateFromSessionStorage(quizSessionStorageStateKey));
|
|
6
7
|
// Save state to session storage
|
|
7
8
|
useEffect(() => {
|
|
8
9
|
// don't save state if initial state
|
|
@@ -13,9 +14,9 @@ const useSessionStorageState = (quizId, quizLocalState, sessionStateOptions, ena
|
|
|
13
14
|
[quizId]: quizLocalState,
|
|
14
15
|
};
|
|
15
16
|
window?.sessionStorage?.setItem(quizSessionStorageStateKey, JSON.stringify(dataToSave));
|
|
17
|
+
setQuizData(data);
|
|
16
18
|
}
|
|
17
19
|
}, [quizLocalState, quizSessionStorageStateKey, enableHydration, quizId]);
|
|
18
|
-
const quizData = getStateFromSessionStorage(quizSessionStorageStateKey);
|
|
19
20
|
const skipToResults = !!enableHydration &&
|
|
20
21
|
!!quizData?.[quizId]?.isQuizCompleted &&
|
|
21
22
|
!sessionStateOptions?.showSessionModalOnResults;
|
package/lib/mjs/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export default '1.
|
|
1
|
+
export default '1.19.1';
|
|
@@ -12,7 +12,8 @@ export declare enum QuestionTypes {
|
|
|
12
12
|
Back = "back",
|
|
13
13
|
Reset = "reset",
|
|
14
14
|
Hydrate = "hydrate",
|
|
15
|
-
Complete = "complete"
|
|
15
|
+
Complete = "complete",
|
|
16
|
+
JumpToQuestion = "jump_to_question"
|
|
16
17
|
}
|
|
17
18
|
export interface QuestionAnswer<Value> {
|
|
18
19
|
questionId: number;
|
|
@@ -26,16 +27,19 @@ interface Action<Type, Payload = {}> {
|
|
|
26
27
|
payload?: Payload;
|
|
27
28
|
}
|
|
28
29
|
export type ActionAnswerInputQuestion = Action<QuestionTypes.OpenText, OpenTextQuestionPayload> | Action<QuestionTypes.SingleSelect, SelectQuestionPayload> | Action<QuestionTypes.MultipleSelect, SelectQuestionPayload> | Action<QuestionTypes.SingleFilterValue, SelectQuestionPayload> | Action<QuestionTypes.MultipleFilterValues, SelectQuestionPayload> | Action<QuestionTypes.Cover, CoverQuestionPayload>;
|
|
29
|
-
export type ActionAnswerQuestion = ActionAnswerInputQuestion | Action<QuestionTypes.Next, CurrentQuestion> | Action<QuestionTypes.Skip, CurrentQuestion> | Action<QuestionTypes.Back, CurrentQuestion> | Action<QuestionTypes.Reset> | Action<QuestionTypes.Complete> | Action<QuestionTypes.
|
|
30
|
+
export type ActionAnswerQuestion = ActionAnswerInputQuestion | Action<QuestionTypes.Next, CurrentQuestion> | Action<QuestionTypes.Skip, CurrentQuestion> | Action<QuestionTypes.Back, CurrentQuestion> | Action<QuestionTypes.Reset> | Action<QuestionTypes.Complete> | Action<QuestionTypes.JumpToQuestion, {
|
|
31
|
+
questionId: number;
|
|
32
|
+
}> | Action<QuestionTypes.Hydrate, Partial<QuizLocalReducerState>>;
|
|
30
33
|
export declare enum QuizAPIActionTypes {
|
|
31
34
|
SET_IS_LOADING = 0,
|
|
32
35
|
SET_IS_ERROR = 1,
|
|
33
36
|
SET_QUIZ_RESULTS = 2,
|
|
34
37
|
SET_CURRENT_QUESTION = 3,
|
|
35
38
|
RESET_QUIZ = 4,
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
JUMP_TO_QUESTION = 5,
|
|
40
|
+
SET_QUIZ_SHARED_RESULTS = 6,
|
|
41
|
+
SET_QUIZ_RESULTS_CONFIG = 7,
|
|
42
|
+
SET_QUIZ_RESULTS_CONFIG_ERROR = 8
|
|
39
43
|
}
|
|
40
44
|
export type ActionSetIsLoading = Action<QuizAPIActionTypes.SET_IS_LOADING>;
|
|
41
45
|
export type ActionSetIsError = Action<QuizAPIActionTypes.SET_IS_ERROR>;
|
|
@@ -50,9 +54,12 @@ export type ActionSetCurrentQuestion = Action<QuizAPIActionTypes.SET_CURRENT_QUE
|
|
|
50
54
|
quizSessionId?: string;
|
|
51
55
|
quizVersionId?: string;
|
|
52
56
|
}>;
|
|
57
|
+
export type ActionJumpToQuestion = Action<QuizAPIActionTypes.JUMP_TO_QUESTION, {
|
|
58
|
+
questionId: number;
|
|
59
|
+
}>;
|
|
53
60
|
export type ActionResetQuiz = Action<QuizAPIActionTypes.RESET_QUIZ>;
|
|
54
61
|
export type ActionSetQuizResultsConfig = Action<QuizAPIActionTypes.SET_QUIZ_RESULTS_CONFIG, {
|
|
55
62
|
quizResultsConfig: QuizResultsConfigResponse;
|
|
56
63
|
}> | Action<QuizAPIActionTypes.SET_QUIZ_RESULTS_CONFIG_ERROR>;
|
|
57
|
-
export type ActionQuizAPI = ActionSetIsLoading | ActionSetIsError | ActionSetQuizResults | ActionSetCurrentQuestion | ActionResetQuiz | ActionSetQuizSharedResults | ActionSetQuizResultsConfig;
|
|
64
|
+
export type ActionQuizAPI = ActionSetIsLoading | ActionSetIsError | ActionSetQuizResults | ActionSetCurrentQuestion | ActionResetQuiz | ActionSetQuizSharedResults | ActionSetQuizResultsConfig | ActionJumpToQuestion;
|
|
58
65
|
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import ConstructorIOClient from '@constructor-io/constructorio-client-javascript';
|
|
3
|
-
import { GetAddToCartButtonProps, GetAddToFavoritesButtonProps, GetCoverQuestionProps, GetHydrateQuizButtonProps, GetNextQuestionButtonProps, GetSkipQuestionButtonProps, GetOpenTextInputProps, GetPreviousQuestionButtonProps, GetQuizImageProps, GetQuizResultButtonProps, GetQuizResultLinkProps, GetResetQuizButtonProps, GetSelectInputProps, PrimaryColorStyles, QuizReturnState, GetShareResultsButtonProps } from '../../types';
|
|
3
|
+
import { GetAddToCartButtonProps, GetAddToFavoritesButtonProps, GetCoverQuestionProps, GetHydrateQuizButtonProps, GetNextQuestionButtonProps, GetSkipQuestionButtonProps, GetOpenTextInputProps, GetPreviousQuestionButtonProps, GetQuizImageProps, GetQuizResultButtonProps, GetQuizResultLinkProps, GetResetQuizButtonProps, GetSelectInputProps, PrimaryColorStyles, QuizReturnState, GetShareResultsButtonProps, GetJumpToQuestionButtonProps } from '../../types';
|
|
4
4
|
export interface QuizContextValue {
|
|
5
5
|
cioClient?: ConstructorIOClient;
|
|
6
6
|
state?: QuizReturnState;
|
|
@@ -18,6 +18,7 @@ export interface QuizContextValue {
|
|
|
18
18
|
getAddToFavoritesButtonProps: GetAddToFavoritesButtonProps;
|
|
19
19
|
getQuizResultButtonProps: GetQuizResultButtonProps;
|
|
20
20
|
getQuizResultLinkProps: GetQuizResultLinkProps;
|
|
21
|
+
getJumpToQuestionButtonProps: GetJumpToQuestionButtonProps;
|
|
21
22
|
primaryColorStyles: PrimaryColorStyles;
|
|
22
23
|
customClickItemCallback: boolean;
|
|
23
24
|
customAddToFavoritesCallback: boolean;
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
import { GetResetQuizButtonProps, GetCoverQuestionProps, GetNextQuestionButtonProps, GetOpenTextInputProps, GetPreviousQuestionButtonProps, GetQuizImageProps, GetSelectInputProps, QuizEventsReturn, GetHydrateQuizButtonProps, GetAddToCartButtonProps, GetQuizResultButtonProps, GetQuizResultLinkProps, GetSelectQuestionImageProps, GetAddToFavoritesButtonProps, GetSkipQuestionButtonProps, GetShareResultsButtonProps } from '../../types';
|
|
1
|
+
import { GetResetQuizButtonProps, GetCoverQuestionProps, GetNextQuestionButtonProps, GetOpenTextInputProps, GetPreviousQuestionButtonProps, GetQuizImageProps, GetSelectInputProps, QuizEventsReturn, GetHydrateQuizButtonProps, GetAddToCartButtonProps, GetQuizResultButtonProps, GetQuizResultLinkProps, GetSelectQuestionImageProps, GetAddToFavoritesButtonProps, GetSkipQuestionButtonProps, GetShareResultsButtonProps, GetJumpToQuestionButtonProps, QuestionsPageOptions } from '../../types';
|
|
2
2
|
import { QuizAPIReducerState } from '../../components/CioQuiz/quizApiReducer';
|
|
3
3
|
import { QuizLocalReducerState } from '../../components/CioQuiz/quizLocalReducer';
|
|
4
|
-
declare const usePropsGetters: (
|
|
4
|
+
declare const usePropsGetters: ({ questionsPageOptions, favoriteItems, quizEvents, quizApiState, quizLocalState, }: {
|
|
5
|
+
quizEvents: QuizEventsReturn;
|
|
6
|
+
quizApiState: QuizAPIReducerState;
|
|
7
|
+
quizLocalState: QuizLocalReducerState;
|
|
8
|
+
favoriteItems?: string[] | undefined;
|
|
9
|
+
questionsPageOptions?: QuestionsPageOptions | undefined;
|
|
10
|
+
}) => {
|
|
5
11
|
getOpenTextInputProps: GetOpenTextInputProps;
|
|
6
12
|
getNextQuestionButtonProps: GetNextQuestionButtonProps;
|
|
7
13
|
getPreviousQuestionButtonProps: GetPreviousQuestionButtonProps;
|
|
@@ -17,5 +23,6 @@ declare const usePropsGetters: (quizEvents: QuizEventsReturn, quizApiState: Quiz
|
|
|
17
23
|
getQuizResultButtonProps: GetQuizResultButtonProps;
|
|
18
24
|
getQuizResultLinkProps: GetQuizResultLinkProps;
|
|
19
25
|
getSkipQuestionButtonProps: GetSkipQuestionButtonProps;
|
|
26
|
+
getJumpToQuestionButtonProps: GetJumpToQuestionButtonProps;
|
|
20
27
|
};
|
|
21
28
|
export default usePropsGetters;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { QuizAPIReducerState } from '../../components/CioQuiz/quizApiReducer';
|
|
2
|
+
import { GetJumpToQuestionButtonProps, QuizEventsReturn } from '../../types';
|
|
3
|
+
import { QuizLocalReducerState } from '../../components/CioQuiz/quizLocalReducer';
|
|
4
|
+
export default function useJumpToQuestionButtonProps(jumpToQuestion: QuizEventsReturn.JumpToQuestion, quizApiState: QuizAPIReducerState, quizLocalState: QuizLocalReducerState): GetJumpToQuestionButtonProps;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { Nullable } from '@constructor-io/constructorio-client-javascript/lib/types';
|
|
2
2
|
import { AnswerInputState, GetSelectInputProps, Question, QuizEventsReturn } from '../../types';
|
|
3
|
-
export default function useSelectInputProps(quizAnswerChanged: QuizEventsReturn.QuizAnswerChanged, nextQuestion: QuizEventsReturn.NextQuestion, currentQuestionData?: Nullable<Question>, answerInputs?: AnswerInputState): GetSelectInputProps;
|
|
3
|
+
export default function useSelectInputProps(quizAnswerChanged: QuizEventsReturn.QuizAnswerChanged, nextQuestion: QuizEventsReturn.NextQuestion, currentQuestionData?: Nullable<Question>, answerInputs?: AnswerInputState, nextQuestionOnSingleSelect?: boolean): GetSelectInputProps;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { ActionAnswerQuestion, ActionQuizAPI } from '../../components/CioQuiz/actions';
|
|
3
|
+
import { QuizEventsReturn } from '../../types';
|
|
4
|
+
import { QuizAPIReducerState } from '../../components/CioQuiz/quizApiReducer';
|
|
5
|
+
type IUseJumpToQuestionProps = {
|
|
6
|
+
dispatchLocalState: React.Dispatch<ActionAnswerQuestion>;
|
|
7
|
+
dispatchApiState: React.Dispatch<ActionQuizAPI>;
|
|
8
|
+
quizApiState: QuizAPIReducerState;
|
|
9
|
+
};
|
|
10
|
+
declare const useJumpToQuestion: (props: IUseJumpToQuestionProps) => QuizEventsReturn.JumpToQuestion;
|
|
11
|
+
export default useJumpToQuestion;
|
|
@@ -7,5 +7,5 @@ type IUseQuizResetClickProps = {
|
|
|
7
7
|
dispatchApiState: React.Dispatch<ActionQuizAPI>;
|
|
8
8
|
quizResults?: QuizResultsResponse | QuizSharedResultsData;
|
|
9
9
|
};
|
|
10
|
-
declare const useQuizResetClick: (props: IUseQuizResetClickProps) => QuizEventsReturn.
|
|
10
|
+
declare const useQuizResetClick: (props: IUseQuizResetClickProps) => QuizEventsReturn.ResetQuiz;
|
|
11
11
|
export default useQuizResetClick;
|
package/lib/types/types.d.ts
CHANGED
|
@@ -46,6 +46,7 @@ export interface ResultsPageOptions {
|
|
|
46
46
|
}
|
|
47
47
|
export interface QuestionsPageOptions {
|
|
48
48
|
skipQuestionButtonText?: string;
|
|
49
|
+
nextQuestionOnSingleSelect?: boolean;
|
|
49
50
|
}
|
|
50
51
|
export interface SessionStateOptions {
|
|
51
52
|
showSessionModal?: boolean;
|
|
@@ -94,6 +95,7 @@ export interface QuizReturnState {
|
|
|
94
95
|
selectedOptionsWithAttributes?: string[];
|
|
95
96
|
matchedOptions?: string[];
|
|
96
97
|
resultsConfig: QuizResultsConfig | null;
|
|
98
|
+
metadata?: object | null;
|
|
97
99
|
};
|
|
98
100
|
quizSessionStorageState: QuizSessionStorageState;
|
|
99
101
|
}
|
|
@@ -126,6 +128,7 @@ export declare namespace QuizEventsReturn {
|
|
|
126
128
|
type SkipQuestion = () => void;
|
|
127
129
|
type PreviousQuestion = () => void;
|
|
128
130
|
type ResetQuiz = () => void;
|
|
131
|
+
type JumpToQuestion = (questionId: number) => void;
|
|
129
132
|
type ResultClick = (result: QuizResultDataPartial, position: number) => void;
|
|
130
133
|
type AddToCart = (e: React.MouseEvent<HTMLElement>, result: QuizResultDataPartial, price?: number | string) => void;
|
|
131
134
|
type AddToFavorites = (e: React.MouseEvent<HTMLElement>, result: QuizResultDataPartial, price?: number | string, sendEvent?: boolean) => void;
|
|
@@ -135,6 +138,7 @@ export declare namespace QuizEventsReturn {
|
|
|
135
138
|
export interface QuizEventsReturn {
|
|
136
139
|
nextQuestion: QuizEventsReturn.NextQuestion;
|
|
137
140
|
skipQuestion: QuizEventsReturn.SkipQuestion;
|
|
141
|
+
jumpToQuestion: QuizEventsReturn.JumpToQuestion;
|
|
138
142
|
quizAnswerChanged: QuizEventsReturn.QuizAnswerChanged;
|
|
139
143
|
previousQuestion: QuizEventsReturn.PreviousQuestion;
|
|
140
144
|
resetQuiz: QuizEventsReturn.ResetQuiz;
|
|
@@ -225,12 +229,18 @@ export interface SelectInputProps {
|
|
|
225
229
|
tabIndex: number;
|
|
226
230
|
key: number | string;
|
|
227
231
|
}
|
|
232
|
+
export interface JumpToQuestionButtonProps {
|
|
233
|
+
className: string;
|
|
234
|
+
onClick: React.MouseEventHandler<HTMLElement>;
|
|
235
|
+
style?: Record<string, string>;
|
|
236
|
+
}
|
|
228
237
|
export type GetOpenTextInputProps = () => OpenTextInputProps;
|
|
229
238
|
export type GetCoverQuestionProps = () => CoverQuestionProps;
|
|
230
239
|
export type GetSelectInputProps = (option: QuestionOption) => SelectInputProps;
|
|
231
240
|
export type GetNextQuestionButtonProps = () => NextQuestionButtonProps;
|
|
232
241
|
export type GetSkipQuestionButtonProps = () => SkipQuestionButtonProps;
|
|
233
242
|
export type GetPreviousQuestionButtonProps = () => PreviousQuestionButtonProps;
|
|
243
|
+
export type GetJumpToQuestionButtonProps = (id: number) => JumpToQuestionButtonProps;
|
|
234
244
|
export type GetResetQuizButtonProps = (stylesType?: 'primary' | 'secondary') => ResetQuizButtonProps;
|
|
235
245
|
export type GetShareResultsButtonProps = () => ShareResultsButtonProps;
|
|
236
246
|
export type GetHydrateQuizButtonProps = () => HydrateQuizButtonProps;
|
|
@@ -269,6 +279,7 @@ export interface UseQuizReturn {
|
|
|
269
279
|
getAddToFavoritesButtonProps: GetAddToFavoritesButtonProps;
|
|
270
280
|
getQuizResultButtonProps: GetQuizResultButtonProps;
|
|
271
281
|
getQuizResultLinkProps: GetQuizResultLinkProps;
|
|
282
|
+
getJumpToQuestionButtonProps: GetJumpToQuestionButtonProps;
|
|
272
283
|
primaryColorStyles: PrimaryColorStyles;
|
|
273
284
|
}
|
|
274
285
|
export type UseQuiz = (quizProps: IQuizProps) => UseQuizReturn;
|
package/lib/types/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default: "1.
|
|
1
|
+
declare const _default: "1.19.1";
|
|
2
2
|
export default _default;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@constructor-io/constructorio-ui-quizzes",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.19.1",
|
|
4
4
|
"description": "Constructor.io Quizzes UI library for web applications",
|
|
5
5
|
"author": "Constructor.io Corporation",
|
|
6
6
|
"license": "MIT",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"check-license": "license-checker --production --onlyAllow 'Apache-2.0;BSD-3-Clause;MIT;0BSD;BSD-2-Clause' --excludePackages 'picocolors@1.0.0'"
|
|
62
62
|
},
|
|
63
63
|
"peerDependencies": {
|
|
64
|
-
"@constructor-io/constructorio-client-javascript": "^2.
|
|
64
|
+
"@constructor-io/constructorio-client-javascript": "^2.68.1",
|
|
65
65
|
"react": ">=16.12.0",
|
|
66
66
|
"react-dom": ">=16.12.0",
|
|
67
67
|
"tslib": "^2.4.0"
|