Sources: Add list IDs and source IDs
List IDs are used to link a source list with an actual source. Each list entry has a unique ID that a user can compare with a source to see if it's legitimate. Source IDs are just identifiers for sources. Not sure what to do with these yet but they may be useful for the future. Signed-off-by: kingbri <bdashore3@gmail.com>
This commit is contained in:
parent
04b2185956
commit
b451cf64b1
8 changed files with 55 additions and 11 deletions
|
|
@ -16,10 +16,12 @@ extension Source {
|
|||
return NSFetchRequest<Source>(entityName: "Source")
|
||||
}
|
||||
|
||||
@NSManaged public var id: UUID
|
||||
@NSManaged public var baseUrl: String
|
||||
@NSManaged public var enabled: Bool
|
||||
@NSManaged public var name: String
|
||||
@NSManaged public var author: String?
|
||||
@NSManaged public var author: String
|
||||
@NSManaged public var listId: UUID?
|
||||
@NSManaged public var preferredParser: Int16
|
||||
@NSManaged public var version: Int16
|
||||
@NSManaged public var htmlParser: SourceHtmlParser?
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ public extension SourceList {
|
|||
NSFetchRequest<SourceList>(entityName: "SourceList")
|
||||
}
|
||||
|
||||
@NSManaged var id: UUID
|
||||
@NSManaged var author: String
|
||||
@NSManaged var name: String
|
||||
@NSManaged var urlString: String
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="21271" systemVersion="21F79" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
|
||||
<entity name="Source" representedClassName="Source" syncable="YES">
|
||||
<attribute name="author" optional="YES" attributeType="String"/>
|
||||
<attribute name="author" attributeType="String" defaultValueString=""/>
|
||||
<attribute name="baseUrl" attributeType="String" defaultValueString=""/>
|
||||
<attribute name="enabled" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||
<attribute name="id" attributeType="UUID" usesScalarValueType="NO"/>
|
||||
<attribute name="listId" optional="YES" attributeType="UUID" usesScalarValueType="NO"/>
|
||||
<attribute name="name" attributeType="String" defaultValueString=""/>
|
||||
<attribute name="preferredParser" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="YES"/>
|
||||
<attribute name="version" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="YES"/>
|
||||
|
|
@ -29,6 +31,7 @@
|
|||
</entity>
|
||||
<entity name="SourceList" representedClassName="SourceList" syncable="YES">
|
||||
<attribute name="author" attributeType="String" defaultValueString=""/>
|
||||
<attribute name="id" attributeType="UUID" usesScalarValueType="NO"/>
|
||||
<attribute name="name" attributeType="String" defaultValueString=""/>
|
||||
<attribute name="urlString" attributeType="String" defaultValueString=""/>
|
||||
</entity>
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ public struct SourceJson: Codable, Hashable {
|
|||
let version: Int16
|
||||
let baseUrl: String
|
||||
var author: String?
|
||||
var listId: UUID?
|
||||
let rssParser: SourceRssParserJson?
|
||||
let htmlParser: SourceHtmlParserJson?
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ public class SourceManager: ObservableObject {
|
|||
|
||||
for index in sourceResponse.sources.indices {
|
||||
sourceResponse.sources[index].author = sourceList.author
|
||||
sourceResponse.sources[index].listId = sourceList.id
|
||||
}
|
||||
|
||||
tempSourceUrls += sourceResponse.sources
|
||||
|
|
@ -62,10 +63,12 @@ public class SourceManager: ObservableObject {
|
|||
}
|
||||
|
||||
let newSource = Source(context: backgroundContext)
|
||||
newSource.id = UUID()
|
||||
newSource.name = sourceJson.name
|
||||
newSource.version = sourceJson.version
|
||||
newSource.baseUrl = sourceJson.baseUrl
|
||||
newSource.author = sourceJson.author
|
||||
newSource.author = sourceJson.author ?? "Unknown"
|
||||
newSource.listId = sourceJson.listId
|
||||
|
||||
// Adds an RSS parser if present
|
||||
if let rssParserJson = sourceJson.rssParser {
|
||||
|
|
@ -240,6 +243,7 @@ public class SourceManager: ObservableObject {
|
|||
}
|
||||
|
||||
let newSourceUrl = SourceList(context: backgroundContext)
|
||||
newSourceUrl.id = UUID()
|
||||
newSourceUrl.urlString = sourceUrl
|
||||
newSourceUrl.name = rawResponse.name
|
||||
newSourceUrl.author = rawResponse.author
|
||||
|
|
@ -248,6 +252,7 @@ public class SourceManager: ObservableObject {
|
|||
|
||||
return true
|
||||
} catch {
|
||||
print(error)
|
||||
urlErrorAlertText = error.localizedDescription
|
||||
showUrlErrorAlert.toggle()
|
||||
|
||||
|
|
|
|||
|
|
@ -20,7 +20,12 @@ struct SettingsSourceListView: View {
|
|||
var body: some View {
|
||||
List {
|
||||
ForEach(sourceUrls, id: \.self) { sourceUrl in
|
||||
Text(sourceUrl.name)
|
||||
VStack(alignment: .leading, spacing: 5) {
|
||||
Text(sourceUrl.name)
|
||||
Text("ID: \(sourceUrl.id)")
|
||||
.font(.caption)
|
||||
.foregroundColor(.gray)
|
||||
}
|
||||
}
|
||||
.onDelete { offsets in
|
||||
for index in offsets {
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ struct SourceListView: View {
|
|||
.foregroundColor(.secondary)
|
||||
}
|
||||
|
||||
Text("by \(source.author ?? "Unknown")")
|
||||
Text("by \(source.author)")
|
||||
.foregroundColor(.secondary)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,10 +10,37 @@ import SwiftUI
|
|||
struct SourceSettingsView: View {
|
||||
@Environment(\.dismiss) var dismiss
|
||||
|
||||
@EnvironmentObject var navModel: NavigationViewModel
|
||||
|
||||
var body: some View {
|
||||
NavView {
|
||||
Form {
|
||||
SourceSettingsMethodView()
|
||||
if let selectedSource = navModel.selectedSource {
|
||||
Section("Info") {
|
||||
VStack(alignment: .leading, spacing: 5) {
|
||||
HStack {
|
||||
Text(selectedSource.name)
|
||||
|
||||
Text("v\(selectedSource.version)")
|
||||
}
|
||||
|
||||
Text("by \(selectedSource.author)")
|
||||
.foregroundColor(.secondary)
|
||||
|
||||
if let listId = selectedSource.listId {
|
||||
Text("List ID: \(listId)")
|
||||
.font(.caption)
|
||||
.foregroundColor(.secondary)
|
||||
} else {
|
||||
Text("No list ID found. This source should be removed.")
|
||||
.font(.caption)
|
||||
.foregroundColor(.secondary)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SourceSettingsMethodView(selectedSource: selectedSource)
|
||||
}
|
||||
}
|
||||
.navigationTitle("Source settings")
|
||||
.toolbar {
|
||||
|
|
@ -28,28 +55,28 @@ struct SourceSettingsView: View {
|
|||
}
|
||||
|
||||
struct SourceSettingsMethodView: View {
|
||||
@EnvironmentObject var navModel: NavigationViewModel
|
||||
@ObservedObject var selectedSource: Source
|
||||
|
||||
@State private var selectedTempParser: SourcePreferredParser = .none
|
||||
|
||||
var body: some View {
|
||||
Picker("Fetch method", selection: $selectedTempParser) {
|
||||
if navModel.selectedSource?.htmlParser != nil {
|
||||
if selectedSource.htmlParser != nil {
|
||||
Text("Web scraping")
|
||||
.tag(SourcePreferredParser.scraping)
|
||||
}
|
||||
|
||||
if navModel.selectedSource?.rssParser != nil {
|
||||
if selectedSource.rssParser != nil {
|
||||
Text("RSS")
|
||||
.tag(SourcePreferredParser.rss)
|
||||
}
|
||||
}
|
||||
.pickerStyle(.inline)
|
||||
.onAppear {
|
||||
selectedTempParser = SourcePreferredParser(rawValue: navModel.selectedSource?.preferredParser ?? 0) ?? .none
|
||||
selectedTempParser = SourcePreferredParser(rawValue: selectedSource.preferredParser) ?? .none
|
||||
}
|
||||
.onChange(of: selectedTempParser) { newMethod in
|
||||
navModel.selectedSource?.preferredParser = newMethod.rawValue
|
||||
selectedSource.preferredParser = selectedTempParser.rawValue
|
||||
PersistenceController.shared.save()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue