diff --git a/src/components/ChallengeEditor/ChallengeView/index.js b/src/components/ChallengeEditor/ChallengeView/index.js index c2da57eb..a8e45389 100644 --- a/src/components/ChallengeEditor/ChallengeView/index.js +++ b/src/components/ChallengeEditor/ChallengeView/index.js @@ -18,7 +18,6 @@ import ChallengeTotalField from '../ChallengeTotal-Field' import Loader from '../../Loader' import AssignedMemberField from '../AssignedMember-Field' import { getResourceRoleByName } from '../../../util/tc' -import { isBetaMode } from '../../../util/cookie' import { loadGroupDetails } from '../../../actions/challenges' import { REVIEW_TYPES, @@ -29,6 +28,7 @@ import { } from '../../../config/constants' import PhaseInput from '../../PhaseInput' import CheckpointPrizesField from '../CheckpointPrizes-Field' +import { isBetaMode } from '../../../util/localstorage' const ChallengeView = ({ projectDetail, diff --git a/src/components/ChallengeEditor/index.js b/src/components/ChallengeEditor/index.js index 0ce1ea9a..03579485 100644 --- a/src/components/ChallengeEditor/index.js +++ b/src/components/ChallengeEditor/index.js @@ -69,11 +69,11 @@ import Tooltip from '../Tooltip' import CancelDropDown from './Cancel-Dropdown' import UseSchedulingAPIField from './UseSchedulingAPIField' -import { isBetaMode } from '../../util/cookie' import MilestoneField from './Milestone-Field' import DiscussionField from './Discussion-Field' import CheckpointPrizesField from './CheckpointPrizes-Field' import { canChangeDuration } from '../../util/phase' +import { isBetaMode } from '../../util/localstorage' const theme = { container: styles.modalContainer diff --git a/src/routes.js b/src/routes.js index 34e995da..f4ca4487 100644 --- a/src/routes.js +++ b/src/routes.js @@ -17,11 +17,11 @@ import { saveToken } from './actions/auth' import { loadChallengeDetails } from './actions/challenges' import { connect } from 'react-redux' import { checkAllowedRoles, checkOnlyReadOnlyRoles, checkReadOnlyRoles } from './util/tc' -import { setCookie, removeCookie, isBetaMode } from './util/cookie' import IdleTimer from 'react-idle-timer' import modalStyles from './styles/modal.module.scss' import ConfirmationModal from './components/Modal/ConfirmationModal' import Users from './containers/Users' +import { isBetaMode, removeFromLocalStorage, saveToLocalStorage } from './util/localstorage' const { ACCOUNTS_APP_LOGIN_URL, IDLE_TIMEOUT_MINUTES, IDLE_TIMEOUT_GRACE_MINUTES, COMMUNITY_APP_URL } = process.env @@ -105,9 +105,9 @@ class Routes extends React.Component { const params = new URLSearchParams(search) if (!_.isEmpty(params.get('beta'))) { if (params.get('beta') === 'true' && !isBetaMode()) { - setCookie(BETA_MODE_COOKIE_TAG, 'true') + saveToLocalStorage(BETA_MODE_COOKIE_TAG, 'true') } else if (params.get('beta') === 'false' && isBetaMode()) { - removeCookie(BETA_MODE_COOKIE_TAG) + removeFromLocalStorage(BETA_MODE_COOKIE_TAG) } this.props.history.push(this.props.location.pathname) } diff --git a/src/util/cookie.js b/src/util/cookie.js deleted file mode 100644 index b1242acb..00000000 --- a/src/util/cookie.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Provides Cookie related utility methods - */ - -import { BETA_MODE_COOKIE_TAG } from '../config/constants' - -/** - * A function that get's a cookie - */ -export function getCookie (name) { - const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)') - return v ? v[2] : undefined -} - -/** - * A function that set's a cookie - */ -export function setCookie (name, value) { - document.cookie = `${name}=${value}; path=/` -} - -/** - * A function that removes Cookie by setting expiry date to past - */ -export function removeCookie (name) { - document.cookie = `${name}=; path=/; expires=Thu, 18 Dec 2013 12:00:00 UTC;` -} - -/** - * A function that checks whether beta mode is enabled or not - */ -export function isBetaMode () { - return getCookie(BETA_MODE_COOKIE_TAG) -} diff --git a/src/util/localstorage.js b/src/util/localstorage.js new file mode 100644 index 00000000..00fcd6d4 --- /dev/null +++ b/src/util/localstorage.js @@ -0,0 +1,61 @@ +import { BETA_MODE_COOKIE_TAG } from '../config/constants' + +/** + * Save an item to localStorage. + * @param {string} key - The key under which the data will be stored. + * @param {any} value - The data to store (will be stringified). + */ +export function saveToLocalStorage (key, value) { + if (!key || typeof key !== 'string') { + throw new Error('Key must be a valid string.') + } + + try { + const jsonValue = JSON.stringify(value) + window.localStorage.setItem(key, jsonValue) + } catch (error) { + console.error('Failed to save to localStorage:', error) + } +} + +/** +* Get an item from localStorage. +* @param {string} key - The key under which the data is stored. +* @returns {any} - The parsed data from localStorage, or null if not found. +*/ +export function getFromLocalStorage (key) { + if (!key || typeof key !== 'string') { + throw new Error('Key must be a valid string.') + } + + try { + const jsonValue = window.localStorage.getItem(key) + return jsonValue ? JSON.parse(jsonValue) : null + } catch (error) { + console.error('Failed to retrieve from localStorage:', error) + return null + } +} + +/** + * Remove an item from localStorage. + * @param {string} key - The key of the item to remove. + */ +export function removeFromLocalStorage (key) { + if (!key || typeof key !== 'string') { + throw new Error('Key must be a valid string.') + } + + try { + window.localStorage.removeItem(key) + } catch (error) { + console.error('Failed to remove from localStorage:', error) + } +} + +/** + * A function that checks whether beta mode is enabled or not + */ +export function isBetaMode () { + return getFromLocalStorage(BETA_MODE_COOKIE_TAG) === 'true' +}