Ivan Valkou 5 лет назад
Родитель
Сommit
1c10e56633

+ 6 - 0
FreeAPS/Sources/Modules/ConfigEditor/ConfigEditorProvider.swift

@@ -1,3 +1,5 @@
+import Foundation
+
 extension ConfigEditor {
     final class Provider: BaseProvider, ConfigEditorProvider {
         @Injected() private var storage: FileStorage!
@@ -11,6 +13,10 @@ extension ConfigEditor {
             return defaults(for: file)
         }
 
+        func urlFor(file: String) -> URL? {
+            storage.urlFor(file: file)
+        }
+
         func save(_ value: RawJSON, as file: String) {
             try? storage.save(value, as: file)
         }

+ 38 - 1
FreeAPS/Sources/Modules/ConfigEditor/View/ConfigEditorRootView.swift

@@ -3,6 +3,7 @@ import SwiftUI
 extension ConfigEditor {
     struct RootView: BaseView {
         @EnvironmentObject var viewModel: ViewModel<Provider>
+        @State private var showShareSheet = false
 
         var body: some View {
             TextEditor(text: $viewModel.configText)
@@ -10,13 +11,49 @@ extension ConfigEditor {
                 .allowsTightening(true)
                 .autocapitalization(.none)
                 .disableAutocorrection(true)
-                .toolbar { ToolbarItem(placement: .principal) { Text(viewModel.file) } }
+                .toolbar {
+                    ToolbarItemGroup(placement: .bottomBar) {
+                        Spacer()
+                        Button { showShareSheet = true }
+                        label: {
+                            Image(systemName: "square.and.arrow.up")
+                        }
+                    }
+                    ToolbarItem(placement: .principal) { Text(viewModel.file) }
+                }
                 .navigationBarItems(
                     leading: Button("Close", action: viewModel.hideModal),
                     trailing: Button("Save", action: viewModel.save)
                 )
+                .sheet(isPresented: $showShareSheet) {
+                    ShareSheet(activityItems: [viewModel.provider.urlFor(file: viewModel.file)!])
+                }
                 .navigationBarTitleDisplayMode(.inline)
                 .padding()
         }
     }
 }
+
+struct ShareSheet: UIViewControllerRepresentable {
+    typealias Callback = (_ activityType: UIActivity.ActivityType?, _ completed: Bool, _ returnedItems: [Any]?, _ error: Error?)
+        -> Void
+
+    let activityItems: [Any]
+    let applicationActivities: [UIActivity]? = nil
+    let excludedActivityTypes: [UIActivity.ActivityType]? = nil
+    let callback: Callback? = nil
+
+    func makeUIViewController(context _: Context) -> UIActivityViewController {
+        let controller = UIActivityViewController(
+            activityItems: activityItems,
+            applicationActivities: applicationActivities
+        )
+        controller.excludedActivityTypes = excludedActivityTypes
+        controller.completionWithItemsHandler = callback
+        return controller
+    }
+
+    func updateUIViewController(_: UIActivityViewController, context _: Context) {
+        // nothing to do here
+    }
+}

+ 6 - 0
FreeAPS/Sources/Services/Storage/FileStorage.swift

@@ -11,6 +11,8 @@ protocol FileStorage {
     func remove(_ name: String) throws
     func rename(_ name: String, to newName: String) throws
     func transaction(_ exec: (FileStorage) throws -> Void) throws
+
+    func urlFor(file: String) -> URL?
 }
 
 final class BaseFileStorage: FileStorage {
@@ -103,4 +105,8 @@ final class BaseFileStorage: FileStorage {
             try exec(self)
         }
     }
+
+    func urlFor(file: String) -> URL? {
+        try? Disk.url(for: file, in: .documents)
+    }
 }