#!/usr/bin/env node 'use strict' const fs = require('fs') const path = require('path') const pickerFile = path.join( __dirname, '..', 'node_modules', 'react-native-document-picker', 'android', 'src', 'main', 'java', 'com', 'reactnativedocumentpicker', 'RNDocumentPickerModule.java', ) if (!fs.existsSync(pickerFile)) { console.log('[postinstall] react-native-document-picker not found, skipping patch') process.exit(0) } let content = fs.readFileSync(pickerFile, 'utf8') if (!content.includes('GuardedResultAsyncTask')) { console.log('[postinstall] react-native-document-picker already patched') process.exit(0) } content = content.replace( 'import com.facebook.react.bridge.GuardedResultAsyncTask;', 'import java.util.concurrent.Executors;', ) content = content.replace( ' new ProcessDataTask(getReactApplicationContext(), uris, copyTo, promise).execute();', ` final ReactApplicationContext ctx = getReactApplicationContext(); final List finalUris = uris; final String finalCopyTo = copyTo; Executors.newSingleThreadExecutor().execute(() -> { WritableArray results = Arguments.createArray(); for (Uri u : finalUris) { results.pushMap(ProcessDataTask.getMetadataStatic(u, ctx.getApplicationContext(), finalCopyTo)); } promise.resolve(results); });`, ) content = content.replace( 'private static class ProcessDataTask extends GuardedResultAsyncTask {', 'private static class ProcessDataTask {', ) content = content.replace( ` private final WeakReference weakContext; private final List uris; private final String copyTo; private final Promise promise; protected ProcessDataTask(ReactContext reactContext, List uris, String copyTo, Promise promise) { super(reactContext.getExceptionHandler()); this.weakContext = new WeakReference<>(reactContext.getApplicationContext()); this.uris = uris; this.copyTo = copyTo; this.promise = promise; } @Override protected ReadableArray doInBackgroundGuarded() { WritableArray results = Arguments.createArray(); for (Uri uri : uris) { results.pushMap(getMetadata(uri)); } return results; } @Override protected void onPostExecuteGuarded(ReadableArray readableArray) { promise.resolve(readableArray); } private WritableMap getMetadata(Uri uri) { Context context = weakContext.get(); if (context == null) { return Arguments.createMap(); }`, ` static WritableMap getMetadataStatic(Uri uri, Context context, String copyTo) { if (context == null) { return Arguments.createMap(); }`, ) content = content.replace( ' prepareFileUri(context, map, uri);', ' prepareFileUri(context, map, uri, copyTo);', ) content = content.replace( ' private void prepareFileUri(Context context, WritableMap map, Uri uri) {', ' private static void prepareFileUri(Context context, WritableMap map, Uri uri, String copyTo) {', ) content = content.replace( ' copyFileToLocalStorage(context, map, uri);', ' copyFileToLocalStorage(context, map, uri, copyTo);', ) content = content.replace( ' private void copyFileToLocalStorage(Context context, WritableMap map, Uri uri) {', ' private static void copyFileToLocalStorage(Context context, WritableMap map, Uri uri, String copyTo) {', ) content = content.replace( ' public File safeGetDestination(', ' public static File safeGetDestination(', ) fs.writeFileSync(pickerFile, content, 'utf8') console.log('[postinstall] react-native-document-picker patched successfully')