XuqmGroup-RNChatDemo/scripts/postinstall.js

106 行
3.6 KiB
JavaScript

#!/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<Uri> 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<ReadableArray> {',
'private static class ProcessDataTask {',
)
content = content.replace(
` private final WeakReference<Context> weakContext;
private final List<Uri> uris;
private final String copyTo;
private final Promise promise;
protected ProcessDataTask(ReactContext reactContext, List<Uri> 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')