@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,68 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.graphics.Rect
4
+ import android.view.View
5
+ import android.view.ViewGroup
6
+
7
+ internal fun NativeEditorExpoView.atomChildAtImpl(index: Int): View? =
8
+ reactChildren.getOrNull(index)
9
+
10
+ internal fun NativeEditorExpoView.addAtomChildImpl(child: View, index: Int) {
11
+ reactChildren.remove(child)
12
+ reactChildren.add(index.coerceIn(0, reactChildren.size), child)
13
+ val atomKey = atomKey(child)
14
+ if (atomKey == null) {
15
+ (child.parent as? ViewGroup)?.removeView(child)
16
+ addNativeAtomView(child, childCount)
17
+ return
18
+ }
19
+ (child.parent as? ViewGroup)?.removeView(child)
20
+ richTextView.mountAtomChild(child, atomKey)
21
+ richTextView.orderAtomChildren(reactChildren)
22
+ }
23
+
24
+ internal fun NativeEditorExpoView.removeAtomChildAtImpl(index: Int) {
25
+ reactChildren.getOrNull(index)?.let(::removeAtomChild)
26
+ }
27
+
28
+ internal fun NativeEditorExpoView.removeAtomChildImpl(child: View) {
29
+ reactChildren.remove(child)
30
+ if (!richTextView.unmountAtomChild(child)) {
31
+ (child.parent as? ViewGroup)?.removeView(child)
32
+ }
33
+ }
34
+
35
+ internal fun NativeEditorExpoView.emitAtomLayout(
36
+ widthPx: Float,
37
+ positions: List<AtomLayoutPosition>
38
+ ) {
39
+ val density = resources.displayMetrics.density.takeIf { it > 0f } ?: 1f
40
+ val contentOrigin = Rect()
41
+ offsetDescendantRectToMyCoords(richTextView.editorContentFrame, contentOrigin)
42
+ val event = mapOf<String, Any>(
43
+ "width" to widthPx / density,
44
+ "positions" to positions.map { position ->
45
+ mapOf(
46
+ "key" to position.key,
47
+ "x" to position.xPx / density,
48
+ "y" to position.yPx / density,
49
+ "hostX" to (contentOrigin.left + position.xPx) / density,
50
+ "hostY" to (contentOrigin.top + position.yPx) / density,
51
+ "height" to position.heightPx / density,
52
+ "width" to position.widthPx / density
53
+ )
54
+ },
55
+ "viewport" to mapOf(
56
+ "y" to richTextView.editorScrollView.scrollY / density,
57
+ "height" to richTextView.editorScrollView.height / density
58
+ ),
59
+ "editorId" to eventEditorId(richTextView.editorId)
60
+ )
61
+ onAtomLayoutForTesting?.invoke(event) ?: onAtomLayout(event)
62
+ }
63
+
64
+ internal fun NativeEditorExpoView.atomKey(child: View): String? {
65
+ val nativeId = child.getTag(com.facebook.react.R.id.view_tag_native_id) as? String
66
+ if (nativeId == null || !nativeId.startsWith(ATOM_NATIVE_ID_PREFIX)) return null
67
+ return nativeId.removePrefix(ATOM_NATIVE_ID_PREFIX).takeIf(String::isNotEmpty)
68
+ }
@@ -0,0 +1,126 @@
1
+ package com.apollohg.editor
2
+
3
+ /** Public v2 handles are decimal strings; [RichTextEditorView] uses an opaque local token. */
4
+ internal fun NativeEditorExpoView.publicHandleForViewToken(viewToken: Long): String? =
5
+ EditorV2Registry.handleForViewToken(viewToken)
6
+
7
+ /** Events never expose a signed widget token as a v2 editor id. */
8
+ internal fun NativeEditorExpoView.eventEditorId(viewToken: Long): String =
9
+ publicHandleForViewToken(viewToken) ?: "0"
10
+
11
+ internal fun NativeEditorExpoView.setEditorHandleImpl(handle: String?) {
12
+ val viewToken = handle?.let(EditorV2Registry::viewTokenForHandle)
13
+ setEditorId(viewToken ?: 0L)
14
+ }
15
+
16
+ /**
17
+ * Internal-only widget binding. This token is allocated by
18
+ * [EditorV2Registry] and is never a public session identifier.
19
+ */
20
+ internal fun NativeEditorExpoView.setEditorIdImpl(id: Long) {
21
+ if (id != 0L && NativeEditorViewRegistry.isDestroyed(id)) {
22
+ setEditorId(0L)
23
+ return
24
+ }
25
+ val previousEditorId = richTextView.editorId
26
+ if (previousEditorId != id) {
27
+ cancelActiveExternalTextComposition("lifecycle")
28
+ invalidateAutoGrowContentHeightEmission()
29
+ drainPendingEditorUpdateEvents()
30
+ clearEditorErrorBinding("editorRebind")
31
+ }
32
+ if (previousEditorId == id && richTextView.editorEditText.editorId == id) {
33
+ if (id != 0L && isAttachedToNativeWindow) {
34
+ if (!NativeEditorViewRegistry.register(id, this)) {
35
+ handleEditorDestroyed(id)
36
+ return
37
+ }
38
+ bindEditorErrorCallbackIfLive(id)
39
+ applyPendingEditorResetUpdateIfNeeded()
40
+ applyPendingEditorUpdateIfNeeded()
41
+ applyPendingThemeIfNeeded()
42
+ applyPendingAtomsIfNeeded()
43
+ refreshReadyStateIfSettled()
44
+ applyAutoFocusIfNeeded()
45
+ } else if (id != 0L) {
46
+ NativeEditorViewRegistry.unregister(
47
+ id,
48
+ this,
49
+ blockCommandsUntilRegistered = true
50
+ )
51
+ }
52
+ richTextView.emitAtomLayoutIfAvailable(force = true)
53
+ return
54
+ }
55
+ if (previousEditorId != id) {
56
+ NativeEditorViewRegistry.unregister(previousEditorId, this)
57
+ lastDocumentVersion = null
58
+ renderedDocumentRevision = null
59
+ cancelPendingToolbarRefocus()
60
+ cancelPendingEditorUpdateRetry()
61
+ if (pendingEditorUpdateEditorId != null && pendingEditorUpdateEditorId != id) {
62
+ clearPendingEditorUpdateState()
63
+ }
64
+ if (pendingEditorResetUpdateEditorId != null && pendingEditorResetUpdateEditorId != id) {
65
+ clearPendingEditorResetUpdateState()
66
+ }
67
+ appliedEditorUpdateRevision = 0L
68
+ appliedEditorResetUpdateRevision = 0L
69
+ consumedEditorUpdateRevision = 0L
70
+ consumedEditorUpdateEditorId = null
71
+ consumedEditorResetUpdateRevision = 0L
72
+ consumedEditorResetUpdateEditorId = null
73
+ clearPendingViewCommandUpdateRetry()
74
+ cancelPendingThemeRetry()
75
+ if (hasPendingTheme) {
76
+ pendingThemeRetry.bind(id)
77
+ }
78
+ cancelPendingAtomsRetry()
79
+ if (hasPendingAtoms) {
80
+ pendingAtomsRetry.bind(id)
81
+ }
82
+ cancelPendingBlurRetry()
83
+ clearPendingNativeActionRetry()
84
+ clearMentionQueryState(resetLastEvent = true)
85
+ lastReadyEditorId = null
86
+ }
87
+ if (!isAttachedToNativeWindow) {
88
+ richTextView.setEditorIdWhileDetached(id)
89
+ if (id != 0L) {
90
+ NativeEditorViewRegistry.unregister(
91
+ id,
92
+ this,
93
+ blockCommandsUntilRegistered = true
94
+ )
95
+ } else {
96
+ toolbarState = NativeToolbarState.empty
97
+ keyboardToolbarView.applyState(toolbarState)
98
+ }
99
+ richTextView.emitAtomLayoutIfAvailable(force = true)
100
+ return
101
+ }
102
+
103
+ if (hasPendingEditorResetUpdateForEditor(id) || hasPendingEditorUpdateForEditor(id)) {
104
+ richTextView.setEditorIdWhileDetached(id)
105
+ richTextView.rebindEditorIfNeeded(notifyListener = false)
106
+ } else {
107
+ richTextView.editorId = id
108
+ }
109
+ if (id != 0L) {
110
+ if (!NativeEditorViewRegistry.register(id, this)) {
111
+ handleEditorDestroyed(id)
112
+ return
113
+ }
114
+ bindEditorErrorCallbackIfLive(id)
115
+ } else {
116
+ toolbarState = NativeToolbarState.empty
117
+ keyboardToolbarView.applyState(toolbarState)
118
+ }
119
+ applyPendingEditorResetUpdateIfNeeded()
120
+ applyPendingEditorUpdateIfNeeded()
121
+ applyPendingThemeIfNeeded()
122
+ applyPendingAtomsIfNeeded()
123
+ refreshReadyStateIfSettled()
124
+ applyAutoFocusIfNeeded()
125
+ richTextView.emitAtomLayoutIfAvailable(force = true)
126
+ }
@@ -0,0 +1,208 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.view.MotionEvent
4
+
5
+ internal fun NativeEditorExpoView.markRecentToolbarTouchForTestingImpl() {
6
+ markRecentToolbarTouch()
7
+ }
8
+
9
+ internal fun NativeEditorExpoView.shouldPreserveFocusAfterToolbarTouchForTestingImpl(): Boolean =
10
+ shouldPreserveFocusAfterToolbarTouch()
11
+
12
+ internal fun NativeEditorExpoView.setEditorFocusedForOutsideTapDecisionForTestingImpl(
13
+ isFocused: Boolean?
14
+ ) {
15
+ editorFocusedForOutsideTapOverrideForTesting = isFocused
16
+ }
17
+
18
+ internal fun NativeEditorExpoView.setAttachedToNativeWindowForTestingImpl(isAttached: Boolean) {
19
+ isAttachedToNativeWindow = isAttached
20
+ }
21
+
22
+ internal fun NativeEditorExpoView.handleAttachedToWindowForTestingImpl() {
23
+ handleAttachedToWindow()
24
+ }
25
+
26
+ internal fun NativeEditorExpoView.traceOutsideTapImpl(message: String) {
27
+ onOutsideTapTraceForTesting?.invoke(message)
28
+ }
29
+
30
+ internal fun NativeEditorExpoView.handleDetachedFromWindowForTestingImpl() {
31
+ prepareForDetachFromWindow()
32
+ richTextView.editorEditText.retireInputConnectionForHostDetach()
33
+ handleDetachedFromWindow()
34
+ }
35
+
36
+ internal fun NativeEditorExpoView.performBlurForTestingImpl(deferKeyboardDismiss: Boolean = false) {
37
+ performBlur(deferKeyboardDismiss = deferKeyboardDismiss, allowRetry = true)
38
+ }
39
+
40
+ internal fun NativeEditorExpoView.pendingBlurRetryAttemptsForTestingImpl(): Int =
41
+ pendingBlurRetryAttempts
42
+
43
+ internal fun NativeEditorExpoView.pendingDetachPreflightRetryAttemptsForTestingImpl(): Int =
44
+ pendingDetachPreflightRetryAttempts
45
+
46
+ internal fun NativeEditorExpoView.hasPendingOutsideTapBlurForTestingImpl(): Boolean =
47
+ pendingOutsideTapBlur != null
48
+
49
+ internal fun NativeEditorExpoView.isOutsideTapBlurHandlerInstalledForTestingImpl(): Boolean =
50
+ outsideTapWindow != null
51
+
52
+ internal fun NativeEditorExpoView.hasPendingKeyboardDismissForTestingImpl(): Boolean =
53
+ pendingKeyboardDismiss != null
54
+
55
+ internal fun NativeEditorExpoView.hasPendingPreflightWakeForTestingImpl(): Boolean =
56
+ pendingPreflightWakeScheduled
57
+
58
+ internal fun NativeEditorExpoView.hasPendingToolbarRefocusForTestingImpl(): Boolean =
59
+ pendingToolbarRefocus != null
60
+
61
+ internal fun NativeEditorExpoView.isKeyboardToolbarAttachedForTestingImpl(): Boolean =
62
+ keyboardToolbarView.parent != null
63
+
64
+ internal fun NativeEditorExpoView.currentImeBottomForTestingImpl(): Int = currentImeBottom
65
+
66
+ internal fun NativeEditorExpoView.setCurrentImeBottomForTestingImpl(bottom: Int) {
67
+ currentImeBottom = bottom
68
+ }
69
+
70
+ internal fun NativeEditorExpoView.updateAttachedKeyboardToolbarForInsetsForTestingImpl() {
71
+ updateAttachedKeyboardToolbarForInsets()
72
+ }
73
+
74
+ internal fun NativeEditorExpoView.scheduleToolbarRefocusForTestingImpl() {
75
+ scheduleToolbarRefocus()
76
+ }
77
+
78
+ internal fun NativeEditorExpoView.focusFromToolbarPreserveForTestingImpl() {
79
+ focusInternal(cancelPendingOutsideTapBlur = false)
80
+ }
81
+
82
+ internal fun NativeEditorExpoView.applyAutoFocusForTestingImpl() {
83
+ applyAutoFocusIfNeeded()
84
+ }
85
+
86
+ internal fun NativeEditorExpoView.installOutsideTapBlurHandlerForTestingImpl() {
87
+ installOutsideTapBlurHandlerIfNeeded()
88
+ }
89
+
90
+ internal fun NativeEditorExpoView.uninstallOutsideTapBlurHandlerForTestingImpl() {
91
+ uninstallOutsideTapBlurHandler()
92
+ }
93
+
94
+ internal fun NativeEditorExpoView.setOutsideTapCycleBreakDispatcherForTestingImpl(
95
+ dispatcher: ((MotionEvent) -> Boolean)?
96
+ ): Boolean {
97
+ val window = resolveActivity(context)?.window ?: return false
98
+ return NativeEditorOutsideTapDispatcher.setCycleBreakDispatcherForTesting(window, dispatcher)
99
+ }
100
+
101
+ internal fun NativeEditorExpoView.clearOutsideTapRouteViewReferenceAndReconcileForTestingImpl():
102
+ NativeEditorOutsideTapRouteTestState {
103
+ val window = resolveActivity(context)?.window
104
+ ?: return NativeEditorOutsideTapRouteTestState(
105
+ isRegistered = false,
106
+ hasCallbackReconciler = false
107
+ )
108
+ return NativeEditorOutsideTapDispatcher.clearViewReferenceAndReconcileForTesting(window, this)
109
+ }
110
+
111
+ internal fun NativeEditorExpoView.dispatchOutsideTapWindowEventForTestingImpl(
112
+ event: MotionEvent
113
+ ): Boolean {
114
+ val window = resolveActivity(context)?.window ?: return false
115
+ return NativeEditorOutsideTapDispatcher.dispatchForTesting(window, event)
116
+ }
117
+
118
+ internal fun NativeEditorExpoView.schedulePendingPreflightWakeForTestingImpl() {
119
+ schedulePendingPreflightWake()
120
+ }
121
+
122
+ internal fun NativeEditorExpoView.hasPendingNativeActionForTestingImpl(): Boolean =
123
+ pendingNativeAction != null
124
+
125
+ internal fun NativeEditorExpoView.pendingNativeActionRetryAttemptsForTestingImpl(): Int =
126
+ pendingNativeActionRetryAttempts
127
+
128
+ internal fun NativeEditorExpoView.lastDocumentVersionForTestingImpl(): String? = lastDocumentVersion
129
+
130
+ internal fun NativeEditorExpoView.setLastDocumentVersionForTestingImpl(documentVersion: String?) {
131
+ lastDocumentVersion = documentVersion
132
+ }
133
+
134
+ internal fun NativeEditorExpoView.refreshToolbarStateFromEditorSelectionForTestingImpl(): String? =
135
+ refreshToolbarStateFromEditorSelection()
136
+
137
+ internal fun NativeEditorExpoView.handleToolbarItemPressForTestingImpl(item: NativeToolbarItem) {
138
+ handleToolbarItemPress(item)
139
+ }
140
+
141
+ internal fun NativeEditorExpoView.insertMentionSuggestionForTestingImpl(
142
+ suggestion: NativeMentionSuggestion
143
+ ) {
144
+ insertMentionSuggestion(suggestion)
145
+ }
146
+
147
+ internal fun NativeEditorExpoView.wakePendingPreflightWorkForTestingImpl() {
148
+ wakePendingPreflightWork()
149
+ }
150
+
151
+ internal fun NativeEditorExpoView.emitEditorReadyForTestingImpl(
152
+ editorUpdateRevision: Long? = null
153
+ ): Boolean = emitEditorReady(editorUpdateRevision)
154
+
155
+ internal fun NativeEditorExpoView.pendingEditorUpdateJsonForTestingImpl(): String? =
156
+ pendingEditorUpdateJson
157
+
158
+ internal fun NativeEditorExpoView.pendingEditorUpdateRevisionForTestingImpl(): Long =
159
+ pendingEditorUpdateRevision
160
+
161
+ internal fun NativeEditorExpoView.pendingEditorResetUpdateJsonForTestingImpl(): String? =
162
+ pendingEditorResetUpdateJson
163
+
164
+ internal fun NativeEditorExpoView.pendingEditorResetUpdateRevisionForTestingImpl(): Long =
165
+ pendingEditorResetUpdateRevision
166
+
167
+ internal fun NativeEditorExpoView.setAppliedEditorUpdateRevisionForTestingImpl(
168
+ editorUpdateRevision: Long
169
+ ) {
170
+ appliedEditorUpdateRevision = editorUpdateRevision
171
+ }
172
+
173
+ internal fun NativeEditorExpoView.pendingEditorUpdateEditorIdForTestingImpl(): Long? =
174
+ pendingEditorUpdateEditorId
175
+
176
+ internal fun NativeEditorExpoView.pendingEditorResetUpdateEditorIdForTestingImpl(): Long? =
177
+ pendingEditorResetUpdateEditorId
178
+
179
+ internal fun NativeEditorExpoView.pendingViewCommandUpdateJsonForTestingImpl(): String? =
180
+ pendingViewCommandUpdateJson
181
+
182
+ internal fun NativeEditorExpoView.pendingViewCommandUpdateRetryAttemptsForTestingImpl(): Int =
183
+ pendingViewCommandUpdateRetryAttempts
184
+
185
+ internal fun NativeEditorExpoView.scheduleViewCommandUpdateRetryForTestingImpl(updateJson: String) {
186
+ scheduleViewCommandUpdateRetry(updateJson)
187
+ }
188
+
189
+ internal fun NativeEditorExpoView.pendingThemeJsonForTestingImpl(): String? =
190
+ pendingThemeJson.takeIf {
191
+ hasPendingTheme
192
+ }
193
+
194
+ internal fun NativeEditorExpoView.pendingAtomsJsonForTestingImpl(): String? =
195
+ pendingAtomsJson.takeIf {
196
+ hasPendingAtoms
197
+ }
198
+
199
+ internal fun NativeEditorExpoView.lastAtomsJsonForTestingImpl(): String? = lastAtomsJson
200
+
201
+ internal fun NativeEditorExpoView.lastThemeJsonForTestingImpl(): String? = lastThemeJson
202
+
203
+ internal fun NativeEditorExpoView.pendingThemeRetryAttemptsForTestingImpl(): Int =
204
+ pendingThemeRetry.attempts
205
+
206
+ internal fun NativeEditorExpoView.applyPendingThemeForTestingImpl() {
207
+ applyPendingThemeIfNeeded()
208
+ }
@@ -0,0 +1,146 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.os.Looper
4
+ import com.apollohg.editor.NativeEditorExpoView.EditorErrorBinding
5
+ import com.apollohg.editor.NativeEditorExpoView.PendingEditorErrorEvent
6
+
7
+ internal fun NativeEditorExpoView.bindEditorErrorCallbackIfLive(viewToken: Long) {
8
+ if (!isAttachedToNativeWindow || richTextView.editorId != viewToken ||
9
+ richTextView.editorEditText.editorId != viewToken
10
+ ) {
11
+ return
12
+ }
13
+ val adapter = EditorV2Registry.adapterForViewToken(viewToken) ?: return
14
+ val editorId = publicHandleForViewToken(viewToken) ?: return
15
+ val existing = editorErrorBinding
16
+ if (existing?.adapter === adapter && existing.viewToken == viewToken &&
17
+ existing.editorId == editorId
18
+ ) {
19
+ return
20
+ }
21
+ clearEditorErrorBinding("claim")
22
+ val binding = EditorErrorBinding(
23
+ adapter = adapter,
24
+ editorId = editorId,
25
+ viewToken = viewToken,
26
+ callbackToken = nextNativeEditorErrorCallbackToken.incrementAndGet(),
27
+ generation = ++nextEditorErrorBindingGeneration
28
+ )
29
+ editorErrorBinding = binding
30
+ adapter.bindAutonomousErrorOwner(
31
+ binding.callbackToken,
32
+ callback = { error -> queueEditorError(binding, error) },
33
+ onReleased = { releaseEditorErrorBinding(binding) }
34
+ )
35
+ }
36
+
37
+ internal fun NativeEditorExpoView.releaseEditorErrorBinding(binding: EditorErrorBinding) {
38
+ if (Looper.myLooper() != Looper.getMainLooper()) {
39
+ mainHandler.post { releaseEditorErrorBinding(binding) }
40
+ return
41
+ }
42
+ if (editorErrorBinding != binding) return
43
+ editorErrorBinding = null
44
+ nextEditorErrorBindingGeneration += 1
45
+ clearPendingEditorErrorDispatchQueue("ownerReleased")
46
+ }
47
+
48
+ internal fun NativeEditorExpoView.clearEditorErrorBinding(reason: String) {
49
+ val binding = editorErrorBinding
50
+ editorErrorBinding = null
51
+ nextEditorErrorBindingGeneration += 1
52
+ binding?.adapter?.clearAutonomousErrorOwner(binding.callbackToken)
53
+ clearPendingEditorErrorDispatchQueue(reason)
54
+ }
55
+
56
+ internal fun NativeEditorExpoView.queueEditorError(
57
+ binding: EditorErrorBinding,
58
+ error: EditorV2Error
59
+ ) {
60
+ val event = PendingEditorErrorEvent(
61
+ adapter = binding.adapter,
62
+ editorId = binding.editorId,
63
+ viewToken = binding.viewToken,
64
+ callbackToken = binding.callbackToken,
65
+ bindingGeneration = binding.generation,
66
+ error = error
67
+ )
68
+ if (Looper.myLooper() == Looper.getMainLooper()) {
69
+ enqueueEditorError(event)
70
+ } else {
71
+ mainHandler.post { enqueueEditorError(event) }
72
+ }
73
+ }
74
+
75
+ internal fun NativeEditorExpoView.enqueueEditorError(event: PendingEditorErrorEvent) {
76
+ if (!isLiveEditorErrorBinding(event)) return
77
+ pendingEditorErrorEvents.addLast(event)
78
+ if (!pendingEditorErrorDispatchScheduled) {
79
+ pendingEditorErrorDispatchScheduled = true
80
+ val generation = ++pendingEditorErrorDispatchGeneration
81
+ mainHandler.post {
82
+ if (generation != pendingEditorErrorDispatchGeneration) return@post
83
+ pendingEditorErrorDispatchScheduled = false
84
+ drainPendingEditorErrorEvents()
85
+ }
86
+ }
87
+ }
88
+
89
+ internal fun NativeEditorExpoView.drainPendingEditorErrorEvents() {
90
+ while (pendingEditorErrorEvents.isNotEmpty()) {
91
+ // Remove before dispatch so a reentrant lifecycle transition cannot deliver it twice.
92
+ val event = pendingEditorErrorEvents.removeFirst()
93
+ if (!isLiveEditorErrorBinding(event)) continue
94
+ val payload = mapOf<String, Any>(
95
+ "editorId" to event.editorId,
96
+ "error" to event.error.toJSMap()
97
+ )
98
+ dispatchEditorError(payload)
99
+ }
100
+ }
101
+
102
+ internal fun NativeEditorExpoView.dispatchEditorError(payload: Map<String, Any>) {
103
+ onEditorErrorForTesting?.let { callback ->
104
+ callback(payload)
105
+ return
106
+ }
107
+ if (!appContext.hasActiveReactInstance) return
108
+ onEditorError(payload)
109
+ }
110
+
111
+ internal fun NativeEditorExpoView.isLiveEditorErrorBinding(
112
+ event: PendingEditorErrorEvent
113
+ ): Boolean {
114
+ val binding = editorErrorBinding ?: return false
115
+ return isAttachedToNativeWindow &&
116
+ !NativeEditorViewRegistry.isDestroyed(event.viewToken) &&
117
+ binding.adapter === event.adapter &&
118
+ binding.editorId == event.editorId &&
119
+ binding.viewToken == event.viewToken &&
120
+ binding.callbackToken == event.callbackToken &&
121
+ binding.generation == event.bindingGeneration &&
122
+ richTextView.editorId == event.viewToken &&
123
+ richTextView.editorEditText.editorId == event.viewToken &&
124
+ publicHandleForViewToken(event.viewToken) == event.editorId &&
125
+ EditorV2Registry.adapterForViewToken(event.viewToken) === event.adapter &&
126
+ event.adapter.ownsAutonomousErrorOwner(event.callbackToken)
127
+ }
128
+
129
+ internal fun NativeEditorExpoView.clearPendingEditorErrorDispatchQueue(reason: String) {
130
+ val clearedCount = pendingEditorErrorEvents.size
131
+ pendingEditorErrorEvents.clear()
132
+ pendingEditorErrorDispatchScheduled = false
133
+ pendingEditorErrorDispatchGeneration += 1
134
+ if (clearedCount > 0) {
135
+ richTextView.editorEditText.recordImeTraceForTesting(
136
+ "nativeViewEditorErrorQueueCleared",
137
+ "reason=$reason count=$clearedCount"
138
+ )
139
+ }
140
+ }
141
+
142
+ internal fun NativeEditorExpoView.pendingEditorErrorEventCountForTestingImpl(): Int =
143
+ pendingEditorErrorEvents.size
144
+
145
+ internal fun NativeEditorExpoView.editorErrorCallbackTokenForTestingImpl(): Long? =
146
+ editorErrorBinding?.callbackToken
@@ -0,0 +1,150 @@
1
+ package com.apollohg.editor
2
+
3
+ import com.apollohg.editor.NativeEditorExpoView.Companion.EDITOR_UPDATE_EVENT_DEBOUNCE_MS
4
+ import com.apollohg.editor.NativeEditorExpoView.Companion.nanosToMicros
5
+ import com.apollohg.editor.NativeEditorExpoView.NativeCommitKey
6
+ import com.apollohg.editor.NativeEditorExpoView.PendingEditorUpdateEvent
7
+ import com.apollohg.editor.NativeEditorExpoView.PreflightUpdateEvent
8
+ import org.json.JSONObject
9
+
10
+ internal fun NativeEditorExpoView.documentVersionFromUpdateJSON(updateJSON: String?): String? =
11
+ try {
12
+ if (updateJSON == null) {
13
+ null
14
+ } else {
15
+ canonicalV2U64(JSONObject(updateJSON).opt("documentVersion") as? String)
16
+ }
17
+ } catch (_: Throwable) {
18
+ null
19
+ }
20
+
21
+ internal fun NativeEditorExpoView.noteDocumentVersionFromUpdateJSON(updateJSON: String?) {
22
+ documentVersionFromUpdateJSON(updateJSON)?.let { version ->
23
+ lastDocumentVersion = version
24
+ }
25
+ }
26
+
27
+ internal fun NativeEditorExpoView.isSupersededEditorUpdate(updateJson: String): Boolean {
28
+ val rendered = renderedDocumentRevision?.toULongOrNull() ?: return false
29
+ val incoming = documentVersionFromUpdateJSON(updateJson)?.toULongOrNull() ?: return false
30
+ return incoming < rendered
31
+ }
32
+
33
+ internal fun NativeEditorExpoView.preflightUpdateEventFromJSON(
34
+ updateJSON: String?
35
+ ): PreflightUpdateEvent? {
36
+ val update = updateJSON ?: return null
37
+ val documentRevision = documentVersionFromUpdateJSON(update) ?: return null
38
+ return PreflightUpdateEvent(updateJSON = update, documentRevision = documentRevision)
39
+ }
40
+
41
+ internal fun NativeEditorExpoView.addPreflightUpdateToEvent(
42
+ event: MutableMap<String, Any>,
43
+ preflightUpdate: PreflightUpdateEvent?
44
+ ) {
45
+ preflightUpdate ?: return
46
+ event["updateJson"] = preflightUpdate.updateJSON
47
+ event["documentRevision"] = preflightUpdate.documentRevision
48
+ }
49
+
50
+ internal fun NativeEditorExpoView.emitAddonEvent(payload: Map<String, Any>) {
51
+ onAddonEventForTesting?.invoke(payload) ?: onAddonEvent(payload)
52
+ }
53
+
54
+ internal fun NativeEditorExpoView.pendingEditorUpdateEventCountForTestingImpl(): Int =
55
+ pendingEditorUpdateEvents.size
56
+
57
+ internal fun NativeEditorExpoView.schedulePendingEditorUpdateDispatch() {
58
+ pendingEditorUpdateDispatchScheduled = true
59
+ val generation = ++pendingEditorUpdateDispatchGeneration
60
+ mainHandler.postDelayed({
61
+ if (generation != pendingEditorUpdateDispatchGeneration) return@postDelayed
62
+ pendingEditorUpdateDispatchScheduled = false
63
+ drainPendingEditorUpdateEvents()
64
+ }, EDITOR_UPDATE_EVENT_DEBOUNCE_MS)
65
+ }
66
+
67
+ internal fun NativeEditorExpoView.drainPendingEditorUpdateEvents() {
68
+ if (pendingEditorUpdateEvents.isEmpty()) return
69
+ val startedAt = System.nanoTime()
70
+ var drainedCount = 0
71
+ while (pendingEditorUpdateEvents.isNotEmpty()) {
72
+ val event = pendingEditorUpdateEvents.removeFirst()
73
+ pendingEditorUpdateKeys.remove(NativeCommitKey(event.editorId, event.documentRevision))
74
+ if (event.editorId != eventEditorId(richTextView.editorId)) {
75
+ richTextView.editorEditText.recordImeTraceForTesting(
76
+ "nativeViewEditorUpdateSkipped",
77
+ "reason=staleEditor queuedEditor=${event.editorId} currentEditor=${eventEditorId(
78
+ richTextView.editorId
79
+ )}"
80
+ )
81
+ continue
82
+ }
83
+ val isCurrentRevision = event.documentRevision == renderedDocumentRevision
84
+ dispatchEditorUpdate(event, emitToJS = true, applyViewState = isCurrentRevision)
85
+ drainedCount += 1
86
+ }
87
+ richTextView.editorEditText.recordImeTraceForTesting(
88
+ "nativeViewEditorUpdateDrained",
89
+ "count=$drainedCount totalUs=${nanosToMicros(System.nanoTime() - startedAt)}"
90
+ )
91
+ }
92
+
93
+ internal fun NativeEditorExpoView.dispatchEditorUpdate(
94
+ event: PendingEditorUpdateEvent,
95
+ emitToJS: Boolean,
96
+ applyViewState: Boolean = true
97
+ ) {
98
+ val updateJSON = event.viewUpdateJSON
99
+ val startedAt = System.nanoTime()
100
+ if (applyViewState) noteDocumentVersionFromUpdateJSON(updateJSON)
101
+ val noteNanos = System.nanoTime() - startedAt
102
+ val toolbarStartedAt = System.nanoTime()
103
+ if (applyViewState) {
104
+ NativeToolbarState.fromUpdateJson(updateJSON)?.let { state ->
105
+ toolbarState = state
106
+ keyboardToolbarView.applyState(state)
107
+ }
108
+ }
109
+ val toolbarNanos = System.nanoTime() - toolbarStartedAt
110
+ val mentionStartedAt = System.nanoTime()
111
+ if (applyViewState) refreshMentionQuery()
112
+ val mentionNanos = System.nanoTime() - mentionStartedAt
113
+ val retryStartedAt = System.nanoTime()
114
+ if (applyViewState) {
115
+ clearPendingNativeActionRetryIfScopeChanged()
116
+ schedulePendingPreflightWake()
117
+ richTextView.refreshRemoteSelections()
118
+ }
119
+ val retryNanos = System.nanoTime() - retryStartedAt
120
+ if (applyViewState && heightBehavior == EditorHeightBehavior.AUTO_GROW) {
121
+ post {
122
+ requestLayout()
123
+ emitContentHeightIfNeeded(force = false)
124
+ }
125
+ }
126
+ val emitStartedAt = System.nanoTime()
127
+ if (emitToJS) {
128
+ val payload = mapOf<String, Any>(
129
+ "updateJson" to event.atomicUpdateJSON,
130
+ "editorId" to event.editorId,
131
+ "documentRevision" to event.documentRevision
132
+ )
133
+ onEditorUpdateForTesting?.invoke(payload) ?: onEditorUpdate(payload)
134
+ }
135
+ val totalNanos = System.nanoTime() - startedAt
136
+ richTextView.editorEditText.recordImeTraceForTesting(
137
+ "nativeViewEditorUpdateDispatch",
138
+ "emitToJS=$emitToJS jsonLength=${updateJSON.length} noteUs=${nanosToMicros(
139
+ noteNanos
140
+ )} toolbarUs=${nanosToMicros(
141
+ toolbarNanos
142
+ )} mentionUs=${nanosToMicros(
143
+ mentionNanos
144
+ )} retryUs=${nanosToMicros(
145
+ retryNanos
146
+ )} emitUs=${nanosToMicros(
147
+ System.nanoTime() - emitStartedAt
148
+ )} totalUs=${nanosToMicros(totalNanos)}"
149
+ )
150
+ }