From 9dff6c341ffdf861c99ad236137d4c39f4c905da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=B1=B1=E5=BF=86?= Date: Tue, 24 Jun 2025 11:36:33 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90fix=E3=80=91Fixed=20rule=20selection?= =?UTF-8?q?=20bug=20and=20some=20code=20optimizations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Localization/Localizations/Localizable.xcstrings | 12 ++---------- qBitControl/Models/RSSFeed.swift | 2 +- qBitControl/Models/RSSRule.swift | 16 ++++++++++------ .../ViewModels/RSSView/RSSRulesViewModel.swift | 6 +++--- .../Views/RSSViews/RSSRuleDetailView.swift | 11 ++++++----- qBitControl/Views/RSSViews/RSSRulesView.swift | 9 ++------- 6 files changed, 24 insertions(+), 32 deletions(-) diff --git a/Localization/Localizations/Localizable.xcstrings b/Localization/Localizations/Localizable.xcstrings index 4230c6d..61f42fe 100644 --- a/Localization/Localizations/Localizable.xcstrings +++ b/Localization/Localizations/Localizable.xcstrings @@ -6511,15 +6511,11 @@ } }, "Rule name already exists" : { - - }, - "Rule name already exists." : { - "extractionState" : "stale", "localizations" : { "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ルール名はすでに存在します" + "value" : "ルール名はすでに存在します\n" } }, "zh-Hans" : { @@ -6537,15 +6533,11 @@ } }, "Rule name cannot be empty" : { - - }, - "Rule name cannot be empty." : { - "extractionState" : "stale", "localizations" : { "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ルール名は空にできません" + "value" : "ルール名は空欄にできません" } }, "zh-Hans" : { diff --git a/qBitControl/Models/RSSFeed.swift b/qBitControl/Models/RSSFeed.swift index f3bb9a7..e624956 100644 --- a/qBitControl/Models/RSSFeed.swift +++ b/qBitControl/Models/RSSFeed.swift @@ -4,7 +4,7 @@ import Foundation struct RSSFeed: Decodable, Identifiable { - var id: UUID { UUID() } + var id: String { url ?? UUID().uuidString } let url: String? let uid: String? let isLoading: Bool? diff --git a/qBitControl/Models/RSSRule.swift b/qBitControl/Models/RSSRule.swift index 702c1b2..c7c2741 100644 --- a/qBitControl/Models/RSSRule.swift +++ b/qBitControl/Models/RSSRule.swift @@ -71,6 +71,12 @@ struct RSSRule: Codable { } class RSSRuleModel: ObservableObject, Identifiable { + struct RSSMatchItem: Identifiable { + let id = UUID() + var type: String + var title: String + } + let id = UUID() var title: String = "" var rule: RSSRule @@ -82,6 +88,10 @@ class RSSRuleModel: ObservableObject, Identifiable { self.rule = rule } + static func defauleAddRule() -> RSSRuleModel { + RSSRuleModel(title: "", rule: .defaultAdd) + } + func getArticlesMatching() { guard !isLoading else { return } isLoading = true @@ -97,9 +107,3 @@ class RSSRuleModel: ObservableObject, Identifiable { } } } - -struct RSSMatchItem: Identifiable { - let id = UUID() - var type: String - var title: String -} diff --git a/qBitControl/ViewModels/RSSView/RSSRulesViewModel.swift b/qBitControl/ViewModels/RSSView/RSSRulesViewModel.swift index 29cf61b..45f4ffd 100644 --- a/qBitControl/ViewModels/RSSView/RSSRulesViewModel.swift +++ b/qBitControl/ViewModels/RSSView/RSSRulesViewModel.swift @@ -47,11 +47,11 @@ class RSSRulesViewModel: ObservableObject { guard !isLoading else { return } isLoading = true Task { - _ = await qBittorrent.removeRSSRule(name: name) + let success = await qBittorrent.removeRSSRule(name: name) await MainActor.run { isLoading = false - if let index = rssRules.firstIndex(where: { $0.title == name }) { - rssRules.remove(at: index) + if success { + rssRules.removeAll { $0.title == name } } } } diff --git a/qBitControl/Views/RSSViews/RSSRuleDetailView.swift b/qBitControl/Views/RSSViews/RSSRuleDetailView.swift index 313ee45..b463cd2 100644 --- a/qBitControl/Views/RSSViews/RSSRuleDetailView.swift +++ b/qBitControl/Views/RSSViews/RSSRuleDetailView.swift @@ -58,7 +58,6 @@ struct RSSRuleDetailView: View { } } } - .environment(\.editMode, $editMode) if !isAdd { Section(header: Text("Matching Articles")) { ForEach(rule.filterResult) { @@ -86,13 +85,15 @@ struct RSSRuleDetailView: View { } private func saveRule() { - guard validateName() else { return } + if isAdd, !validateName(){ return } rule.rule.affectedFeeds = Array(selectedFeedURLs) viewModel.setRSSRule(rule) { success in - if success { + guard success else { return } + viewModel.getRssRules() + if isAdd { + dismiss() + } else { rule.getArticlesMatching() - viewModel.getRssRules() - if isAdd { dismiss() } } } } diff --git a/qBitControl/Views/RSSViews/RSSRulesView.swift b/qBitControl/Views/RSSViews/RSSRulesView.swift index b2db310..8395ca0 100644 --- a/qBitControl/Views/RSSViews/RSSRulesView.swift +++ b/qBitControl/Views/RSSViews/RSSRulesView.swift @@ -24,10 +24,8 @@ struct RSSRulesView: View { rule.rule.enabled }, set: { rule.rule.enabled = $0 - })) - .onChange(of: rule.rule.enabled) { _ in viewModel.setRSSRule(rule) - } + })) }.contextMenu { ruleItemMenu(name: rule.title) } @@ -47,10 +45,7 @@ struct RSSRulesView: View { content: { NavigationView { RSSRuleDetailView( - rule: RSSRuleModel( - title: "", - rule: .defaultAdd - ), + rule: .defauleAddRule(), isAdd: true ) }