UserStatusSwiftUIView.swift 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. //
  2. // SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
  3. // SPDX-License-Identifier: GPL-3.0-or-later
  4. //
  5. import UIKit
  6. import SwiftUI
  7. import SwiftUIIntrospect
  8. @_spi(Advanced) import SwiftUIIntrospect
  9. @objc protocol UserStatusViewDelegate: AnyObject {
  10. func userStatusViewDidDisappear()
  11. }
  12. struct UserStatusSwiftUIView: View {
  13. @Environment(\.dismiss) var dismiss
  14. @State var userStatus: NCUserStatus
  15. @State var changed: Bool = false
  16. init(userStatus: NCUserStatus) {
  17. _userStatus = State(initialValue: userStatus)
  18. }
  19. weak var delegate: UserStatusViewDelegate?
  20. var body: some View {
  21. NavigationView {
  22. VStack {
  23. Form {
  24. Section(header: Text("Online status")) {
  25. NavigationLink(destination: {
  26. UserStatusOptionsSwiftUI(changed: $changed, userStatus: $userStatus)
  27. }, label: {
  28. HStack(spacing: 10) {
  29. AnyView(NCUserStatus.getUserStatusIcon(userStatus: userStatus.status))
  30. Text(userStatus.readableUserStatus())
  31. }
  32. })
  33. }
  34. Section(header: Text("Status message")) {
  35. NavigationLink(destination: {
  36. UserStatusMessageSwiftUIView(changed: $changed)
  37. }, label: {
  38. Text(userStatus.readableUserStatusMessage().isEmpty ? NSLocalizedString("What is your status?", comment: "") : userStatus.readableUserStatusMessage() )
  39. })
  40. }
  41. }
  42. }
  43. .navigationBarTitle(Text(NSLocalizedString("Status", comment: "")), displayMode: .inline)
  44. .navigationBarHidden(false)
  45. .toolbar(content: {
  46. ToolbarItem(placement: .navigationBarLeading) {
  47. Button(action: {
  48. dismiss()
  49. }) {
  50. Text("Cancel")
  51. .foregroundColor(Color(NCAppBranding.themeTextColor()))
  52. }
  53. }
  54. })
  55. }
  56. .introspect(.navigationView(style: .stack), on: .iOS(.v15...)) { navController in
  57. let appearance = UINavigationBarAppearance()
  58. appearance.configureWithOpaqueBackground()
  59. appearance.backgroundColor = NCAppBranding.themeColor()
  60. appearance.titleTextAttributes = [.foregroundColor: NCAppBranding.themeTextColor()]
  61. navController.navigationBar.tintColor = NCAppBranding.themeTextColor()
  62. navController.navigationBar.standardAppearance = appearance
  63. navController.navigationBar.compactAppearance = appearance
  64. navController.navigationBar.scrollEdgeAppearance = appearance
  65. }
  66. .navigationViewStyle(StackNavigationViewStyle())
  67. .tint(Color(NCAppBranding.themeTextColor()))
  68. .onAppear {
  69. getUserStatus()
  70. }
  71. .onChange(of: changed) { newValue in
  72. if newValue == true {
  73. getUserStatus()
  74. changed = false
  75. }
  76. }
  77. .onDisappear {
  78. delegate?.userStatusViewDidDisappear()
  79. }
  80. }
  81. func getUserStatus() {
  82. let activeAccount = NCDatabaseManager.sharedInstance().activeAccount()
  83. NCAPIController.sharedInstance().getUserStatus(for: activeAccount) { [self] userStatusDict, error in
  84. if error == nil && userStatusDict != nil {
  85. userStatus = NCUserStatus(dictionary: userStatusDict!)
  86. }
  87. }
  88. }
  89. }
  90. @objc class UserStatusSwiftUIViewFactory: NSObject {
  91. @objc static func create(userStatus: NCUserStatus, delegate: UserStatusViewDelegate) -> UIViewController {
  92. var userStatusView = UserStatusSwiftUIView(userStatus: userStatus)
  93. userStatusView.delegate = delegate
  94. let hostingController = UIHostingController(rootView: userStatusView)
  95. return hostingController
  96. }
  97. }