department-of-veterans-affairs/vets-website

View on GitHub
src/platform/site-wide/announcements/actions/index.js

Summary

Maintainability
A
2 hrs
Test Coverage
import localStorage from '../../../utilities/storage/localStorage';
import sessionStorage from '../../../utilities/storage/sessionStorage';
import { AnnouncementBehavior } from '../constants';

export const INIT_DISMISSED_ANNOUNCEMENTS = 'INIT_DISMISSED_ANNOUNCEMENTS';
export const DISMISS_ANNOUNCEMENT = 'DISMISS_ANNOUNCEMENT';

export const ANNOUNCEMENTS_LOCAL_STORAGE = 'DISMISSED_ANNOUNCEMENTS';
export const ANNOUNCEMENTS_SESSION_STORAGE = 'DISMISSED_ANNOUNCEMENTS';

let dismissedOnce = [];
let dismissedPerSession = [];

export const previouslyDismissedAnnouncements = {
  initializeFromLocalStorage() {
    const fromLocalStorage = localStorage.getItem(ANNOUNCEMENTS_LOCAL_STORAGE);
    if (fromLocalStorage) {
      try {
        dismissedOnce = JSON.parse(fromLocalStorage);
      } catch (err) {
        // Value will default to an empty array
      }
    }
    return dismissedOnce;
  },

  initializeFromSessionStorage() {
    const fromSessionStorage = sessionStorage.getItem(
      ANNOUNCEMENTS_SESSION_STORAGE,
    );
    if (fromSessionStorage) {
      try {
        dismissedPerSession = JSON.parse(fromSessionStorage);
      } catch (err) {
        // Value will default to an empty array
      }
    }
    return dismissedPerSession;
  },

  save(dismissedAnnouncementName, show) {
    switch (show) {
      case AnnouncementBehavior.SHOW_ONCE:
        dismissedOnce.push(dismissedAnnouncementName);
        localStorage.setItem(
          ANNOUNCEMENTS_LOCAL_STORAGE,
          JSON.stringify(dismissedOnce),
        );
        break;
      case AnnouncementBehavior.SHOW_ONCE_PER_SESSION:
        dismissedPerSession.push(dismissedAnnouncementName);
        sessionStorage.setItem(
          ANNOUNCEMENTS_SESSION_STORAGE,
          JSON.stringify(dismissedPerSession),
        );
        break;
      default:
        break;
    }
  },
};

export function initDismissedAnnouncements() {
  const localStored = previouslyDismissedAnnouncements.initializeFromLocalStorage();
  const sessionStored = previouslyDismissedAnnouncements.initializeFromSessionStorage();
  return {
    type: INIT_DISMISSED_ANNOUNCEMENTS,
    dismissedAnnouncements: [...localStored, ...sessionStored],
  };
}

export function dismissAnnouncement(announcement, show) {
  if (
    show === AnnouncementBehavior.SHOW_ONCE ||
    show === AnnouncementBehavior.SHOW_ONCE_PER_SESSION
  ) {
    previouslyDismissedAnnouncements.save(announcement, show);
  }

  return {
    type: DISMISS_ANNOUNCEMENT,
    announcement,
  };
}