Changelog
All notable changes to @phucprime/react-native-image-editor are documented here.
The format follows Keep a Changelog and the project adheres to Semantic Versioning.
1.0.4 — 2026-09-24
Added
- Yarn Workspaces monorepo: Declared
"workspaces": ["Example"]in the rootpackage.jsonand setnmHoistingLimits: workspacesin.yarnrc.yml. Runningyarn installfrom the repo root now installs everything for both the library and the Example app, and creates the@phucprime/react-native-image-editorsymlink that Metro and CocoaPods auto-linking require. - Documentation site (
docs/): Full Docusaurus 3.10.2 site deployed to GitHub Pages athttps://nguyenhoangphucvnm.github.io/react-native-image-editor/. Covers Getting Started, iOS/Android installation, API reference, four usage guides, Architecture, Troubleshooting, and Changelog. - GitHub Actions — docs deploy (
.github/workflows/deploy-docs.yml): Builds Docusaurus on everymasterpush touchingdocs/**and deploys compiled output to thegh-pagesbranch. - GitHub Actions — release publish (
.github/workflows/release.yml): Fixed malformed workflow file (was a baresteps:block with noname/on/jobswrapper). Triggers on GitHub Release creation, publishes to GitHub Packages viaNODE_AUTH_TOKEN.
Changed
TurboModule / New Architecture — JS
src/NativeRNPhotoEditor.ts: ReplacedObject(rejected by strict codegen validator in RN 0.74+) withtype UnsafeObject = {}. This is the exact form the RN codegen AST parser maps toNSDictionary *(iOS) /ReadableMap(Android).Record<string, any>was also tried and rejected withUnsupportedGenericParserError: Unrecognised generic type 'Record'.src/NativeRNPhotoEditor.ts: Migrated from twoCallbackparameters to a singlePromise<string>return. Method renamed fromEdit→edit(camelCase, codegen convention).Callbackobjects stored acrossonActivityResult/ delegate boundaries become dangling if the JS context reloads;Promiseis the correct single-shot async contract.src/index.ts: All native calls route through a singlecallNative()helper. Public API (ImageEditor.open(),ImageEditor.edit()) is unchanged.
TurboModule / New Architecture — Android
RNPhotoEditorPackage.java: Migrated fromReactPackage→TurboReactPackagewithgetModule()+getReactModuleInfoProvider(). WithoutTurboReactPackage,TurboModuleRegistry.getEnforcing('RNPhotoEditor')throws "No TurboModule found" on New Architecture becauseReactPackage.createNativeModules()is never consulted by the TurboModule registry.RNPhotoEditorModule.java: Replaced twoCallbackparameters withPromise. Addedpublic static final String NAME. Addedvolatile+synchronizedguards onmPendingPromisefor cross-thread safety (JS thread writes, UI thread reads inonActivityResult). AddedALREADY_OPENguard. Added null checks forActivity,Intent,imagePath. WrappedColor.parseColor()in try/catch.newarch/RNPhotoEditorSpec.java+oldarch/RNPhotoEditorSpec.java: Updated abstract method toedit(ReadableMap, Promise)on both paths soRNPhotoEditorModule.javacompiles identically regardless of architecture.android/build.gradle:implementation 'com.facebook.react:react-native:+'→compileOnly 'com.facebook.react:react-android'. The open+range can cause version skew between codegen output and the runtime;compileOnlyavoids bundling a second copy of React Native.
TurboModule / New Architecture — iOS
ios/RNImageEditor.podspec: Added.swifttosource_files(previously**/*.{h,m,mm}—RNPhotoEditor.swiftwas silently never compiled for pod consumers). AddedCLANG_CXX_LANGUAGE_STANDARD = c++17+OTHER_CPLUSPLUSFLAGStopod_target_xcconfig. Addedinstall_modules_dependenciesguard.ios/RNPhotoEditor.mm: ChangedRCT_EXTERN_METHODselector fromEdit:onDone:onCancel:(RCTResponseSenderBlock) toedit:resolve:reject:(RCTPromiseResolveBlock/RCTPromiseRejectBlock), matching the codegen-generated protocol.ios/RNPhotoEditor.swift: ReplacedRCTResponseSenderBlockfields with Promise blocks. Replaced deprecatedUIApplication.shared.delegate?.window(returnsnilin scene-based apps since iOS 13) with atopPresentingViewController()helper that walksconnectedScenesfor the foreground-activeUIWindowScene. AddedclearPending()andALREADY_OPENguard.
Fixed
Example/yarn installfailing withWorkspace not found (@phucprime/react-native-image-editor@workspace:*):Example/yarn.lock,Example/.yarn/cache, andExample/.yarnrc.ymlcaused Yarn to treatExample/as a standalone project. All three removed; root workspace config now governs everything.pod installfailing withUnsupportedGenericParserError: Unrecognised generic type 'Record': Fixed by changingtype UnsafeObject = Record<string, any>totype UnsafeObject = {}insrc/NativeRNPhotoEditor.ts.
1.0.3 — 2026-09-17
Fixed
iOS
- Removed duplicate
RNPhotoEditor.mfile. The podspec glob*.{h,m,mm,swift}was picking up both.mand.mmwith identical content. Xcode compiled the.mas plain Objective-C (-x objective-c), which cannot include C++ standard-library headers (<utility>,<vector>,<chrono>) pulled in transitively by TurboModule/JSI headers. Keeping only the.mm(Objective-C++) resolvesScanDependenciesbuild errors under New Architecture. - Moved
CLANG_CXX_LANGUAGE_STANDARD = c++17andOTHER_CPLUSPLUSFLAGSout of theRCT_NEW_ARCH_ENABLEDconditional in the podspec so they always apply regardless of RN version —install_modules_dependencies(used with RN ≥ 0.71) bypasses that branch. - Added a
post_installper-target override in the ExamplePodfileto enforce C++17 on thereact-native-image-editorpod as a belt-and-suspenders fix.
Android
- Patched
photo-editor-android.jarbytecode —PhotoEditorSDKwas compiled againstcom.ahmedadeltito.photoeditorsdk.R$layout/R$id, but the JAR was distributed without a bundledRclass (it should have been an AAR). The constant pool was rewritten to referenceui.photoeditor.R$layout/R$id(the library's actual namespace), eliminating theNoClassDefFoundError: com/ahmedadeltito/photoeditorsdk/R$layoutcrash on sticker/text tap. - Added missing layout resources
photo_editor_sdk_image_item_list.xmlandphoto_editor_sdk_text_item_list.xmlwith the exact view IDs (photo_editor_sdk_image_iv,photo_editor_sdk_text_tv) thatPhotoEditorSDK.addImage()andPhotoEditorSDK.addText()inflate at runtime.
1.0.2 — 2026-02-27
Added
- New Architecture Support: Added full TurboModule and Codegen support (
RNPhotoEditorSpec) for iOS and Android. - Dual-Arch Android Source Sets: Configured
src/newarchandsrc/oldarchspecs inandroid/build.gradle. - TypeScript Codegen Spec: Added
src/NativeRNPhotoEditor.tsfor type-safe native module integration viaTurboModuleRegistry.
Changed
- Peer Dependencies: Raised minimum supported versions to
react-native >= 0.73.0andreact >= 18.2.0. - Module Resolution: Updated
src/index.tsto export the module usingTurboModuleRegistry.getEnforcing(). - Publish Workflow: Updated release script in
package.jsonto executenpm run preparebefore publishing.
Fixed
- Android: Cleaned up deprecated
createJSModules()inRNPhotoEditorPackage.javaand removed duplicate layout transform code inSlidingUpPanelLayout.java. - Sponsorship: Updated funding configurations in
.github/FUNDING.yml.
1.0.1 — 2026-02-27
Added
- React Native 0.78.2 Support: Upgraded Metro and Babel presets (
module:@react-native/babel-preset) across the project. - New Architecture by Default: Set
newArchEnabled=truein Example appgradle.properties.
Changed
- Android SDK & Tooling: Upgraded
compileSdkVersionandtargetSdkVersionto 35, raisedminSdkVersionto 24, updated NDK version to27.1.12297006, and AGP to8.2.1. - iOS Build Settings: Upgraded C++ Language Standard to
c++20. - Release Script: Enhanced npm release script to support token authentication and custom registry settings.
Removed
- Flipper Integration: Removed legacy
ReactNativeFlipper.javadebug/release files from the Android Example app.
Contributors
- First contribution by @nguyenhoangphucvnm in #2.
1.0.0 — 2026-02-26
Added
- Initial Release: Launched
@phucprime/react-native-image-editor. - Native Modules: iOS (
RNPhotoEditor.m/ Objective-C & Swift bridging) and Android (RNPhotoEditorModule.java) native photo editing implementations. - Editing Capabilities: Image cropping (UCrop / iOSPhotoEditor), freehand drawing, text overlays, sticker picker, interactive object scaling/rotation/deletion.
- Configurability:
hiddenControls,stickers,colors,languagesprops. - Callbacks:
onDoneandonCancel. - Promise API:
ImageEditor.edit()returningPromise<string>. - TypeScript Types:
ImageEditorConfig,ImageEditorLanguage,EditorControlwith full JSDoc. - Build System:
react-native-builder-boboutputting CJS, ESM, and.d.ts.
Deprecated
PhotoEditorclass → useImageEditor.PhotoEditor.Edit()→ useImageEditor.open()orImageEditor.edit().PhotoEditorPropstype → useImageEditorConfig.Languagetype → useImageEditorLanguage.