From 9c828ff80a284238c6a514304e909bb5aded6f99 Mon Sep 17 00:00:00 2001 From: Christoph Hagen Date: Tue, 17 Dec 2024 23:24:07 +0100 Subject: [PATCH] Reset data after folder change --- CHDataManagement/Main/InitialSetupView.swift | 2 -- CHDataManagement/Main/MainView.swift | 2 -- CHDataManagement/Model/Content+Load.swift | 1 - CHDataManagement/Model/Content.swift | 28 +++++++++++++++++-- .../Preview Content/Content+Mock.swift | 2 +- .../Preview Content/WebsiteData+Mock.swift | 2 +- CHDataManagement/Storage/Storage.swift | 1 + .../Generic/FolderOnDiskPropertyView.swift | 22 +++++++++++++-- .../Views/Settings/PathSettingsView.swift | 7 ++--- 9 files changed, 51 insertions(+), 16 deletions(-) diff --git a/CHDataManagement/Main/InitialSetupView.swift b/CHDataManagement/Main/InitialSetupView.swift index d36a36b..1fc03cc 100644 --- a/CHDataManagement/Main/InitialSetupView.swift +++ b/CHDataManagement/Main/InitialSetupView.swift @@ -52,10 +52,8 @@ struct InitialSetupView: View { set(message: "Failed to set content path") return } - print("Selected folder, initializing storage") DispatchQueue.main.async { do { - print("Loading disk content") try content.loadFromDisk() } catch { set(message: "Failed to load database: \(error)") diff --git a/CHDataManagement/Main/MainView.swift b/CHDataManagement/Main/MainView.swift index bc3a1ad..433eb79 100644 --- a/CHDataManagement/Main/MainView.swift +++ b/CHDataManagement/Main/MainView.swift @@ -203,8 +203,6 @@ struct MainView: App { } private func loadContent() { - #warning("Remove") - content.storage.clearContentPath() guard content.storage.hasContentFolders else { showInitialSheet() return diff --git a/CHDataManagement/Model/Content+Load.swift b/CHDataManagement/Model/Content+Load.swift index e63c820..92684fa 100644 --- a/CHDataManagement/Model/Content+Load.swift +++ b/CHDataManagement/Model/Content+Load.swift @@ -47,7 +47,6 @@ extension Content { } let settings = try storage.loadSettings() // Uses defaults if missing - print("Loaded settings") let imageDescriptions = try storage.loadFileDescriptions().reduce(into: [:]) { descriptions, description in descriptions[description.fileId] = description } diff --git a/CHDataManagement/Model/Content.swift b/CHDataManagement/Model/Content.swift index b92fe1d..68bc09b 100644 --- a/CHDataManagement/Model/Content.swift +++ b/CHDataManagement/Model/Content.swift @@ -26,7 +26,7 @@ final class Content: ObservableObject { var tagOverview: TagOverviewPage? @Published - private(set) var results: [ItemId : PageGenerationResults] = [:] + private(set) var results: [ItemId : PageGenerationResults] @Published private(set) var isGeneratingWebsite = false @@ -43,15 +43,27 @@ final class Content: ObservableObject { self.tags = tags self.files = files self.tagOverview = tagOverview + self.results = [:] } init() { - self.settings = .mock + self.settings = .default self.posts = [] self.pages = [] self.tags = [] self.files = [] self.tagOverview = nil + self.results = [:] + } + + private func clear() { + self.settings = .default + self.posts = [] + self.pages = [] + self.tags = [] + self.files = [] + self.tagOverview = nil + self.results = [:] } var images: [FileResource] { @@ -73,4 +85,16 @@ final class Content: ObservableObject { // TODO: Insert at correct index? pages.insert(page, at: 0) } + + func update(contentPath: URL) { + guard storage.save(contentPath: contentPath) else { + return + } + clear() + do { + try loadFromDisk() + } catch { + print("Failed to reload content: \(error)") + } + } } diff --git a/CHDataManagement/Preview Content/Content+Mock.swift b/CHDataManagement/Preview Content/Content+Mock.swift index b850a83..15a81f5 100644 --- a/CHDataManagement/Preview Content/Content+Mock.swift +++ b/CHDataManagement/Preview Content/Content+Mock.swift @@ -15,7 +15,7 @@ extension Content { private static let dbPath = FileManager.default.documentDirectory.appendingPathComponent("db").path() static let mock: Content = Content( - settings: .mock, + settings: .default, posts: [.empty, .mock, .fullMock], pages: [.empty], tags: [.hiking, .mountains, .nature, .sports], diff --git a/CHDataManagement/Preview Content/WebsiteData+Mock.swift b/CHDataManagement/Preview Content/WebsiteData+Mock.swift index b8c17bb..f8abcf3 100644 --- a/CHDataManagement/Preview Content/WebsiteData+Mock.swift +++ b/CHDataManagement/Preview Content/WebsiteData+Mock.swift @@ -2,7 +2,7 @@ import Foundation extension Settings { - static let mock: Settings = .init( + static let `default`: Settings = .init( paths: .default, navigationItems: [], posts: .default, diff --git a/CHDataManagement/Storage/Storage.swift b/CHDataManagement/Storage/Storage.swift index 1703a87..9d3ac8f 100644 --- a/CHDataManagement/Storage/Storage.swift +++ b/CHDataManagement/Storage/Storage.swift @@ -560,6 +560,7 @@ final class Storage: ObservableObject { } } + @discardableResult func save(outputPath: URL) -> Bool { guard let contentPath else { return false } guard let bookmarkData = encode(url: outputPath) else { return false } diff --git a/CHDataManagement/Views/Generic/FolderOnDiskPropertyView.swift b/CHDataManagement/Views/Generic/FolderOnDiskPropertyView.swift index 1803496..a2655cf 100644 --- a/CHDataManagement/Views/Generic/FolderOnDiskPropertyView.swift +++ b/CHDataManagement/Views/Generic/FolderOnDiskPropertyView.swift @@ -1,4 +1,5 @@ import SwiftUI +import SFSafeSymbols struct FolderOnDiskPropertyView: View { @@ -7,21 +8,31 @@ struct FolderOnDiskPropertyView: View { @Binding var folder: URL? + @Binding + var isStale: Bool + let footer: LocalizedStringKey let update: (URL) -> Void - init(title: LocalizedStringKey, folder: Binding, footer: LocalizedStringKey, update: @escaping (URL) -> Void) { + init(title: LocalizedStringKey, folder: Binding, isStale: Binding, footer: LocalizedStringKey, update: @escaping (URL) -> Void) { self.title = title self._folder = folder + self._isStale = isStale self.footer = footer self.update = update } var body: some View { - GenericPropertyView(title: title, footer: footer) { + VStack(alignment: .leading) { + HStack(alignment: .firstTextBaseline) { - Text(folder?.path() ?? "No folder selected") + Text(title) + .font(.headline) + if isStale { + Image(systemSymbol: .exclamationmarkTriangle) + .foregroundStyle(.yellow) + } Spacer() Button("Select") { guard let url = openFolderSelectionPanel() else { @@ -32,6 +43,11 @@ struct FolderOnDiskPropertyView: View { } } } + Text(folder?.path() ?? "No folder selected") + .padding(.bottom, 5) + Text(footer) + .foregroundStyle(.secondary) + .padding(.bottom) } } diff --git a/CHDataManagement/Views/Settings/PathSettingsView.swift b/CHDataManagement/Views/Settings/PathSettingsView.swift index a91c11f..a9547ea 100644 --- a/CHDataManagement/Views/Settings/PathSettingsView.swift +++ b/CHDataManagement/Views/Settings/PathSettingsView.swift @@ -18,16 +18,15 @@ struct PathSettingsView: View { FolderOnDiskPropertyView( title: "Content Folder", folder: $content.storage.contentPath, + isStale: $content.storage.contentPathUrlIsStale, footer: "The folder where the raw content of the website is stored") { url in - guard content.storage.save(contentPath: url) else { - return - } - #warning("Reload database") + content.update(contentPath: url) } FolderOnDiskPropertyView( title: "Output Folder", folder: $content.storage.outputPath, + isStale: $content.storage.outputPathUrlIsStale, footer: "The folder where the generated website is stored") { url in content.storage.save(outputPath: url) }