UserStatusOptionsSwiftUI.swift 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. //
  2. // SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
  3. // SPDX-License-Identifier: GPL-3.0-or-later
  4. //
  5. import SwiftUI
  6. import NextcloudKit
  7. struct UserStatusOptionsSwiftUI: View {
  8. @Environment(\.dismiss) var dismiss
  9. @Binding var changed: Bool
  10. @Binding var userStatus: NCUserStatus
  11. @State private var options: [DetailedOption] = []
  12. @State private var isLoading: Bool = true
  13. var body: some View {
  14. VStack {
  15. List(options, id: \.self) { option in
  16. Button(action: {
  17. setActiveUserStatus(userStatus: option.identifier)
  18. }) {
  19. HStack(spacing: 15) {
  20. AnyView(NCUserStatus.getUserStatusIcon(userStatus: option.identifier))
  21. .frame(width: 20)
  22. VStack(alignment: .leading) {
  23. Text(option.title)
  24. .foregroundColor(.primary)
  25. if option.subtitle != nil && !option.subtitle.isEmpty {
  26. Text(option.subtitle)
  27. .foregroundColor(.secondary)
  28. }
  29. }
  30. Spacer()
  31. if userStatus.status == option.identifier {
  32. Image(systemName: "checkmark")
  33. .font(.system(size: 18, weight: .medium))
  34. .foregroundColor(Color(NCAppBranding.themeColor()))
  35. }
  36. }
  37. }
  38. }
  39. }
  40. .navigationBarTitle(Text(NSLocalizedString("Online status", comment: "")), displayMode: .inline)
  41. .navigationBarHidden(false)
  42. .onAppear {
  43. getActiveUserStatus()
  44. presentUserStatusOptions()
  45. }
  46. }
  47. func setActiveUserStatus(userStatus: String) {
  48. let activeAcoount: TalkAccount = NCDatabaseManager.sharedInstance().activeAccount()
  49. NCAPIController.sharedInstance().setUserStatus(userStatus, for: activeAcoount) { _ in
  50. getActiveUserStatus()
  51. dismiss()
  52. changed.toggle()
  53. }
  54. }
  55. func getActiveUserStatus() {
  56. let activeAccount: TalkAccount = NCDatabaseManager.sharedInstance().activeAccount()
  57. NCAPIController.sharedInstance().getUserStatus(for: activeAccount) { [self] userStatusDict, error in
  58. if error == nil && userStatusDict != nil {
  59. userStatus = NCUserStatus(dictionary: userStatusDict!)
  60. }
  61. }
  62. }
  63. func presentUserStatusOptions() {
  64. let onlineOption = DetailedOption()
  65. onlineOption.identifier = kUserStatusOnline
  66. onlineOption.title = NCUserStatus.readableUserStatus(fromUserStatus: kUserStatusOnline)
  67. let awayOption = DetailedOption()
  68. awayOption.identifier = kUserStatusAway
  69. awayOption.title = NCUserStatus.readableUserStatus(fromUserStatus: kUserStatusAway)
  70. let dndOption = DetailedOption()
  71. dndOption.identifier = kUserStatusDND
  72. dndOption.title = NCUserStatus.readableUserStatus(fromUserStatus: kUserStatusDND)
  73. dndOption.subtitle = NSLocalizedString("Mute all notifications", comment: "")
  74. let invisibleOption = DetailedOption()
  75. invisibleOption.identifier = kUserStatusInvisible
  76. invisibleOption.title = NCUserStatus.readableUserStatus(fromUserStatus: kUserStatusInvisible)
  77. invisibleOption.subtitle = NSLocalizedString("Appear offline", comment: "")
  78. options.append(onlineOption)
  79. options.append(awayOption)
  80. options.append(dndOption)
  81. options.append(invisibleOption)
  82. }
  83. }