import SwiftUI import UniformTypeIdentifiers struct SettingsExportView: View { @EnvironmentObject private var settings: SettingsManager @State private var isFileExporterPresented = false @State private var exportError: Error? var body: some View { Button("Export Bookmarks") { exportBookmarksToFile() } #if os(macOS) .frame(maxWidth: .infinity, alignment: .trailing) .fileExporter( isPresented: $isFileExporterPresented, document: try? JSONFileDocument(settings.exportBookmarks()), contentType: .json, defaultFilename: "sora_bookmarks.json" ) { result in switch result { case .success: break case .failure(let error): exportError = error } } #endif .alert( "Export Failed", isPresented: Binding( get: { exportError != nil }, set: { if !$0 { exportError = nil } } ) ) { Button("OK", role: .cancel) { () } } message: { Text(exportError?.localizedDescription ?? "An unknown error occurred while exporting.") } } private func exportBookmarksToFile() { do { #if os(macOS) _ = try settings.exportBookmarks() isFileExporterPresented = true #elseif os(iOS) let data = try settings.exportBookmarks() let temporaryURL = FileManager.default.temporaryDirectory .appendingPathComponent("sora_bookmarks.json") try data.write(to: temporaryURL) let activityController = UIActivityViewController( activityItems: [temporaryURL], applicationActivities: nil ) if let windowScene = UIApplication.shared.connectedScenes .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene, let rootViewController = windowScene.windows.first?.rootViewController { activityController.popoverPresentationController?.sourceView = rootViewController.view rootViewController.present(activityController, animated: true) } activityController.completionWithItemsHandler = { _, _, _, _ in try? FileManager.default.removeItem(at: temporaryURL) } #endif } catch { exportError = error } } }