@constructor-io/constructorio-ui-quizzes 1.17.16 → 1.17.18

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.
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
- const react_1 = require("react");
5
4
  const useCioClient_1 = tslib_1.__importDefault(require("./useCioClient"));
6
5
  const useConsoleErrors_1 = tslib_1.__importDefault(require("./useConsoleErrors"));
7
6
  const usePropsGetters_1 = tslib_1.__importDefault(require("./usePropsGetters"));
@@ -21,14 +20,8 @@ const useQuiz = (quizOptions) => {
21
20
  const quizEvents = (0, useQuizEvents_1.default)(quizOptions, cioClient, quizState);
22
21
  // Props getters
23
22
  const { quizApiState, quizLocalState, quizSessionStorageState } = quizState;
24
- const { skipToResults } = quizSessionStorageState;
25
23
  const propGetters = (0, usePropsGetters_1.default)(quizEvents, quizApiState, quizLocalState, resultsPageOptions === null || resultsPageOptions === void 0 ? void 0 : resultsPageOptions.favoriteItems);
26
24
  const primaryColorStyles = (0, usePrimaryColorStyles_1.default)(primaryColor);
27
- (0, react_1.useEffect)(() => {
28
- if (skipToResults)
29
- quizEvents.hydrateQuiz();
30
- // eslint-disable-next-line react-hooks/exhaustive-deps
31
- }, []);
32
25
  return Object.assign(Object.assign({ cioClient, state: {
33
26
  answers: {
34
27
  inputs: quizLocalState.answerInputs,
@@ -30,15 +30,16 @@ const useQuizEvents = (quizOptions, cioClient, quizState) => {
30
30
  const addToFavorites = (0, useQuizAddToFavorites_1.default)(cioClient, quizApiState, onAddToFavoritesClick);
31
31
  // Quiz results loaded event
32
32
  (0, useQuizResultsLoaded_1.default)(cioClient, quizApiState, onQuizResultsLoaded);
33
+ const resetSessionStorageState = (0, utils_1.resetQuizSessionStorageState)(quizSessionStorageState.key, quizOptions.quizId);
33
34
  // Quiz reset
34
35
  const resetQuiz = (0, useQuizResetClick_1.default)({
35
- resetQuizSessionStorageState: (0, utils_1.resetQuizSessionStorageState)(quizSessionStorageState.key),
36
+ resetQuizSessionStorageState: resetSessionStorageState,
36
37
  dispatchLocalState,
37
38
  dispatchApiState,
38
39
  quizResults: quizApiState.quizResults,
39
40
  });
40
41
  // Quiz rehydrate
41
- const hydrateQuizLocalState = (0, useHydrateQuizLocalState_1.default)(quizSessionStorageState.key, dispatchLocalState);
42
+ const hydrateQuizLocalState = (0, useHydrateQuizLocalState_1.default)(quizOptions.quizId, quizSessionStorageState, dispatchLocalState);
42
43
  return {
43
44
  addToCart,
44
45
  addToFavorites,
@@ -49,7 +50,7 @@ const useQuizEvents = (quizOptions, cioClient, quizState) => {
49
50
  skipQuestion,
50
51
  resetQuiz,
51
52
  hydrateQuiz: hydrateQuizLocalState,
52
- resetSessionStorageState: (0, utils_1.resetQuizSessionStorageState)(quizSessionStorageState.key),
53
+ resetSessionStorageState,
53
54
  };
54
55
  };
55
56
  exports.default = useQuizEvents;
@@ -3,16 +3,23 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const react_1 = require("react");
4
4
  const actions_1 = require("../../components/CioQuiz/actions");
5
5
  const utils_1 = require("../../utils");
6
- const useHydrateQuizLocalState = (quizSessionStorageStateKey, dispatchLocalState) => {
6
+ const useHydrateQuizLocalState = (quizId, quizSessionStorageState, dispatchLocalState) => {
7
+ const { key: quizSessionStorageStateKey, skipToResults } = quizSessionStorageState;
7
8
  const sessionStorageQuizState = (0, utils_1.getStateFromSessionStorage)(quizSessionStorageStateKey);
8
9
  const hydrateQuizLocalStateHandler = (0, react_1.useCallback)(() => {
9
- if (sessionStorageQuizState) {
10
+ const quizData = sessionStorageQuizState === null || sessionStorageQuizState === void 0 ? void 0 : sessionStorageQuizState[quizId];
11
+ if (quizData) {
10
12
  dispatchLocalState({
11
13
  type: actions_1.QuestionTypes.Hydrate,
12
- payload: sessionStorageQuizState,
14
+ payload: quizData,
13
15
  });
14
16
  }
15
- }, [dispatchLocalState, sessionStorageQuizState]);
17
+ }, [dispatchLocalState, quizId, sessionStorageQuizState]);
18
+ (0, react_1.useEffect)(() => {
19
+ if (skipToResults)
20
+ hydrateQuizLocalStateHandler();
21
+ // eslint-disable-next-line react-hooks/exhaustive-deps
22
+ }, []);
16
23
  return hydrateQuizLocalStateHandler;
17
24
  };
18
25
  exports.default = useHydrateQuizLocalState;
@@ -9,7 +9,7 @@ const useQuizState = (quizOptions, cioClient) => {
9
9
  // Quiz Local state
10
10
  const { quizLocalState, dispatchLocalState } = (0, useQuizLocalState_1.default)();
11
11
  // Quiz Session Storage state
12
- const { skipToResults, quizSessionStorageStateKey, hasSessionStorageState } = (0, useSessionStorageState_1.default)(quizLocalState, sessionStateOptions, enableHydration === undefined ? true : enableHydration);
12
+ const { skipToResults, quizSessionStorageStateKey, hasSessionStorageState } = (0, useSessionStorageState_1.default)(quizOptions.quizId, quizLocalState, sessionStateOptions, enableHydration === undefined ? true : enableHydration);
13
13
  // Quiz API state
14
14
  const { quizApiState, dispatchApiState } = (0, useQuizApiState_1.default)(quizOptions, cioClient, quizLocalState, skipToResults, dispatchLocalState);
15
15
  return {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const react_1 = require("react");
4
4
  const utils_1 = require("../../utils");
5
5
  const constants_1 = require("../../constants");
6
- const useSessionStorageState = (quizLocalState, sessionStateOptions, enableHydration) => {
6
+ const useSessionStorageState = (quizId, quizLocalState, sessionStateOptions, enableHydration) => {
7
7
  var _a;
8
8
  const quizSessionStorageStateKey = (sessionStateOptions === null || sessionStateOptions === void 0 ? void 0 : sessionStateOptions.sessionStateKey) || constants_1.quizSessionStateKey;
9
9
  // Save state to session storage
@@ -11,16 +11,19 @@ const useSessionStorageState = (quizLocalState, sessionStateOptions, enableHydra
11
11
  var _a, _b;
12
12
  // don't save state if initial state
13
13
  if (enableHydration && ((_a = quizLocalState === null || quizLocalState === void 0 ? void 0 : quizLocalState.answers) === null || _a === void 0 ? void 0 : _a.length)) {
14
- (_b = window === null || window === void 0 ? void 0 : window.sessionStorage) === null || _b === void 0 ? void 0 : _b.setItem(quizSessionStorageStateKey, JSON.stringify(quizLocalState));
14
+ const data = (0, utils_1.getStateFromSessionStorage)(quizSessionStorageStateKey);
15
+ const dataToSave = Object.assign(Object.assign({}, data), { [quizId]: quizLocalState });
16
+ (_b = window === null || window === void 0 ? void 0 : window.sessionStorage) === null || _b === void 0 ? void 0 : _b.setItem(quizSessionStorageStateKey, JSON.stringify(dataToSave));
15
17
  }
16
- }, [quizLocalState, quizSessionStorageStateKey, enableHydration]);
18
+ }, [quizLocalState, quizSessionStorageStateKey, enableHydration, quizId]);
19
+ const quizData = (0, utils_1.getStateFromSessionStorage)(quizSessionStorageStateKey);
17
20
  const skipToResults = !!enableHydration &&
18
- !!((_a = (0, utils_1.getStateFromSessionStorage)(quizSessionStorageStateKey)) === null || _a === void 0 ? void 0 : _a.isQuizCompleted) &&
21
+ !!((_a = quizData === null || quizData === void 0 ? void 0 : quizData[quizId]) === null || _a === void 0 ? void 0 : _a.isQuizCompleted) &&
19
22
  !(sessionStateOptions === null || sessionStateOptions === void 0 ? void 0 : sessionStateOptions.showSessionModalOnResults);
20
23
  return {
21
24
  skipToResults,
22
25
  quizSessionStorageStateKey,
23
- hasSessionStorageState: () => (0, utils_1.getStateFromSessionStorage)(quizSessionStorageStateKey) !== null,
26
+ hasSessionStorageState: () => !!quizData && !!quizData[quizId],
24
27
  };
25
28
  };
26
29
  exports.default = useSessionStorageState;
package/lib/cjs/utils.js CHANGED
@@ -113,9 +113,13 @@ const getStateFromSessionStorage = (quizStateKey) => {
113
113
  return null;
114
114
  };
115
115
  exports.getStateFromSessionStorage = getStateFromSessionStorage;
116
- const resetQuizSessionStorageState = (quizStateKey) => () => {
116
+ const resetQuizSessionStorageState = (quizStateKey, quizId) => () => {
117
117
  var _a;
118
- (_a = window === null || window === void 0 ? void 0 : window.sessionStorage) === null || _a === void 0 ? void 0 : _a.removeItem(quizStateKey);
118
+ const quizData = (0, exports.getStateFromSessionStorage)(quizStateKey);
119
+ if (quizData) {
120
+ const updatedData = Object.assign(Object.assign({}, quizData), { [quizId]: null });
121
+ (_a = window === null || window === void 0 ? void 0 : window.sessionStorage) === null || _a === void 0 ? void 0 : _a.setItem(quizStateKey, JSON.stringify(updatedData));
122
+ }
119
123
  };
120
124
  exports.resetQuizSessionStorageState = resetQuizSessionStorageState;
121
125
  /* istanbul ignore next */
@@ -167,9 +171,9 @@ function rgbToHsl(r, g, b) {
167
171
  exports.rgbToHsl = rgbToHsl;
168
172
  function convertPrimaryColorsToString(primaryColorStyles) {
169
173
  return `{
170
- --primary-color-h: ${primaryColorStyles['--primary-color-h']};
171
- --primary-color-s: ${primaryColorStyles['--primary-color-s']};
172
- --primary-color-l: ${primaryColorStyles['--primary-color-l']};
174
+ --primary-color-h: ${primaryColorStyles['--primary-color-h']};
175
+ --primary-color-s: ${primaryColorStyles['--primary-color-s']};
176
+ --primary-color-l: ${primaryColorStyles['--primary-color-l']};
173
177
  }`;
174
178
  }
175
179
  exports.convertPrimaryColorsToString = convertPrimaryColorsToString;
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = '1.17.16';
3
+ exports.default = '1.17.18';
@@ -1,4 +1,3 @@
1
- import { useEffect } from 'react';
2
1
  import useCioClient from './useCioClient';
3
2
  import useConsoleErrors from './useConsoleErrors';
4
3
  import usePropsGetters from './usePropsGetters';
@@ -17,14 +16,8 @@ const useQuiz = (quizOptions) => {
17
16
  const quizEvents = useQuizEvents(quizOptions, cioClient, quizState);
18
17
  // Props getters
19
18
  const { quizApiState, quizLocalState, quizSessionStorageState } = quizState;
20
- const { skipToResults } = quizSessionStorageState;
21
19
  const propGetters = usePropsGetters(quizEvents, quizApiState, quizLocalState, resultsPageOptions?.favoriteItems);
22
20
  const primaryColorStyles = usePrimaryColorStyles(primaryColor);
23
- useEffect(() => {
24
- if (skipToResults)
25
- quizEvents.hydrateQuiz();
26
- // eslint-disable-next-line react-hooks/exhaustive-deps
27
- }, []);
28
21
  return {
29
22
  cioClient,
30
23
  state: {
@@ -27,15 +27,16 @@ const useQuizEvents = (quizOptions, cioClient, quizState) => {
27
27
  const addToFavorites = useQuizAddToFavorites(cioClient, quizApiState, onAddToFavoritesClick);
28
28
  // Quiz results loaded event
29
29
  useQuizResultsLoaded(cioClient, quizApiState, onQuizResultsLoaded);
30
+ const resetSessionStorageState = resetQuizSessionStorageState(quizSessionStorageState.key, quizOptions.quizId);
30
31
  // Quiz reset
31
32
  const resetQuiz = useQuizResetClick({
32
- resetQuizSessionStorageState: resetQuizSessionStorageState(quizSessionStorageState.key),
33
+ resetQuizSessionStorageState: resetSessionStorageState,
33
34
  dispatchLocalState,
34
35
  dispatchApiState,
35
36
  quizResults: quizApiState.quizResults,
36
37
  });
37
38
  // Quiz rehydrate
38
- const hydrateQuizLocalState = useHydrateQuizLocalState(quizSessionStorageState.key, dispatchLocalState);
39
+ const hydrateQuizLocalState = useHydrateQuizLocalState(quizOptions.quizId, quizSessionStorageState, dispatchLocalState);
39
40
  return {
40
41
  addToCart,
41
42
  addToFavorites,
@@ -46,7 +47,7 @@ const useQuizEvents = (quizOptions, cioClient, quizState) => {
46
47
  skipQuestion,
47
48
  resetQuiz,
48
49
  hydrateQuiz: hydrateQuizLocalState,
49
- resetSessionStorageState: resetQuizSessionStorageState(quizSessionStorageState.key),
50
+ resetSessionStorageState,
50
51
  };
51
52
  };
52
53
  export default useQuizEvents;
@@ -1,16 +1,23 @@
1
- import { useCallback } from 'react';
1
+ import { useCallback, useEffect } from 'react';
2
2
  import { QuestionTypes } from '../../components/CioQuiz/actions';
3
3
  import { getStateFromSessionStorage } from '../../utils';
4
- const useHydrateQuizLocalState = (quizSessionStorageStateKey, dispatchLocalState) => {
4
+ const useHydrateQuizLocalState = (quizId, quizSessionStorageState, dispatchLocalState) => {
5
+ const { key: quizSessionStorageStateKey, skipToResults } = quizSessionStorageState;
5
6
  const sessionStorageQuizState = getStateFromSessionStorage(quizSessionStorageStateKey);
6
7
  const hydrateQuizLocalStateHandler = useCallback(() => {
7
- if (sessionStorageQuizState) {
8
+ const quizData = sessionStorageQuizState?.[quizId];
9
+ if (quizData) {
8
10
  dispatchLocalState({
9
11
  type: QuestionTypes.Hydrate,
10
- payload: sessionStorageQuizState,
12
+ payload: quizData,
11
13
  });
12
14
  }
13
- }, [dispatchLocalState, sessionStorageQuizState]);
15
+ }, [dispatchLocalState, quizId, sessionStorageQuizState]);
16
+ useEffect(() => {
17
+ if (skipToResults)
18
+ hydrateQuizLocalStateHandler();
19
+ // eslint-disable-next-line react-hooks/exhaustive-deps
20
+ }, []);
14
21
  return hydrateQuizLocalStateHandler;
15
22
  };
16
23
  export default useHydrateQuizLocalState;
@@ -6,7 +6,7 @@ const useQuizState = (quizOptions, cioClient) => {
6
6
  // Quiz Local state
7
7
  const { quizLocalState, dispatchLocalState } = useQuizLocalState();
8
8
  // Quiz Session Storage state
9
- const { skipToResults, quizSessionStorageStateKey, hasSessionStorageState } = useSessionStorageState(quizLocalState, sessionStateOptions, enableHydration === undefined ? true : enableHydration);
9
+ const { skipToResults, quizSessionStorageStateKey, hasSessionStorageState } = useSessionStorageState(quizOptions.quizId, quizLocalState, sessionStateOptions, enableHydration === undefined ? true : enableHydration);
10
10
  // Quiz API state
11
11
  const { quizApiState, dispatchApiState } = useQuizApiState(quizOptions, cioClient, quizLocalState, skipToResults, dispatchLocalState);
12
12
  return {
@@ -1,22 +1,28 @@
1
1
  import { useEffect } from 'react';
2
2
  import { getStateFromSessionStorage } from '../../utils';
3
3
  import { quizSessionStateKey } from '../../constants';
4
- const useSessionStorageState = (quizLocalState, sessionStateOptions, enableHydration) => {
4
+ const useSessionStorageState = (quizId, quizLocalState, sessionStateOptions, enableHydration) => {
5
5
  const quizSessionStorageStateKey = sessionStateOptions?.sessionStateKey || quizSessionStateKey;
6
6
  // Save state to session storage
7
7
  useEffect(() => {
8
8
  // don't save state if initial state
9
9
  if (enableHydration && quizLocalState?.answers?.length) {
10
- window?.sessionStorage?.setItem(quizSessionStorageStateKey, JSON.stringify(quizLocalState));
10
+ const data = getStateFromSessionStorage(quizSessionStorageStateKey);
11
+ const dataToSave = {
12
+ ...data,
13
+ [quizId]: quizLocalState,
14
+ };
15
+ window?.sessionStorage?.setItem(quizSessionStorageStateKey, JSON.stringify(dataToSave));
11
16
  }
12
- }, [quizLocalState, quizSessionStorageStateKey, enableHydration]);
17
+ }, [quizLocalState, quizSessionStorageStateKey, enableHydration, quizId]);
18
+ const quizData = getStateFromSessionStorage(quizSessionStorageStateKey);
13
19
  const skipToResults = !!enableHydration &&
14
- !!getStateFromSessionStorage(quizSessionStorageStateKey)?.isQuizCompleted &&
20
+ !!quizData?.[quizId]?.isQuizCompleted &&
15
21
  !sessionStateOptions?.showSessionModalOnResults;
16
22
  return {
17
23
  skipToResults,
18
24
  quizSessionStorageStateKey,
19
- hasSessionStorageState: () => getStateFromSessionStorage(quizSessionStorageStateKey) !== null,
25
+ hasSessionStorageState: () => !!quizData && !!quizData[quizId],
20
26
  };
21
27
  };
22
28
  export default useSessionStorageState;
package/lib/mjs/utils.js CHANGED
@@ -100,8 +100,12 @@ export const getStateFromSessionStorage = (quizStateKey) => {
100
100
  }
101
101
  return null;
102
102
  };
103
- export const resetQuizSessionStorageState = (quizStateKey) => () => {
104
- window?.sessionStorage?.removeItem(quizStateKey);
103
+ export const resetQuizSessionStorageState = (quizStateKey, quizId) => () => {
104
+ const quizData = getStateFromSessionStorage(quizStateKey);
105
+ if (quizData) {
106
+ const updatedData = { ...quizData, [quizId]: null };
107
+ window?.sessionStorage?.setItem(quizStateKey, JSON.stringify(updatedData));
108
+ }
105
109
  };
106
110
  /* istanbul ignore next */
107
111
  export const logger = (action) => {
@@ -148,9 +152,9 @@ export function rgbToHsl(r, g, b) {
148
152
  }
149
153
  export function convertPrimaryColorsToString(primaryColorStyles) {
150
154
  return `{
151
- --primary-color-h: ${primaryColorStyles['--primary-color-h']};
152
- --primary-color-s: ${primaryColorStyles['--primary-color-s']};
153
- --primary-color-l: ${primaryColorStyles['--primary-color-l']};
155
+ --primary-color-h: ${primaryColorStyles['--primary-color-h']};
156
+ --primary-color-s: ${primaryColorStyles['--primary-color-s']};
157
+ --primary-color-l: ${primaryColorStyles['--primary-color-l']};
154
158
  }`;
155
159
  }
156
160
  export function formatMatchedOptions(options, separator, lastSeparator) {
@@ -1 +1 @@
1
- export default '1.17.16';
1
+ export default '1.17.18';
@@ -1,4 +1,4 @@
1
1
  import { ActionAnswerQuestion } from '../../components/CioQuiz/actions';
2
- import { QuizEventsReturn } from '../../types';
3
- declare const useHydrateQuizLocalState: (quizSessionStorageStateKey: string, dispatchLocalState: React.Dispatch<ActionAnswerQuestion>) => QuizEventsReturn.NextQuestion;
2
+ import { QuizEventsReturn, QuizSessionStorageState } from '../../types';
3
+ declare const useHydrateQuizLocalState: (quizId: string, quizSessionStorageState: QuizSessionStorageState, dispatchLocalState: React.Dispatch<ActionAnswerQuestion>) => QuizEventsReturn.NextQuestion;
4
4
  export default useHydrateQuizLocalState;
@@ -1,6 +1,6 @@
1
1
  import { SessionStateOptions } from '../../types';
2
2
  import { QuizLocalReducerState } from '../../components/CioQuiz/quizLocalReducer';
3
- declare const useSessionStorageState: (quizLocalState?: QuizLocalReducerState, sessionStateOptions?: SessionStateOptions, enableHydration?: boolean) => {
3
+ declare const useSessionStorageState: (quizId: string, quizLocalState?: QuizLocalReducerState, sessionStateOptions?: SessionStateOptions, enableHydration?: boolean) => {
4
4
  skipToResults: boolean;
5
5
  quizSessionStorageStateKey: string;
6
6
  hasSessionStorageState: () => boolean;
@@ -31,7 +31,7 @@ export declare const getQuestionTypes: (questionType?: `${QuestionTypes}`) => {
31
31
  export declare function getPreferredColorScheme(): string;
32
32
  export declare function isFunction(fn: any): boolean;
33
33
  export declare const getStateFromSessionStorage: (quizStateKey: string) => QuizLocalReducerState | null;
34
- export declare const resetQuizSessionStorageState: (quizStateKey: string) => () => void;
34
+ export declare const resetQuizSessionStorageState: (quizStateKey: string, quizId: string) => () => void;
35
35
  export declare const logger: (action: any) => void;
36
36
  export declare function sleep(ms: any): Promise<unknown>;
37
37
  export declare function rgbToHsl(r: number, g: number, b: number): number[];
@@ -1,2 +1,2 @@
1
- declare const _default: "1.17.16";
1
+ declare const _default: "1.17.18";
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.17.16",
3
+ "version": "1.17.18",
4
4
  "description": "Constructor.io Quizzes UI library for web applications",
5
5
  "author": "Constructor.io Corporation",
6
6
  "license": "MIT",