@chaitrabhairappa/react-native-rich-text-editor 3.2.0 → 3.4.0
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.
- package/README.md +5 -0
- package/android/src/main/java/com/richtext/editor/MediaAttachmentSpan.kt +5 -0
- package/android/src/main/java/com/richtext/editor/MediaAttachmentSupport.kt +94 -8
- package/android/src/main/java/com/richtext/editor/RichTextEditorView.kt +59 -5
- package/android/src/main/java/com/richtext/editor/RichTextEditorViewManager.kt +29 -4
- package/ios/RichTextEditorView.swift +240 -19
- package/ios/RichTextEditorViewManager.m +1 -0
- package/lib/commonjs/RichTextEditorViewNativeComponent.js.map +1 -1
- package/lib/commonjs/index.js +12 -7
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/module/RichTextEditorViewNativeComponent.js.map +1 -1
- package/lib/module/index.js +12 -7
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/typescript/src/RichTextEditorViewNativeComponent.d.ts +1 -0
- package/lib/typescript/src/RichTextEditorViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +1 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +8 -1
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/RichTextEditorViewNativeComponent.ts +1 -0
- package/src/index.tsx +24 -11
- package/src/types.ts +8 -1
package/README.md
CHANGED
|
@@ -140,6 +140,7 @@ export default App;
|
|
|
140
140
|
| `placeholder` | `string` | `""` | Placeholder text |
|
|
141
141
|
| `initialContent` | `Block[]` | `[]` | Initial content blocks |
|
|
142
142
|
| `readOnly` | `boolean` | `false` | Make editor read-only |
|
|
143
|
+
| `selectable` | `boolean` | `true` | Enable/disable text selection |
|
|
143
144
|
| `numberOfLines` | `number` | `undefined` | Truncate text with ellipsis in readOnly mode |
|
|
144
145
|
| `maxHeight` | `number` | `undefined` | Maximum height before scrolling |
|
|
145
146
|
| `showToolbar` | `boolean` | `true` | Show/hide floating toolbar |
|
|
@@ -314,6 +315,10 @@ const toolbarOptions: ToolbarOption[] = ['bold', 'italic', 'underline', 'bullet'
|
|
|
314
315
|
|
|
315
316
|
## Changelog
|
|
316
317
|
|
|
318
|
+
### 3.3.0
|
|
319
|
+
|
|
320
|
+
- Add `selectable` prop to enable/disable text selection (iOS & Android)
|
|
321
|
+
|
|
317
322
|
### 3.0.0
|
|
318
323
|
|
|
319
324
|
- Add media attachment support — insert images into the editor (iOS & Android)
|
|
@@ -11,6 +11,11 @@ import kotlin.math.ceil
|
|
|
11
11
|
data class MediaAttachmentData(
|
|
12
12
|
val kind: String,
|
|
13
13
|
val uri: String,
|
|
14
|
+
val sourceUri: String? = null,
|
|
15
|
+
val fileName: String? = null,
|
|
16
|
+
val extension: String? = null,
|
|
17
|
+
val contentType: String? = null,
|
|
18
|
+
val fileSize: Long? = null,
|
|
14
19
|
val widthDp: Int,
|
|
15
20
|
val heightDp: Int,
|
|
16
21
|
val alt: String
|
|
@@ -4,9 +4,11 @@ import android.content.Context
|
|
|
4
4
|
import android.graphics.Bitmap
|
|
5
5
|
import android.graphics.BitmapFactory
|
|
6
6
|
import android.net.Uri
|
|
7
|
+
import android.provider.OpenableColumns
|
|
7
8
|
import android.text.Editable
|
|
8
9
|
import android.text.SpannableStringBuilder
|
|
9
10
|
import android.text.Spanned
|
|
11
|
+
import android.webkit.MimeTypeMap
|
|
10
12
|
import com.facebook.react.bridge.Arguments
|
|
11
13
|
import com.facebook.react.bridge.WritableMap
|
|
12
14
|
import org.json.JSONObject
|
|
@@ -32,9 +34,16 @@ class MediaAttachmentSupport(
|
|
|
32
34
|
if (blockType != "mediaAttachment") return null
|
|
33
35
|
|
|
34
36
|
val mediaInfo = block["mediaAttachment"] as? Map<*, *>
|
|
37
|
+
val uri = mediaInfo?.get("uri") as? String ?: ""
|
|
38
|
+
val sourceUri = mediaInfo?.get("sourceUri") as? String ?: uri
|
|
35
39
|
return MediaAttachmentData(
|
|
36
40
|
kind = mediaInfo?.get("kind") as? String ?: "image",
|
|
37
|
-
uri =
|
|
41
|
+
uri = uri,
|
|
42
|
+
sourceUri = sourceUri,
|
|
43
|
+
fileName = mediaInfo?.get("fileName") as? String,
|
|
44
|
+
extension = mediaInfo?.get("extension") as? String,
|
|
45
|
+
contentType = mediaInfo?.get("contentType") as? String,
|
|
46
|
+
fileSize = (mediaInfo?.get("fileSize") as? Number)?.toLong(),
|
|
38
47
|
widthDp = (mediaInfo?.get("width") as? Number)?.toInt() ?: 100,
|
|
39
48
|
heightDp = (mediaInfo?.get("height") as? Number)?.toInt() ?: 100,
|
|
40
49
|
alt = mediaInfo?.get("alt") as? String ?: ""
|
|
@@ -76,6 +85,11 @@ class MediaAttachmentSupport(
|
|
|
76
85
|
val mediaMap = Arguments.createMap()
|
|
77
86
|
mediaMap.putString("kind", mediaData.kind)
|
|
78
87
|
mediaMap.putString("uri", mediaData.uri)
|
|
88
|
+
mediaMap.putString("sourceUri", mediaData.sourceUri ?: mediaData.uri)
|
|
89
|
+
mediaData.fileName?.let { mediaMap.putString("fileName", it) }
|
|
90
|
+
mediaData.extension?.let { mediaMap.putString("extension", it) }
|
|
91
|
+
mediaData.contentType?.let { mediaMap.putString("contentType", it) }
|
|
92
|
+
mediaData.fileSize?.let { mediaMap.putDouble("fileSize", it.toDouble()) }
|
|
79
93
|
mediaMap.putInt("width", mediaData.widthDp)
|
|
80
94
|
mediaMap.putInt("height", mediaData.heightDp)
|
|
81
95
|
mediaMap.putString("alt", mediaData.alt)
|
|
@@ -93,6 +107,11 @@ class MediaAttachmentSupport(
|
|
|
93
107
|
val mediaObj = JSONObject()
|
|
94
108
|
mediaObj.put("kind", mediaData.kind)
|
|
95
109
|
mediaObj.put("uri", mediaData.uri)
|
|
110
|
+
mediaObj.put("sourceUri", mediaData.sourceUri ?: mediaData.uri)
|
|
111
|
+
mediaData.fileName?.let { mediaObj.put("fileName", it) }
|
|
112
|
+
mediaData.extension?.let { mediaObj.put("extension", it) }
|
|
113
|
+
mediaData.contentType?.let { mediaObj.put("contentType", it) }
|
|
114
|
+
mediaData.fileSize?.let { mediaObj.put("fileSize", it) }
|
|
96
115
|
mediaObj.put("width", mediaData.widthDp)
|
|
97
116
|
mediaObj.put("height", mediaData.heightDp)
|
|
98
117
|
mediaObj.put("alt", mediaData.alt)
|
|
@@ -127,14 +146,12 @@ class MediaAttachmentSupport(
|
|
|
127
146
|
}
|
|
128
147
|
|
|
129
148
|
fun insertMediaAttachmentBlock(editable: Editable, insertPos: Int, uri: String): Int {
|
|
149
|
+
val mediaData = createMediaDataForUri(uri)
|
|
150
|
+
return insertMediaAttachmentBlock(editable, insertPos, mediaData)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
fun insertMediaAttachmentBlock(editable: Editable, insertPos: Int, mediaData: MediaAttachmentData): Int {
|
|
130
154
|
var mutableInsertPos = insertPos.coerceIn(0, editable.length)
|
|
131
|
-
val mediaData = MediaAttachmentData(
|
|
132
|
-
kind = "image",
|
|
133
|
-
uri = uri,
|
|
134
|
-
widthDp = 100,
|
|
135
|
-
heightDp = 100,
|
|
136
|
-
alt = "Selected image"
|
|
137
|
-
)
|
|
138
155
|
|
|
139
156
|
if (mutableInsertPos > 0 && editable[mutableInsertPos - 1] != '\n') {
|
|
140
157
|
editable.insert(mutableInsertPos, "\n")
|
|
@@ -160,6 +177,75 @@ class MediaAttachmentSupport(
|
|
|
160
177
|
return nextPos.coerceAtMost(editable.length)
|
|
161
178
|
}
|
|
162
179
|
|
|
180
|
+
fun createMediaDataForUri(uri: String): MediaAttachmentData {
|
|
181
|
+
val inferredMeta = inferMediaMetadata(uri)
|
|
182
|
+
return MediaAttachmentData(
|
|
183
|
+
kind = "image",
|
|
184
|
+
uri = uri,
|
|
185
|
+
sourceUri = uri,
|
|
186
|
+
fileName = inferredMeta.fileName,
|
|
187
|
+
extension = inferredMeta.extension,
|
|
188
|
+
contentType = inferredMeta.contentType,
|
|
189
|
+
fileSize = inferredMeta.fileSize,
|
|
190
|
+
widthDp = 100,
|
|
191
|
+
heightDp = 100,
|
|
192
|
+
alt = "Selected image"
|
|
193
|
+
)
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
private data class InferredMediaMetadata(
|
|
197
|
+
val fileName: String?,
|
|
198
|
+
val extension: String?,
|
|
199
|
+
val contentType: String?,
|
|
200
|
+
val fileSize: Long?
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
private fun inferMediaMetadata(uriString: String): InferredMediaMetadata {
|
|
204
|
+
val parsed = runCatching { Uri.parse(uriString) }.getOrNull()
|
|
205
|
+
?: return InferredMediaMetadata(null, null, null, null)
|
|
206
|
+
|
|
207
|
+
val extension = runCatching {
|
|
208
|
+
MimeTypeMap.getFileExtensionFromUrl(parsed.toString())
|
|
209
|
+
}.getOrNull()?.takeIf { it.isNotBlank() }?.lowercase()
|
|
210
|
+
|
|
211
|
+
val contentType = runCatching {
|
|
212
|
+
context.contentResolver.getType(parsed)
|
|
213
|
+
}.getOrNull() ?: extension?.let {
|
|
214
|
+
MimeTypeMap.getSingleton().getMimeTypeFromExtension(it)
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
var fileName: String? = null
|
|
218
|
+
var fileSize: Long? = null
|
|
219
|
+
|
|
220
|
+
if (parsed.scheme == "content") {
|
|
221
|
+
runCatching {
|
|
222
|
+
context.contentResolver.query(parsed, null, null, null, null)
|
|
223
|
+
}.getOrNull()?.use { cursor ->
|
|
224
|
+
val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
|
|
225
|
+
val sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE)
|
|
226
|
+
if (cursor.moveToFirst()) {
|
|
227
|
+
if (nameIndex >= 0) {
|
|
228
|
+
fileName = cursor.getString(nameIndex)
|
|
229
|
+
}
|
|
230
|
+
if (sizeIndex >= 0 && !cursor.isNull(sizeIndex)) {
|
|
231
|
+
fileSize = cursor.getLong(sizeIndex)
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
if (fileName.isNullOrBlank()) {
|
|
238
|
+
fileName = parsed.lastPathSegment
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
val resolvedExtension = extension ?: fileName
|
|
242
|
+
?.substringAfterLast('.', "")
|
|
243
|
+
?.takeIf { it.isNotBlank() }
|
|
244
|
+
?.lowercase()
|
|
245
|
+
|
|
246
|
+
return InferredMediaMetadata(fileName, resolvedExtension, contentType, fileSize)
|
|
247
|
+
}
|
|
248
|
+
|
|
163
249
|
private fun normalizeMediaDimensions(mediaData: MediaAttachmentData, targetWidthPx: Int): MediaAttachmentData {
|
|
164
250
|
val targetWidthDp = (targetWidthPx / density).toInt().coerceAtLeast(1)
|
|
165
251
|
val fallbackHeightDp = if (mediaData.widthDp > 0 && mediaData.heightDp > 0) {
|
|
@@ -1006,6 +1006,10 @@ class RichTextEditorView(context: Context) : androidx.appcompat.widget.AppCompat
|
|
|
1006
1006
|
}
|
|
1007
1007
|
}
|
|
1008
1008
|
|
|
1009
|
+
fun setSelectableValue(value: Boolean) {
|
|
1010
|
+
setTextIsSelectable(value)
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1009
1013
|
fun setMaxHeightValue(value: Int) {
|
|
1010
1014
|
maxHeightValue = value
|
|
1011
1015
|
post { updateContentSize() }
|
|
@@ -1939,12 +1943,12 @@ class RichTextEditorView(context: Context) : androidx.appcompat.widget.AppCompat
|
|
|
1939
1943
|
imagePickerLauncher?.launch("image/*")
|
|
1940
1944
|
}
|
|
1941
1945
|
|
|
1942
|
-
private fun insertMediaAttachmentBlock(
|
|
1946
|
+
private fun insertMediaAttachmentBlock(mediaData: MediaAttachmentData) {
|
|
1943
1947
|
val editable = text ?: return
|
|
1944
1948
|
var insertPos = selectionStart.coerceIn(0, editable.length)
|
|
1945
1949
|
|
|
1946
1950
|
isInternalChange = true
|
|
1947
|
-
val nextPos = mediaAttachmentSupport.insertMediaAttachmentBlock(editable, insertPos,
|
|
1951
|
+
val nextPos = mediaAttachmentSupport.insertMediaAttachmentBlock(editable, insertPos, mediaData)
|
|
1948
1952
|
setSelection(nextPos.coerceAtMost(editable.length))
|
|
1949
1953
|
|
|
1950
1954
|
isInternalChange = false
|
|
@@ -1953,10 +1957,60 @@ class RichTextEditorView(context: Context) : androidx.appcompat.widget.AppCompat
|
|
|
1953
1957
|
post { updateContentSize() }
|
|
1954
1958
|
}
|
|
1955
1959
|
|
|
1956
|
-
fun
|
|
1957
|
-
val safeUri = uri
|
|
1960
|
+
private fun insertMediaAttachmentBlock(uri: String) {
|
|
1961
|
+
val safeUri = uri.trim()
|
|
1958
1962
|
if (safeUri.isEmpty()) return
|
|
1959
|
-
|
|
1963
|
+
val mediaData = mediaAttachmentSupport.createMediaDataForUri(safeUri)
|
|
1964
|
+
insertMediaAttachmentBlock(mediaData)
|
|
1965
|
+
}
|
|
1966
|
+
|
|
1967
|
+
private fun parseMediaAttachmentPayload(payload: String): MediaAttachmentData? {
|
|
1968
|
+
val trimmed = payload.trim()
|
|
1969
|
+
if (trimmed.isEmpty()) return null
|
|
1970
|
+
|
|
1971
|
+
return try {
|
|
1972
|
+
if (trimmed.startsWith("{")) {
|
|
1973
|
+
val obj = org.json.JSONObject(trimmed)
|
|
1974
|
+
val uri = obj.optString("uri", "").trim()
|
|
1975
|
+
if (uri.isEmpty()) {
|
|
1976
|
+
null
|
|
1977
|
+
} else {
|
|
1978
|
+
val sourceUri = obj.optString("sourceUri", uri).ifBlank { uri }
|
|
1979
|
+
val kind = obj.optString("kind", "image")
|
|
1980
|
+
val fileName = obj.optString("fileName", "").ifBlank { null }
|
|
1981
|
+
val extension = obj.optString("extension", "").ifBlank { null }
|
|
1982
|
+
val contentType = obj.optString("contentType", "").ifBlank { null }
|
|
1983
|
+
val fileSize = if (obj.has("fileSize")) obj.optLong("fileSize", -1L) else -1L
|
|
1984
|
+
val width = obj.optInt("width", 100).coerceAtLeast(1)
|
|
1985
|
+
val height = obj.optInt("height", 100).coerceAtLeast(1)
|
|
1986
|
+
val alt = obj.optString("alt", "Selected image")
|
|
1987
|
+
|
|
1988
|
+
MediaAttachmentData(
|
|
1989
|
+
kind = kind,
|
|
1990
|
+
uri = uri,
|
|
1991
|
+
sourceUri = sourceUri,
|
|
1992
|
+
fileName = fileName,
|
|
1993
|
+
extension = extension,
|
|
1994
|
+
contentType = contentType,
|
|
1995
|
+
fileSize = fileSize.takeIf { it >= 0L },
|
|
1996
|
+
widthDp = width,
|
|
1997
|
+
heightDp = height,
|
|
1998
|
+
alt = alt
|
|
1999
|
+
)
|
|
2000
|
+
}
|
|
2001
|
+
} else {
|
|
2002
|
+
mediaAttachmentSupport.createMediaDataForUri(trimmed)
|
|
2003
|
+
}
|
|
2004
|
+
} catch (_: Exception) {
|
|
2005
|
+
mediaAttachmentSupport.createMediaDataForUri(trimmed)
|
|
2006
|
+
}
|
|
2007
|
+
}
|
|
2008
|
+
|
|
2009
|
+
fun insertMediaAttachment(payload: String?) {
|
|
2010
|
+
val safePayload = payload?.trim().orEmpty()
|
|
2011
|
+
if (safePayload.isEmpty()) return
|
|
2012
|
+
val mediaData = parseMediaAttachmentPayload(safePayload) ?: return
|
|
2013
|
+
insertMediaAttachmentBlock(mediaData)
|
|
1960
2014
|
}
|
|
1961
2015
|
|
|
1962
2016
|
private fun promptInsertLink() {
|
|
@@ -29,8 +29,8 @@ class RichTextEditorViewManager : SimpleViewManager<RichTextEditorView>() {
|
|
|
29
29
|
override fun receiveCommand(view: RichTextEditorView, commandId: String?, args: ReadableArray?) {
|
|
30
30
|
when (commandId) {
|
|
31
31
|
"insertMediaAttachment" -> {
|
|
32
|
-
val
|
|
33
|
-
view.insertMediaAttachment(
|
|
32
|
+
val payload = args?.getString(0)
|
|
33
|
+
view.insertMediaAttachment(payload)
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -38,8 +38,8 @@ class RichTextEditorViewManager : SimpleViewManager<RichTextEditorView>() {
|
|
|
38
38
|
override fun receiveCommand(view: RichTextEditorView, commandId: Int, args: ReadableArray?) {
|
|
39
39
|
when (commandId) {
|
|
40
40
|
COMMAND_INSERT_MEDIA_ATTACHMENT -> {
|
|
41
|
-
val
|
|
42
|
-
view.insertMediaAttachment(
|
|
41
|
+
val payload = args?.getString(0)
|
|
42
|
+
view.insertMediaAttachment(payload)
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
}
|
|
@@ -62,6 +62,15 @@ class RichTextEditorViewManager : SimpleViewManager<RichTextEditorView>() {
|
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
@ReactProp(name = "selectable")
|
|
66
|
+
fun setSelectable(view: RichTextEditorView, selectable: Boolean) {
|
|
67
|
+
try {
|
|
68
|
+
view.setSelectableValue(selectable)
|
|
69
|
+
} catch (e: Exception) {
|
|
70
|
+
e.printStackTrace()
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
65
74
|
@ReactProp(name = "maxHeight")
|
|
66
75
|
fun setMaxHeight(view: RichTextEditorView, maxHeight: Double) {
|
|
67
76
|
try {
|
|
@@ -165,6 +174,22 @@ class RichTextEditorViewManager : SimpleViewManager<RichTextEditorView>() {
|
|
|
165
174
|
val mediaMap = mutableMapOf<String, Any>()
|
|
166
175
|
mediaMap["kind"] = mediaAttachment.optString("kind", "image")
|
|
167
176
|
mediaMap["uri"] = mediaAttachment.optString("uri", "")
|
|
177
|
+
mediaMap["sourceUri"] = mediaAttachment.optString(
|
|
178
|
+
"sourceUri",
|
|
179
|
+
mediaAttachment.optString("uri", "")
|
|
180
|
+
)
|
|
181
|
+
if (mediaAttachment.has("fileName")) {
|
|
182
|
+
mediaMap["fileName"] = mediaAttachment.optString("fileName", "")
|
|
183
|
+
}
|
|
184
|
+
if (mediaAttachment.has("extension")) {
|
|
185
|
+
mediaMap["extension"] = mediaAttachment.optString("extension", "")
|
|
186
|
+
}
|
|
187
|
+
if (mediaAttachment.has("contentType")) {
|
|
188
|
+
mediaMap["contentType"] = mediaAttachment.optString("contentType", "")
|
|
189
|
+
}
|
|
190
|
+
if (mediaAttachment.has("fileSize")) {
|
|
191
|
+
mediaMap["fileSize"] = mediaAttachment.optLong("fileSize", 0)
|
|
192
|
+
}
|
|
168
193
|
mediaMap["width"] = mediaAttachment.optInt("width", 100)
|
|
169
194
|
mediaMap["height"] = mediaAttachment.optInt("height", 100)
|
|
170
195
|
mediaMap["alt"] = mediaAttachment.optString("alt", "")
|
|
@@ -557,6 +557,12 @@ class RichTextEditorView: UIView, UITextViewDelegate, PHPickerViewControllerDele
|
|
|
557
557
|
}
|
|
558
558
|
}
|
|
559
559
|
|
|
560
|
+
@objc var selectable: Bool = true {
|
|
561
|
+
didSet {
|
|
562
|
+
textView.isSelectable = selectable
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
|
|
560
566
|
@objc var maxHeight: CGFloat = 0 {
|
|
561
567
|
didSet {
|
|
562
568
|
if maxHeight > 0 {
|
|
@@ -2029,7 +2035,12 @@ class RichTextEditorView: UIView, UITextViewDelegate, PHPickerViewControllerDele
|
|
|
2029
2035
|
|
|
2030
2036
|
private func insertPickedImage(_ image: UIImage) {
|
|
2031
2037
|
guard let imageUrl = writeImageToTemporaryURL(image) else { return }
|
|
2032
|
-
|
|
2038
|
+
let mediaAttachment = createMediaAttachmentInfoFromUri(
|
|
2039
|
+
imageUrl.absoluteString,
|
|
2040
|
+
kind: "image",
|
|
2041
|
+
alt: "Selected image"
|
|
2042
|
+
)
|
|
2043
|
+
insertMediaAttachmentBlock(mediaAttachment: mediaAttachment, image: image)
|
|
2033
2044
|
}
|
|
2034
2045
|
|
|
2035
2046
|
private func writeImageToTemporaryURL(_ image: UIImage) -> URL? {
|
|
@@ -2045,7 +2056,12 @@ class RichTextEditorView: UIView, UITextViewDelegate, PHPickerViewControllerDele
|
|
|
2045
2056
|
}
|
|
2046
2057
|
}
|
|
2047
2058
|
|
|
2048
|
-
private func insertMediaAttachmentBlock(
|
|
2059
|
+
private func insertMediaAttachmentBlock(mediaAttachment: [String: Any], image: UIImage?) {
|
|
2060
|
+
guard let uri = mediaAttachment["uri"] as? String,
|
|
2061
|
+
!uri.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else {
|
|
2062
|
+
return
|
|
2063
|
+
}
|
|
2064
|
+
|
|
2049
2065
|
let mutable = NSMutableAttributedString(attributedString: textView.attributedText)
|
|
2050
2066
|
var insertPos = textView.selectedRange.location
|
|
2051
2067
|
insertPos = max(0, min(insertPos, mutable.length))
|
|
@@ -2060,7 +2076,12 @@ class RichTextEditorView: UIView, UITextViewDelegate, PHPickerViewControllerDele
|
|
|
2060
2076
|
}
|
|
2061
2077
|
}
|
|
2062
2078
|
|
|
2063
|
-
let attachmentString = createMediaAttachmentAttributedString(
|
|
2079
|
+
let attachmentString = createMediaAttachmentAttributedString(
|
|
2080
|
+
mediaAttachment: mediaAttachment,
|
|
2081
|
+
image: image,
|
|
2082
|
+
width: nil,
|
|
2083
|
+
height: nil
|
|
2084
|
+
)
|
|
2064
2085
|
mutable.insert(attachmentString, at: insertPos)
|
|
2065
2086
|
|
|
2066
2087
|
var nextPos = insertPos + attachmentString.length
|
|
@@ -2084,13 +2105,30 @@ class RichTextEditorView: UIView, UITextViewDelegate, PHPickerViewControllerDele
|
|
|
2084
2105
|
updateContentSize()
|
|
2085
2106
|
}
|
|
2086
2107
|
|
|
2087
|
-
private func
|
|
2108
|
+
private func insertMediaAttachmentBlock(uri: String, image: UIImage?) {
|
|
2109
|
+
let safeUri = uri.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
2110
|
+
guard !safeUri.isEmpty else { return }
|
|
2111
|
+
let mediaAttachment = createMediaAttachmentInfoFromUri(safeUri, kind: "image", alt: "Selected image")
|
|
2112
|
+
insertMediaAttachmentBlock(mediaAttachment: mediaAttachment, image: image)
|
|
2113
|
+
}
|
|
2114
|
+
|
|
2115
|
+
private func createMediaAttachmentAttributedString(mediaAttachment: [String: Any], image: UIImage?, width: CGFloat?, height: CGFloat?) -> NSAttributedString {
|
|
2116
|
+
let uri = (mediaAttachment["uri"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
|
|
2117
|
+
let sourceUri = (mediaAttachment["sourceUri"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
2118
|
+
.flatMap { $0.isEmpty ? nil : $0 } ?? uri
|
|
2119
|
+
let kind = (mediaAttachment["kind"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
2120
|
+
.flatMap { $0.isEmpty ? nil : $0 } ?? "image"
|
|
2121
|
+
let alt = (mediaAttachment["alt"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
2122
|
+
.flatMap { $0.isEmpty ? nil : $0 } ?? "Selected image"
|
|
2123
|
+
|
|
2124
|
+
let widthFromPayload = numberValue(mediaAttachment["width"]).map { CGFloat(truncating: $0) }
|
|
2125
|
+
let heightFromPayload = numberValue(mediaAttachment["height"]).map { CGFloat(truncating: $0) }
|
|
2088
2126
|
let textContainerWidth = max(
|
|
2089
2127
|
120,
|
|
2090
2128
|
textView.bounds.width - textView.textContainerInset.left - textView.textContainerInset.right - textView.textContainer.lineFragmentPadding * 2
|
|
2091
2129
|
)
|
|
2092
2130
|
|
|
2093
|
-
let fallbackWidth = width ?? textContainerWidth
|
|
2131
|
+
let fallbackWidth = width ?? widthFromPayload ?? textContainerWidth
|
|
2094
2132
|
let normalizedWidth = max(1, min(textContainerWidth, fallbackWidth))
|
|
2095
2133
|
|
|
2096
2134
|
let sourceImage = image ?? loadImageFromUri(uri)
|
|
@@ -2098,7 +2136,7 @@ class RichTextEditorView: UIView, UITextViewDelegate, PHPickerViewControllerDele
|
|
|
2098
2136
|
if let sourceImage = sourceImage, sourceImage.size.width > 0 {
|
|
2099
2137
|
normalizedHeight = max(1, normalizedWidth * (sourceImage.size.height / sourceImage.size.width))
|
|
2100
2138
|
} else {
|
|
2101
|
-
normalizedHeight = max(1, height ?? normalizedWidth)
|
|
2139
|
+
normalizedHeight = max(1, height ?? heightFromPayload ?? normalizedWidth)
|
|
2102
2140
|
}
|
|
2103
2141
|
|
|
2104
2142
|
let targetSize = CGSize(width: normalizedWidth, height: normalizedHeight)
|
|
@@ -2107,15 +2145,32 @@ class RichTextEditorView: UIView, UITextViewDelegate, PHPickerViewControllerDele
|
|
|
2107
2145
|
attachment.image = renderMediaImage(sourceImage, targetSize: targetSize)
|
|
2108
2146
|
|
|
2109
2147
|
let attributed = NSMutableAttributedString(attachment: attachment)
|
|
2148
|
+
|
|
2149
|
+
var normalizedAttachment: [String: Any] = [
|
|
2150
|
+
"kind": kind,
|
|
2151
|
+
"uri": uri,
|
|
2152
|
+
"sourceUri": sourceUri,
|
|
2153
|
+
"width": Int(normalizedWidth.rounded()),
|
|
2154
|
+
"height": Int(normalizedHeight.rounded()),
|
|
2155
|
+
"alt": alt
|
|
2156
|
+
]
|
|
2157
|
+
|
|
2158
|
+
if let fileName = (mediaAttachment["fileName"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines), !fileName.isEmpty {
|
|
2159
|
+
normalizedAttachment["fileName"] = fileName
|
|
2160
|
+
}
|
|
2161
|
+
if let fileExtension = (mediaAttachment["extension"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines), !fileExtension.isEmpty {
|
|
2162
|
+
normalizedAttachment["extension"] = fileExtension
|
|
2163
|
+
}
|
|
2164
|
+
if let contentType = (mediaAttachment["contentType"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines), !contentType.isEmpty {
|
|
2165
|
+
normalizedAttachment["contentType"] = contentType
|
|
2166
|
+
}
|
|
2167
|
+
if let fileSize = numberValue(mediaAttachment["fileSize"]) {
|
|
2168
|
+
normalizedAttachment["fileSize"] = fileSize
|
|
2169
|
+
}
|
|
2170
|
+
|
|
2110
2171
|
attributed.addAttribute(
|
|
2111
2172
|
RichTextEditorView.mediaAttachmentAttributeKey,
|
|
2112
|
-
value:
|
|
2113
|
-
"kind": "image",
|
|
2114
|
-
"uri": uri,
|
|
2115
|
-
"width": Int(normalizedWidth.rounded()),
|
|
2116
|
-
"height": Int(normalizedHeight.rounded()),
|
|
2117
|
-
"alt": alt
|
|
2118
|
-
],
|
|
2173
|
+
value: normalizedAttachment,
|
|
2119
2174
|
range: NSRange(location: 0, length: attributed.length)
|
|
2120
2175
|
)
|
|
2121
2176
|
|
|
@@ -2166,6 +2221,137 @@ class RichTextEditorView: UIView, UITextViewDelegate, PHPickerViewControllerDele
|
|
|
2166
2221
|
return UIImage(data: data)
|
|
2167
2222
|
}
|
|
2168
2223
|
|
|
2224
|
+
private func createMediaAttachmentInfoFromUri(_ uri: String, kind: String = "image", alt: String = "Selected image") -> [String: Any] {
|
|
2225
|
+
let normalizedUri = uri.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
2226
|
+
var mediaAttachment: [String: Any] = [
|
|
2227
|
+
"kind": kind,
|
|
2228
|
+
"uri": normalizedUri,
|
|
2229
|
+
"sourceUri": normalizedUri,
|
|
2230
|
+
"alt": alt
|
|
2231
|
+
]
|
|
2232
|
+
|
|
2233
|
+
let inferred = inferMediaMetadata(from: normalizedUri)
|
|
2234
|
+
if let fileName = inferred.fileName {
|
|
2235
|
+
mediaAttachment["fileName"] = fileName
|
|
2236
|
+
}
|
|
2237
|
+
if let fileExtension = inferred.fileExtension {
|
|
2238
|
+
mediaAttachment["extension"] = fileExtension
|
|
2239
|
+
}
|
|
2240
|
+
if let contentType = inferred.contentType {
|
|
2241
|
+
mediaAttachment["contentType"] = contentType
|
|
2242
|
+
}
|
|
2243
|
+
if let fileSize = inferred.fileSize {
|
|
2244
|
+
mediaAttachment["fileSize"] = fileSize
|
|
2245
|
+
}
|
|
2246
|
+
|
|
2247
|
+
return mediaAttachment
|
|
2248
|
+
}
|
|
2249
|
+
|
|
2250
|
+
private func numberValue(_ value: Any?) -> NSNumber? {
|
|
2251
|
+
if let number = value as? NSNumber {
|
|
2252
|
+
return number
|
|
2253
|
+
}
|
|
2254
|
+
if let intValue = value as? Int {
|
|
2255
|
+
return NSNumber(value: intValue)
|
|
2256
|
+
}
|
|
2257
|
+
if let int64Value = value as? Int64 {
|
|
2258
|
+
return NSNumber(value: int64Value)
|
|
2259
|
+
}
|
|
2260
|
+
if let doubleValue = value as? Double {
|
|
2261
|
+
return NSNumber(value: doubleValue)
|
|
2262
|
+
}
|
|
2263
|
+
if let floatValue = value as? Float {
|
|
2264
|
+
return NSNumber(value: floatValue)
|
|
2265
|
+
}
|
|
2266
|
+
return nil
|
|
2267
|
+
}
|
|
2268
|
+
|
|
2269
|
+
private func parseMediaAttachmentPayload(_ payload: String) -> [String: Any]? {
|
|
2270
|
+
let trimmed = payload.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
2271
|
+
guard !trimmed.isEmpty else { return nil }
|
|
2272
|
+
|
|
2273
|
+
if trimmed.first == "{" {
|
|
2274
|
+
guard let data = trimmed.data(using: .utf8),
|
|
2275
|
+
let raw = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
|
|
2276
|
+
let uriValue = raw["uri"] as? String else {
|
|
2277
|
+
return nil
|
|
2278
|
+
}
|
|
2279
|
+
|
|
2280
|
+
let uri = uriValue.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
2281
|
+
guard !uri.isEmpty else { return nil }
|
|
2282
|
+
|
|
2283
|
+
var normalized = createMediaAttachmentInfoFromUri(uri)
|
|
2284
|
+
|
|
2285
|
+
if let kind = (raw["kind"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines), !kind.isEmpty {
|
|
2286
|
+
normalized["kind"] = kind
|
|
2287
|
+
}
|
|
2288
|
+
if let sourceUri = (raw["sourceUri"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines), !sourceUri.isEmpty {
|
|
2289
|
+
normalized["sourceUri"] = sourceUri
|
|
2290
|
+
}
|
|
2291
|
+
if let alt = (raw["alt"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines), !alt.isEmpty {
|
|
2292
|
+
normalized["alt"] = alt
|
|
2293
|
+
}
|
|
2294
|
+
if let fileName = (raw["fileName"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines), !fileName.isEmpty {
|
|
2295
|
+
normalized["fileName"] = fileName
|
|
2296
|
+
}
|
|
2297
|
+
if let fileExtension = (raw["extension"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines), !fileExtension.isEmpty {
|
|
2298
|
+
normalized["extension"] = fileExtension
|
|
2299
|
+
}
|
|
2300
|
+
if let contentType = (raw["contentType"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines), !contentType.isEmpty {
|
|
2301
|
+
normalized["contentType"] = contentType
|
|
2302
|
+
}
|
|
2303
|
+
if let fileSize = numberValue(raw["fileSize"]) {
|
|
2304
|
+
normalized["fileSize"] = fileSize
|
|
2305
|
+
}
|
|
2306
|
+
if let width = numberValue(raw["width"]) {
|
|
2307
|
+
normalized["width"] = max(1, width.intValue)
|
|
2308
|
+
}
|
|
2309
|
+
if let height = numberValue(raw["height"]) {
|
|
2310
|
+
normalized["height"] = max(1, height.intValue)
|
|
2311
|
+
}
|
|
2312
|
+
|
|
2313
|
+
return normalized
|
|
2314
|
+
}
|
|
2315
|
+
|
|
2316
|
+
return createMediaAttachmentInfoFromUri(trimmed)
|
|
2317
|
+
}
|
|
2318
|
+
|
|
2319
|
+
private func inferMediaMetadata(from uri: String) -> (fileName: String?, fileExtension: String?, contentType: String?, fileSize: NSNumber?) {
|
|
2320
|
+
guard let url = URL(string: uri) else {
|
|
2321
|
+
return (nil, nil, nil, nil)
|
|
2322
|
+
}
|
|
2323
|
+
|
|
2324
|
+
let fileName = url.lastPathComponent.isEmpty ? nil : url.lastPathComponent
|
|
2325
|
+
let fileExtension = url.pathExtension.isEmpty ? nil : url.pathExtension.lowercased()
|
|
2326
|
+
|
|
2327
|
+
var fileSize: NSNumber?
|
|
2328
|
+
if url.isFileURL,
|
|
2329
|
+
let attributes = try? FileManager.default.attributesOfItem(atPath: url.path),
|
|
2330
|
+
let size = attributes[.size] as? NSNumber {
|
|
2331
|
+
fileSize = size
|
|
2332
|
+
}
|
|
2333
|
+
|
|
2334
|
+
let contentType = fileExtension.flatMap { mimeType(forExtension: $0) }
|
|
2335
|
+
|
|
2336
|
+
return (fileName, fileExtension, contentType, fileSize)
|
|
2337
|
+
}
|
|
2338
|
+
|
|
2339
|
+
private func mimeType(forExtension fileExtension: String) -> String? {
|
|
2340
|
+
let lower = fileExtension.lowercased()
|
|
2341
|
+
switch lower {
|
|
2342
|
+
case "jpg", "jpeg": return "image/jpeg"
|
|
2343
|
+
case "png": return "image/png"
|
|
2344
|
+
case "gif": return "image/gif"
|
|
2345
|
+
case "webp": return "image/webp"
|
|
2346
|
+
case "bmp": return "image/bmp"
|
|
2347
|
+
case "heic": return "image/heic"
|
|
2348
|
+
case "heif": return "image/heif"
|
|
2349
|
+
case "mp4": return "video/mp4"
|
|
2350
|
+
case "mov": return "video/quicktime"
|
|
2351
|
+
default: return nil
|
|
2352
|
+
}
|
|
2353
|
+
}
|
|
2354
|
+
|
|
2169
2355
|
private func isImageURL(_ url: URL) -> Bool {
|
|
2170
2356
|
let lowercasedPath = url.path.lowercased()
|
|
2171
2357
|
return lowercasedPath.hasSuffix(".png") ||
|
|
@@ -2359,9 +2545,38 @@ class RichTextEditorView: UIView, UITextViewDelegate, PHPickerViewControllerDele
|
|
|
2359
2545
|
let uri = mediaAttachment["uri"] as? String {
|
|
2360
2546
|
let width = (mediaAttachment["width"] as? NSNumber).map { CGFloat(truncating: $0) }
|
|
2361
2547
|
let height = (mediaAttachment["height"] as? NSNumber).map { CGFloat(truncating: $0) }
|
|
2362
|
-
|
|
2548
|
+
var normalizedMediaAttachment = createMediaAttachmentInfoFromUri(uri)
|
|
2363
2549
|
|
|
2364
|
-
|
|
2550
|
+
if let kind = mediaAttachment["kind"] as? String {
|
|
2551
|
+
normalizedMediaAttachment["kind"] = kind
|
|
2552
|
+
}
|
|
2553
|
+
if let sourceUri = mediaAttachment["sourceUri"] as? String, !sourceUri.isEmpty {
|
|
2554
|
+
normalizedMediaAttachment["sourceUri"] = sourceUri
|
|
2555
|
+
}
|
|
2556
|
+
if let alt = mediaAttachment["alt"] as? String, !alt.isEmpty {
|
|
2557
|
+
normalizedMediaAttachment["alt"] = alt
|
|
2558
|
+
}
|
|
2559
|
+
if let fileName = mediaAttachment["fileName"] as? String, !fileName.isEmpty {
|
|
2560
|
+
normalizedMediaAttachment["fileName"] = fileName
|
|
2561
|
+
}
|
|
2562
|
+
if let fileExtension = mediaAttachment["extension"] as? String, !fileExtension.isEmpty {
|
|
2563
|
+
normalizedMediaAttachment["extension"] = fileExtension
|
|
2564
|
+
}
|
|
2565
|
+
if let contentType = mediaAttachment["contentType"] as? String, !contentType.isEmpty {
|
|
2566
|
+
normalizedMediaAttachment["contentType"] = contentType
|
|
2567
|
+
}
|
|
2568
|
+
if let fileSize = numberValue(mediaAttachment["fileSize"]) {
|
|
2569
|
+
normalizedMediaAttachment["fileSize"] = fileSize
|
|
2570
|
+
}
|
|
2571
|
+
|
|
2572
|
+
attributedString.append(
|
|
2573
|
+
createMediaAttachmentAttributedString(
|
|
2574
|
+
mediaAttachment: normalizedMediaAttachment,
|
|
2575
|
+
image: nil,
|
|
2576
|
+
width: width,
|
|
2577
|
+
height: height
|
|
2578
|
+
)
|
|
2579
|
+
)
|
|
2365
2580
|
|
|
2366
2581
|
if blockIndex < blocks.count - 1 {
|
|
2367
2582
|
attributedString.append(NSAttributedString(string: "\n", attributes: [
|
|
@@ -2583,10 +2798,16 @@ class RichTextEditorView: UIView, UITextViewDelegate, PHPickerViewControllerDele
|
|
|
2583
2798
|
}
|
|
2584
2799
|
|
|
2585
2800
|
func insertMediaAttachment(uri: String) {
|
|
2586
|
-
let
|
|
2587
|
-
guard !
|
|
2588
|
-
|
|
2589
|
-
|
|
2801
|
+
let safePayload = uri.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
2802
|
+
guard !safePayload.isEmpty,
|
|
2803
|
+
let mediaAttachment = parseMediaAttachmentPayload(safePayload),
|
|
2804
|
+
let mediaUri = mediaAttachment["uri"] as? String,
|
|
2805
|
+
!mediaUri.isEmpty else {
|
|
2806
|
+
return
|
|
2807
|
+
}
|
|
2808
|
+
|
|
2809
|
+
let image = loadImageFromUri(mediaUri)
|
|
2810
|
+
insertMediaAttachmentBlock(mediaAttachment: mediaAttachment, image: image)
|
|
2590
2811
|
}
|
|
2591
2812
|
|
|
2592
2813
|
func undo() {
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
RCT_EXPORT_VIEW_PROPERTY(placeholder, NSString)
|
|
6
6
|
RCT_EXPORT_VIEW_PROPERTY(editable, BOOL)
|
|
7
|
+
RCT_EXPORT_VIEW_PROPERTY(selectable, BOOL)
|
|
7
8
|
RCT_EXPORT_VIEW_PROPERTY(maxHeight, CGFloat)
|
|
8
9
|
RCT_EXPORT_VIEW_PROPERTY(numberOfLines, NSInteger)
|
|
9
10
|
RCT_EXPORT_VIEW_PROPERTY(showToolbar, BOOL)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","COMPONENT_NAME","hasNativeComponent","UIManager","getViewManagerConfig","RichTextEditorViewNative","requireNativeComponent","_default","exports","default"],"sourceRoot":"../../src","sources":["RichTextEditorViewNativeComponent.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;
|
|
1
|
+
{"version":3,"names":["_reactNative","require","COMPONENT_NAME","hasNativeComponent","UIManager","getViewManagerConfig","RichTextEditorViewNative","requireNativeComponent","_default","exports","default"],"sourceRoot":"../../src","sources":["RichTextEditorViewNativeComponent.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAqEA,MAAMC,cAAc,GAAG,oBAAoB;;AAE3C;AACA,MAAMC,kBAAkB,GAAGC,sBAAS,CAACC,oBAAoB,CAACH,cAAc,CAAC,IAAI,IAAI;AAEjF,IAAII,wBAAoD;AAExD,IAAIH,kBAAkB,EAAE;EACtBG,wBAAwB,GAAG,IAAAC,mCAAsB,EAC/CL,cACF,CAA+B;AACjC,CAAC,MAAM;EACLI,wBAAwB,GAAIA,CAAA,KAAM,IAAY;AAChD;AAAC,IAAAE,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEcJ,wBAAwB","ignoreList":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -33,10 +33,16 @@ const RichTextEditor = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
|
|
|
33
33
|
if (commandId == null) return;
|
|
34
34
|
_reactNative.UIManager.dispatchViewManagerCommand(nativeTag, commandId, args);
|
|
35
35
|
}, []);
|
|
36
|
-
const dispatchInsertMediaAttachment = _react.default.useCallback(
|
|
37
|
-
if (typeof uri !== "string" || uri.trim().length === 0)
|
|
36
|
+
const dispatchInsertMediaAttachment = _react.default.useCallback(mediaAttachment => {
|
|
37
|
+
if (!mediaAttachment || typeof mediaAttachment !== "object" || typeof mediaAttachment.uri !== "string" || mediaAttachment.uri.trim().length === 0) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const normalizedMediaAttachment = {
|
|
41
|
+
...mediaAttachment,
|
|
42
|
+
sourceUri: mediaAttachment.sourceUri ?? mediaAttachment.uri
|
|
43
|
+
};
|
|
38
44
|
if (_reactNative.Platform.OS === "android") {
|
|
39
|
-
dispatchAndroidCommand("insertMediaAttachment", [
|
|
45
|
+
dispatchAndroidCommand("insertMediaAttachment", [JSON.stringify(normalizedMediaAttachment)]);
|
|
40
46
|
return;
|
|
41
47
|
}
|
|
42
48
|
if (_reactNative.Platform.OS === "ios") {
|
|
@@ -44,7 +50,7 @@ const RichTextEditor = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
|
|
|
44
50
|
if (nativeTag == null) return;
|
|
45
51
|
const manager = _reactNative.NativeModules ? _reactNative.NativeModules["RichTextEditorViewManager"] : null;
|
|
46
52
|
if (manager && typeof manager === "object" && typeof manager.insertMediaAttachment === "function") {
|
|
47
|
-
manager.insertMediaAttachment(nativeTag,
|
|
53
|
+
manager.insertMediaAttachment(nativeTag, JSON.stringify(normalizedMediaAttachment));
|
|
48
54
|
}
|
|
49
55
|
}
|
|
50
56
|
}, [dispatchAndroidCommand]);
|
|
@@ -105,9 +111,7 @@ const RichTextEditor = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
|
|
|
105
111
|
/* Native toolbar handles this */
|
|
106
112
|
},
|
|
107
113
|
insertMediaAttachment: mediaAttachment => {
|
|
108
|
-
|
|
109
|
-
dispatchInsertMediaAttachment(mediaAttachment.uri);
|
|
110
|
-
}
|
|
114
|
+
dispatchInsertMediaAttachment(mediaAttachment);
|
|
111
115
|
},
|
|
112
116
|
undo: () => {
|
|
113
117
|
/* Native toolbar handles this */
|
|
@@ -186,6 +190,7 @@ const RichTextEditor = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
|
|
|
186
190
|
placeholder: props.placeholder,
|
|
187
191
|
initialContentJson: props.initialContent ? JSON.stringify(props.initialContent) : undefined,
|
|
188
192
|
editable: props.readOnly !== undefined ? !props.readOnly : true,
|
|
193
|
+
selectable: props.selectable ?? true,
|
|
189
194
|
maxHeight: props.maxHeight,
|
|
190
195
|
numberOfLines: props.numberOfLines,
|
|
191
196
|
showToolbar: props.readOnly ? false : props.showToolbar ?? true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_RichTextEditorViewNativeComponent","_types","e","__esModule","default","RichTextEditor","React","forwardRef","props","ref","nativeRef","useRef","height","setHeight","useState","handleSizeChange","useCallback","event","newHeight","nativeEvent","dispatchAndroidCommand","commandName","args","Platform","OS","nativeTag","findNodeHandle","current","commandConfig","UIManager","getViewManagerConfig","Commands","commandId","dispatchViewManagerCommand","dispatchInsertMediaAttachment","uri","trim","length","manager","NativeModules","insertMediaAttachment","useImperativeHandle","setContent","_blocks","getText","getBlocks","clear","focus","blur","toggleBold","toggleItalic","toggleUnderline","toggleStrikethrough","toggleCode","toggleHighlight","_color","setHeading","setBulletList","setNumberedList","setQuote","setChecklist","setParagraph","insertLink","_url","_text","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_RichTextEditorViewNativeComponent","_types","e","__esModule","default","RichTextEditor","React","forwardRef","props","ref","nativeRef","useRef","height","setHeight","useState","handleSizeChange","useCallback","event","newHeight","nativeEvent","dispatchAndroidCommand","commandName","args","Platform","OS","nativeTag","findNodeHandle","current","commandConfig","UIManager","getViewManagerConfig","Commands","commandId","dispatchViewManagerCommand","dispatchInsertMediaAttachment","mediaAttachment","uri","trim","length","normalizedMediaAttachment","sourceUri","JSON","stringify","manager","NativeModules","insertMediaAttachment","useImperativeHandle","setContent","_blocks","getText","getBlocks","clear","focus","blur","toggleBold","toggleItalic","toggleUnderline","toggleStrikethrough","toggleCode","toggleHighlight","_color","setHeading","setBulletList","setNumberedList","setQuote","setChecklist","setParagraph","insertLink","_url","_text","undo","redo","clearFormatting","indent","outdent","setAlignment","_alignment","toggleChecklistItem","handleContentChange","blocks","blocksJson","parse","contentEvent","text","delta","onContentChange","handleSelectionChange","selectionEvent","start","end","onSelectionChange","handleFocus","onFocus","handleBlur","onBlur","handleActiveStylesChange","onActiveStylesChange","combinedStyle","StyleSheet","flatten","style","createElement","placeholder","initialContentJson","initialContent","undefined","editable","readOnly","selectable","maxHeight","numberOfLines","showToolbar","toolbarOptions","variant","fontFamily","fontSize","onEditorFocus","onEditorBlur","onSizeChange","displayName","_default","exports"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DEFAULT_TOOLBAR_OPTIONS","exports"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"names":["DEFAULT_TOOLBAR_OPTIONS","exports"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;;;;;AAqGO,MAAMA,uBAAwC,GAAAC,OAAA,CAAAD,uBAAA,GAAG,CACtD,MAAM,EACN,QAAQ,EACR,WAAW,EACX,eAAe,EACf,MAAM,EACN,WAAW,EACX,SAAS,EACT,QAAQ,EACR,UAAU,EACV,OAAO,EACP,WAAW,EACX,iBAAiB,EACjB,MAAM,EACN,MAAM,EACN,MAAM,EACN,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,aAAa,EACb,YAAY,CACb","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["requireNativeComponent","UIManager","COMPONENT_NAME","hasNativeComponent","getViewManagerConfig","RichTextEditorViewNative"],"sourceRoot":"../../src","sources":["RichTextEditorViewNativeComponent.ts"],"mappings":"AACA,SAASA,sBAAsB,EAAEC,SAAS,QAAQ,cAAc;
|
|
1
|
+
{"version":3,"names":["requireNativeComponent","UIManager","COMPONENT_NAME","hasNativeComponent","getViewManagerConfig","RichTextEditorViewNative"],"sourceRoot":"../../src","sources":["RichTextEditorViewNativeComponent.ts"],"mappings":"AACA,SAASA,sBAAsB,EAAEC,SAAS,QAAQ,cAAc;AAqEhE,MAAMC,cAAc,GAAG,oBAAoB;;AAE3C;AACA,MAAMC,kBAAkB,GAAGF,SAAS,CAACG,oBAAoB,CAACF,cAAc,CAAC,IAAI,IAAI;AAEjF,IAAIG,wBAAoD;AAExD,IAAIF,kBAAkB,EAAE;EACtBE,wBAAwB,GAAGL,sBAAsB,CAC/CE,cACF,CAA+B;AACjC,CAAC,MAAM;EACLG,wBAAwB,GAAIA,CAAA,KAAM,IAAY;AAChD;AAEA,eAAeA,wBAAwB","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -19,10 +19,16 @@ const RichTextEditor = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
19
19
|
if (commandId == null) return;
|
|
20
20
|
UIManager.dispatchViewManagerCommand(nativeTag, commandId, args);
|
|
21
21
|
}, []);
|
|
22
|
-
const dispatchInsertMediaAttachment = React.useCallback(
|
|
23
|
-
if (typeof uri !== "string" || uri.trim().length === 0)
|
|
22
|
+
const dispatchInsertMediaAttachment = React.useCallback(mediaAttachment => {
|
|
23
|
+
if (!mediaAttachment || typeof mediaAttachment !== "object" || typeof mediaAttachment.uri !== "string" || mediaAttachment.uri.trim().length === 0) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const normalizedMediaAttachment = {
|
|
27
|
+
...mediaAttachment,
|
|
28
|
+
sourceUri: mediaAttachment.sourceUri ?? mediaAttachment.uri
|
|
29
|
+
};
|
|
24
30
|
if (Platform.OS === "android") {
|
|
25
|
-
dispatchAndroidCommand("insertMediaAttachment", [
|
|
31
|
+
dispatchAndroidCommand("insertMediaAttachment", [JSON.stringify(normalizedMediaAttachment)]);
|
|
26
32
|
return;
|
|
27
33
|
}
|
|
28
34
|
if (Platform.OS === "ios") {
|
|
@@ -30,7 +36,7 @@ const RichTextEditor = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
30
36
|
if (nativeTag == null) return;
|
|
31
37
|
const manager = NativeModules ? NativeModules["RichTextEditorViewManager"] : null;
|
|
32
38
|
if (manager && typeof manager === "object" && typeof manager.insertMediaAttachment === "function") {
|
|
33
|
-
manager.insertMediaAttachment(nativeTag,
|
|
39
|
+
manager.insertMediaAttachment(nativeTag, JSON.stringify(normalizedMediaAttachment));
|
|
34
40
|
}
|
|
35
41
|
}
|
|
36
42
|
}, [dispatchAndroidCommand]);
|
|
@@ -91,9 +97,7 @@ const RichTextEditor = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
91
97
|
/* Native toolbar handles this */
|
|
92
98
|
},
|
|
93
99
|
insertMediaAttachment: mediaAttachment => {
|
|
94
|
-
|
|
95
|
-
dispatchInsertMediaAttachment(mediaAttachment.uri);
|
|
96
|
-
}
|
|
100
|
+
dispatchInsertMediaAttachment(mediaAttachment);
|
|
97
101
|
},
|
|
98
102
|
undo: () => {
|
|
99
103
|
/* Native toolbar handles this */
|
|
@@ -172,6 +176,7 @@ const RichTextEditor = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
172
176
|
placeholder: props.placeholder,
|
|
173
177
|
initialContentJson: props.initialContent ? JSON.stringify(props.initialContent) : undefined,
|
|
174
178
|
editable: props.readOnly !== undefined ? !props.readOnly : true,
|
|
179
|
+
selectable: props.selectable ?? true,
|
|
175
180
|
maxHeight: props.maxHeight,
|
|
176
181
|
numberOfLines: props.numberOfLines,
|
|
177
182
|
showToolbar: props.readOnly ? false : props.showToolbar ?? true,
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","findNodeHandle","NativeModules","Platform","StyleSheet","UIManager","RichTextEditorViewNative","RichTextEditor","forwardRef","props","ref","nativeRef","useRef","height","setHeight","useState","handleSizeChange","useCallback","event","newHeight","nativeEvent","dispatchAndroidCommand","commandName","args","OS","nativeTag","current","commandConfig","getViewManagerConfig","Commands","commandId","dispatchViewManagerCommand","dispatchInsertMediaAttachment","uri","trim","length","manager","insertMediaAttachment","useImperativeHandle","setContent","_blocks","getText","getBlocks","clear","focus","blur","toggleBold","toggleItalic","toggleUnderline","toggleStrikethrough","toggleCode","toggleHighlight","_color","setHeading","setBulletList","setNumberedList","setQuote","setChecklist","setParagraph","insertLink","_url","_text","
|
|
1
|
+
{"version":3,"names":["React","findNodeHandle","NativeModules","Platform","StyleSheet","UIManager","RichTextEditorViewNative","RichTextEditor","forwardRef","props","ref","nativeRef","useRef","height","setHeight","useState","handleSizeChange","useCallback","event","newHeight","nativeEvent","dispatchAndroidCommand","commandName","args","OS","nativeTag","current","commandConfig","getViewManagerConfig","Commands","commandId","dispatchViewManagerCommand","dispatchInsertMediaAttachment","mediaAttachment","uri","trim","length","normalizedMediaAttachment","sourceUri","JSON","stringify","manager","insertMediaAttachment","useImperativeHandle","setContent","_blocks","getText","getBlocks","clear","focus","blur","toggleBold","toggleItalic","toggleUnderline","toggleStrikethrough","toggleCode","toggleHighlight","_color","setHeading","setBulletList","setNumberedList","setQuote","setChecklist","setParagraph","insertLink","_url","_text","undo","redo","clearFormatting","indent","outdent","setAlignment","_alignment","toggleChecklistItem","handleContentChange","blocks","blocksJson","parse","contentEvent","text","delta","onContentChange","handleSelectionChange","selectionEvent","start","end","onSelectionChange","handleFocus","onFocus","handleBlur","onBlur","handleActiveStylesChange","onActiveStylesChange","combinedStyle","flatten","style","createElement","placeholder","initialContentJson","initialContent","undefined","editable","readOnly","selectable","maxHeight","numberOfLines","showToolbar","toolbarOptions","variant","fontFamily","fontSize","onEditorFocus","onEditorBlur","onSizeChange","displayName","DEFAULT_TOOLBAR_OPTIONS"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
|
package/lib/module/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DEFAULT_TOOLBAR_OPTIONS"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"
|
|
1
|
+
{"version":3,"names":["DEFAULT_TOOLBAR_OPTIONS"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"AAqGA,OAAO,MAAMA,uBAAwC,GAAG,CACtD,MAAM,EACN,QAAQ,EACR,WAAW,EACX,eAAe,EACf,MAAM,EACN,WAAW,EACX,SAAS,EACT,QAAQ,EACR,UAAU,EACV,OAAO,EACP,WAAW,EACX,iBAAiB,EACjB,MAAM,EACN,MAAM,EACN,MAAM,EACN,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,aAAa,EACb,YAAY,CACb","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichTextEditorViewNativeComponent.d.ts","sourceRoot":"","sources":["../../../src/RichTextEditorViewNativeComponent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7D,KAAK,MAAM,GAAG,MAAM,CAAC;AACrB,KAAK,KAAK,GAAG,MAAM,CAAC;AACpB,KAAK,kBAAkB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE;IAAE,WAAW,EAAE,CAAC,CAAA;CAAE,KAAK,IAAI,CAAC;AAEjE,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,KAAK,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC,CAAC;AAEH,MAAM,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,CAAC;CACrB,CAAC,CAAC;AAEH,KAAK,sBAAsB,GAAG,QAAQ,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH,KAAK,wBAAwB,GAAG,QAAQ,CAAC;IACvC,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,KAAK,CAAC;CACZ,CAAC,CAAC;AAEH,KAAK,mBAAmB,GAAG,QAAQ,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,KAAK,qBAAqB,GAAG,QAAQ,CAAC;IACpC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AAEH,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,eAAe,CAAC,EAAE,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;IAC7D,iBAAiB,CAAC,EAAE,kBAAkB,CAAC,wBAAwB,CAAC,CAAC;IACjE,aAAa,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,YAAY,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,YAAY,CAAC,EAAE,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;IACvD,oBAAoB,CAAC,EAAE,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;CAClE;AAOD,QAAA,IAAI,wBAAwB,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;AAUzD,eAAe,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"RichTextEditorViewNativeComponent.d.ts","sourceRoot":"","sources":["../../../src/RichTextEditorViewNativeComponent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7D,KAAK,MAAM,GAAG,MAAM,CAAC;AACrB,KAAK,KAAK,GAAG,MAAM,CAAC;AACpB,KAAK,kBAAkB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE;IAAE,WAAW,EAAE,CAAC,CAAA;CAAE,KAAK,IAAI,CAAC;AAEjE,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,KAAK,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC,CAAC;AAEH,MAAM,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,CAAC;CACrB,CAAC,CAAC;AAEH,KAAK,sBAAsB,GAAG,QAAQ,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH,KAAK,wBAAwB,GAAG,QAAQ,CAAC;IACvC,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,KAAK,CAAC;CACZ,CAAC,CAAC;AAEH,KAAK,mBAAmB,GAAG,QAAQ,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,KAAK,qBAAqB,GAAG,QAAQ,CAAC;IACpC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AAEH,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,eAAe,CAAC,EAAE,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;IAC7D,iBAAiB,CAAC,EAAE,kBAAkB,CAAC,wBAAwB,CAAC,CAAC;IACjE,aAAa,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,YAAY,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,YAAY,CAAC,EAAE,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;IACvD,oBAAoB,CAAC,EAAE,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;CAClE;AAOD,QAAA,IAAI,wBAAwB,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;AAUzD,eAAe,wBAAwB,CAAC"}
|
|
@@ -16,5 +16,5 @@ export interface RichTextEditorPropsExtended extends RichTextEditorProps {
|
|
|
16
16
|
declare const RichTextEditor: React.ForwardRefExoticComponent<RichTextEditorPropsExtended & React.RefAttributes<RichTextEditorRef>>;
|
|
17
17
|
export default RichTextEditor;
|
|
18
18
|
export { DEFAULT_TOOLBAR_OPTIONS } from "./types";
|
|
19
|
-
export type { Block, BlockType, StyleRange, MediaAttachment, TextAlignment, EditorVariant, ContentChangeEvent, SelectionChangeEvent, RichTextEditorRef, RichTextEditorProps, ToolbarOption, ContentDelta, DeltaType, } from "./types";
|
|
19
|
+
export type { Block, BlockType, StyleRange, MediaKind, MediaAttachment, TextAlignment, EditorVariant, ContentChangeEvent, SelectionChangeEvent, RichTextEditorRef, RichTextEditorProps, ToolbarOption, ContentDelta, DeltaType, } from "./types";
|
|
20
20
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,OAAO,KAAK,EAMV,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AASjB,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,MAAM,WAAW,2BAA4B,SAAQ,mBAAmB;IACtE,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC5D;AAED,QAAA,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,OAAO,KAAK,EAMV,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AASjB,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,MAAM,WAAW,2BAA4B,SAAQ,mBAAmB;IACtE,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC5D;AAED,QAAA,MAAM,cAAc,uGAgQlB,CAAC;AAIH,eAAe,cAAc,CAAC;AAC9B,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAClD,YAAY,EACV,KAAK,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,eAAe,EACf,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,SAAS,GACV,MAAM,SAAS,CAAC"}
|
|
@@ -9,9 +9,15 @@ export interface StyleRange {
|
|
|
9
9
|
export type BlockType = "paragraph" | "bullet" | "numbered" | "heading" | "quote" | "checklist" | "mediaAttachment";
|
|
10
10
|
export type TextAlignment = "left" | "center" | "right";
|
|
11
11
|
export type EditorVariant = "outlined" | "flat" | "plain";
|
|
12
|
+
export type MediaKind = "image" | "video";
|
|
12
13
|
export interface MediaAttachment {
|
|
13
|
-
kind:
|
|
14
|
+
kind: MediaKind;
|
|
14
15
|
uri: string;
|
|
16
|
+
sourceUri?: string;
|
|
17
|
+
fileName?: string;
|
|
18
|
+
extension?: string;
|
|
19
|
+
contentType?: string;
|
|
20
|
+
fileSize?: number;
|
|
15
21
|
width?: number;
|
|
16
22
|
height?: number;
|
|
17
23
|
alt?: string;
|
|
@@ -54,6 +60,7 @@ export interface RichTextEditorProps {
|
|
|
54
60
|
placeholder?: string;
|
|
55
61
|
initialContent?: Block[];
|
|
56
62
|
readOnly?: boolean;
|
|
63
|
+
selectable?: boolean;
|
|
57
64
|
maxHeight?: number;
|
|
58
65
|
numberOfLines?: number;
|
|
59
66
|
showToolbar?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,KAAK,EACD,MAAM,GACN,QAAQ,GACR,WAAW,GACX,eAAe,GACf,MAAM,GACN,MAAM,GACN,WAAW,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,SAAS,GACjB,WAAW,GACX,QAAQ,GACR,UAAU,GACV,SAAS,GACT,OAAO,GACP,WAAW,GACX,iBAAiB,CAAC;AACtB,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AACxD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,KAAK,EACD,MAAM,GACN,QAAQ,GACR,WAAW,GACX,eAAe,GACf,MAAM,GACN,MAAM,GACN,WAAW,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,SAAS,GACjB,WAAW,GACX,QAAQ,GACR,UAAU,GACV,SAAS,GACT,OAAO,GACP,WAAW,GACX,iBAAiB,CAAC;AACtB,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AACxD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAC1D,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,KAAK,EAAE,CAAC;QAChB,KAAK,CAAC,EAAE,YAAY,CAAC;KACtB,CAAC;CACH;AAED,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,QAAQ,GACR,eAAe,GACf,WAAW,GACX,MAAM,GACN,WAAW,GACX,SAAS,GACT,QAAQ,GACR,UAAU,GACV,OAAO,GACP,WAAW,GACX,iBAAiB,GACjB,MAAM,GACN,MAAM,GACN,MAAM,GACN,iBAAiB,GACjB,QAAQ,GACR,SAAS,GACT,WAAW,GACX,aAAa,GACb,YAAY,CAAC;AAEjB,eAAO,MAAM,uBAAuB,EAAE,aAAa,EAsBlD,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACtD,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC1D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IACtC,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAClC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,qBAAqB,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,IAAI,CAAC;IAClE,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,YAAY,EAAE,CAAC,SAAS,EAAE,aAAa,KAAK,IAAI,CAAC;IACjD,mBAAmB,EAAE,MAAM,IAAI,CAAC;CACjC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chaitrabhairappa/react-native-rich-text-editor",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.0",
|
|
4
4
|
"description": "A high-performance native rich text editor for React Native (New Architecture / Fabric only)",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
package/src/index.tsx
CHANGED
|
@@ -76,11 +76,25 @@ const RichTextEditor = React.forwardRef<
|
|
|
76
76
|
);
|
|
77
77
|
|
|
78
78
|
const dispatchInsertMediaAttachment = React.useCallback(
|
|
79
|
-
(
|
|
80
|
-
if (
|
|
79
|
+
(mediaAttachment: MediaAttachment) => {
|
|
80
|
+
if (
|
|
81
|
+
!mediaAttachment ||
|
|
82
|
+
typeof mediaAttachment !== "object" ||
|
|
83
|
+
typeof mediaAttachment.uri !== "string" ||
|
|
84
|
+
mediaAttachment.uri.trim().length === 0
|
|
85
|
+
) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const normalizedMediaAttachment: MediaAttachment = {
|
|
90
|
+
...mediaAttachment,
|
|
91
|
+
sourceUri: mediaAttachment.sourceUri ?? mediaAttachment.uri,
|
|
92
|
+
};
|
|
81
93
|
|
|
82
94
|
if (Platform.OS === "android") {
|
|
83
|
-
dispatchAndroidCommand("insertMediaAttachment", [
|
|
95
|
+
dispatchAndroidCommand("insertMediaAttachment", [
|
|
96
|
+
JSON.stringify(normalizedMediaAttachment),
|
|
97
|
+
]);
|
|
84
98
|
return;
|
|
85
99
|
}
|
|
86
100
|
|
|
@@ -104,7 +118,10 @@ const RichTextEditor = React.forwardRef<
|
|
|
104
118
|
manager as {
|
|
105
119
|
insertMediaAttachment: (tag: number, value: string) => void;
|
|
106
120
|
}
|
|
107
|
-
).insertMediaAttachment(
|
|
121
|
+
).insertMediaAttachment(
|
|
122
|
+
nativeTag,
|
|
123
|
+
JSON.stringify(normalizedMediaAttachment),
|
|
124
|
+
);
|
|
108
125
|
}
|
|
109
126
|
}
|
|
110
127
|
},
|
|
@@ -169,13 +186,7 @@ const RichTextEditor = React.forwardRef<
|
|
|
169
186
|
/* Native toolbar handles this */
|
|
170
187
|
},
|
|
171
188
|
insertMediaAttachment: (mediaAttachment: MediaAttachment) => {
|
|
172
|
-
|
|
173
|
-
mediaAttachment &&
|
|
174
|
-
typeof mediaAttachment === "object" &&
|
|
175
|
-
typeof mediaAttachment.uri === "string"
|
|
176
|
-
) {
|
|
177
|
-
dispatchInsertMediaAttachment(mediaAttachment.uri);
|
|
178
|
-
}
|
|
189
|
+
dispatchInsertMediaAttachment(mediaAttachment);
|
|
179
190
|
},
|
|
180
191
|
undo: () => {
|
|
181
192
|
/* Native toolbar handles this */
|
|
@@ -271,6 +282,7 @@ const RichTextEditor = React.forwardRef<
|
|
|
271
282
|
props.initialContent ? JSON.stringify(props.initialContent) : undefined
|
|
272
283
|
}
|
|
273
284
|
editable={props.readOnly !== undefined ? !props.readOnly : true}
|
|
285
|
+
selectable={props.selectable ?? true}
|
|
274
286
|
maxHeight={props.maxHeight}
|
|
275
287
|
numberOfLines={props.numberOfLines}
|
|
276
288
|
showToolbar={props.readOnly ? false : (props.showToolbar ?? true)}
|
|
@@ -296,6 +308,7 @@ export type {
|
|
|
296
308
|
Block,
|
|
297
309
|
BlockType,
|
|
298
310
|
StyleRange,
|
|
311
|
+
MediaKind,
|
|
299
312
|
MediaAttachment,
|
|
300
313
|
TextAlignment,
|
|
301
314
|
EditorVariant,
|
package/src/types.ts
CHANGED
|
@@ -25,10 +25,16 @@ export type BlockType =
|
|
|
25
25
|
| "mediaAttachment";
|
|
26
26
|
export type TextAlignment = "left" | "center" | "right";
|
|
27
27
|
export type EditorVariant = "outlined" | "flat" | "plain";
|
|
28
|
+
export type MediaKind = "image" | "video";
|
|
28
29
|
|
|
29
30
|
export interface MediaAttachment {
|
|
30
|
-
kind:
|
|
31
|
+
kind: MediaKind;
|
|
31
32
|
uri: string;
|
|
33
|
+
sourceUri?: string;
|
|
34
|
+
fileName?: string;
|
|
35
|
+
extension?: string;
|
|
36
|
+
contentType?: string;
|
|
37
|
+
fileSize?: number;
|
|
32
38
|
width?: number;
|
|
33
39
|
height?: number;
|
|
34
40
|
alt?: string;
|
|
@@ -122,6 +128,7 @@ export interface RichTextEditorProps {
|
|
|
122
128
|
placeholder?: string;
|
|
123
129
|
initialContent?: Block[];
|
|
124
130
|
readOnly?: boolean;
|
|
131
|
+
selectable?: boolean;
|
|
125
132
|
maxHeight?: number;
|
|
126
133
|
numberOfLines?: number;
|
|
127
134
|
showToolbar?: boolean;
|