summaryrefslogtreecommitdiff
path: root/lib/notice/storage-utils.ts
blob: 41a512d81060a3495664df8c592a968d694a50fb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
/**
 * 공지사항 로컬 스토리지 유틸리티 함수들
 * '다시 보지 않기' 기능을 위한 저장 및 확인 로직을 제공합니다.
 */

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 []
  }
}