Prevent crashes and duplicates in import operations

This commit is contained in:
Beingpax 2025-12-28 12:26:50 +05:45
parent a631043167
commit 7beb63e3c6
2 changed files with 29 additions and 5 deletions

View File

@ -27,7 +27,8 @@ class DictionaryImportExportService {
var wordReplacements: [String: String] = [:]
let replacementsDescriptor = FetchDescriptor<WordReplacement>()
if let replacements = try? context.fetch(replacementsDescriptor) {
wordReplacements = Dictionary(uniqueKeysWithValues: replacements.map { ($0.originalText, $0.replacementText) })
// Use uniquingKeysWith to handle potential duplicates gracefully (keep first occurrence)
wordReplacements = Dictionary(replacements.map { ($0.originalText, $0.replacementText) }, uniquingKeysWith: { first, _ in first })
}
let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "1.0.0"
@ -121,7 +122,6 @@ class DictionaryImportExportService {
let importedWords = self.extractWords(from: normalizedImportedKey)
// Check for conflicts and update existing replacements
var hasConflict = false
for existingReplacement in existingReplacements {
var existingWords = self.extractWords(from: existingReplacement.originalText)
var modified = false
@ -130,7 +130,6 @@ class DictionaryImportExportService {
if let index = existingWords.firstIndex(where: { $0.lowercased() == importedWord.lowercased() }) {
existingWords.remove(at: index)
modified = true
hasConflict = true
}
}

View File

@ -235,9 +235,34 @@ class ImportExportService {
// Import word replacements to SwiftData
if let replacementsToImport = importedSettings.wordReplacements {
let replacementsDescriptor = FetchDescriptor<WordReplacement>()
let existingReplacements = (try? whisperState.modelContext.fetch(replacementsDescriptor)) ?? []
// Build a set of existing replacement keys for duplicate checking
var existingKeysSet = Set<String>()
for existing in existingReplacements {
let tokens = existing.originalText
.split(separator: ",")
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() }
.filter { !$0.isEmpty }
existingKeysSet.formUnion(tokens)
}
for (original, replacement) in replacementsToImport {
let newReplacement = WordReplacement(originalText: original, replacementText: replacement)
whisperState.modelContext.insert(newReplacement)
let importTokens = original
.split(separator: ",")
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() }
.filter { !$0.isEmpty }
// Check if any token already exists
let hasConflict = importTokens.contains { existingKeysSet.contains($0) }
if !hasConflict {
let newReplacement = WordReplacement(originalText: original, replacementText: replacement)
whisperState.modelContext.insert(newReplacement)
// Add these tokens to the set to prevent duplicates within the import
existingKeysSet.formUnion(importTokens)
}
}
try? whisperState.modelContext.save()
print("Successfully imported word replacements to SwiftData.")