Skip to content

Commit f64319e

Browse files
committed
♻️ refactor: extract UserDefaults keys to interface modules for widget access
Move UserDefaults key definitions from repository implementations to interface modules, enabling widgets to access the same keys without duplicating magic strings. Also fix CircleBadge color parameter and remove typo in TimetablePainter comment.
1 parent f96d2e8 commit f64319e

File tree

7 files changed

+35
-19
lines changed

7 files changed

+35
-19
lines changed

SNUTT/Modules/Feature/Themes/Sources/Infra/ThemeUserDefaultsRepository.swift

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,15 @@ struct ThemeUserDefaultsRepository: ThemeLocalRepository {
1515
@Dependency(\.widgetReloader) private var widgetReloader
1616

1717
func loadAvailableThemes() -> [Theme] {
18-
guard let data = userDefaults.data(forKey: Keys.availableThemes.rawValue),
18+
guard let data = userDefaults.data(forKey: ThemeUserDefaultsKeys.availableThemes.rawValue),
1919
let themes = try? JSONDecoder().decode([Theme].self, from: data)
2020
else { return [] }
2121
return themes
2222
}
2323

2424
func storeAvailableThemes(_ themes: [Theme]) {
2525
guard let data = try? JSONEncoder().encode(themes) else { return }
26-
userDefaults.set(data, forKey: Keys.availableThemes.rawValue)
26+
userDefaults.set(data, forKey: ThemeUserDefaultsKeys.availableThemes.rawValue)
2727
widgetReloader.reloadAll()
2828
}
29-
30-
private enum Keys: String {
31-
case availableThemes
32-
}
3329
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//
2+
// ThemeUserDefaultsKeys.swift
3+
// SNUTT
4+
//
5+
// Copyright © 2026 wafflestudio.com. All rights reserved.
6+
//
7+
8+
public enum ThemeUserDefaultsKeys: String {
9+
case availableThemes
10+
}

SNUTT/Modules/Feature/Timetable/Sources/Infra/TimetableUserDefaultsRepository.swift

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ struct TimetableUserDefaultsRepository: TimetableLocalRepository {
1616
@Dependency(\.widgetReloader) private var widgetReloader
1717

1818
func loadSelectedTimetable() throws -> Timetable {
19-
try userDefaults.object(forKey: Keys.currentTimetable.rawValue, type: Timetable.self)
19+
try userDefaults.object(forKey: TimetableUserDefaultsKeys.currentTimetable.rawValue, type: Timetable.self)
2020
}
2121

2222
func storeSelectedTimetable(_ timetable: Timetable) throws {
2323
let data = try JSONEncoder().encode(timetable)
24-
userDefaults.set(data, forKey: Keys.currentTimetable.rawValue)
24+
userDefaults.set(data, forKey: TimetableUserDefaultsKeys.currentTimetable.rawValue)
2525
widgetReloader.reloadAll()
2626
}
2727

@@ -35,19 +35,18 @@ struct TimetableUserDefaultsRepository: TimetableLocalRepository {
3535
}
3636

3737
func configurationValues() -> AsyncStream<TimetableConfiguration> {
38-
userDefaults.dataValues(forKey: "timetableConfiguration").compactMap {
38+
userDefaults.dataValues(forKey: TimetableUserDefaultsKeys.timetableConfiguration.rawValue).compactMap {
3939
guard let data = $0 else { return nil }
4040
return try? JSONDecoder().decode(TimetableConfiguration.self, from: data)
4141
}.eraseToStream()
4242
}
43-
44-
private enum Keys: String {
45-
case currentTimetable
46-
}
4743
}
4844

4945
extension UserDefaultsEntryDefinitions {
5046
var timetableConfiguration: UserDefaultsEntry<TimetableConfiguration> {
51-
UserDefaultsEntry(key: "timetableConfiguration", defaultValue: TimetableConfiguration())
47+
UserDefaultsEntry(
48+
key: TimetableUserDefaultsKeys.timetableConfiguration.rawValue,
49+
defaultValue: TimetableConfiguration()
50+
)
5251
}
5352
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//
2+
// TimetableUserDefaultsKeys.swift
3+
// SNUTT
4+
//
5+
// Copyright © 2026 wafflestudio.com. All rights reserved.
6+
//
7+
8+
public enum TimetableUserDefaultsKeys: String {
9+
case currentTimetable
10+
case timetableConfiguration
11+
}

SNUTT/Modules/Feature/TimetableUIComponents/Sources/Presentation/TimetablePainter.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ extension TimetablePainter {
4040
return max((containerSize.height - weekdayHeight) / CGFloat(hourCount), 0)
4141
}
4242

43-
/// 시간표 그리드의 시간 행 렌더링을 위한 높이와 개수를 계산한다..
43+
/// 시간표 그리드의 시간 행 렌더링을 위한 높이와 개수를 계산한다.
4444
///
4545
/// 1. `geometry.size`를 기준으로 이상적인 한 시간의 높이(`hourHeight`)를 계산한다.
4646
/// 2. `geometry.extendedContainerSize`의 가용 높이(weekdayHeight 제외)를 `hourHeight`로 나누어

SNUTT/Modules/Shared/SharedUIComponents/Sources/CircleBadge.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct CircleBadgeModifier: ViewModifier {
3030
content
3131

3232
if condition {
33-
CircleBadge(color: .red)
33+
CircleBadge(color: color)
3434
}
3535
}
3636
}

SNUTT/SNUTTWidget/Sources/SNUTTWidgetDataSource.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,21 @@ final class SNUTTWidgetDataSource {
2222
}
2323

2424
var currentTimetable: Timetable? {
25-
guard let data = userDefaults.data(forKey: "currentTimetable"),
25+
guard let data = userDefaults.data(forKey: TimetableUserDefaultsKeys.currentTimetable.rawValue),
2626
let timetable = try? JSONDecoder().decode(Timetable.self, from: data)
2727
else { return nil }
2828
return timetable
2929
}
3030

3131
var timetableConfiguration: TimetableConfiguration {
32-
guard let data = userDefaults.data(forKey: "timetableConfiguration"),
32+
guard let data = userDefaults.data(forKey: TimetableUserDefaultsKeys.timetableConfiguration.rawValue),
3333
let configuration = try? JSONDecoder().decode(TimetableConfiguration.self, from: data)
3434
else { return .init() }
3535
return configuration
3636
}
3737

3838
var availableThemes: [Theme] {
39-
guard let data = userDefaults.data(forKey: "availableThemes"),
39+
guard let data = userDefaults.data(forKey: ThemeUserDefaultsKeys.availableThemes.rawValue),
4040
let themes = try? JSONDecoder().decode([Theme].self, from: data)
4141
else { return [] }
4242
return themes

0 commit comments

Comments
 (0)