RowEmojiTextField.swift 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. //
  2. // RowEmojiTextField.swift
  3. // LoopKitUI
  4. //
  5. // Created by Noah Brauner on 8/1/23.
  6. // Copyright © 2023 LoopKit Authors. All rights reserved.
  7. //
  8. import SwiftUI
  9. /// Has the same functions as `RowTextField` and uses an `EmojiInputController` as the keyboard. This struct handles `standardInputMode` as well.
  10. struct RowEmojiTextField: View {
  11. @Binding private var text: String
  12. @Binding private var isFocused: Bool
  13. private var placeholder: String
  14. private let emojiType: EmojiDataSourceType
  15. @StateObject private var viewModel: EmojiTextFieldViewModel
  16. class EmojiTextFieldViewModel: ObservableObject, EmojiInputControllerDelegate {
  17. @Published var standardInputMode = false
  18. let didSelectItemInSection: ((Int) -> Void)?
  19. init(didSelectItemInSection: ((Int) -> Void)?) {
  20. self.didSelectItemInSection = didSelectItemInSection
  21. }
  22. func emojiInputControllerDidAdvanceToStandardInputMode(_ controller: EmojiInputController) {
  23. self.standardInputMode = true
  24. }
  25. func emojiInputControllerDidSelectItemInSection(_ section: Int) {
  26. didSelectItemInSection?(section)
  27. }
  28. }
  29. init(text: Binding<String>, isFocused: Binding<Bool>, placeholder: String = "", emojiType: EmojiDataSourceType, didSelectItemInSection: ((Int) -> Void)? = nil) {
  30. self._text = text
  31. self._isFocused = isFocused
  32. self.placeholder = placeholder
  33. self.emojiType = emojiType
  34. self._viewModel = StateObject(wrappedValue: EmojiTextFieldViewModel(didSelectItemInSection: didSelectItemInSection))
  35. }
  36. var body: some View {
  37. // this if statement cannot be moved into the RowTextField closure because the closure does not refresh on state changes
  38. if viewModel.standardInputMode {
  39. RowTextField(text: $text, isFocused: $isFocused, maxLength: 20) { textField in
  40. textField.textAlignment = .right
  41. textField.font = UIFont.preferredFont(forTextStyle: .title3)
  42. textField.autocorrectionType = .no
  43. textField.autocapitalizationType = .none
  44. textField.placeholder = placeholder
  45. }
  46. }
  47. else {
  48. RowTextField(text: $text, isFocused: $isFocused, maxLength: 20) { textField in
  49. textField.textAlignment = .right
  50. textField.font = UIFont.preferredFont(forTextStyle: .title3)
  51. let emojiController = EmojiInputController.instance(withEmojis: emojiType.dataSource())
  52. emojiController.delegate = viewModel
  53. textField.customInput = emojiController
  54. textField.placeholder = placeholder
  55. }
  56. }
  57. }
  58. }