ConfigEditorRootView.swift 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. @Environment(\.colorScheme) var colorScheme
  10. @Environment(AppState.self) var appState
  11. var body: some View {
  12. ZStack {
  13. TextEditor(text: $state.configText)
  14. .keyboardType(.asciiCapable)
  15. .font(.system(.subheadline, design: .monospaced))
  16. .allowsTightening(true)
  17. .autocapitalization(.none)
  18. .disableAutocorrection(true)
  19. .toolbar {
  20. ToolbarItemGroup(placement: .bottomBar) {
  21. Spacer()
  22. Button { showShareSheet = true }
  23. label: {
  24. Image(systemName: "square.and.arrow.up")
  25. }
  26. }
  27. }
  28. .navigationBarItems(
  29. trailing: Button("Save", action: state.save)
  30. )
  31. .sheet(isPresented: $showShareSheet) {
  32. ShareSheet(activityItems: [state.provider.urlFor(file: state.file)!])
  33. }
  34. .onAppear {
  35. configureView {
  36. state.file = file
  37. }
  38. }
  39. .navigationTitle(file)
  40. .navigationBarTitleDisplayMode(.automatic)
  41. .padding()
  42. }
  43. .scrollContentBackground(.hidden).background(appState.trioBackgroundColor(for: colorScheme))
  44. }
  45. }
  46. }
  47. struct ShareSheet: UIViewControllerRepresentable {
  48. typealias Callback = (_ activityType: UIActivity.ActivityType?, _ completed: Bool, _ returnedItems: [Any]?, _ error: Error?)
  49. -> Void
  50. let activityItems: [Any]
  51. let applicationActivities: [UIActivity]? = nil
  52. let excludedActivityTypes: [UIActivity.ActivityType]? = nil
  53. let callback: Callback? = nil
  54. func makeUIViewController(context _: Context) -> UIActivityViewController {
  55. let controller = UIActivityViewController(
  56. activityItems: activityItems,
  57. applicationActivities: applicationActivities
  58. )
  59. controller.excludedActivityTypes = excludedActivityTypes
  60. controller.completionWithItemsHandler = callback
  61. return controller
  62. }
  63. func updateUIViewController(_: UIActivityViewController, context _: Context) {
  64. // nothing to do here
  65. }
  66. }