@apollohg/react-native-rich-text-editor 2.0.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.
Files changed (494) hide show
  1. package/LICENSE +160 -0
  2. package/README.md +259 -0
  3. package/RUST-STANDARD-LIBRARY-NOTICES.html +8266 -0
  4. package/ReactNativeProseEditor.podspec +59 -0
  5. package/THIRD_PARTY_NOTICES.md +31155 -0
  6. package/android/build.gradle +188 -0
  7. package/android/consumer-rules.pro +18 -0
  8. package/android/expo/build.gradle +17 -0
  9. package/android/src/debug/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +7 -0
  10. package/android/src/main/assets/editor-icons/MaterialIcons.json +2236 -0
  11. package/android/src/main/assets/editor-icons/MaterialIcons.ttf +0 -0
  12. package/android/src/main/java/com/apollohg/editor/AndroidApiCompat.kt +19 -0
  13. package/android/src/main/java/com/apollohg/editor/AndroidCollaborationTransport.kt +860 -0
  14. package/android/src/main/java/com/apollohg/editor/CaretGeometry.kt +91 -0
  15. package/android/src/main/java/com/apollohg/editor/CodeHighlighting.kt +141 -0
  16. package/android/src/main/java/com/apollohg/editor/DecodedBitmapBudget.kt +250 -0
  17. package/android/src/main/java/com/apollohg/editor/EditorAddons.kt +133 -0
  18. package/android/src/main/java/com/apollohg/editor/EditorBlockSpacing.kt +51 -0
  19. package/android/src/main/java/com/apollohg/editor/EditorBoxDrawable.kt +16 -0
  20. package/android/src/main/java/com/apollohg/editor/EditorBoxDrawing.kt +234 -0
  21. package/android/src/main/java/com/apollohg/editor/EditorCheckboxSpan.kt +87 -0
  22. package/android/src/main/java/com/apollohg/editor/EditorCodeHighlighting.kt +120 -0
  23. package/android/src/main/java/com/apollohg/editor/EditorDecorationLayer.java +18 -0
  24. package/android/src/main/java/com/apollohg/editor/EditorDocumentLayout.kt +626 -0
  25. package/android/src/main/java/com/apollohg/editor/EditorEditText.kt +1042 -0
  26. package/android/src/main/java/com/apollohg/editor/EditorEditTextAnnotations.kt +191 -0
  27. package/android/src/main/java/com/apollohg/editor/EditorEditTextCaret.kt +100 -0
  28. package/android/src/main/java/com/apollohg/editor/EditorEditTextClipboard.kt +101 -0
  29. package/android/src/main/java/com/apollohg/editor/EditorEditTextComposition.kt +220 -0
  30. package/android/src/main/java/com/apollohg/editor/EditorEditTextConfiguration.kt +316 -0
  31. package/android/src/main/java/com/apollohg/editor/EditorEditTextCorrection.kt +303 -0
  32. package/android/src/main/java/com/apollohg/editor/EditorEditTextDeferredUpdates.kt +327 -0
  33. package/android/src/main/java/com/apollohg/editor/EditorEditTextDeletion.kt +258 -0
  34. package/android/src/main/java/com/apollohg/editor/EditorEditTextDiagnostics.kt +83 -0
  35. package/android/src/main/java/com/apollohg/editor/EditorEditTextDragDrop.kt +67 -0
  36. package/android/src/main/java/com/apollohg/editor/EditorEditTextExternalComposition.kt +357 -0
  37. package/android/src/main/java/com/apollohg/editor/EditorEditTextHardwareInput.kt +277 -0
  38. package/android/src/main/java/com/apollohg/editor/EditorEditTextImages.kt +280 -0
  39. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputLifecycle.kt +183 -0
  40. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputPreparation.kt +79 -0
  41. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputTraits.kt +384 -0
  42. package/android/src/main/java/com/apollohg/editor/EditorEditTextLayout.kt +100 -0
  43. package/android/src/main/java/com/apollohg/editor/EditorEditTextNativeMutation.kt +243 -0
  44. package/android/src/main/java/com/apollohg/editor/EditorEditTextPlaceholder.kt +154 -0
  45. package/android/src/main/java/com/apollohg/editor/EditorEditTextRenderPatch.kt +347 -0
  46. package/android/src/main/java/com/apollohg/editor/EditorEditTextRendering.kt +313 -0
  47. package/android/src/main/java/com/apollohg/editor/EditorEditTextRustCommands.kt +281 -0
  48. package/android/src/main/java/com/apollohg/editor/EditorEditTextSelection.kt +352 -0
  49. package/android/src/main/java/com/apollohg/editor/EditorEditTextState.kt +113 -0
  50. package/android/src/main/java/com/apollohg/editor/EditorEditTextTaskMarkers.kt +92 -0
  51. package/android/src/main/java/com/apollohg/editor/EditorEditTextTextCommit.kt +327 -0
  52. package/android/src/main/java/com/apollohg/editor/EditorEditTextToolbar.kt +84 -0
  53. package/android/src/main/java/com/apollohg/editor/EditorEditTextUpdates.kt +245 -0
  54. package/android/src/main/java/com/apollohg/editor/EditorGlyphHeightCursorDrawable.kt +42 -0
  55. package/android/src/main/java/com/apollohg/editor/EditorHeightBehavior.kt +13 -0
  56. package/android/src/main/java/com/apollohg/editor/EditorInputConnection.kt +923 -0
  57. package/android/src/main/java/com/apollohg/editor/EditorInputCoordinates.kt +191 -0
  58. package/android/src/main/java/com/apollohg/editor/EditorInputCorrection.kt +107 -0
  59. package/android/src/main/java/com/apollohg/editor/EditorInputCursorGeometry.kt +128 -0
  60. package/android/src/main/java/com/apollohg/editor/EditorInputSnapshots.kt +134 -0
  61. package/android/src/main/java/com/apollohg/editor/EditorInputSurroundingDeletion.kt +321 -0
  62. package/android/src/main/java/com/apollohg/editor/EditorKeyboardToolbarView.kt +851 -0
  63. package/android/src/main/java/com/apollohg/editor/EditorMentionStyle.kt +192 -0
  64. package/android/src/main/java/com/apollohg/editor/EditorReconciliationWatcher.kt +46 -0
  65. package/android/src/main/java/com/apollohg/editor/EditorStyleSheet.kt +303 -0
  66. package/android/src/main/java/com/apollohg/editor/EditorStyleSheetSpans.kt +253 -0
  67. package/android/src/main/java/com/apollohg/editor/EditorSurfaceInputConnection.kt +67 -0
  68. package/android/src/main/java/com/apollohg/editor/EditorTextDecorationDrawing.kt +143 -0
  69. package/android/src/main/java/com/apollohg/editor/EditorTextSurface.kt +712 -0
  70. package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceDragDrop.kt +94 -0
  71. package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceInteraction.kt +708 -0
  72. package/android/src/main/java/com/apollohg/editor/EditorTheme.kt +650 -0
  73. package/android/src/main/java/com/apollohg/editor/EditorV2Adapter.kt +912 -0
  74. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterMutations.kt +402 -0
  75. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterRendering.kt +123 -0
  76. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterSelection.kt +203 -0
  77. package/android/src/main/java/com/apollohg/editor/EditorV2Backend.kt +120 -0
  78. package/android/src/main/java/com/apollohg/editor/EditorV2Driver.kt +87 -0
  79. package/android/src/main/java/com/apollohg/editor/EditorV2Registry.kt +97 -0
  80. package/android/src/main/java/com/apollohg/editor/EditorV2RenderValidation.kt +409 -0
  81. package/android/src/main/java/com/apollohg/editor/ExpoAutoGrowStyleSizePublisher.kt +34 -0
  82. package/android/src/main/java/com/apollohg/editor/ImageResizeOverlayView.kt +266 -0
  83. package/android/src/main/java/com/apollohg/editor/ImeTextCoordinateMapper.kt +102 -0
  84. package/android/src/main/java/com/apollohg/editor/KeyboardToolbarImeAnimationController.kt +101 -0
  85. package/android/src/main/java/com/apollohg/editor/MentionSuggestionChipView.kt +234 -0
  86. package/android/src/main/java/com/apollohg/editor/NativeCollaborationTransportRegistry.kt +493 -0
  87. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoView.kt +813 -0
  88. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewAtoms.kt +68 -0
  89. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewBinding.kt +126 -0
  90. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewDiagnostics.kt +208 -0
  91. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewErrors.kt +146 -0
  92. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewEvents.kt +150 -0
  93. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewExternalComposition.kt +39 -0
  94. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewFocus.kt +176 -0
  95. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewLifecycle.kt +302 -0
  96. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewMentions.kt +259 -0
  97. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewNativeActions.kt +179 -0
  98. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewOutsideTap.kt +214 -0
  99. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPendingUpdates.kt +376 -0
  100. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewProperties.kt +234 -0
  101. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPropertyRetries.kt +197 -0
  102. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewToolbar.kt +285 -0
  103. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewTypes.kt +28 -0
  104. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewUpdates.kt +271 -0
  105. package/android/src/main/java/com/apollohg/editor/NativeEditorModule.kt +687 -0
  106. package/android/src/main/java/com/apollohg/editor/NativeEditorOutsideTapDispatcher.kt +380 -0
  107. package/android/src/main/java/com/apollohg/editor/NativeEditorV2Numbers.kt +45 -0
  108. package/android/src/main/java/com/apollohg/editor/NativeEditorViewRegistry.kt +372 -0
  109. package/android/src/main/java/com/apollohg/editor/NativeImagePipeline.kt +22 -0
  110. package/android/src/main/java/com/apollohg/editor/NativeToolbar.kt +193 -0
  111. package/android/src/main/java/com/apollohg/editor/NativeToolbarIcons.kt +177 -0
  112. package/android/src/main/java/com/apollohg/editor/NativeToolbarItem.kt +274 -0
  113. package/android/src/main/java/com/apollohg/editor/OkHttpCollaborationSocket.kt +102 -0
  114. package/android/src/main/java/com/apollohg/editor/OrderedListMarkerFormatter.kt +130 -0
  115. package/android/src/main/java/com/apollohg/editor/PointerTransparentView.java +18 -0
  116. package/android/src/main/java/com/apollohg/editor/PositionBridge.kt +128 -0
  117. package/android/src/main/java/com/apollohg/editor/ProseViewerView.kt +854 -0
  118. package/android/src/main/java/com/apollohg/editor/RemoteSelectionOverlayView.kt +314 -0
  119. package/android/src/main/java/com/apollohg/editor/RenderBlockSpans.kt +314 -0
  120. package/android/src/main/java/com/apollohg/editor/RenderBridge.kt +224 -0
  121. package/android/src/main/java/com/apollohg/editor/RenderBridgeBlockStyles.kt +407 -0
  122. package/android/src/main/java/com/apollohg/editor/RenderBridgeElements.kt +544 -0
  123. package/android/src/main/java/com/apollohg/editor/RenderBridgeInlineAndAtoms.kt +631 -0
  124. package/android/src/main/java/com/apollohg/editor/RenderBridgeParagraphs.kt +215 -0
  125. package/android/src/main/java/com/apollohg/editor/RenderImageDecoder.kt +748 -0
  126. package/android/src/main/java/com/apollohg/editor/RenderImageLoader.kt +900 -0
  127. package/android/src/main/java/com/apollohg/editor/RenderLayoutConstants.kt +117 -0
  128. package/android/src/main/java/com/apollohg/editor/RenderMediaSpans.kt +337 -0
  129. package/android/src/main/java/com/apollohg/editor/RenderParagraphSpans.kt +182 -0
  130. package/android/src/main/java/com/apollohg/editor/RichTextEditorView.kt +951 -0
  131. package/android/src/main/java/com/apollohg/editor/SharedNativeImagePipeline.kt +78 -0
  132. package/android/src/main/java/com/apollohg/editor/UniffiEditorV2Backend.kt +261 -0
  133. package/android/src/main/java/com/apollohg/editor/viewer/AndroidProseLayoutEngine.kt +1656 -0
  134. package/android/src/main/java/com/apollohg/editor/viewer/FabricAttachmentSidecars.kt +80 -0
  135. package/android/src/main/java/com/apollohg/editor/viewer/FabricLeaseHandleBridge.kt +59 -0
  136. package/android/src/main/java/com/apollohg/editor/viewer/FallbackSelectionGeometry.kt +450 -0
  137. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseDrawingView.kt +678 -0
  138. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseInstrumentation.kt +608 -0
  139. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayout.kt +186 -0
  140. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutCache.kt +393 -0
  141. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutRegistry.kt +828 -0
  142. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseTheme.kt +316 -0
  143. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerManager.kt +900 -0
  144. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerPackage.kt +16 -0
  145. package/android/src/main/java/com/apollohg/editor/viewer/PreparedViewerAtoms.kt +89 -0
  146. package/android/src/main/java/com/apollohg/editor/viewer/ViewerCodeHighlighting.kt +91 -0
  147. package/android/src/main/java/com/apollohg/editor/viewer/ViewerDocument.kt +453 -0
  148. package/android/src/main/java/com/apollohg/editor/viewer/ViewerFontEnvironment.kt +282 -0
  149. package/android/src/main/java/com/apollohg/editor/viewer/ViewerImagePipeline.kt +460 -0
  150. package/android/src/main/jni/CMakeLists.txt +85 -0
  151. package/android/src/main/jni/PreparedProseViewerMeasurementsManager.cpp +334 -0
  152. package/android/src/main/jni/ReactNativeProseEditorSpec.h +17 -0
  153. package/android/src/main/jni/reactnativeproseeditor.h +6 -0
  154. package/android/src/main/res/values/attrs.xml +6 -0
  155. package/android/src/release/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +9 -0
  156. package/app.plugin.js +62 -0
  157. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseMeasurementsManager.h +62 -0
  158. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerComponentDescriptor.h +30 -0
  159. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.cpp +192 -0
  160. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.h +46 -0
  161. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerState.h +145 -0
  162. package/dist/AtomHost.d.ts +17 -0
  163. package/dist/AtomHost.js +135 -0
  164. package/dist/DefaultAtomChip.d.ts +2 -0
  165. package/dist/DefaultAtomChip.js +22 -0
  166. package/dist/EditorAddon.d.ts +32 -0
  167. package/dist/EditorAddon.js +29 -0
  168. package/dist/EditorAddonNormalization.d.ts +6 -0
  169. package/dist/EditorAddonNormalization.js +48 -0
  170. package/dist/EditorMentionThemeNormalization.d.ts +8 -0
  171. package/dist/EditorMentionThemeNormalization.js +22 -0
  172. package/dist/EditorMentionThemeValidation.d.ts +12 -0
  173. package/dist/EditorMentionThemeValidation.js +95 -0
  174. package/dist/EditorStyleSheet.d.ts +4 -0
  175. package/dist/EditorStyleSheet.js +10 -0
  176. package/dist/EditorStyleSheetNormalization.d.ts +3 -0
  177. package/dist/EditorStyleSheetNormalization.js +226 -0
  178. package/dist/EditorStyleSheetTypes.d.ts +151 -0
  179. package/dist/EditorStyleSheetTypes.js +2 -0
  180. package/dist/EditorTheme.d.ts +117 -0
  181. package/dist/EditorTheme.js +41 -0
  182. package/dist/EditorToolbar.d.ts +4 -0
  183. package/dist/EditorToolbar.js +17 -0
  184. package/dist/EditorToolbarComponent.d.ts +13 -0
  185. package/dist/EditorToolbarComponent.js +24 -0
  186. package/dist/EditorToolbarItems.d.ts +9 -0
  187. package/dist/EditorToolbarItems.js +58 -0
  188. package/dist/EditorToolbarRegistry.d.ts +59 -0
  189. package/dist/EditorToolbarRegistry.js +175 -0
  190. package/dist/EditorToolbarTypes.d.ts +273 -0
  191. package/dist/EditorToolbarTypes.js +2 -0
  192. package/dist/EditorToolbarVisuals.d.ts +154 -0
  193. package/dist/EditorToolbarVisuals.js +228 -0
  194. package/dist/EditorUpdateRevision.d.ts +8 -0
  195. package/dist/EditorUpdateRevision.js +22 -0
  196. package/dist/ExternalTextComposition.d.ts +45 -0
  197. package/dist/ExternalTextComposition.js +537 -0
  198. package/dist/ImageLoadingPolicy.d.ts +54 -0
  199. package/dist/ImageLoadingPolicy.js +60 -0
  200. package/dist/NativeEditorBoundaryError.d.ts +111 -0
  201. package/dist/NativeEditorBoundaryError.js +268 -0
  202. package/dist/NativeEditorBridge.d.ts +9 -0
  203. package/dist/NativeEditorBridge.js +37 -0
  204. package/dist/NativeEditorCollaborationTransport.d.ts +154 -0
  205. package/dist/NativeEditorCollaborationTransport.js +275 -0
  206. package/dist/NativeEditorCreateConfig.d.ts +16 -0
  207. package/dist/NativeEditorCreateConfig.js +249 -0
  208. package/dist/NativeEditorCreateJson.d.ts +76 -0
  209. package/dist/NativeEditorCreateJson.js +474 -0
  210. package/dist/NativeEditorCreateValidation.d.ts +32 -0
  211. package/dist/NativeEditorCreateValidation.js +150 -0
  212. package/dist/NativeEditorDocumentBridge.d.ts +72 -0
  213. package/dist/NativeEditorDocumentBridge.js +305 -0
  214. package/dist/NativeEditorDocumentHandle.d.ts +70 -0
  215. package/dist/NativeEditorDocumentHandle.js +89 -0
  216. package/dist/NativeEditorLocalAwareness.d.ts +34 -0
  217. package/dist/NativeEditorLocalAwareness.js +153 -0
  218. package/dist/NativeEditorNativeModule.d.ts +48 -0
  219. package/dist/NativeEditorNativeModule.js +34 -0
  220. package/dist/NativeEditorRenderNormalization.d.ts +22 -0
  221. package/dist/NativeEditorRenderNormalization.js +274 -0
  222. package/dist/NativeEditorResultNormalization.d.ts +108 -0
  223. package/dist/NativeEditorResultNormalization.js +400 -0
  224. package/dist/NativeEditorTypes.d.ts +318 -0
  225. package/dist/NativeEditorTypes.js +15 -0
  226. package/dist/NativeEditorV2Decimal.d.ts +5 -0
  227. package/dist/NativeEditorV2Decimal.js +18 -0
  228. package/dist/NativeProseViewer.d.ts +122 -0
  229. package/dist/NativeProseViewer.js +130 -0
  230. package/dist/NativeRichTextEditor.d.ts +3 -0
  231. package/dist/NativeRichTextEditor.js +6 -0
  232. package/dist/ResourceLimits.d.ts +100 -0
  233. package/dist/ResourceLimits.js +80 -0
  234. package/dist/RichTextEditor.d.ts +4 -0
  235. package/dist/RichTextEditor.js +25 -0
  236. package/dist/RichTextEditorNativeTypes.d.ts +122 -0
  237. package/dist/RichTextEditorNativeTypes.js +2 -0
  238. package/dist/RichTextEditorNativeView.d.ts +12 -0
  239. package/dist/RichTextEditorNativeView.js +15 -0
  240. package/dist/RichTextEditorSerialization.d.ts +53 -0
  241. package/dist/RichTextEditorSerialization.js +283 -0
  242. package/dist/RichTextEditorTypes.d.ts +281 -0
  243. package/dist/RichTextEditorTypes.js +2 -0
  244. package/dist/ViewerConfiguration.d.ts +22 -0
  245. package/dist/ViewerConfiguration.js +6 -0
  246. package/dist/YjsCollaboration.d.ts +146 -0
  247. package/dist/YjsCollaboration.js +496 -0
  248. package/dist/addons.d.ts +193 -0
  249. package/dist/addons.js +122 -0
  250. package/dist/atomConstants.d.ts +3 -0
  251. package/dist/atomConstants.js +6 -0
  252. package/dist/atomInstances.d.ts +35 -0
  253. package/dist/atomInstances.js +79 -0
  254. package/dist/atomPolicy.d.ts +4 -0
  255. package/dist/atomPolicy.js +47 -0
  256. package/dist/atomUpdates.d.ts +2 -0
  257. package/dist/atomUpdates.js +38 -0
  258. package/dist/atoms.d.ts +92 -0
  259. package/dist/atoms.js +222 -0
  260. package/dist/attributeValidation.d.ts +4 -0
  261. package/dist/attributeValidation.js +97 -0
  262. package/dist/contentExpression.d.ts +6 -0
  263. package/dist/contentExpression.js +335 -0
  264. package/dist/index.d.ts +21 -0
  265. package/dist/index.js +78 -0
  266. package/dist/listMarkers.d.ts +15 -0
  267. package/dist/listMarkers.js +21 -0
  268. package/dist/schemaDefinition.d.ts +143 -0
  269. package/dist/schemaDefinition.js +206 -0
  270. package/dist/schemaDocument.d.ts +17 -0
  271. package/dist/schemaDocument.js +69 -0
  272. package/dist/schemaDocumentConstruction.d.ts +5 -0
  273. package/dist/schemaDocumentConstruction.js +125 -0
  274. package/dist/schemaNormalization.d.ts +29 -0
  275. package/dist/schemaNormalization.js +313 -0
  276. package/dist/schemaPresets.d.ts +68 -0
  277. package/dist/schemaPresets.js +198 -0
  278. package/dist/schemaResolution.d.ts +9 -0
  279. package/dist/schemaResolution.js +211 -0
  280. package/dist/schemas.d.ts +5 -0
  281. package/dist/schemas.js +28 -0
  282. package/dist/specs/PreparedProseViewerNativeComponent.d.ts +37 -0
  283. package/dist/specs/PreparedProseViewerNativeComponent.js +6 -0
  284. package/dist/useEditorToolbarInteractions.d.ts +12 -0
  285. package/dist/useEditorToolbarInteractions.js +218 -0
  286. package/dist/useEditorToolbarItems.d.ts +8 -0
  287. package/dist/useEditorToolbarItems.js +280 -0
  288. package/dist/useEditorToolbarPresentation.d.ts +4 -0
  289. package/dist/useEditorToolbarPresentation.js +203 -0
  290. package/dist/useEditorToolbarState.d.ts +63 -0
  291. package/dist/useEditorToolbarState.js +108 -0
  292. package/dist/useFocusPreservingFrames.d.ts +17 -0
  293. package/dist/useFocusPreservingFrames.js +108 -0
  294. package/dist/useNativeEditor.d.ts +66 -0
  295. package/dist/useNativeEditor.js +370 -0
  296. package/dist/useRichTextEditorCommands.d.ts +21 -0
  297. package/dist/useRichTextEditorCommands.js +299 -0
  298. package/dist/useRichTextEditorEvents.d.ts +18 -0
  299. package/dist/useRichTextEditorEvents.js +216 -0
  300. package/dist/useRichTextEditorMentions.d.ts +11 -0
  301. package/dist/useRichTextEditorMentions.js +316 -0
  302. package/dist/useRichTextEditorPresentation.d.ts +5 -0
  303. package/dist/useRichTextEditorPresentation.js +178 -0
  304. package/dist/useRichTextEditorState.d.ts +180 -0
  305. package/dist/useRichTextEditorState.js +405 -0
  306. package/dist/useRichTextEditorUpdates.d.ts +10 -0
  307. package/dist/useRichTextEditorUpdates.js +308 -0
  308. package/dist/useViewerAtoms.d.ts +38 -0
  309. package/dist/useViewerAtoms.js +288 -0
  310. package/expo-module.config.json +13 -0
  311. package/ios/EditorAddons.swift +354 -0
  312. package/ios/EditorCodeHighlighting.swift +184 -0
  313. package/ios/EditorCore.xcframework/Info.plist +44 -0
  314. package/ios/EditorCore.xcframework/ios-arm64/libeditor_core.a +0 -0
  315. package/ios/EditorCore.xcframework/ios-arm64_x86_64-simulator/libeditor_core.a +0 -0
  316. package/ios/EditorInteractionOverlays.swift +697 -0
  317. package/ios/EditorLayoutManager.swift +971 -0
  318. package/ios/EditorNodeTypes.swift +37 -0
  319. package/ios/EditorStyleSheet.swift +461 -0
  320. package/ios/EditorTextView+AttributedPatch.swift +305 -0
  321. package/ios/EditorTextView+Binding.swift +61 -0
  322. package/ios/EditorTextView+Caret.swift +333 -0
  323. package/ios/EditorTextView+Commands.swift +203 -0
  324. package/ios/EditorTextView+Delegate.swift +65 -0
  325. package/ios/EditorTextView+Diagnostics.swift +225 -0
  326. package/ios/EditorTextView+DragDrop.swift +290 -0
  327. package/ios/EditorTextView+ExternalComposition.swift +364 -0
  328. package/ios/EditorTextView+Images.swift +354 -0
  329. package/ios/EditorTextView+InputTraits.swift +200 -0
  330. package/ios/EditorTextView+KeyboardInput.swift +318 -0
  331. package/ios/EditorTextView+Layout.swift +245 -0
  332. package/ios/EditorTextView+MarkedText.swift +267 -0
  333. package/ios/EditorTextView+NativeInputLifecycle.swift +372 -0
  334. package/ios/EditorTextView+NativeMutation.swift +471 -0
  335. package/ios/EditorTextView+Reconciliation.swift +97 -0
  336. package/ios/EditorTextView+RenderPatch.swift +573 -0
  337. package/ios/EditorTextView+Rendering.swift +539 -0
  338. package/ios/EditorTextView+Selection.swift +542 -0
  339. package/ios/EditorTextView.swift +953 -0
  340. package/ios/EditorTheme.swift +626 -0
  341. package/ios/EditorV2Adapter+Commands.swift +204 -0
  342. package/ios/EditorV2Adapter+Envelope.swift +238 -0
  343. package/ios/EditorV2Adapter+Mutation.swift +392 -0
  344. package/ios/EditorV2Adapter+Registry.swift +185 -0
  345. package/ios/EditorV2Adapter+RenderState.swift +360 -0
  346. package/ios/EditorV2Adapter+RenderValidation.swift +420 -0
  347. package/ios/EditorV2Adapter+Selection.swift +329 -0
  348. package/ios/EditorV2Adapter+TextCommands.swift +430 -0
  349. package/ios/EditorV2Adapter.swift +376 -0
  350. package/ios/EditorV2Shadow.swift +353 -0
  351. package/ios/Generated_editor_core.swift +2378 -0
  352. package/ios/NativeCodeHighlighting.swift +159 -0
  353. package/ios/NativeCollaborationSocket.swift +144 -0
  354. package/ios/NativeCollaborationTransport+Protocol.swift +258 -0
  355. package/ios/NativeCollaborationTransport+Socket.swift +379 -0
  356. package/ios/NativeCollaborationTransport+Validation.swift +103 -0
  357. package/ios/NativeCollaborationTransport.swift +322 -0
  358. package/ios/NativeCollaborationTransportRegistry.swift +521 -0
  359. package/ios/NativeEditorExpoView+AccessoryRetry.swift +219 -0
  360. package/ios/NativeEditorExpoView+Binding.swift +268 -0
  361. package/ios/NativeEditorExpoView+Diagnostics.swift +66 -0
  362. package/ios/NativeEditorExpoView+Events.swift +131 -0
  363. package/ios/NativeEditorExpoView+Focus.swift +169 -0
  364. package/ios/NativeEditorExpoView+MentionRetry.swift +288 -0
  365. package/ios/NativeEditorExpoView+Mentions.swift +288 -0
  366. package/ios/NativeEditorExpoView+Properties.swift +300 -0
  367. package/ios/NativeEditorExpoView+Toolbar.swift +86 -0
  368. package/ios/NativeEditorExpoView+Updates.swift +312 -0
  369. package/ios/NativeEditorExpoView.swift +349 -0
  370. package/ios/NativeEditorModule.swift +856 -0
  371. package/ios/NativeEditorViewRegistry.swift +226 -0
  372. package/ios/NativeToolbar+ButtonStyle.swift +214 -0
  373. package/ios/NativeToolbar+Buttons.swift +228 -0
  374. package/ios/NativeToolbar+Diagnostics.swift +114 -0
  375. package/ios/NativeToolbar+Menu.swift +101 -0
  376. package/ios/NativeToolbar+Models.swift +519 -0
  377. package/ios/NativeToolbar+Placeholder.swift +39 -0
  378. package/ios/NativeToolbar.swift +612 -0
  379. package/ios/OrderedListMarkerFormatter.swift +103 -0
  380. package/ios/PositionBridge.swift +596 -0
  381. package/ios/ProseViewerView.swift +462 -0
  382. package/ios/RenderBridge+Atoms.swift +288 -0
  383. package/ios/RenderBridge+Attachments.swift +246 -0
  384. package/ios/RenderBridge+BlockBoundaries.swift +313 -0
  385. package/ios/RenderBridge+Style.swift +343 -0
  386. package/ios/RenderBridge.swift +704 -0
  387. package/ios/RichTextEditorView.swift +930 -0
  388. package/ios/SharedNativeImagePipeline+Cache.swift +189 -0
  389. package/ios/SharedNativeImagePipeline+Transport.swift +328 -0
  390. package/ios/SharedNativeImagePipeline.swift +533 -0
  391. package/ios/Viewer/CoreTextProseLayoutEngine+AttributedText.swift +436 -0
  392. package/ios/Viewer/CoreTextProseLayoutEngine+Models.swift +322 -0
  393. package/ios/Viewer/CoreTextProseLayoutEngine.swift +635 -0
  394. package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.h +4 -0
  395. package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.mm +767 -0
  396. package/ios/Viewer/Fabric/PreparedProseMeasurementsManager.mm +118 -0
  397. package/ios/Viewer/NativeSVGImageDecoder.h +9 -0
  398. package/ios/Viewer/NativeSVGImageDecoder.mm +106 -0
  399. package/ios/Viewer/NativeSVGPreflight.h +11 -0
  400. package/ios/Viewer/NativeSVGPreflight.mm +219 -0
  401. package/ios/Viewer/PreparedProseDrawingView.swift +639 -0
  402. package/ios/Viewer/PreparedProseInstrumentation.swift +387 -0
  403. package/ios/Viewer/PreparedProseLayout.swift +326 -0
  404. package/ios/Viewer/PreparedProseLayoutCache.swift +766 -0
  405. package/ios/Viewer/PreparedProseLayoutRegistry+Artifacts.swift +377 -0
  406. package/ios/Viewer/PreparedProseLayoutRegistry+Fabric.swift +582 -0
  407. package/ios/Viewer/PreparedProseLayoutRegistry+FabricOwnership.swift +128 -0
  408. package/ios/Viewer/PreparedProseLayoutRegistry.swift +381 -0
  409. package/ios/Viewer/ViewerDocument.swift +575 -0
  410. package/ios/Viewer/ViewerFontEnvironment.swift +283 -0
  411. package/ios/Viewer/ViewerImagePipeline.swift +478 -0
  412. package/ios/editor_coreFFI/editor_coreFFI.h +1023 -0
  413. package/ios/editor_coreFFI/module.modulemap +7 -0
  414. package/package.json +151 -0
  415. package/react-native.config.js +17 -0
  416. package/rust/android/arm64-v8a/libeditor_core.so +0 -0
  417. package/rust/android/armeabi-v7a/libeditor_core.so +0 -0
  418. package/rust/android/x86/libeditor_core.so +0 -0
  419. package/rust/android/x86_64/libeditor_core.so +0 -0
  420. package/rust/bindings/kotlin/uniffi/editor_core/editor_core.kt +3146 -0
  421. package/src/AtomHost.tsx +180 -0
  422. package/src/DefaultAtomChip.tsx +27 -0
  423. package/src/EditorAddon.ts +65 -0
  424. package/src/EditorAddonNormalization.ts +49 -0
  425. package/src/EditorMentionThemeNormalization.ts +25 -0
  426. package/src/EditorMentionThemeValidation.ts +133 -0
  427. package/src/EditorStyleSheet.ts +9 -0
  428. package/src/EditorStyleSheetNormalization.ts +219 -0
  429. package/src/EditorStyleSheetTypes.ts +189 -0
  430. package/src/EditorTheme.ts +196 -0
  431. package/src/EditorToolbar.tsx +31 -0
  432. package/src/EditorToolbarComponent.tsx +23 -0
  433. package/src/EditorToolbarItems.tsx +64 -0
  434. package/src/EditorToolbarRegistry.tsx +254 -0
  435. package/src/EditorToolbarTypes.tsx +322 -0
  436. package/src/EditorToolbarVisuals.tsx +270 -0
  437. package/src/EditorUpdateRevision.ts +26 -0
  438. package/src/ExternalTextComposition.ts +658 -0
  439. package/src/ImageLoadingPolicy.ts +125 -0
  440. package/src/NativeEditorBoundaryError.ts +345 -0
  441. package/src/NativeEditorBridge.ts +93 -0
  442. package/src/NativeEditorCollaborationTransport.ts +493 -0
  443. package/src/NativeEditorCreateConfig.ts +326 -0
  444. package/src/NativeEditorCreateJson.ts +579 -0
  445. package/src/NativeEditorCreateValidation.ts +178 -0
  446. package/src/NativeEditorDocumentBridge.ts +485 -0
  447. package/src/NativeEditorDocumentHandle.ts +168 -0
  448. package/src/NativeEditorLocalAwareness.ts +168 -0
  449. package/src/NativeEditorNativeModule.ts +97 -0
  450. package/src/NativeEditorRenderNormalization.ts +320 -0
  451. package/src/NativeEditorResultNormalization.ts +469 -0
  452. package/src/NativeEditorTypes.ts +366 -0
  453. package/src/NativeEditorV2Decimal.ts +13 -0
  454. package/src/NativeProseViewer.tsx +356 -0
  455. package/src/NativeRichTextEditor.tsx +33 -0
  456. package/src/ResourceLimits.ts +187 -0
  457. package/src/RichTextEditor.tsx +27 -0
  458. package/src/RichTextEditorNativeTypes.tsx +144 -0
  459. package/src/RichTextEditorNativeView.tsx +21 -0
  460. package/src/RichTextEditorSerialization.tsx +381 -0
  461. package/src/RichTextEditorTypes.tsx +327 -0
  462. package/src/ViewerConfiguration.ts +23 -0
  463. package/src/YjsCollaboration.ts +692 -0
  464. package/src/addons.ts +311 -0
  465. package/src/atomConstants.ts +3 -0
  466. package/src/atomInstances.ts +123 -0
  467. package/src/atomPolicy.ts +47 -0
  468. package/src/atomUpdates.ts +52 -0
  469. package/src/atoms.ts +379 -0
  470. package/src/attributeValidation.ts +116 -0
  471. package/src/contentExpression.ts +338 -0
  472. package/src/index.ts +295 -0
  473. package/src/listMarkers.ts +18 -0
  474. package/src/schemaDefinition.ts +395 -0
  475. package/src/schemaDocument.ts +92 -0
  476. package/src/schemaDocumentConstruction.ts +148 -0
  477. package/src/schemaNormalization.ts +367 -0
  478. package/src/schemaPresets.ts +250 -0
  479. package/src/schemaResolution.ts +242 -0
  480. package/src/schemas.ts +43 -0
  481. package/src/specs/PreparedProseViewerNativeComponent.ts +40 -0
  482. package/src/useEditorToolbarInteractions.tsx +329 -0
  483. package/src/useEditorToolbarItems.tsx +390 -0
  484. package/src/useEditorToolbarPresentation.tsx +483 -0
  485. package/src/useEditorToolbarState.tsx +172 -0
  486. package/src/useFocusPreservingFrames.ts +171 -0
  487. package/src/useNativeEditor.ts +534 -0
  488. package/src/useRichTextEditorCommands.tsx +478 -0
  489. package/src/useRichTextEditorEvents.tsx +342 -0
  490. package/src/useRichTextEditorMentions.tsx +441 -0
  491. package/src/useRichTextEditorPresentation.tsx +563 -0
  492. package/src/useRichTextEditorState.tsx +620 -0
  493. package/src/useRichTextEditorUpdates.tsx +403 -0
  494. package/src/useViewerAtoms.tsx +427 -0
@@ -0,0 +1,219 @@
1
+ import ExpoModulesCore
2
+ import UIKit
3
+
4
+ extension NativeEditorExpoView {
5
+ func clearPendingEditorUpdateRetries() {
6
+ lastEditorUpdateJSONProp = nil
7
+ pendingEditorUpdateJSON = nil
8
+ pendingEditorUpdateResetJSON = nil
9
+ pendingEditorUpdateEditorId = nil
10
+ pendingEditorUpdateRevision = 0
11
+ appliedEditorUpdateRevision = 0
12
+ renderedRevision = nil
13
+ pendingEditorUpdateRetryScheduled = false
14
+ pendingEditorUpdateRetryEditorId = nil
15
+ pendingEditorUpdateRetryGeneration &+= 1
16
+ }
17
+
18
+ func clearPendingViewCommandUpdateRetry() {
19
+ pendingViewCommandUpdateJSON = nil
20
+ pendingViewCommandUpdateEditorId = nil
21
+ pendingViewCommandUpdateRetryScheduled = false
22
+ pendingViewCommandUpdateRetryGeneration &+= 1
23
+ }
24
+
25
+ func clearPendingEditableRetry() {
26
+ pendingEditableRetryValue = nil
27
+ pendingEditableRetryEditorId = nil
28
+ pendingEditableRetryScheduled = false
29
+ pendingEditableRetryGeneration &+= 1
30
+ }
31
+
32
+ func clearPendingThemeRetry() {
33
+ pendingThemeRetry.clear()
34
+ }
35
+
36
+ func clearPendingAtomsRetry() {
37
+ pendingAtomsRetry.clear()
38
+ }
39
+
40
+ func clearPendingAccessoryRetry() {
41
+ pendingAccessoryRetryActions = []
42
+ invalidatedAccessoryRetryActions.removeAll()
43
+ pendingAccessoryRetryEditorId = nil
44
+ pendingAccessoryRetryScheduled = false
45
+ pendingAccessoryRetryGeneration &+= 1
46
+ }
47
+
48
+ func clearPendingMentionSuggestionRetry() {
49
+ pendingMentionSuggestionRetry = nil
50
+ pendingMentionSuggestionRetryScheduled = false
51
+ pendingMentionSuggestionRetryGeneration &+= 1
52
+ }
53
+
54
+ func scheduleThemeRetry(_ themeJson: String?) {
55
+ guard let token = pendingThemeRetry.schedule(
56
+ json: themeJson,
57
+ editorId: richTextView.editorId,
58
+ maxAttempts: nil
59
+ ) else { return }
60
+ DispatchQueue.main.async { [weak self] in
61
+ guard let self else { return }
62
+ guard let retry = self.pendingThemeRetry.consume(token) else { return }
63
+ guard retry.editorId == self.richTextView.editorId else {
64
+ self.clearPendingThemeRetry()
65
+ return
66
+ }
67
+ guard retry.json == self.desiredThemeJSON else {
68
+ self.clearPendingThemeRetry()
69
+ return
70
+ }
71
+ self.setThemeJson(retry.json)
72
+ }
73
+ }
74
+
75
+ func scheduleAtomsRetry(_ atomsJson: String?) {
76
+ guard let token = pendingAtomsRetry.schedule(
77
+ json: atomsJson,
78
+ editorId: richTextView.editorId,
79
+ maxAttempts: Self.maxPendingUpdateRetryAttempts
80
+ ) else { return }
81
+ let delay = Self.nativeActionRetryDelay * Double(token.attempt)
82
+ DispatchQueue.main.asyncAfter(deadline: .now() + delay) { [weak self] in
83
+ guard let self else { return }
84
+ guard let retry = self.pendingAtomsRetry.consume(token) else { return }
85
+ guard retry.editorId == self.richTextView.editorId else {
86
+ self.clearPendingAtomsRetry()
87
+ return
88
+ }
89
+ guard retry.json == self.desiredAtomsJSON else {
90
+ self.clearPendingAtomsRetry()
91
+ return
92
+ }
93
+ self.setAtomsJson(retry.json)
94
+ }
95
+ }
96
+
97
+ func schedulePendingAtomsWakeIfNeeded() {
98
+ guard desiredAtomsJSON != lastAtomsJSON,
99
+ !pendingAtomsWakeScheduled
100
+ else { return }
101
+ clearPendingAtomsRetry()
102
+ pendingAtomsWakeScheduled = true
103
+ DispatchQueue.main.async { [weak self] in
104
+ guard let self else { return }
105
+ self.pendingAtomsWakeScheduled = false
106
+ guard self.desiredAtomsJSON != self.lastAtomsJSON else { return }
107
+ self.setAtomsJson(self.desiredAtomsJSON)
108
+ }
109
+ }
110
+
111
+ func prepareForInputAccessoryMutationOrRetry(_ action: PendingAccessoryRetryAction) -> Bool {
112
+ guard richTextView.editorId != 0, richTextView.textView.isFirstResponder else {
113
+ return true
114
+ }
115
+ guard richTextView.textView.prepareForExternalEditorUpdate() else {
116
+ scheduleAccessoryRetry(action)
117
+ return false
118
+ }
119
+ return true
120
+ }
121
+
122
+ func reloadInputViewsAfterPreparingOrRetry() {
123
+ guard prepareForInputAccessoryMutationOrRetry(.reloadInputViews) else { return }
124
+ richTextView.textView.reloadInputViews()
125
+ markAccessoryMutationSucceeded(.reloadInputViews)
126
+ }
127
+
128
+ private func scheduleAccessoryRetry(_ action: PendingAccessoryRetryAction) {
129
+ invalidatedAccessoryRetryActions.remove(action)
130
+ pendingAccessoryRetryActions.removeAll { $0 == action }
131
+ pendingAccessoryRetryActions.append(action)
132
+ pendingAccessoryRetryEditorId = richTextView.editorId
133
+ guard !pendingAccessoryRetryScheduled else { return }
134
+ pendingAccessoryRetryScheduled = true
135
+ pendingAccessoryRetryGeneration &+= 1
136
+ let retryGeneration = pendingAccessoryRetryGeneration
137
+ DispatchQueue.main.async { [weak self] in
138
+ guard let self else { return }
139
+ guard retryGeneration == self.pendingAccessoryRetryGeneration else { return }
140
+ guard self.pendingAccessoryRetryEditorId == self.richTextView.editorId else {
141
+ self.clearPendingAccessoryRetry()
142
+ return
143
+ }
144
+ let actions = self.pendingAccessoryRetryActions
145
+ self.pendingAccessoryRetryActions = []
146
+ self.pendingAccessoryRetryEditorId = nil
147
+ self.pendingAccessoryRetryScheduled = false
148
+ for index in actions.indices {
149
+ let action = actions[index]
150
+ guard retryGeneration == self.pendingAccessoryRetryGeneration else { return }
151
+ guard !self.invalidatedAccessoryRetryActions.contains(action) else {
152
+ self.invalidatedAccessoryRetryActions.remove(action)
153
+ continue
154
+ }
155
+ let generationBeforeAction = self.pendingAccessoryRetryGeneration
156
+ self.performAccessoryRetryAction(action)
157
+ guard self.pendingAccessoryRetryGeneration == generationBeforeAction else {
158
+ let remainingIndex = actions.index(after: index)
159
+ if remainingIndex < actions.endIndex {
160
+ self.requeueUnprocessedAccessoryRetryActions(actions[remainingIndex...])
161
+ }
162
+ return
163
+ }
164
+ }
165
+ self.invalidatedAccessoryRetryActions.subtract(actions)
166
+ }
167
+ }
168
+
169
+ private func requeueUnprocessedAccessoryRetryActions(
170
+ _ actions: ArraySlice<PendingAccessoryRetryAction>
171
+ ) {
172
+ for action in actions {
173
+ guard !invalidatedAccessoryRetryActions.contains(action) else {
174
+ invalidatedAccessoryRetryActions.remove(action)
175
+ continue
176
+ }
177
+ pendingAccessoryRetryActions.removeAll { $0 == action }
178
+ pendingAccessoryRetryActions.append(action)
179
+ }
180
+ if !pendingAccessoryRetryActions.isEmpty {
181
+ pendingAccessoryRetryEditorId = richTextView.editorId
182
+ }
183
+ }
184
+
185
+ private func performAccessoryRetryAction(_ action: PendingAccessoryRetryAction) {
186
+ switch action {
187
+ case .reloadInputViews:
188
+ reloadInputViewsAfterPreparingOrRetry()
189
+ case .refreshMentionQuery:
190
+ refreshMentionQuery()
191
+ case .clearMentionQueryState:
192
+ clearMentionQueryStateAndHidePopover()
193
+ case .updateAccessoryToolbarVisibility:
194
+ updateAccessoryToolbarVisibility()
195
+ }
196
+ }
197
+
198
+ func markAccessoryMutationSucceeded(_ action: PendingAccessoryRetryAction) {
199
+ var invalidated: Set<PendingAccessoryRetryAction> = [action]
200
+ switch action {
201
+ case .refreshMentionQuery:
202
+ invalidated.insert(.clearMentionQueryState)
203
+ case .clearMentionQueryState:
204
+ if !hasActiveMentionQueryForCurrentAddons() {
205
+ invalidated.insert(.refreshMentionQuery)
206
+ }
207
+ case .reloadInputViews, .updateAccessoryToolbarVisibility:
208
+ break
209
+ }
210
+ invalidatePendingAccessoryRetries(invalidated)
211
+ }
212
+
213
+ private func invalidatePendingAccessoryRetries(_ actions: Set<PendingAccessoryRetryAction>) {
214
+ guard !actions.isEmpty else { return }
215
+ invalidatedAccessoryRetryActions.formUnion(actions)
216
+ pendingAccessoryRetryActions.removeAll { actions.contains($0) }
217
+ }
218
+
219
+ }
@@ -0,0 +1,268 @@
1
+ import ExpoModulesCore
2
+ import UIKit
3
+
4
+ extension NativeEditorExpoView {
5
+ func handleEditorDestroyed(_ editorId: UInt64) {
6
+ guard editorId != 0 else { return }
7
+ guard richTextView.editorId == editorId || richTextView.textView.editorId == editorId else {
8
+ NativeEditorViewRegistry.shared.unregister(editorId: editorId, view: self)
9
+ return
10
+ }
11
+
12
+ richTextView.textView.discardTransientNativeInputForEditorRebind()
13
+ clearAutonomousErrorBinding()
14
+ NativeEditorViewRegistry.shared.unregister(editorId: editorId, view: self)
15
+ clearPendingEditorUpdateRetries()
16
+ clearPendingViewCommandUpdateRetry()
17
+ clearPendingEditableRetry()
18
+ clearPendingThemeRetry()
19
+ clearPendingAtomsRetry()
20
+ clearPendingAccessoryRetry()
21
+ clearPendingMentionSuggestionRetry()
22
+ lastMentionEventJSON = nil
23
+ _ = richTextView.textView.resignFirstResponder()
24
+ richTextView.editorId = 0
25
+ mentionQueryState = nil
26
+ _ = accessoryToolbar.setMentionSuggestions([])
27
+ toolbarState = .empty
28
+ accessoryToolbar.apply(state: .empty)
29
+ uninstallOutsideTapRecognizer()
30
+ refreshSystemAssistantToolbarIfNeeded()
31
+ }
32
+
33
+ func setEditorId(_ id: UInt64) {
34
+ let previousEditorId = richTextView.editorId
35
+ if id != 0 && NativeEditorViewRegistry.shared.isDestroyed(editorId: id) {
36
+ if previousEditorId == id {
37
+ handleEditorDestroyed(id)
38
+ } else {
39
+ setEditorId(0)
40
+ }
41
+ return
42
+ }
43
+ guard previousEditorId != id else {
44
+ if id != 0 {
45
+ if !NativeEditorViewRegistry.shared.register(editorId: id, view: self) {
46
+ handleEditorDestroyed(id)
47
+ } else {
48
+ ensureAutonomousErrorBinding()
49
+ }
50
+ }
51
+ return
52
+ }
53
+ if previousEditorId != id {
54
+ richTextView.textView.discardTransientNativeInputForEditorRebind()
55
+ let releasedNativeOwner = ownsNativeBinding(editorId: previousEditorId)
56
+ clearAutonomousErrorBinding()
57
+ NativeEditorViewRegistry.shared.unregister(editorId: previousEditorId, view: self)
58
+ if releasedNativeOwner {
59
+ NativeEditorViewRegistry.shared.nativeOwnerReleased(
60
+ editorId: previousEditorId,
61
+ by: self
62
+ )
63
+ }
64
+ clearPendingEditorUpdateRetries()
65
+ clearPendingViewCommandUpdateRetry()
66
+ clearPendingEditableRetry()
67
+ clearPendingThemeRetry()
68
+ clearPendingAtomsRetry()
69
+ clearPendingAccessoryRetry()
70
+ clearPendingMentionSuggestionRetry()
71
+ }
72
+ var initialBindUpdateJSON: String?
73
+ if id != 0 {
74
+ guard NativeEditorViewRegistry.shared.register(editorId: id, view: self) else {
75
+ handleEditorDestroyed(id)
76
+ return
77
+ }
78
+ bindAutonomousError(adapter: EditorV2Registry.adapter(forLegacyId: id), editorId: id)
79
+ initialBindUpdateJSON = EditorV2Registry.adapter(forLegacyId: id)?.initialUpdateJSON()
80
+ }
81
+ // Bind the editor with the same adopted snapshot used for toolbar
82
+ // state. The text view must not perform an independent state read.
83
+ imageLoadOwner.withCurrent {
84
+ richTextView.bindEditor(id: id, initialUpdateJSON: initialBindUpdateJSON)
85
+ }
86
+ if id != 0 {
87
+ richTextView.emitAtomContentWidthIfAvailable(force: true)
88
+ }
89
+ if id != 0 {
90
+ if let initialBindUpdateJSON,
91
+ let state = NativeToolbarState(updateJSON: initialBindUpdateJSON) {
92
+ toolbarState = state
93
+ accessoryToolbar.apply(state: state)
94
+ } else {
95
+ toolbarState = .empty
96
+ accessoryToolbar.apply(state: .empty)
97
+ }
98
+ } else {
99
+ toolbarState = .empty
100
+ accessoryToolbar.apply(state: .empty)
101
+ }
102
+ if desiredThemeJSON != lastThemeJSON {
103
+ setThemeJson(desiredThemeJSON)
104
+ }
105
+ if desiredAtomsJSON != lastAtomsJSON {
106
+ setAtomsJson(desiredAtomsJSON)
107
+ }
108
+ refreshSystemAssistantToolbarIfNeeded()
109
+ refreshMentionQuery()
110
+ }
111
+
112
+ func ownsNativeBinding(editorId: UInt64) -> Bool {
113
+ guard editorId != 0,
114
+ richTextView.editorId == editorId,
115
+ let adapter = EditorV2Registry.adapter(forLegacyId: editorId)
116
+ else { return false }
117
+ let autonomousOwner = autonomousErrorBindingAdapter === adapter
118
+ && autonomousErrorBindingToken.map { adapter.isNativeBindingOwner(token: $0) } == true
119
+ return autonomousOwner || richTextView.textView.ownsNativeBinding(adapter)
120
+ }
121
+
122
+ func claimNativeOwnershipAndCatchUp(editorId: UInt64) {
123
+ guard window != nil, richTextView.editorId == editorId else { return }
124
+ ensureAutonomousErrorBinding()
125
+ applyRemoteCommitRefresh()
126
+ }
127
+
128
+ func ensureAutonomousErrorBinding() {
129
+ let editorId = richTextView.editorId
130
+ guard editorId != 0,
131
+ let adapter = EditorV2Registry.adapter(forLegacyId: editorId)
132
+ else { return }
133
+ guard autonomousErrorBindingAdapter !== adapter
134
+ || autonomousErrorBindingEditorId != adapter.editorId
135
+ || autonomousErrorBindingToken.map({ adapter.isAutonomousErrorOwner(token: $0) }) != true
136
+ else { return }
137
+ clearAutonomousErrorBinding()
138
+ bindAutonomousError(adapter: adapter, editorId: editorId)
139
+ }
140
+
141
+ private func bindAutonomousError(adapter: EditorV2Adapter?, editorId: UInt64) {
142
+ guard let adapter,
143
+ let canonicalEditorId = v2CanonicalUInt64String(adapter.editorId),
144
+ canonicalEditorId == String(editorId),
145
+ !adapter.isDestroyed
146
+ else { return }
147
+ let token = UUID()
148
+ let generation = autonomousErrorBindingGeneration
149
+ autonomousErrorBindingAdapter = adapter
150
+ autonomousErrorBindingEditorId = canonicalEditorId
151
+ autonomousErrorBindingToken = token
152
+ adapter.bindAutonomousErrorOwner(token: token) { [weak self, weak adapter] error in
153
+ let enqueue = {
154
+ guard let self, let adapter else { return }
155
+ self.enqueueAutonomousError(
156
+ error,
157
+ from: adapter,
158
+ editorId: canonicalEditorId,
159
+ token: token,
160
+ generation: generation
161
+ )
162
+ }
163
+ if Thread.isMainThread {
164
+ enqueue()
165
+ } else {
166
+ DispatchQueue.main.async(execute: enqueue)
167
+ }
168
+ }
169
+ }
170
+
171
+ func clearAutonomousErrorBinding() {
172
+ autonomousErrorBindingGeneration &+= 1
173
+ pendingAutonomousErrors.removeAll()
174
+ if let adapter = autonomousErrorBindingAdapter,
175
+ let token = autonomousErrorBindingToken {
176
+ adapter.clearAutonomousErrorOwner(token: token)
177
+ }
178
+ autonomousErrorBindingAdapter = nil
179
+ autonomousErrorBindingEditorId = nil
180
+ autonomousErrorBindingToken = nil
181
+ }
182
+
183
+ private func enqueueAutonomousError(
184
+ _ error: FfiError,
185
+ from adapter: EditorV2Adapter,
186
+ editorId: String,
187
+ token: UUID,
188
+ generation: UInt64
189
+ ) {
190
+ guard isLiveAutonomousErrorBinding(
191
+ adapter: adapter,
192
+ editorId: editorId,
193
+ token: token,
194
+ generation: generation
195
+ ) else { return }
196
+ let dispatchId = UUID()
197
+ pendingAutonomousErrors[dispatchId] = PendingAutonomousError(
198
+ adapter: adapter,
199
+ editorId: editorId,
200
+ token: token,
201
+ generation: generation,
202
+ error: error
203
+ )
204
+ DispatchQueue.main.async { [weak self] in
205
+ self?.dispatchAutonomousError(id: dispatchId)
206
+ }
207
+ }
208
+
209
+ private func dispatchAutonomousError(id: UUID) {
210
+ // Remove before invoking Expo/test code. Reentrant state changes or a
211
+ // duplicate callback cannot deliver this particular failure twice.
212
+ guard let pending = pendingAutonomousErrors.removeValue(forKey: id),
213
+ isLiveAutonomousErrorBinding(
214
+ adapter: pending.adapter,
215
+ editorId: pending.editorId,
216
+ token: pending.token,
217
+ generation: pending.generation
218
+ )
219
+ else { return }
220
+ let payload = NativeEditorExpoView.autonomousErrorEventPayload(
221
+ editorId: pending.editorId,
222
+ error: pending.error
223
+ )
224
+ if let onEditorErrorForTesting {
225
+ onEditorErrorForTesting(payload)
226
+ } else {
227
+ onEditorError(payload)
228
+ }
229
+ }
230
+
231
+ private func isLiveAutonomousErrorBinding(
232
+ adapter: EditorV2Adapter,
233
+ editorId: String,
234
+ token: UUID,
235
+ generation: UInt64
236
+ ) -> Bool {
237
+ guard autonomousErrorBindingGeneration == generation,
238
+ autonomousErrorBindingAdapter === adapter,
239
+ autonomousErrorBindingEditorId == editorId,
240
+ autonomousErrorBindingToken == token,
241
+ adapter.isAutonomousErrorOwner(token: token),
242
+ !adapter.isDestroyed,
243
+ let nativeEditorId = UInt64(editorId),
244
+ !NativeEditorViewRegistry.shared.isDestroyed(editorId: nativeEditorId),
245
+ EditorV2Registry.adapter(forLegacyId: nativeEditorId) === adapter
246
+ else { return false }
247
+ return true
248
+ }
249
+
250
+ private static func autonomousErrorEventPayload(editorId: String, error: FfiError) -> [String: Any] {
251
+ let errorRecord: [String: Any] = [
252
+ "domain": error.domain,
253
+ "code": error.code,
254
+ "message": error.message,
255
+ "requestId": error.requestId ?? NSNull(),
256
+ "operationIndex": error.operationIndex ?? NSNull(),
257
+ "limit": error.limit ?? NSNull(),
258
+ "actual": error.actual ?? NSNull(),
259
+ "detailsJson": error.detailsJson ?? NSNull()
260
+ ]
261
+ let payload: [String: Any] = [
262
+ "editorId": editorId,
263
+ "error": errorRecord
264
+ ]
265
+ return payload
266
+ }
267
+
268
+ }
@@ -0,0 +1,66 @@
1
+ import ExpoModulesCore
2
+ import UIKit
3
+
4
+ extension NativeEditorExpoView {
5
+ func setMentionQueryStateForTesting(_ state: MentionQueryState?) {
6
+ mentionQueryState = state
7
+ }
8
+
9
+ func currentMentionQueryStateForTesting(trigger: String) -> MentionQueryState? {
10
+ currentMentionQueryState(trigger: trigger)
11
+ }
12
+
13
+ func setMentionSuggestionsForTesting(_ suggestions: [NativeMentionSuggestion]) {
14
+ accessoryToolbar.setMentionSuggestions(
15
+ suggestions,
16
+ trigger: mentionQueryState?.trigger ?? "@"
17
+ )
18
+ }
19
+
20
+ func isShowingMentionSuggestionsForTesting() -> Bool {
21
+ accessoryToolbar.isShowingMentionSuggestions
22
+ }
23
+
24
+ func lastAddonEventJSONForTesting() -> String? {
25
+ lastAddonEventJSONForTestingValue
26
+ }
27
+
28
+ func triggerMentionSuggestionTapForTesting(at index: Int) {
29
+ accessoryToolbar.triggerMentionSuggestionTapForTesting(at: index)
30
+ }
31
+
32
+ func inputAccessoryViewForTesting() -> UIView? {
33
+ richTextView.textView.inputAccessoryView
34
+ }
35
+
36
+ func isUsingAccessoryToolbarForTesting() -> Bool {
37
+ richTextView.textView.inputAccessoryView === accessoryToolbar
38
+ }
39
+
40
+ func isUsingAccessoryPlaceholderForTesting() -> Bool {
41
+ richTextView.textView.inputAccessoryView === accessoryPlaceholder
42
+ }
43
+
44
+ func markRecentToolbarTouchForTesting() {
45
+ markRecentToolbarTouch()
46
+ }
47
+
48
+ func shouldPreserveFocusAfterToolbarTouchForTesting() -> Bool {
49
+ shouldPreserveFocusAfterToolbarTouch()
50
+ }
51
+
52
+ func consumeToolbarFocusPreservationForTesting() -> Bool {
53
+ consumeToolbarFocusPreservationForBlur()
54
+ }
55
+
56
+ func prepareOutsideTapForFocusHandlingForTesting(
57
+ locationInWindow: CGPoint,
58
+ touchedView: UIView? = nil
59
+ ) -> Bool {
60
+ prepareOutsideTapForFocusHandling(
61
+ locationInWindow: locationInWindow,
62
+ touchedView: touchedView
63
+ )
64
+ }
65
+
66
+ }
@@ -0,0 +1,131 @@
1
+ import ExpoModulesCore
2
+ import UIKit
3
+
4
+ extension NativeEditorExpoView {
5
+ func editorTextView(
6
+ _ textView: EditorTextView,
7
+ didEndExternalTextComposition resultJSON: String
8
+ ) {
9
+ schedulePendingAtomsWakeIfNeeded()
10
+ dispatchExternalTextCompositionEnd(resultJSON)
11
+ }
12
+
13
+ func dispatchExternalTextCompositionEnd(_ resultJSON: String) {
14
+ let payload: [String: Any] = [
15
+ "editorId": String(richTextView.editorId),
16
+ "resultJson": resultJSON
17
+ ]
18
+ if let onExternalTextCompositionEndForTesting {
19
+ onExternalTextCompositionEndForTesting(payload)
20
+ } else {
21
+ onExternalTextCompositionEnd(payload)
22
+ }
23
+ }
24
+
25
+ func editorTextView(_ textView: EditorTextView, selectionDidChange anchor: UInt32, head: UInt32) {
26
+ let originatingEditorId = textView.editorId
27
+ let stateJSON = refreshToolbarStateFromEditorSelection()
28
+ refreshSystemAssistantToolbarIfNeeded()
29
+ refreshMentionQuery()
30
+ richTextView.refreshRemoteSelections()
31
+ var event: [String: Any] = ["anchor": Int(anchor), "head": Int(head)]
32
+ if let stateJSON {
33
+ event["stateJson"] = stateJSON
34
+ }
35
+ guard let scopedEvent = Self.editorScopedEventPayload(
36
+ event,
37
+ originatingEditorId: originatingEditorId
38
+ ) else { return }
39
+ onSelectionChange(scopedEvent)
40
+ }
41
+
42
+ func editorTextView(_ textView: EditorTextView, didReceiveUpdate updateJSON: String) {
43
+ schedulePendingAtomsWakeIfNeeded()
44
+ if let revision = renderRevision(fromUpdateJSON: updateJSON) {
45
+ renderedRevision = revision
46
+ }
47
+ // Capture both fields from the same committed atomic update before
48
+ // any view work can cause a rebind. The event must never relabel A's
49
+ // update as B merely because the host changes editorId afterwards.
50
+ let nativeCommitEvent = Self.nativeCommitEventPayload(
51
+ originatingEditorId: String(textView.editorId),
52
+ updateJSON: updateJSON
53
+ )
54
+ if let state = NativeToolbarState(updateJSON: updateJSON) {
55
+ toolbarState = state
56
+ accessoryToolbar.apply(state: state)
57
+ refreshSystemAssistantToolbarIfNeeded()
58
+ }
59
+ refreshMentionQuery()
60
+ richTextView.refreshRemoteSelections()
61
+ guard !isApplyingJSUpdate else { return }
62
+ guard let nativeCommitEvent else { return }
63
+ onEditorUpdate(nativeCommitEvent)
64
+ }
65
+
66
+ /// The canonical JS commit contract. `originatingEditorId` is captured
67
+ /// synchronously from the text view which applied `updateJSON`; it is not
68
+ /// read from the host view after asynchronous rebind work.
69
+ static func nativeCommitEventPayload(
70
+ originatingEditorId: String,
71
+ updateJSON: String
72
+ ) -> [String: Any]? {
73
+ guard let editorId = v2CanonicalUInt64String(originatingEditorId),
74
+ editorId != "0",
75
+ let nativeEditorId = UInt64(editorId),
76
+ let data = updateJSON.data(using: .utf8),
77
+ let update = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
78
+ let rawRevision = update["documentVersion"] as? String,
79
+ let documentRevision = v2CanonicalUInt64String(rawRevision),
80
+ let revision = UInt64(documentRevision),
81
+ let atomicUpdateJSON = EditorV2Registry.adapter(forLegacyId: nativeEditorId)?
82
+ .atomicRenderJSON(matchingDocumentRevision: revision)
83
+ else {
84
+ return nil
85
+ }
86
+ return [
87
+ "editorId": editorId,
88
+ "documentRevision": documentRevision,
89
+ "updateJson": atomicUpdateJSON
90
+ ]
91
+ }
92
+
93
+ /// Every non-commit view event is labelled with the editor that produced
94
+ /// it, captured before refresh/rebind work can change the view binding.
95
+ static func editorScopedEventPayload(
96
+ _ payload: [String: Any],
97
+ originatingEditorId: UInt64
98
+ ) -> [String: Any]? {
99
+ guard originatingEditorId != 0,
100
+ let editorId = v2CanonicalUInt64String(String(originatingEditorId))
101
+ else {
102
+ return nil
103
+ }
104
+ var scopedPayload = payload
105
+ scopedPayload["editorId"] = editorId
106
+ return scopedPayload
107
+ }
108
+
109
+ @discardableResult
110
+ private func refreshToolbarStateFromEditorSelection() -> String? {
111
+ guard richTextView.editorId != 0 else { return nil }
112
+ let stateJSON = EditorV2Shadow.getSelectionState(id: richTextView.editorId)
113
+ guard let state = NativeToolbarState(updateJSON: stateJSON) else { return nil }
114
+ toolbarState = state
115
+ accessoryToolbar.apply(state: state)
116
+ return stateJSON
117
+ }
118
+
119
+ func configureAccessoryToolbar() {
120
+ accessoryToolbar.onPressItem = { [weak self] item in
121
+ self?.handleToolbarItemPress(item)
122
+ }
123
+ accessoryToolbar.onSelectMentionSuggestion = { [weak self] suggestion in
124
+ self?.insertMentionSuggestion(suggestion)
125
+ }
126
+ accessoryToolbar.setItems(toolbarItems)
127
+ accessoryToolbar.apply(state: toolbarState)
128
+ updateAccessoryToolbarVisibility()
129
+ }
130
+
131
+ }