ConfigEditorRootView.swift 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import SwiftUI
  2. extension ConfigEditor {
  3. struct RootView: BaseView {
  4. @EnvironmentObject var viewModel: ViewModel<Provider>
  5. @State private var showShareSheet = false
  6. var body: some View {
  7. TextEditor(text: $viewModel.configText)
  8. .keyboardType(.asciiCapable)
  9. .font(.system(.subheadline, design: .monospaced))
  10. .allowsTightening(true)
  11. .autocapitalization(.none)
  12. .disableAutocorrection(true)
  13. .toolbar {
  14. ToolbarItemGroup(placement: .bottomBar) {
  15. Spacer()
  16. Button { showShareSheet = true }
  17. label: {
  18. Image(systemName: "square.and.arrow.up")
  19. }
  20. }
  21. }
  22. .navigationBarItems(
  23. trailing: Button("Save", action: viewModel.save)
  24. )
  25. .sheet(isPresented: $showShareSheet) {
  26. ShareSheet(activityItems: [viewModel.provider.urlFor(file: viewModel.file)!])
  27. }
  28. .navigationTitle(viewModel.file)
  29. .navigationBarTitleDisplayMode(.inline)
  30. .padding()
  31. }
  32. }
  33. }
  34. struct ShareSheet: UIViewControllerRepresentable {
  35. typealias Callback = (_ activityType: UIActivity.ActivityType?, _ completed: Bool, _ returnedItems: [Any]?, _ error: Error?)
  36. -> Void
  37. let activityItems: [Any]
  38. let applicationActivities: [UIActivity]? = nil
  39. let excludedActivityTypes: [UIActivity.ActivityType]? = nil
  40. let callback: Callback? = nil
  41. func makeUIViewController(context _: Context) -> UIActivityViewController {
  42. let controller = UIActivityViewController(
  43. activityItems: activityItems,
  44. applicationActivities: applicationActivities
  45. )
  46. controller.excludedActivityTypes = excludedActivityTypes
  47. controller.completionWithItemsHandler = callback
  48. return controller
  49. }
  50. func updateUIViewController(_: UIActivityViewController, context _: Context) {
  51. // nothing to do here
  52. }
  53. }