UNPKG

@react-native-clipboard/clipboard

Version:

React Native Clipboard API for macOS, iOS, Android, and Windows

202 lines (189 loc) 6.19 kB
import { // @ts-ignore - remove this comment when RN in the repo & example app is upgraded TurboModuleRegistry, // @ts-ignore - remove this comment when RN in the repo & example app is upgraded type TurboModule, type EmitterSubscription, NativeEventEmitter, } from "react-native"; // @ts-ignore - remove this comment when RN in the repo & example app is upgraded import type { Int32 } from "react-native/Libraries/Types/CodegenTypes"; export interface Spec extends TurboModule { /** * Get content of string type, this method returns a `Promise`, so you can use following code to get clipboard content * ```javascript * async _getContent() { * var content = await Clipboard.getString(); * } * ``` */ getString(): Promise<string>; /** * (iOS Only) * Get contents of string array type, this method returns a `Promise`, so you can use following code to get clipboard content * ```javascript * async _getContent() { * var content = await Clipboard.getStrings(); * } * ``` */ getStrings(): Promise<string[]>; /** * Get clipboard image as PNG in base64, this method returns a `Promise`, so you can use following code to get clipboard content * ```javascript * async _getContent() { * var content = await Clipboard.getImagePNG(); * } * ``` */ getImagePNG(): Promise<string>; /** * Get clipboard image as JPG in base64, this method returns a `Promise`, so you can use following code to get clipboard content * ```javascript * async _getContent() { * var content = await Clipboard.getImageJPG(); * } * ``` */ getImageJPG(): Promise<string>; /** * (iOS Only) * Set content of base64 image type. You can use following code to set clipboard content * ```javascript * _setContent() { * Clipboard.setImage(...); * } * ``` * @param the content to be stored in the clipboard. */ setImage(content: string): Promise<void>; /** * (iOS and Android Only) * Get clipboard image in base64, this method returns a `Promise`, so you can use following code to get clipboard content * ```javascript * async _getContent() { * var content = await Clipboard.getImage(); * } * ``` */ getImage(): Promise<string>; /** * Set content of string type. You can use following code to set clipboard content * ```javascript * _setContent() { * Clipboard.setString('hello world'); * } * ``` * @param the content to be stored in the clipboard. */ setString(content: string): void; /** * Set content of string array type. You can use following code to set clipboard content * ```javascript * _setContent() { * Clipboard.setStrings(['hello world', 'second string']); * } * ``` * @param the content to be stored in the clipboard. */ setStrings(content: string[]): void; /** * Returns whether the clipboard has content or is empty. * This method returns a `Promise`, so you can use following code to get clipboard content * ```javascript * async _hasContent() { * var hasContent = await Clipboard.hasString(); * } * ``` */ hasString(): Promise<boolean>; /** * Returns whether the clipboard has an image or is empty. * This method returns a `Promise`, so you can use following code to check clipboard content * ```javascript * async _hasContent() { * var hasContent = await Clipboard.hasImage(); * } * ``` */ hasImage(): Promise<boolean>; /** * (iOS Only) * Returns whether the clipboard has a URL content. Can check * if there is a URL content in clipboard without triggering PasteBoard notification for iOS 14+ * This method returns a `Promise`, so you can use following code to check for url content in clipboard. * ```javascript * async _hasURL() { * var hasURL = await Clipboard.hasURL(); * } * ``` */ hasURL(): Promise<boolean>; /** * (iOS 14+ Only) * Returns whether the clipboard has a Number(UIPasteboardDetectionPatternNumber) content. Can check * if there is a Number content in clipboard without triggering PasteBoard notification for iOS 14+ * This method returns a `Promise`, so you can use following code to check for Number content in clipboard. * ```javascript * async _hasNumber() { * var hasNumber = await Clipboard.hasNumber(); * } * ``` */ hasNumber(): Promise<boolean>; /** * (iOS 14+ Only) * Returns whether the clipboard has a WebURL(UIPasteboardDetectionPatternProbableWebURL) content. Can check * if there is a WebURL content in clipboard without triggering PasteBoard notification for iOS 14+ * This method returns a `Promise`, so you can use following code to check for WebURL content in clipboard. * ```javascript * async _hasWebURL() { * var hasWebURL = await Clipboard.hasWebURL(); * } * ``` */ hasWebURL(): Promise<boolean>; setListener(): void; removeListener(): void; addListener(eventName: string): void; removeListeners(count: Int32): void; } const ClipboardTurboModule = TurboModuleRegistry.getEnforcing<Spec>("RNCClipboard"); export default ClipboardTurboModule; const EVENT_NAME = "RNCClipboard_TEXT_CHANGED"; const eventEmitter = new NativeEventEmitter(ClipboardTurboModule); let listenerCount = eventEmitter.listenerCount; // listenerCount is only available from RN 0.64 // Older versions only have `listeners` if (!listenerCount) { listenerCount = (eventType: string) => { // @ts-ignore return eventEmitter.listeners(eventType).length; }; } else { listenerCount = eventEmitter.listenerCount.bind(eventEmitter); } const addListener = (callback: () => void): EmitterSubscription => { if (listenerCount(EVENT_NAME) === 0) { ClipboardTurboModule.setListener(); } const res = eventEmitter.addListener(EVENT_NAME, callback); // Path the remove call to also remove the native listener // if we no longer have listeners // @ts-ignore res._remove = res.remove; res.remove = function () { // @ts-ignore this._remove(); if (listenerCount(EVENT_NAME) === 0) { ClipboardTurboModule.removeListener(); } }; return res; }; const removeAllListeners = () => { eventEmitter.removeAllListeners(EVENT_NAME); ClipboardTurboModule.removeListener(); }; export { addListener, removeAllListeners };