summaryrefslogtreecommitdiff
path: root/Sora/Views
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-03-03 03:08:52 -0800
committerFuwn <[email protected]>2025-03-03 03:08:52 -0800
commit2646279dc1378d0c63e91372486baa85d83590bd (patch)
tree740abe2babf8e4ca9d9c4b86f64f2e4301533a98 /Sora/Views
parentfeat: Development commit (diff)
downloadsora-testing-2646279dc1378d0c63e91372486baa85d83590bd.tar.xz
sora-testing-2646279dc1378d0c63e91372486baa85d83590bd.zip
feat: Development commit
Diffstat (limited to 'Sora/Views')
-rw-r--r--Sora/Views/Settings/Section/SettingsExportView.swift78
-rw-r--r--Sora/Views/Settings/SettingsView.swift4
2 files changed, 82 insertions, 0 deletions
diff --git a/Sora/Views/Settings/Section/SettingsExportView.swift b/Sora/Views/Settings/Section/SettingsExportView.swift
new file mode 100644
index 0000000..2e9723e
--- /dev/null
+++ b/Sora/Views/Settings/Section/SettingsExportView.swift
@@ -0,0 +1,78 @@
+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
+ }
+ }
+}
diff --git a/Sora/Views/Settings/SettingsView.swift b/Sora/Views/Settings/SettingsView.swift
index 4f00cbd..82738c8 100644
--- a/Sora/Views/Settings/SettingsView.swift
+++ b/Sora/Views/Settings/SettingsView.swift
@@ -22,6 +22,10 @@ struct SettingsView: View {
SettingsSearchView()
}
+ Section(header: Text("Export")) {
+ SettingsExportView()
+ }
+
Section(header: Text("Settings")) {
Button("Reset to Defaults") {
settings.resetToDefaults()