react-native-typerich 0.1.7 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -63,6 +63,8 @@ class TypeRichTextInputView : AppCompatEditText {
63
63
  private var keyboardAppearance: String = "default"
64
64
  private var inputMethodManager: InputMethodManager? = null
65
65
  private var lineHeightPx: Int? = null
66
+ private var isSettingTextFromJS = false
67
+
66
68
 
67
69
  constructor(context: Context) : super(context) {
68
70
  prepareComponent()
@@ -101,10 +103,12 @@ class TypeRichTextInputView : AppCompatEditText {
101
103
  layoutManager = TypeRichTextInputViewLayoutManager(this)
102
104
 
103
105
  addTextChangedListener(object : TextWatcher {
104
- override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
106
+ override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { if (isSettingTextFromJS) return}
105
107
 
106
108
  override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
107
109
  if (!isDuringTransaction) {
110
+ if (isSettingTextFromJS) return
111
+
108
112
  val reactContext = context as ReactContext
109
113
  val surfaceId = UIManagerHelper.getSurfaceId(reactContext)
110
114
  val dispatcher =
@@ -360,29 +364,51 @@ class TypeRichTextInputView : AppCompatEditText {
360
364
  // }
361
365
  }
362
366
 
363
-
364
367
  fun setValue(value: CharSequence?) {
365
368
  if (value == null) return
366
369
 
367
- val editText = this
370
+ val current = text?.toString() ?: ""
371
+ val newText = value.toString()
368
372
 
369
- // Save current selection BEFORE text change
370
- val prevStart = editText.selectionStart
371
- val prevEnd = editText.selectionEnd
373
+ if (current == newText) {
374
+ return
375
+ }
372
376
 
373
- runAsATransaction {
374
- if (editText.text.toString() != value.toString()) {
375
- setText(value.toString())
377
+ isSettingTextFromJS = true
378
+ try {
379
+ // Save current selection BEFORE text change
380
+ val prevStart = selectionStart
381
+ val prevEnd = selectionEnd
382
+
383
+ runAsATransaction {
384
+ // Check if this is just an insertion at cursor (fast typing case)
385
+ val isSimpleInsertion = prevStart == prevEnd &&
386
+ newText.length > current.length &&
387
+ prevStart <= newText.length &&
388
+ current.substring(0, minOf(prevStart, current.length)) ==
389
+ newText.substring(0, minOf(prevStart, current.length))
390
+
391
+ setText(newText)
392
+
393
+ val len = text?.length ?: 0
394
+
395
+ if (isSimpleInsertion) {
396
+ // For insertions, move cursor to end of new content
397
+ val diff = newText.length - current.length
398
+ val newPos = (prevStart + diff).coerceIn(0, len)
399
+ setSelection(newPos)
400
+ } else {
401
+ // For other changes, try to preserve relative position
402
+ val start = prevStart.coerceIn(0, len)
403
+ val end = prevEnd.coerceIn(0, len)
404
+ setSelection(start, end)
405
+ }
376
406
  }
377
-
378
- val len = editText.text?.length ?: 0
379
- val start = prevStart.coerceIn(0, len)
380
- val end = prevEnd.coerceIn(0, len)
381
-
382
- setSelection(start, end)
407
+ } finally {
408
+ isSettingTextFromJS = false
383
409
  }
384
410
  }
385
-
411
+
386
412
  fun setAutoFocus(autoFocus: Boolean) {
387
413
  this.autoFocus = autoFocus
388
414
  }
@@ -53,7 +53,8 @@ const TypeRichTextInput = /*#__PURE__*/forwardRef((props, ref) => {
53
53
  if (nativeRef.current) {
54
54
  Commands.setSelection(nativeRef.current, start, end);
55
55
  }
56
- }
56
+ },
57
+ getNativeRef: () => nativeRef.current
57
58
  }));
58
59
 
59
60
  /**
@@ -1 +1 @@
1
- {"version":3,"names":["forwardRef","useImperativeHandle","useRef","Platform","View","Commands","jsx","_jsx","NativeTypeRichTextInput","OS","require","default","normalizeEvent","event","nativeEvent","TypeRichTextInput","props","ref","nativeRef","focus","current","blur","setValue","text","setSelection","start","end","handlePasteImage","data","undefined","onPasteImageData","handleOnChangeTextEvent","e","onChangeText","value","handleonChangeSelectionEvent","onChangeSelection","androidExperimentalSynchronousEvents","onInputFocus","onFocus","onInputBlur","onBlur","onPasteImage"],"sourceRoot":"../../src","sources":["TypeRichTextInput.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["forwardRef","useImperativeHandle","useRef","Platform","View","Commands","jsx","_jsx","NativeTypeRichTextInput","OS","require","default","normalizeEvent","event","nativeEvent","TypeRichTextInput","props","ref","nativeRef","focus","current","blur","setValue","text","setSelection","start","end","getNativeRef","handlePasteImage","data","undefined","onPasteImageData","handleOnChangeTextEvent","e","onChangeText","value","handleonChangeSelectionEvent","onChangeSelection","androidExperimentalSynchronousEvents","onInputFocus","onFocus","onInputBlur","onBlur","onPasteImage"],"sourceRoot":"../../src","sources":["TypeRichTextInput.tsx"],"mappings":"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","ignoreList":[]}
@@ -19,6 +19,7 @@ export interface TypeRichTextInputRef {
19
19
  blur: () => void;
20
20
  setValue: (text: string) => void;
21
21
  setSelection: (start: number, end: number) => void;
22
+ getNativeRef: () => any | null;
22
23
  }
23
24
  /**
24
25
  * TypeRichTextInput
@@ -1 +1 @@
1
- {"version":3,"file":"TypeRichTextInput.d.ts","sourceRoot":"","sources":["../../../src/TypeRichTextInput.tsx"],"names":[],"mappings":"AAKA,OAAO,EAIL,KAAK,qBAAqB,EAC1B,KAAK,4BAA4B,EAClC,MAAM,oCAAoC,CAAC;AAW5C,KAAK,gBAAgB,CAAC,CAAC,IAAI,CAAC,GAAG;IAAE,WAAW,EAAE,CAAC,CAAA;CAAE,CAAC;AAElD,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAK/D;AAGD,MAAM,WAAW,sBACf,SAAQ,IAAI,CACV,4BAA4B,EAC1B,cAAc,GACd,mBAAmB,GACnB,cAAc,GACd,aAAa,GACb,cAAc,CACjB;IAED,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE;QAC1B,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;KACd,KAAK,IAAI,CAAC;IACX,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,CAAC;CAC1D;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACpD;AAED;;;;;;;;;;GAUG;AACH,QAAA,MAAM,iBAAiB,yHAiFtB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"TypeRichTextInput.d.ts","sourceRoot":"","sources":["../../../src/TypeRichTextInput.tsx"],"names":[],"mappings":"AAKA,OAAO,EAIL,KAAK,qBAAqB,EAC1B,KAAK,4BAA4B,EAClC,MAAM,oCAAoC,CAAC;AAW5C,KAAK,gBAAgB,CAAC,CAAC,IAAI,CAAC,GAAG;IAAE,WAAW,EAAE,CAAC,CAAA;CAAE,CAAC;AAElD,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAK/D;AAGD,MAAM,WAAW,sBACf,SAAQ,IAAI,CACV,4BAA4B,EAC1B,cAAc,GACd,mBAAmB,GACnB,cAAc,GACd,aAAa,GACb,cAAc,CACjB;IAED,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE;QAC1B,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;KACd,KAAK,IAAI,CAAC;IACX,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,CAAC;CAC1D;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,YAAY,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC;CAChC;AAED;;;;;;;;;;GAUG;AACH,QAAA,MAAM,iBAAiB,yHAkFtB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-typerich",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "description": "Textinput replacement",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -56,6 +56,7 @@ export interface TypeRichTextInputRef {
56
56
  blur: () => void;
57
57
  setValue: (text: string) => void;
58
58
  setSelection: (start: number, end: number) => void;
59
+ getNativeRef: () => any | null;
59
60
  }
60
61
 
61
62
  /**
@@ -94,6 +95,7 @@ const TypeRichTextInput = forwardRef(
94
95
  Commands.setSelection(nativeRef.current, start, end);
95
96
  }
96
97
  },
98
+ getNativeRef: () => nativeRef.current,
97
99
  }));
98
100
 
99
101
  /**