diff --git a/Ferrite.xcodeproj/project.pbxproj b/Ferrite.xcodeproj/project.pbxproj index d7ebec3..694903e 100644 --- a/Ferrite.xcodeproj/project.pbxproj +++ b/Ferrite.xcodeproj/project.pbxproj @@ -137,6 +137,8 @@ 0CBC7705288DE7F40054BE44 /* PersistenceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CBC7704288DE7F40054BE44 /* PersistenceController.swift */; }; 0CC389532970AD900066D06F /* Action+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CC389512970AD900066D06F /* Action+CoreDataClass.swift */; }; 0CC389542970AD900066D06F /* Action+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CC389522970AD900066D06F /* Action+CoreDataProperties.swift */; }; + 0CD4030A29DA01B6008D9F03 /* PluginInfoMetaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CD4030929DA01B6008D9F03 /* PluginInfoMetaView.swift */; }; + 0CD4030C29DA0222008D9F03 /* PluginInfoAboutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CD4030B29DA0222008D9F03 /* PluginInfoAboutView.swift */; }; 0CD4CAC628C980EB0046E1DC /* HistoryActionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CD4CAC528C980EB0046E1DC /* HistoryActionsView.swift */; }; 0CD5E78928CD932B001BF684 /* DisabledAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CD5E78828CD932B001BF684 /* DisabledAppearance.swift */; }; 0CD5F1FB299BEFBE00476DDB /* CustomScopeBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CD5F1FA299BEFBE00476DDB /* CustomScopeBar.swift */; }; @@ -277,6 +279,8 @@ 0CC389512970AD900066D06F /* Action+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Action+CoreDataClass.swift"; sourceTree = ""; }; 0CC389522970AD900066D06F /* Action+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Action+CoreDataProperties.swift"; sourceTree = ""; }; 0CC6E4D428A45BA000AF2BCC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + 0CD4030929DA01B6008D9F03 /* PluginInfoMetaView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PluginInfoMetaView.swift; sourceTree = ""; }; + 0CD4030B29DA0222008D9F03 /* PluginInfoAboutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PluginInfoAboutView.swift; sourceTree = ""; }; 0CD4CAC528C980EB0046E1DC /* HistoryActionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryActionsView.swift; sourceTree = ""; }; 0CD5E78828CD932B001BF684 /* DisabledAppearance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisabledAppearance.swift; sourceTree = ""; }; 0CD5F1FA299BEFBE00476DDB /* CustomScopeBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomScopeBar.swift; sourceTree = ""; }; @@ -420,6 +424,7 @@ 0C3E00D4296F560800ECECB2 /* Plugin */ = { isa = PBXGroup; children = ( + 0CD4030829DA01A3008D9F03 /* Info */, 0C44E2AA28D4E09B007711AE /* Buttons */, 0C794B65289DAC9F00DD1CC8 /* Source */, 0C0D50E6288DFF850035ECC8 /* PluginAggregateView.swift */, @@ -665,6 +670,15 @@ path = DataManagement; sourceTree = ""; }; + 0CD4030829DA01A3008D9F03 /* Info */ = { + isa = PBXGroup; + children = ( + 0CD4030929DA01B6008D9F03 /* PluginInfoMetaView.swift */, + 0CD4030B29DA0222008D9F03 /* PluginInfoAboutView.swift */, + ); + path = Info; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -794,8 +808,10 @@ 0CD5E78928CD932B001BF684 /* DisabledAppearance.swift in Sources */, 0CA148DB288903F000DE2211 /* NavView.swift in Sources */, 0CA3B23C28C2AA5600616D3A /* Bookmark+CoreDataClass.swift in Sources */, + 0CD4030A29DA01B6008D9F03 /* PluginInfoMetaView.swift in Sources */, 0C750745289B003E004B3906 /* SourceRssParser+CoreDataProperties.swift in Sources */, 0CA3FB2028B91D9500FA10A8 /* IndeterminateProgressView.swift in Sources */, + 0CD4030C29DA0222008D9F03 /* PluginInfoAboutView.swift in Sources */, 0C50055A2992BA6A0064606A /* PluginTag+CoreDataClass.swift in Sources */, 0C1A3E5229C8A7F500DA9730 /* SettingsModels.swift in Sources */, 0CBC7705288DE7F40054BE44 /* PersistenceController.swift in Sources */, @@ -1129,7 +1145,7 @@ repositoryURL = "https://github.com/siteline/SwiftUI-Introspect/"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 0.2.2; + minimumVersion = 0.2.3; }; }; 0C4CFC442897030D00AD9FAD /* XCRemoteSwiftPackageReference "Regex" */ = { diff --git a/Ferrite/DataManagement/Classes/Action+CoreDataProperties.swift b/Ferrite/DataManagement/Classes/Action+CoreDataProperties.swift index 923d5ac..3ee9362 100644 --- a/Ferrite/DataManagement/Classes/Action+CoreDataProperties.swift +++ b/Ferrite/DataManagement/Classes/Action+CoreDataProperties.swift @@ -19,6 +19,8 @@ public extension Action { @NSManaged var name: String @NSManaged var deeplink: String? @NSManaged var version: Int16 + @NSManaged var about: String? + @NSManaged var website: String? @NSManaged var requires: [String] @NSManaged var author: String @NSManaged var enabled: Bool diff --git a/Ferrite/DataManagement/Classes/Source+CoreDataProperties.swift b/Ferrite/DataManagement/Classes/Source+CoreDataProperties.swift index 01e6750..90eb2c9 100644 --- a/Ferrite/DataManagement/Classes/Source+CoreDataProperties.swift +++ b/Ferrite/DataManagement/Classes/Source+CoreDataProperties.swift @@ -15,9 +15,10 @@ public extension Source { } @NSManaged var id: UUID - @NSManaged var baseUrl: String? + @NSManaged var about: String? + @NSManaged var website: String? + @NSManaged var dynamicWebsite: Bool @NSManaged var fallbackUrls: [String]? - @NSManaged var dynamicBaseUrl: Bool @NSManaged var enabled: Bool @NSManaged var name: String @NSManaged var author: String diff --git a/Ferrite/DataManagement/FerriteDB.xcdatamodeld/FerriteDB_v2.xcdatamodel/contents b/Ferrite/DataManagement/FerriteDB.xcdatamodeld/FerriteDB_v2.xcdatamodel/contents index 21b7c00..eb3bb9c 100644 --- a/Ferrite/DataManagement/FerriteDB.xcdatamodeld/FerriteDB_v2.xcdatamodel/contents +++ b/Ferrite/DataManagement/FerriteDB.xcdatamodeld/FerriteDB_v2.xcdatamodel/contents @@ -1,6 +1,7 @@ + @@ -9,6 +10,7 @@ + @@ -53,9 +55,9 @@ + - - + @@ -64,6 +66,7 @@ + diff --git a/Ferrite/Models/ActionModels.swift b/Ferrite/Models/ActionModels.swift index 8911d87..59dd4f2 100644 --- a/Ferrite/Models/ActionModels.swift +++ b/Ferrite/Models/ActionModels.swift @@ -11,6 +11,8 @@ public struct ActionJson: Codable, Hashable, PluginJson { public let name: String public let version: Int16 let minVersion: String? + let about: String? + let website: String? let requires: [ActionRequirement] let deeplink: [DeeplinkActionJson]? public let author: String? @@ -21,6 +23,8 @@ public struct ActionJson: Codable, Hashable, PluginJson { public init(name: String, version: Int16, minVersion: String?, + about: String?, + website: String?, requires: [ActionRequirement], deeplink: [DeeplinkActionJson]?, author: String?, @@ -31,6 +35,8 @@ public struct ActionJson: Codable, Hashable, PluginJson { self.name = name self.version = version self.minVersion = minVersion + self.about = about + self.website = website self.requires = requires self.deeplink = deeplink self.author = author @@ -44,6 +50,8 @@ public struct ActionJson: Codable, Hashable, PluginJson { name = try container.decode(String.self, forKey: .name) version = try container.decode(Int16.self, forKey: .version) minVersion = try container.decodeIfPresent(String.self, forKey: .minVersion) + about = try container.decodeIfPresent(String.self, forKey: .about) + website = try container.decodeIfPresent(String.self, forKey: .website) requires = try container.decode([ActionRequirement].self, forKey: .requires) author = try container.decodeIfPresent(String.self, forKey: .author) listId = nil diff --git a/Ferrite/Models/SourceModels.swift b/Ferrite/Models/SourceModels.swift index 6384c72..b0f7d91 100644 --- a/Ferrite/Models/SourceModels.swift +++ b/Ferrite/Models/SourceModels.swift @@ -16,9 +16,10 @@ public struct SourceJson: Codable, Hashable, Sendable, PluginJson { public let name: String public let version: Int16 let minVersion: String? - let baseUrl: String? + let about: String? + let website: String? + let dynamicWebsite: Bool? let fallbackUrls: [String]? - let dynamicBaseUrl: Bool? let trackers: [String]? let api: SourceApiJson? let jsonParser: SourceJsonParserJson? diff --git a/Ferrite/Protocols/Plugin.swift b/Ferrite/Protocols/Plugin.swift index 1e2faa4..adbe1ee 100644 --- a/Ferrite/Protocols/Plugin.swift +++ b/Ferrite/Protocols/Plugin.swift @@ -14,6 +14,8 @@ public protocol Plugin: ObservableObject, NSManagedObject { var name: String { get set } var version: Int16 { get set } var author: String { get set } + var about: String? { get set } + var website: String? { get set } var enabled: Bool { get set } var tags: NSOrderedSet? { get set } func getTags() -> [PluginTagJson] diff --git a/Ferrite/ViewModels/PluginManager.swift b/Ferrite/ViewModels/PluginManager.swift index dfa0b06..b2f64bd 100644 --- a/Ferrite/ViewModels/PluginManager.swift +++ b/Ferrite/ViewModels/PluginManager.swift @@ -124,9 +124,10 @@ public class PluginManager: ObservableObject { name: inputJson.name, version: inputJson.version, minVersion: inputJson.minVersion, - baseUrl: inputJson.baseUrl, + about: inputJson.about, + website: inputJson.website, + dynamicWebsite: inputJson.dynamicWebsite, fallbackUrls: inputJson.fallbackUrls, - dynamicBaseUrl: inputJson.dynamicBaseUrl, trackers: inputJson.trackers, api: inputJson.api, jsonParser: inputJson.jsonParser, @@ -154,6 +155,8 @@ public class PluginManager: ObservableObject { name: inputJson.name, version: inputJson.version, minVersion: inputJson.minVersion, + about: inputJson.about, + website: inputJson.website, requires: inputJson.requires, deeplink: filteredDeeplinks, author: pluginList.author, @@ -409,6 +412,8 @@ public class PluginManager: ObservableObject { newAction.id = UUID() newAction.name = actionJson.name newAction.version = actionJson.version + newAction.website = actionJson.website + newAction.about = actionJson.about newAction.author = actionJson.author ?? "Unknown" newAction.listId = actionJson.listId newAction.requires = actionJson.requires.map(\.rawValue) @@ -448,9 +453,9 @@ public class PluginManager: ObservableObject { let backgroundContext = PersistenceController.shared.backgroundContext // If there's no base URL and it isn't dynamic, return before any transactions occur - let dynamicBaseUrl = sourceJson.dynamicBaseUrl ?? false - if !dynamicBaseUrl, sourceJson.baseUrl == nil { - await logManager?.error("Not adding this source because base URL parameters are malformed. Please contact the source dev.") + let dynamicWebsite = sourceJson.dynamicWebsite ?? false + if !dynamicWebsite, sourceJson.website == nil { + await logManager?.error("Not adding this source because website parameters are malformed. Please contact the source dev.") return } @@ -472,9 +477,10 @@ public class PluginManager: ObservableObject { newSource.id = UUID() newSource.name = sourceJson.name newSource.version = sourceJson.version - newSource.dynamicBaseUrl = dynamicBaseUrl - newSource.baseUrl = sourceJson.baseUrl - newSource.fallbackUrls = dynamicBaseUrl ? nil : sourceJson.fallbackUrls + newSource.about = sourceJson.about + newSource.website = sourceJson.website + newSource.dynamicWebsite = dynamicWebsite + newSource.fallbackUrls = dynamicWebsite ? nil : sourceJson.fallbackUrls newSource.author = sourceJson.author ?? "Unknown" newSource.listId = sourceJson.listId newSource.trackers = sourceJson.trackers diff --git a/Ferrite/ViewModels/ScrapingViewModel.swift b/Ferrite/ViewModels/ScrapingViewModel.swift index d75cb59..1e047b1 100644 --- a/Ferrite/ViewModels/ScrapingViewModel.swift +++ b/Ferrite/ViewModels/ScrapingViewModel.swift @@ -144,7 +144,7 @@ class ScrapingViewModel: ObservableObject { } func executeParser(source: Source) async -> SearchRequestResult? { - guard let baseUrl = source.baseUrl else { + guard let website = source.website else { await logManager?.error("Scraping: The base URL could not be found for source \(source.name)") return nil @@ -167,7 +167,7 @@ class ScrapingViewModel: ObservableObject { } let data = await handleUrls( - baseUrl: baseUrl, + website: website, replacedSearchUrl: replacedSearchUrl, fallbackUrls: source.fallbackUrls, sourceName: source.name @@ -176,7 +176,7 @@ class ScrapingViewModel: ObservableObject { if let data, let html = String(data: data, encoding: .utf8) { - return await scrapeHtml(source: source, baseUrl: baseUrl, html: html) + return await scrapeHtml(source: source, website: website, html: html) } } case .rss: @@ -194,7 +194,7 @@ class ScrapingViewModel: ObservableObject { ) } else { data = await handleUrls( - baseUrl: baseUrl, + website: website, replacedSearchUrl: replacedSearchUrl, fallbackUrls: source.fallbackUrls, sourceName: source.name @@ -220,7 +220,7 @@ class ScrapingViewModel: ObservableObject { replacement: "{clientId}", searchUrl: replacedSearchUrl, apiUrl: sourceApi.apiUrl, - baseUrl: baseUrl, + website: website, sourceName: source.name) { replacedSearchUrl = newSearchUrl @@ -233,7 +233,7 @@ class ScrapingViewModel: ObservableObject { replacement: "{secret}", searchUrl: replacedSearchUrl, apiUrl: sourceApi.apiUrl, - baseUrl: baseUrl, + website: website, sourceName: source.name) { replacedSearchUrl = newSearchUrl @@ -241,9 +241,9 @@ class ScrapingViewModel: ObservableObject { } } - let passedUrl = source.api?.apiUrl ?? baseUrl + let passedUrl = source.api?.apiUrl ?? website let data = await handleUrls( - baseUrl: passedUrl, + website: passedUrl, replacedSearchUrl: replacedSearchUrl, fallbackUrls: source.fallbackUrls, sourceName: source.name @@ -261,8 +261,8 @@ class ScrapingViewModel: ObservableObject { } // Checks the base URL for any website data then iterates through the fallback URLs - func handleUrls(baseUrl: String, replacedSearchUrl: String?, fallbackUrls: [String]?, sourceName: String) async -> Data? { - let fetchUrl = baseUrl + (replacedSearchUrl.map { $0 } ?? "") + func handleUrls(website: String, replacedSearchUrl: String?, fallbackUrls: [String]?, sourceName: String) async -> Data? { + let fetchUrl = website + (replacedSearchUrl.map { $0 } ?? "") if let data = await fetchWebsiteData(urlString: fetchUrl, sourceName: sourceName) { return data } @@ -283,7 +283,7 @@ class ScrapingViewModel: ObservableObject { replacement: String, searchUrl: String, apiUrl: String?, - baseUrl: String, + website: String, sourceName: String) async -> String? { // Is the credential expired @@ -302,7 +302,7 @@ class ScrapingViewModel: ObservableObject { credential.value == nil || isExpired, let credentialUrl = credential.urlString, let newValue = await fetchApiCredential( - urlString: (apiUrl ?? baseUrl) + credentialUrl, + urlString: (apiUrl ?? website) + credentialUrl, credential: credential, sourceName: sourceName ) @@ -733,7 +733,7 @@ class ScrapingViewModel: ObservableObject { } // HTML scraper - public func scrapeHtml(source: Source, baseUrl: String, html: String) async -> SearchRequestResult? { + public func scrapeHtml(source: Source, website: String, html: String) async -> SearchRequestResult? { guard let htmlParser = source.htmlParser else { return nil } @@ -783,7 +783,7 @@ class ScrapingViewModel: ObservableObject { continue } - let replacedMagnetUrl = externalMagnetUrl.starts(with: "/") ? baseUrl + externalMagnetUrl : externalMagnetUrl + let replacedMagnetUrl = externalMagnetUrl.starts(with: "/") ? website + externalMagnetUrl : externalMagnetUrl guard let data = await fetchWebsiteData(urlString: replacedMagnetUrl, sourceName: source.name), let magnetHtml = String(data: data, encoding: .utf8) diff --git a/Ferrite/Views/ComponentViews/Plugin/Info/PluginInfoAboutView.swift b/Ferrite/Views/ComponentViews/Plugin/Info/PluginInfoAboutView.swift new file mode 100644 index 0000000..b6c95c5 --- /dev/null +++ b/Ferrite/Views/ComponentViews/Plugin/Info/PluginInfoAboutView.swift @@ -0,0 +1,30 @@ +// +// PluginInfoAboutView.swift +// Ferrite +// +// Created by Brian Dashore on 4/2/23. +// + +import SwiftUI + +struct PluginInfoAboutView: View { + @ObservedObject var selectedPlugin: P + + var body: some View { + Section(header: InlineHeader("Description")) { + VStack(alignment: .leading, spacing: 10) { + if let pluginAbout = selectedPlugin.about { + if pluginAbout.last == "\n" { + Text(pluginAbout.dropLast()) + } else { + Text(pluginAbout) + } + } + + if let pluginWebsite = selectedPlugin.website { + Link("Website", destination: URL(string: pluginWebsite) ?? URL(string: "https://kingbri.dev/ferrite")!) + } + } + } + } +} diff --git a/Ferrite/Views/ComponentViews/Plugin/Info/PluginInfoMetaView.swift b/Ferrite/Views/ComponentViews/Plugin/Info/PluginInfoMetaView.swift new file mode 100644 index 0000000..4d10509 --- /dev/null +++ b/Ferrite/Views/ComponentViews/Plugin/Info/PluginInfoMetaView.swift @@ -0,0 +1,54 @@ +// +// PluginInfoMetaView.swift +// Ferrite +// +// Created by Brian Dashore on 4/2/23. +// + +import SwiftUI + +struct PluginInfoMetaView: View { + @ObservedObject var selectedPlugin: P + + @FetchRequest( + entity: PluginList.entity(), + sortDescriptors: [] + ) var pluginLists: FetchedResults + + var body: some View { + Section(header: InlineHeader("Metadata")) { + VStack(alignment: .leading) { + VStack(alignment: .leading, spacing: 5) { + HStack(spacing: 5) { + Text(selectedPlugin.name) + + Text("v\(selectedPlugin.version)") + .foregroundColor(.secondary) + } + + Text("by \(selectedPlugin.author)") + .foregroundColor(.secondary) + + Group { + Text("ID: \(selectedPlugin.id)") + + if let pluginList = pluginLists.first(where: { $0.id == selectedPlugin.listId }) + { + Text("List: \(pluginList.name)") + Text("List ID: \(pluginList.id.uuidString)") + } else { + Text("No plugin list found. This source should be removed.") + } + } + .foregroundColor(.secondary) + .font(.caption) + } + + if let tags = selectedPlugin.getTags(), !tags.isEmpty { + PluginTagsView(tags: tags) + } + } + .padding(.vertical, 2) + } + } +} diff --git a/Ferrite/Views/ComponentViews/Plugin/PluginInfoView.swift b/Ferrite/Views/ComponentViews/Plugin/PluginInfoView.swift index 4d10e73..a90d458 100644 --- a/Ferrite/Views/ComponentViews/Plugin/PluginInfoView.swift +++ b/Ferrite/Views/ComponentViews/Plugin/PluginInfoView.swift @@ -12,48 +12,14 @@ struct PluginInfoView: View { @Binding var selectedPlugin: P? - @FetchRequest( - entity: PluginList.entity(), - sortDescriptors: [] - ) var pluginLists: FetchedResults - var body: some View { NavView { List { if let selectedPlugin { - Section(header: InlineHeader("Info")) { - VStack(alignment: .leading) { - VStack(alignment: .leading, spacing: 5) { - HStack(spacing: 5) { - Text(selectedPlugin.name) + PluginInfoMetaView(selectedPlugin: selectedPlugin) - Text("v\(selectedPlugin.version)") - .foregroundColor(.secondary) - } - - Text("by \(selectedPlugin.author)") - .foregroundColor(.secondary) - - Group { - Text("ID: \(selectedPlugin.id)") - - if let pluginList = pluginLists.first(where: { $0.id == selectedPlugin.listId }) - { - Text("List: \(pluginList.name)") - Text("List ID: \(pluginList.id.uuidString)") - } else { - Text("No plugin list found. This source should be removed.") - } - } - .foregroundColor(.secondary) - .font(.caption) - } - - if let tags = selectedPlugin.getTags(), !tags.isEmpty { - PluginTagsView(tags: tags) - } - } - .padding(.vertical, 2) + if selectedPlugin.about != nil || selectedPlugin.website != nil { + PluginInfoAboutView(selectedPlugin: selectedPlugin) } if let selectedSource = selectedPlugin as? Source { diff --git a/Ferrite/Views/ComponentViews/Plugin/Source/SourceSettingsBaseUrlView.swift b/Ferrite/Views/ComponentViews/Plugin/Source/SourceSettingsBaseUrlView.swift index 5918871..5c19f98 100644 --- a/Ferrite/Views/ComponentViews/Plugin/Source/SourceSettingsBaseUrlView.swift +++ b/Ferrite/Views/ComponentViews/Plugin/Source/SourceSettingsBaseUrlView.swift @@ -10,18 +10,18 @@ import SwiftUI struct SourceSettingsBaseUrlView: View { @ObservedObject var selectedSource: Source - @State private var tempBaseUrl: String = "" + @State private var tempSite: String = "" var body: some View { Section( header: InlineHeader("Base URL"), footer: Text("Enter the base URL of your server.") ) { - TextField("https://...", text: $tempBaseUrl, onEditingChanged: { isFocused in + TextField("https://...", text: $tempSite, onEditingChanged: { isFocused in if !isFocused { - if tempBaseUrl.last == "/" { - selectedSource.baseUrl = String(tempBaseUrl.dropLast()) + if tempSite.last == "/" { + selectedSource.website = String(tempSite.dropLast()) } else { - selectedSource.baseUrl = tempBaseUrl + selectedSource.website = tempSite } } }) @@ -29,7 +29,7 @@ struct SourceSettingsBaseUrlView: View { .autocorrectionDisabled(true) .autocapitalization(.none) .onAppear { - tempBaseUrl = selectedSource.baseUrl ?? "" + tempSite = selectedSource.website ?? "" } } } diff --git a/Ferrite/Views/ComponentViews/Plugin/Source/SourceSettingsView.swift b/Ferrite/Views/ComponentViews/Plugin/Source/SourceSettingsView.swift index cc7a3a9..312c7ea 100644 --- a/Ferrite/Views/ComponentViews/Plugin/Source/SourceSettingsView.swift +++ b/Ferrite/Views/ComponentViews/Plugin/Source/SourceSettingsView.swift @@ -11,7 +11,7 @@ struct SourceSettingsView: View { @ObservedObject var selectedSource: Source var body: some View { - if selectedSource.dynamicBaseUrl { + if selectedSource.dynamicWebsite { SourceSettingsBaseUrlView(selectedSource: selectedSource) }