/** * 공지사항 로컬 스토리지 유틸리티 함수들 * '다시 보지 않기' 기능을 위한 저장 및 확인 로직을 제공합니다. */ export interface NoticeStorageOptions { noticeId: number duration: 'day' | 'never' } /** * 공지사항 '다시 보지 않기' 설정을 로컬 스토리지에 저장합니다. * @param options - 공지사항 ID와 기간 설정 */ export function setNoticeDontShow(options: NoticeStorageOptions): void { const { noticeId, duration } = options if (typeof window === 'undefined') { console.warn('setNoticeDontShow: window 객체가 없습니다. 클라이언트 사이드에서만 사용 가능합니다.') return } try { const key = `notice-${noticeId}-${duration}` let value: string if (duration === 'day') { // 오늘 자정까지의 타임스탬프 계산 const today = new Date() const tomorrow = new Date(today) tomorrow.setDate(tomorrow.getDate() + 1) tomorrow.setHours(0, 0, 0, 0) // 자정으로 설정 value = tomorrow.getTime().toString() } else if (duration === 'never') { // 영구적으로 저장 (매우 먼 미래의 날짜) const neverDate = new Date('2099-12-31T23:59:59.999Z') value = neverDate.getTime().toString() } else { throw new Error(`지원하지 않는 기간 설정입니다: ${duration}`) } localStorage.setItem(key, value) console.log(`공지사항 ${noticeId}의 '다시 보지 않기' 설정을 저장했습니다:`, { key, value, duration }) } catch (error) { console.error('공지사항 설정 저장 중 오류 발생:', error) } } /** * 공지사항의 '다시 보지 않기' 설정이 유효한지 확인합니다. * @param options - 공지사항 ID와 기간 설정 * @returns 설정이 유효하면 true, 만료되었거나 설정되지 않았으면 false */ export function isNoticeDontShowValid(options: NoticeStorageOptions): boolean { const { noticeId, duration } = options if (typeof window === 'undefined') { console.warn('isNoticeDontShowValid: window 객체가 없습니다. 클라이언트 사이드에서만 사용 가능합니다.') return false } try { const key = `notice-${noticeId}-${duration}` const storedValue = localStorage.getItem(key) if (!storedValue) { return false // 설정이 없음 } const expirationTime = parseInt(storedValue, 10) const currentTime = Date.now() if (isNaN(expirationTime)) { console.warn(`잘못된 만료 시간 값입니다: ${storedValue}`) localStorage.removeItem(key) // 잘못된 값은 삭제 return false } const isValid = currentTime < expirationTime if (!isValid) { // 만료된 설정은 자동으로 삭제 localStorage.removeItem(key) console.log(`공지사항 ${noticeId}의 만료된 설정을 삭제했습니다.`) } return isValid } catch (error) { console.error('공지사항 설정 확인 중 오류 발생:', error) return false } } /** * 특정 공지사항의 모든 '다시 보지 않기' 설정을 초기화합니다. * @param noticeId - 공지사항 ID */ export function clearNoticeDontShowSettings(noticeId: number): void { if (typeof window === 'undefined') { console.warn('clearNoticeDontShowSettings: window 객체가 없습니다. 클라이언트 사이드에서만 사용 가능합니다.') return } try { const keysToRemove: string[] = [] // 모든 가능한 키 패턴을 확인 for (let i = 0; i < localStorage.length; i++) { const key = localStorage.key(i) if (key && key.startsWith(`notice-${noticeId}-`)) { keysToRemove.push(key) } } // 모든 관련 키 삭제 keysToRemove.forEach(key => localStorage.removeItem(key)) if (keysToRemove.length > 0) { console.log(`공지사항 ${noticeId}의 모든 '다시 보지 않기' 설정을 초기화했습니다:`, keysToRemove) } } catch (error) { console.error('공지사항 설정 초기화 중 오류 발생:', error) } } /** * 모든 공지사항의 '다시 보지 않기' 설정을 초기화합니다. * 주의: 이 함수는 모든 공지사항 설정을 삭제하므로 신중하게 사용해야 합니다. */ export function clearAllNoticeDontShowSettings(): void { if (typeof window === 'undefined') { console.warn('clearAllNoticeDontShowSettings: window 객체가 없습니다. 클라이언트 사이드에서만 사용 가능합니다.') return } try { const keysToRemove: string[] = [] // 모든 가능한 키 패턴을 확인 for (let i = 0; i < localStorage.length; i++) { const key = localStorage.key(i) if (key && key.startsWith('notice-')) { keysToRemove.push(key) } } // 모든 관련 키 삭제 keysToRemove.forEach(key => localStorage.removeItem(key)) if (keysToRemove.length > 0) { console.log(`모든 공지사항의 '다시 보지 않기' 설정을 초기화했습니다: ${keysToRemove.length}개`) } } catch (error) { console.error('모든 공지사항 설정 초기화 중 오류 발생:', error) } } /** * 현재 로컬 스토리지에서 공지사항과 관련된 모든 키를 조회합니다. * 디버깅 목적으로 사용됩니다. */ export function getAllNoticeStorageKeys(): string[] { if (typeof window === 'undefined') { console.warn('getAllNoticeStorageKeys: window 객체가 없습니다. 클라이언트 사이드에서만 사용 가능합니다.') return [] } try { const keys: string[] = [] for (let i = 0; i < localStorage.length; i++) { const key = localStorage.key(i) if (key && key.startsWith('notice-')) { keys.push(key) } } return keys } catch (error) { console.error('공지사항 키 조회 중 오류 발생:', error) return [] } } /** * 특정 공지사항의 현재 설정 상태를 조회합니다. * 디버깅 목적으로 사용됩니다. */ export function getNoticeStorageInfo(noticeId: number): Array<{ key: string; value: string | null; duration: string }> { if (typeof window === 'undefined') { console.warn('getNoticeStorageInfo: window 객체가 없습니다. 클라이언트 사이드에서만 사용 가능합니다.') return [] } try { const info: Array<{ key: string; value: string | null; duration: string }> = [] for (let i = 0; i < localStorage.length; i++) { const key = localStorage.key(i) if (key && key.startsWith(`notice-${noticeId}-`)) { const value = localStorage.getItem(key) const duration = key.split('-').pop() || 'unknown' info.push({ key, value, duration }) } } return info } catch (error) { console.error('공지사항 정보 조회 중 오류 발생:', error) return [] } }