Skip to content

Commit cfdce82

Browse files
BPerlakiHkelson42
authored andcommitted
Fix categories parsing, when eTag 304 is used
1 parent 2a5195d commit cfdce82

File tree

1 file changed

+39
-3
lines changed

1 file changed

+39
-3
lines changed

ViewModel/LibraryViewModel.swift

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,29 @@ final class LibraryViewModel: ObservableObject {
8787

8888
// refresh library
8989
guard let data = try await fetchData() else {
90-
error = nil
91-
process.state = .complete
92-
return
90+
// this is the case when we have no new data (304 http)
91+
// but we still need to refresh the memory only stored
92+
// zimfile categories to languages dictionary
93+
if CategoriesToLanguages.allCategories().count < 2 {
94+
let context = Database.shared.viewContext
95+
if let zimFiles: [ZimFile] = try? context.fetch(ZimFile.fetchRequest()) {
96+
saveCategoryAvailableInLanguages(fromDBZimFiles: zimFiles)
97+
// populate library language code if there isn't one set already
98+
await setDefaultContentFilterLanguage()
99+
100+
error = nil
101+
process.state = .complete
102+
return
103+
} else {
104+
error = LibraryRefreshError.process
105+
process.state = .error
106+
return
107+
}
108+
} else {
109+
error = nil
110+
process.state = .complete
111+
return
112+
}
93113
}
94114
let parser = try await parse(data: data)
95115
// delete all old ISO Lang Code entries if needed, by passing in an empty parser
@@ -138,6 +158,22 @@ final class LibraryViewModel: ObservableObject {
138158
}
139159
CategoriesToLanguages.save(dictionary)
140160
}
161+
162+
private func saveCategoryAvailableInLanguages(fromDBZimFiles zimFiles: [ZimFile]) {
163+
var dictionary: [Category: Set<String>] = [:]
164+
for zimFile in zimFiles {
165+
let category = Category(rawValue: zimFile.category) ?? .other
166+
let allLanguagesForCategory: Set<String>
167+
let categoryLanguages: Set<String> = Set<String>(zimFile.languageCode.components(separatedBy: ","))
168+
if let existingLanguages = dictionary[category] {
169+
allLanguagesForCategory = existingLanguages.union(categoryLanguages)
170+
} else {
171+
allLanguagesForCategory = categoryLanguages
172+
}
173+
dictionary[category] = allLanguagesForCategory
174+
}
175+
CategoriesToLanguages.save(dictionary)
176+
}
141177

142178
/// The fetched content is filtered by the languages set in settings.
143179
/// We need to make sure, whatever was set by the user is

0 commit comments

Comments
 (0)