ConfigEditorRootView.swift 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. var color: LinearGradient {
  11. colorScheme == .dark ? LinearGradient(
  12. gradient: Gradient(colors: [
  13. Color("Background_1"),
  14. Color("Background_1"),
  15. Color("Background_2")
  16. // Color("Background_1")
  17. ]),
  18. startPoint: .top,
  19. endPoint: .bottom
  20. )
  21. :
  22. LinearGradient(
  23. gradient: Gradient(colors: [Color.gray.opacity(0.1)]),
  24. startPoint: .top,
  25. endPoint: .bottom
  26. )
  27. }
  28. var body: some View {
  29. ZStack {
  30. TextEditor(text: $state.configText)
  31. .keyboardType(.asciiCapable)
  32. .font(.system(.subheadline, design: .monospaced))
  33. .allowsTightening(true)
  34. .autocapitalization(.none)
  35. .disableAutocorrection(true)
  36. .toolbar {
  37. ToolbarItemGroup(placement: .bottomBar) {
  38. Spacer()
  39. Button { showShareSheet = true }
  40. label: {
  41. Image(systemName: "square.and.arrow.up")
  42. }
  43. }
  44. }
  45. .navigationBarItems(
  46. trailing: Button("Save", action: state.save)
  47. )
  48. .sheet(isPresented: $showShareSheet) {
  49. ShareSheet(activityItems: [state.provider.urlFor(file: state.file)!])
  50. }
  51. .onAppear {
  52. configureView {
  53. state.file = file
  54. }
  55. }
  56. .navigationTitle(file)
  57. .navigationBarTitleDisplayMode(.inline)
  58. .padding()
  59. }
  60. .scrollContentBackground(.hidden).background(color)
  61. }
  62. }
  63. }
  64. struct ShareSheet: UIViewControllerRepresentable {
  65. typealias Callback = (_ activityType: UIActivity.ActivityType?, _ completed: Bool, _ returnedItems: [Any]?, _ error: Error?)
  66. -> Void
  67. let activityItems: [Any]
  68. let applicationActivities: [UIActivity]? = nil
  69. let excludedActivityTypes: [UIActivity.ActivityType]? = nil
  70. let callback: Callback? = nil
  71. func makeUIViewController(context _: Context) -> UIActivityViewController {
  72. let controller = UIActivityViewController(
  73. activityItems: activityItems,
  74. applicationActivities: applicationActivities
  75. )
  76. controller.excludedActivityTypes = excludedActivityTypes
  77. controller.completionWithItemsHandler = callback
  78. return controller
  79. }
  80. func updateUIViewController(_: UIActivityViewController, context _: Context) {
  81. // nothing to do here
  82. }
  83. }