0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-02-10 23:36:14 -05:00

Fixed announcement bar close button state (#16699)

refs TryGhost/Team#3095

We should show the announcement bar again in the following case:

- User closes the bar
- Publisher updates announcement content
- We show the bar again even if the user closed it previously in the
same session
This commit is contained in:
Elena Baidakova 2023-04-21 16:58:41 +04:00 committed by GitHub
parent 1538b18d4e
commit bef618c975
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -3,26 +3,36 @@ import React from 'react';
import './AnnouncementBar.css'; import './AnnouncementBar.css';
import {ReactComponent as CloseIcon} from '../icons/clear.svg'; import {ReactComponent as CloseIcon} from '../icons/clear.svg';
export function AnnouncementBar({settings}) { export function AnnouncementBar({settings = {}}) {
const [visible, setVisible] = React.useState(isBarVisible()); const [visible, setVisible] = React.useState(shouldShowBar(settings.announcement));
React.useEffect(() => {
if (!settings.announcement) {
return;
}
if (shouldShowBar(settings.announcement)) {
setVisible(true);
}
}, [settings.announcement]);
const handleButtonClick = () => { const handleButtonClick = () => {
setBarVisibility();
setVisible(false); setVisible(false);
setBarVisibility(false);
}; };
if (!visible) { if (!visible) {
return null; return null;
} }
if (!settings?.announcement) { if (!settings.announcement) {
return null; return null;
} }
let className = 'gh-announcement-bar ' + settings?.announcement_background; let className = 'gh-announcement-bar ' + settings.announcement_background;
return ( return (
<div className={className}> <div className={className}>
<div className="gh-announcement-bar-content" dangerouslySetInnerHTML={{__html: settings?.announcement}}></div> <div className="gh-announcement-bar-content" dangerouslySetInnerHTML={{__html: settings.announcement}}></div>
<button onClick={handleButtonClick}> <button onClick={handleButtonClick}>
<CloseIcon /> <CloseIcon />
</button> </button>
@ -30,11 +40,43 @@ export function AnnouncementBar({settings}) {
); );
} }
const BAR_STORAGE_KEY = 'isAnnouncementBarVisible'; const BAR_VISIBILITY_STORAGE_KEY = 'isAnnouncementBarVisible';
function setBarVisibility(state = 'true') { const BAR_CONTENT_STORAGE_KEY = 'announcementBarContent';
sessionStorage.setItem(BAR_STORAGE_KEY, state);
function shouldShowBar(content) {
const contentChanged = isContentChanged(content);
if (contentChanged) {
setBarVisibility(true);
setContent(content);
return true;
}
const isBarVisible = getBarVisibility();
return !!isBarVisible;
} }
function isBarVisible() { function setContent(content) {
return !sessionStorage.getItem(BAR_STORAGE_KEY); sessionStorage.setItem(BAR_CONTENT_STORAGE_KEY, content);
}
function isContentChanged(content) {
if (!content) {
return false;
}
const prevContent = sessionStorage.getItem(BAR_CONTENT_STORAGE_KEY);
return content !== prevContent;
}
function setBarVisibility(state) {
if (state) {
sessionStorage.setItem(BAR_VISIBILITY_STORAGE_KEY, state);
} else {
sessionStorage.removeItem(BAR_VISIBILITY_STORAGE_KEY);
}
}
function getBarVisibility() {
return sessionStorage.getItem(BAR_VISIBILITY_STORAGE_KEY);
} }