diff --git a/apps/mobile/app/hooks/use-actions.tsx b/apps/mobile/app/hooks/use-actions.tsx index 581842394..906d0e73c 100644 --- a/apps/mobile/app/hooks/use-actions.tsx +++ b/apps/mobile/app/hooks/use-actions.tsx @@ -1333,7 +1333,7 @@ export const useActions = ({ icon: "link", onPress: () => { const link = createInternalLink(item.type, item.id); - Clipboard.setString(link); + Clipboard.setHTML(`${item.title}`, link); ToastManager.show({ heading: strings.linkCopied(), message: link, diff --git a/apps/mobile/patches/@react-native-clipboard+clipboard+1.16.3.patch b/apps/mobile/patches/@react-native-clipboard+clipboard+1.16.3.patch new file mode 100644 index 000000000..5a50ddb2d --- /dev/null +++ b/apps/mobile/patches/@react-native-clipboard+clipboard+1.16.3.patch @@ -0,0 +1,230 @@ +diff --git a/node_modules/@react-native-clipboard/clipboard/android/.settings/org.eclipse.buildship.core.prefs b/node_modules/@react-native-clipboard/clipboard/android/.settings/org.eclipse.buildship.core.prefs +deleted file mode 100644 +index 1c6d50d..0000000 +--- a/node_modules/@react-native-clipboard/clipboard/android/.settings/org.eclipse.buildship.core.prefs ++++ /dev/null +@@ -1,13 +0,0 @@ +-arguments= +-auto.sync=false +-build.scans.enabled=false +-connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(7.4.2)) +-connection.project.dir=../example/android +-eclipse.preferences.version=1 +-gradle.user.home= +-java.home=/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home +-jvm.arguments= +-offline.mode=false +-override.workspace.settings=true +-show.console.view=true +-show.executions.view=true +diff --git a/node_modules/@react-native-clipboard/clipboard/android/gradle/.settings/org.eclipse.buildship.core.prefs b/node_modules/@react-native-clipboard/clipboard/android/gradle/.settings/org.eclipse.buildship.core.prefs +deleted file mode 100644 +index e889521..0000000 +--- a/node_modules/@react-native-clipboard/clipboard/android/gradle/.settings/org.eclipse.buildship.core.prefs ++++ /dev/null +@@ -1,2 +0,0 @@ +-connection.project.dir= +-eclipse.preferences.version=1 +diff --git a/node_modules/@react-native-clipboard/clipboard/android/src/main/java/com/reactnativecommunity/clipboard/ClipboardModule.java b/node_modules/@react-native-clipboard/clipboard/android/src/main/java/com/reactnativecommunity/clipboard/ClipboardModule.java +index b68b858..324b293 100644 +--- a/node_modules/@react-native-clipboard/clipboard/android/src/main/java/com/reactnativecommunity/clipboard/ClipboardModule.java ++++ b/node_modules/@react-native-clipboard/clipboard/android/src/main/java/com/reactnativecommunity/clipboard/ClipboardModule.java +@@ -202,6 +202,37 @@ public class ClipboardModule extends NativeClipboardModuleSpec { + } + } + ++ @ReactMethod ++ public void setHTML(String html, String text) { ++ try { ++ ClipData clipdata = ClipData.newHtmlText(null, text, html); ++ ClipboardManager clipboard = getClipboardService(); ++ clipboard.setPrimaryClip(clipdata); ++ } catch (Exception e) { ++ e.printStackTrace(); ++ } ++ } ++ ++ @ReactMethod ++ public void getHTML(Promise promise) { ++ try { ++ ClipboardManager clipboard = getClipboardService(); ++ ClipData clipData = clipboard.getPrimaryClip(); ++ ++ if (clipData == null ++ || clipboard.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_HTML) ++ || clipData.getItemCount() < 1) { ++ promise.resolve(""); ++ return; ++ } ++ ClipData.Item item = clipData.getItemAt(0); ++ promise.resolve(item.getHtmlText()); ++ ++ } catch (Exception e) { ++ promise.reject(e); ++ } ++ } ++ + @ReactMethod + public void setListener() { + try { +diff --git a/node_modules/@react-native-clipboard/clipboard/dist/Clipboard.d.ts b/node_modules/@react-native-clipboard/clipboard/dist/Clipboard.d.ts +index 6c85195..afe3a5d 100644 +--- a/node_modules/@react-native-clipboard/clipboard/dist/Clipboard.d.ts ++++ b/node_modules/@react-native-clipboard/clipboard/dist/Clipboard.d.ts +@@ -22,6 +22,9 @@ export declare const Clipboard: { + * ``` + */ + getStrings(): Promise; ++ ++ getHTML(): Promise; ++ setHTML(html: string, content: string): void; + /** + * Get clipboard image as PNG in base64, this method returns a `Promise`, so you can use following code to get clipboard content + * ```javascript +diff --git a/node_modules/@react-native-clipboard/clipboard/dist/Clipboard.js b/node_modules/@react-native-clipboard/clipboard/dist/Clipboard.js +index ccdf309..03e7a42 100644 +--- a/node_modules/@react-native-clipboard/clipboard/dist/Clipboard.js ++++ b/node_modules/@react-native-clipboard/clipboard/dist/Clipboard.js +@@ -30,6 +30,12 @@ const NativeClipboardModule_1 = __importStar(require("./NativeClipboardModule")) + * `Clipboard` gives you an interface for setting and getting content from Clipboard on both iOS and Android + */ + exports.Clipboard = { ++ getHTML() { ++ return NativeClipboardModule_1.default.getHTML(); ++ }, ++ setHTML(html, text) { ++ return NativeClipboardModule_1.default.setHTML(html, text); ++ }, + /** + * Get content of string type, this method returns a `Promise`, so you can use following code to get clipboard content + * ```javascript +diff --git a/node_modules/@react-native-clipboard/clipboard/dist/NativeClipboard.d.ts b/node_modules/@react-native-clipboard/clipboard/dist/NativeClipboard.d.ts +index 5440157..75f346c 100644 +--- a/node_modules/@react-native-clipboard/clipboard/dist/NativeClipboard.d.ts ++++ b/node_modules/@react-native-clipboard/clipboard/dist/NativeClipboard.d.ts +@@ -2,6 +2,8 @@ import type { EmitterSubscription } from 'react-native'; + import type { TurboModule } from 'react-native'; + export interface Spec extends TurboModule { + getConstants: () => {}; ++ setHTML(html: string, content: string): void; ++ getHTML(): Promise; + getString: () => Promise; + getStrings: () => Promise; + setString: (content: string) => void; +diff --git a/node_modules/@react-native-clipboard/clipboard/dist/NativeClipboardModule.d.ts b/node_modules/@react-native-clipboard/clipboard/dist/NativeClipboardModule.d.ts +index 0b2111e..b395af2 100644 +--- a/node_modules/@react-native-clipboard/clipboard/dist/NativeClipboardModule.d.ts ++++ b/node_modules/@react-native-clipboard/clipboard/dist/NativeClipboardModule.d.ts +@@ -20,6 +20,8 @@ export interface Spec extends TurboModule { + * ``` + */ + getStrings(): Promise; ++ setHTML(html: string, content: string): void; ++ getHTML(): Promise; + /** + * Get clipboard image as PNG in base64, this method returns a `Promise`, so you can use following code to get clipboard content + * ```javascript +diff --git a/node_modules/@react-native-clipboard/clipboard/ios/RNCClipboard.mm b/node_modules/@react-native-clipboard/clipboard/ios/RNCClipboard.mm +index 4e38fd2..5dea6a7 100644 +--- a/node_modules/@react-native-clipboard/clipboard/ios/RNCClipboard.mm ++++ b/node_modules/@react-native-clipboard/clipboard/ios/RNCClipboard.mm +@@ -87,6 +87,29 @@ - (void) listener:(NSNotification *) notification + resolve((clipboard.strings ? : @[])); + } + ++RCT_EXPORT_METHOD(setHTML:(nonnull NSString *)html ++ content:(nonnull NSString*)content ++) { ++ UIPasteboard *clipboard = [UIPasteboard generalPasteboard]; ++ NSDictionary *htmlDict = [NSDictionary dictionaryWithObjectsAndKeys:html, (NSString*)kUTTypeHTML, nil]; ++ NSDictionary *textDict = [NSDictionary dictionaryWithObjectsAndKeys:content, (NSString*)kUTTypePlainText, nil]; ++ clipboard.items = [NSArray arrayWithObjects:htmlDict, textDict, nil]; ++} ++ ++RCT_EXPORT_METHOD(getHTML:(RCTPromiseResolveBlock)resolve ++ reject:(__unused RCTPromiseRejectBlock)reject) ++{ ++ UIPasteboard *clipboard = [UIPasteboard generalPasteboard]; ++ id value = [clipboard valueForPasteboardType:(NSString*)kUTTypeHTML]; ++ NSString *html = nil; ++ if ([value isKindOfClass:[NSString class]]) { ++ html = (NSString *)value; ++ } else if ([value isKindOfClass:[NSData class]]) { ++ html = [[NSString alloc] initWithData:(NSData *)value encoding:NSUTF8StringEncoding]; ++ } ++ resolve((html ? : @"")); ++} ++ + RCT_EXPORT_METHOD(setImage:(NSString *)content + resolve:(RCTPromiseResolveBlock) resolve + reject:(RCTPromiseRejectBlock) reject +@@ -238,10 +261,11 @@ - (void) listener:(NSNotification *) notification + // Keep: Required for RN built in Event Emitter Calls. + } + +-RCT_EXPORT_METHOD(removeListeners : (double)count) { ++RCT_EXPORT_METHOD(removeListeners : (long)count) { + // Keep: Required for RN built in Event Emitter Calls. + } + ++ + #if RCT_NEW_ARCH_ENABLED + - (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params +diff --git a/node_modules/@react-native-clipboard/clipboard/src/Clipboard.ts b/node_modules/@react-native-clipboard/clipboard/src/Clipboard.ts +index d5e61fc..b010a22 100644 +--- a/node_modules/@react-native-clipboard/clipboard/src/Clipboard.ts ++++ b/node_modules/@react-native-clipboard/clipboard/src/Clipboard.ts +@@ -31,6 +31,18 @@ export const Clipboard = { + getStrings(): Promise { + return NativeClipboard.getStrings(); + }, ++ ++ /** ++ * Get content of HTML type, this method returns a `Promise`, so you can use following code to get clipboard content ++ * ```javascript ++ * async _getContent() { ++ * var content = await Clipboard.getHTML(); ++ * } ++ * ``` ++ */ ++ getHTML(): Promise { ++ return NativeClipboard.getHTML(); ++ }, + /** + * Get clipboard image as PNG in base64, this method returns a `Promise`, so you can use following code to get clipboard content + * ```javascript +@@ -106,6 +118,19 @@ export const Clipboard = { + setStrings(content: string[]) { + NativeClipboard.setStrings(content); + }, ++ /** ++ * Set content of HTML type. You can use following code to set clipboard content ++ * ```javascript ++ * _setContent() { ++ * Clipboard.setHTML('hello world', 'hello world'); ++ * } ++ * ``` ++ * @param {string} content the HTML to be stored in the clipboard. ++ * @param {string} text text to be used inplace of HTML be stored in the clipboard. ++ */ ++ setHTML(content: string, text: string) { ++ NativeClipboard.setHTML(content, text); ++ }, + /** + * Returns whether the clipboard has content or is empty. + * This method returns a `Promise`, so you can use following code to get clipboard content +diff --git a/node_modules/@react-native-clipboard/clipboard/src/NativeClipboardModule.ts b/node_modules/@react-native-clipboard/clipboard/src/NativeClipboardModule.ts +index 2373747..a094285 100644 +--- a/node_modules/@react-native-clipboard/clipboard/src/NativeClipboardModule.ts ++++ b/node_modules/@react-native-clipboard/clipboard/src/NativeClipboardModule.ts +@@ -78,6 +78,9 @@ export interface Spec extends TurboModule { + * @param the content to be stored in the clipboard. + */ + setString(content: string): void; ++ ++ setHTML(html: string, content: string): void; ++ getHTML(): Promise; + /** + * Set content of string array type. You can use following code to set clipboard content + * ```javascript diff --git a/packages/editor-mobile/src/index.tsx b/packages/editor-mobile/src/index.tsx index 1d706116d..b5b40d6d8 100644 --- a/packages/editor-mobile/src/index.tsx +++ b/packages/editor-mobile/src/index.tsx @@ -40,7 +40,7 @@ setTimeout(() => { globalThis.logger("info", ...arguments); }; } -}, 100); +}, 1000); let appLoaded = false; function loadApp() { if (appLoaded) return;