v1.3.2: 어나운스 바 슬라이드·설정 내비 아이콘

어나운스 바는 숨김 확인 후 슬라이드 인/아웃하고 7일간 보지 않기를 지원한다. 설정 좌측 내비에 타임존·메인 화면·어나운스·Import/Export·스팸 필터 아이콘을 추가한다.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-05-19 16:23:20 +09:00
parent b77f37a94e
commit b6a3228b09
7 changed files with 325 additions and 90 deletions

View File

@@ -62,3 +62,103 @@ export const normalizeAnnouncementUrl = (url) => {
return ''
}
/** @type {string} 어나운스 바 7일 숨김 localStorage 키 */
export const ANNOUNCEMENT_DISMISS_STORAGE_KEY = 'SITE_ANNOUNCEMENT_DISMISS'
/** @type {string} 어나운스 바 이번 방문(세션) 숨김 sessionStorage 키 */
export const ANNOUNCEMENT_SESSION_DISMISS_KEY = 'SITE_ANNOUNCEMENT_SESSION_DISMISS'
/** @type {number} 기본 숨김 일수 */
export const ANNOUNCEMENT_SNOOZE_DAYS = 7
/**
* 어나운스 바 닫기 식별 키(설정 저장 시각)
* @param {{ updatedAt?: string | null }} settings - 사이트 설정
* @returns {string} 식별 키
*/
export const getAnnouncementDismissKey = (settings) => settings?.updatedAt || ''
/**
* 어나운스 바가 숨김 상태인지 확인한다.
* @param {{ updatedAt?: string | null }} settings - 사이트 설정
* @returns {boolean} 숨김 여부
*/
export const isAnnouncementDismissed = (settings) => {
if (!import.meta.client) {
return false
}
const key = getAnnouncementDismissKey(settings)
if (!key) {
return false
}
const sessionDismissed = sessionStorage.getItem(ANNOUNCEMENT_SESSION_DISMISS_KEY)
if (sessionDismissed === key) {
return true
}
const raw = localStorage.getItem(ANNOUNCEMENT_DISMISS_STORAGE_KEY)
if (!raw) {
return false
}
try {
const parsed = JSON.parse(raw)
if (parsed?.key !== key) {
return false
}
if (typeof parsed.until === 'number' && Date.now() < parsed.until) {
return true
}
if (parsed.until == null && parsed.key === key) {
return true
}
} catch {
return false
}
return false
}
/**
* 이번 브라우저 방문(세션) 동안만 어나운스 바를 숨긴다.
* @param {{ updatedAt?: string | null }} settings - 사이트 설정
* @returns {void}
*/
export const dismissAnnouncementForSession = (settings) => {
if (!import.meta.client) {
return
}
const key = getAnnouncementDismissKey(settings)
if (!key) {
return
}
sessionStorage.setItem(ANNOUNCEMENT_SESSION_DISMISS_KEY, key)
}
/**
* 지정 일수 동안 어나운스 바를 숨긴다.
* @param {{ updatedAt?: string | null }} settings - 사이트 설정
* @param {number} [days=ANNOUNCEMENT_SNOOZE_DAYS] - 숨김 일수
* @returns {void}
*/
export const dismissAnnouncementForDays = (settings, days = ANNOUNCEMENT_SNOOZE_DAYS) => {
if (!import.meta.client) {
return
}
const key = getAnnouncementDismissKey(settings)
if (!key) {
return
}
const until = Date.now() + days * 24 * 60 * 60 * 1000
localStorage.setItem(ANNOUNCEMENT_DISMISS_STORAGE_KEY, JSON.stringify({ key, until }))
sessionStorage.setItem(ANNOUNCEMENT_SESSION_DISMISS_KEY, key)
}