EmojiTextField.swift 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. //
  2. // SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
  3. // SPDX-License-Identifier: GPL-3.0-or-later
  4. //
  5. import UIKit
  6. import SwiftUI
  7. import Dynamic
  8. struct SingleEmojiTextFieldWrapper: UIViewRepresentable {
  9. @State var placeholder: String
  10. @Binding var text: String
  11. func makeUIView(context: Context) -> EmojiTextField {
  12. let emojiTextField = EmojiTextField()
  13. emojiTextField.delegate = context.coordinator
  14. return emojiTextField
  15. }
  16. func updateUIView(_ uiView: EmojiTextField, context: Context) {
  17. uiView.text = text
  18. uiView.placeholder = placeholder
  19. }
  20. func makeCoordinator() -> SingleEmojiTextFieldWrapper.Coordinator {
  21. Coordinator(parent: self)
  22. }
  23. class Coordinator: NSObject, UITextFieldDelegate {
  24. var parent: SingleEmojiTextFieldWrapper
  25. init(parent: SingleEmojiTextFieldWrapper) {
  26. self.parent = parent
  27. }
  28. func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
  29. if textField is EmojiTextField {
  30. if string.isSingleEmoji == false {
  31. self.parent.text = ""
  32. } else {
  33. self.parent.text = string
  34. }
  35. textField.endEditing(true)
  36. return false
  37. }
  38. return true
  39. }
  40. }
  41. }
  42. @objc class EmojiTextField: UITextField {
  43. override init(frame: CGRect) {
  44. super.init(frame: frame)
  45. tintColor = .clear
  46. }
  47. required init?(coder: NSCoder) {
  48. super.init(coder: coder)
  49. tintColor = .clear
  50. }
  51. // required for iOS 13
  52. override var textInputContextIdentifier: String? { "" } // return non-nil to show the Emoji keyboard ¯\_(ツ)_/¯
  53. override var textInputMode: UITextInputMode? {
  54. for mode in UITextInputMode.activeInputModes where mode.primaryLanguage == "emoji" {
  55. return mode
  56. }
  57. return nil
  58. }
  59. @discardableResult override func becomeFirstResponder() -> Bool {
  60. let result = super.becomeFirstResponder()
  61. if result && NCUtils.isiOSAppOnMac() {
  62. // Open the emoji picker when running on Mac OS
  63. let app = Dynamic.NSApplication.sharedApplication()
  64. app.orderFrontCharacterPalette(nil)
  65. }
  66. return result
  67. }
  68. }