All basic views now done.

Some tidying of views will be needed.
Next, data fetching needs to be worked on.

Signed-off-by: Louis Hollingworth <louis@hollingworth.ch>
This commit is contained in:
Louis Hollingworth 2023-05-23 18:37:04 +01:00
parent a18f485502
commit 058cf52926
Signed by: lucxjo
GPG key ID: A11415CB3DC7809B
6 changed files with 167 additions and 25 deletions

View file

@ -17,6 +17,19 @@ enum Genre: Int16, CaseIterable, Identifiable {
}
struct AddFeed: View {
var body: some View {
#if os(iOS)
NavigationView {
AddFeedContent()
}
#else
AddFeedContent()
#endif
}
}
struct AddFeedContent: View {
@Environment(\.managedObjectContext) var moc
@Environment(\.dismiss) var dismiss
@ -26,19 +39,18 @@ struct AddFeed: View {
@State private var url = ""
var body: some View {
NavigationView {
Form{
Section {
TextField("name", text: $name)
TextField("desc", text: $desc)
TextField("url", text: $url)
Picker("genre", selection: $genre) {
ForEach(Genre.allCases) { option in
Text(LocalizedStringKey(String(describing: option)))
}
Form {
Section {
TextField("name", text: $name)
TextField("desc", text: $desc)
TextField("url", text: $url)
Picker("genre", selection: $genre) {
ForEach(Genre.allCases) { option in
Text(LocalizedStringKey(String(describing: option)))
}
}
}
}
.toolbar {
ToolbarItem {
Button(action: addItem) {
@ -46,11 +58,8 @@ struct AddFeed: View {
}
}
}
}
}
func addItem() {
let newFeed = Feed(context: moc)
newFeed.id = UUID()

View file

@ -18,7 +18,21 @@ struct ContentView: View {
NavigationView {
List {
ForEach(feeds) { item in
Text(item.name!)
NavigationLink {
FeedView(source: item)
} label: {
HStack {
if Genre(rawValue: item.genre) == .news {
Image(systemName: "newspaper")
} else if Genre(rawValue: item.genre) == .technology {
Image(systemName: "laptopcomputer")
} else {
Image(systemName: "doc")
}
Text(item.name!)
}
}
}
.onDelete(perform: deleteItems)
}
@ -56,5 +70,6 @@ struct ContentView: View {
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
.environment(\.managedObjectContext, DataController.preview.container.viewContext)
}
}

View file

@ -5,17 +5,74 @@
// Created by Louis Hollingworth on 2023-05-21.
//
import Foundation
import CoreData
class DataController: ObservableObject {
let container = NSPersistentContainer(name: "Leganto")
static let shared = DataController()
init() {
container.loadPersistentStores { desc, err in
if let err = err {
print("Core Data failed to load: \(err.localizedDescription)")
static var preview: DataController {
let result = DataController(inMemory: true)
let viewContext = result.container.viewContext
for i in 0..<3 {
for j in 1...3 {
let newFeed = Feed(context: viewContext)
switch i {
case 2:
newFeed.genre = Genre.technology.rawValue
break
case 3:
newFeed.genre = Genre.news.rawValue
break
default:
newFeed.genre = Genre.uncategorised.rawValue
break
}
newFeed.name = "\(i+j)"
newFeed.dateAdded = Date()
newFeed.dateUpdated = Date()
newFeed.desc = "\(i+j)"
newFeed.url = "https://git.ludoviko.ch/lucxjo/leganto.rss"
}
}
do {
try viewContext.save()
} catch {
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
return result
}
let container: NSPersistentCloudKitContainer
init(inMemory: Bool = false) {
container = NSPersistentCloudKitContainer(name: "Leganto")
if inMemory {
container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
}
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
// Replace this implementation with code to handle the error appropriately.
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
/*
Typical reasons for an error here include:
* The parent directory does not exist, cannot be created, or disallows writing.
* The persistent store is not accessible, due to permissions or data protection when the device is locked.
* The device is out of space.
* The store could not be migrated to the current model version.
Check the error message to determine what the actual problem was.
*/
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
container.viewContext.automaticallyMergesChangesFromParent = true
}
}

21
Leganto/FeedView.swift Normal file
View file

@ -0,0 +1,21 @@
//
// FeedView.swift
// Leganto
//
// Created by Louis Hollingworth on 2023-05-23.
//
import SwiftUI
struct FeedView: View {
var source: Feed
var body: some View {
List {
ForEach(1..<20) { item in
FeedViewCell()
}
}
.navigationTitle(source.name!)
}
}

View file

@ -0,0 +1,32 @@
//
// FeedViewCell.swift
// Leganto
//
// Created by Louis Hollingworth on 2023-05-23.
//
import SwiftUI
struct FeedViewCell: View {
var body: some View {
VStack(alignment: .leading) {
Text("Title")
.font(.title)
HStack {
Text("Author")
Spacer()
Text("Date")
}
.font(.footnote)
Text("Content")
.font(.body)
}
.multilineTextAlignment(.leading)
}
}
struct FeedViewCell_Previews: PreviewProvider {
static var previews: some View {
FeedViewCell()
}
}