Source: store/useResultsStore.js

import { create } from 'zustand';
import { persist, createJSONStorage } from 'zustand/middleware';
import { getCookieConsentValue } from 'react-cookie-consent';

/**
 * Custom storage engine that checks for GDPR consent before writing to localStorage.
 */
const consentAwareStorage = {
    getItem: (name) => {
        return localStorage.getItem(name);
    },
    setItem: (name, value) => {
        const consent = getCookieConsentValue('quizCookieConsent');
        if (consent === 'true') {
            localStorage.setItem(name, value);
        }
    },
    removeItem: (name) => {
        localStorage.removeItem(name);
    },
};

/**
 * Zustand store for managing quiz results.
 * Persists results to localStorage if consent is given.
 *
 * @typedef {Object} ResultsStore
 * @property {Object.<string, Array>} resultsByUser - Map of usernames to their result history
 * @property {function(string, Object): void} addResult - Adds a new result for a user
 * @property {function(string): void} clearUserResults - Clears results for a specific user
 */

/**
 * Hook to access the results store.
 *
 * @type {function(): ResultsStore}
 */
export const useResultsStore = create(
    persist(
        (set) => ({
            resultsByUser: {},

            /**
             * Adds a new quiz result for a user.
             * @param {string} username - The username
             * @param {Object} newResult - The result object to add
             */
            addResult: (username, newResult) => {
                set((state) => {
                    const userResults = state.resultsByUser[username] || [];

                    return {
                        resultsByUser: {
                            ...state.resultsByUser,
                            [username]: [...userResults, newResult],
                        },
                    };
                });
            },

            /**
             * Clears all results for a specific user.
             * @param {string} username - The username to clear results for
             */
            clearUserResults: (username) => {
                set((state) => {
                    const newResultsByUser = { ...state.resultsByUser };
                    delete newResultsByUser[username];
                    return {
                        resultsByUser: newResultsByUser,
                    };
                });
            },
        }),
        {
            name: 'quiz-results-by-user',
            storage: createJSONStorage(() => consentAwareStorage),
        }
    )
);