ConfigEditorRootView.swift 3.1 KB

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