diff --git a/Shared/Logging/Logging.swift b/Shared/Logging/Logging.swift index 27f7980..18e1a16 100644 --- a/Shared/Logging/Logging.swift +++ b/Shared/Logging/Logging.swift @@ -1,67 +1,69 @@ // // Logging.swift // WriteFreely-MultiPlatform // // Created by Angelo Stavrow on 2022-06-25. // import Foundation import os import OSLog protocol LogWriter { func log(_ message: String, withSensitiveInfo privateInfo: String?, level: OSLogType) func logCrashAndSetFlag(error: Error) } +@available(iOS 15, *) protocol LogReader { func fetchLogs() -> [String] } final class Logging { private let logger: Logger private let subsystem = Bundle.main.bundleIdentifier! init(for category: String = "") { self.logger = Logger(subsystem: subsystem, category: category) } } extension Logging: LogWriter { func log( _ message: String, withSensitiveInfo privateInfo: String? = nil, level: OSLogType = .default ) { if let privateInfo = privateInfo { logger.log(level: level, "\(message): \(privateInfo, privacy: .sensitive)") } else { logger.log(level: level, "\(message)") } } func logCrashAndSetFlag(error: Error) { let errorDescription = error.localizedDescription UserDefaults.shared.set(true, forKey: WFDefaults.didHaveFatalError) UserDefaults.shared.set(errorDescription, forKey: WFDefaults.fatalErrorDescription) logger.log(level: .error, "\(errorDescription)") fatalError(errorDescription) } } extension Logging: LogReader { + @available(iOS 15, *) func fetchLogs() -> [String] { return [ "This is line 1", "This is line 2", "This is line 3", "This is line 4" ] } } diff --git a/iOS/Settings/SettingsView.swift b/iOS/Settings/SettingsView.swift index 3ede41f..f4721d7 100644 --- a/iOS/Settings/SettingsView.swift +++ b/iOS/Settings/SettingsView.swift @@ -1,92 +1,95 @@ import SwiftUI struct SettingsView: View { @EnvironmentObject var model: WriteFreelyModel private let logger = Logging(for: String(describing: SettingsView.self)) var body: some View { VStack { SettingsHeaderView() Form { Section(header: Text("Login Details")) { AccountView() .withErrorHandling() } Section(header: Text("Appearance")) { PreferencesView(preferences: model.preferences) } Section(header: Text("Help and Support")) { Link("View the Guide", destination: model.howToURL) Link("Visit the Help Forum", destination: model.helpURL) Link("Write a Review on the App Store", destination: model.reviewURL) - VStack(alignment: .leading, spacing: 8) { - Button( - action: didTapGenerateLogPostButton, - label: { - Text("Create Log Post") - } - ) - Text("Generates a local post using recent logs. You can share this for troubleshooting.") - .font(.footnote) - .foregroundColor(.secondary) + if #available(iOS 15.0, *) { + VStack(alignment: .leading, spacing: 8) { + Button( + action: didTapGenerateLogPostButton, + label: { + Text("Create Log Post") + } + ) + Text("Generates a local post using recent logs. You can share this for troubleshooting.") + .font(.footnote) + .foregroundColor(.secondary) + } } } Section(header: Text("Acknowledgements")) { VStack { VStack(alignment: .leading) { Text("This application makes use of the following open-source projects:") .padding(.bottom) Text("• Lora typeface") .padding(.leading) Text("• Open Sans typeface") .padding(.leading) Text("• Hack typeface") .padding(.leading) } .padding(.bottom) .foregroundColor(.secondary) HStack { Spacer() Link("View the licenses", destination: model.licensesURL) Spacer() } } .padding() } } } // .preferredColorScheme(preferences.selectedColorScheme) // See PreferencesModel for info. } + @available(iOS 15, *) private func didTapGenerateLogPostButton() { logger.log("Generating local log post...") DispatchQueue.main.asyncAfter(deadline: .now()) { // Unset selected post and collection and navigate to local drafts. self.model.selectedPost = nil self.model.selectedCollection = nil self.model.showAllPosts = false // Create the new log post. let newLogPost = model.editor.generateNewLocalPost(withFont: 2) newLogPost.title = "Logs For Support" var postBody: [String] = [ "WriteFreely-Multiplatform v\(Bundle.main.appMarketingVersion) (\(Bundle.main.appBuildVersion))", "Generated \(Date())", "" ] postBody.append(contentsOf: logger.fetchLogs()) newLogPost.body = postBody.joined(separator: "\n") } logger.log("Generated local log post.") } } struct SettingsView_Previews: PreviewProvider { static var previews: some View { SettingsView() .environmentObject(WriteFreelyModel()) } }