ConfigEditorRootView.swift 2.5 KB

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