forked from react-native-clipboard/clipboard
-
Notifications
You must be signed in to change notification settings - Fork 0
/
NativeClipboard.ts
73 lines (61 loc) · 1.97 KB
/
NativeClipboard.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
'use strict';
import {
NativeModules,
NativeEventEmitter,
EmitterSubscription,
TurboModuleRegistry,
} from 'react-native';
import type {TurboModule} from 'react-native';
export interface Spec extends TurboModule {
getConstants: () => {};
getString: () => Promise<string>;
getStrings: () => Promise<string[]>;
setString: (content: string) => void;
hasString: () => Promise<boolean>;
hasNumber: () => Promise<boolean>;
getImagePNG: () => Promise<string>;
getImageJPG: () => Promise<string>;
setImage: (content: string) => void;
getImage: () => Promise<string>;
setStrings: (content: string[]) => void;
hasImage: () => Promise<boolean>;
hasURL: () => Promise<boolean>;
hasWebURL: () => Promise<boolean>;
}
export default TurboModuleRegistry.get<Spec>('RNCClipboard') as Spec;
const EVENT_NAME = 'RNCClipboard_TEXT_CHANGED';
const eventEmitter = new NativeEventEmitter(NativeModules.RNCClipboard);
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) {
NativeModules.RNCClipboard.setListener();
}
let 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) {
NativeModules.RNCClipboard.removeListener();
}
};
return res;
};
const removeAllListeners = () => {
eventEmitter.removeAllListeners(EVENT_NAME);
NativeModules.RNCClipboard.removeListener();
};
export {addListener, removeAllListeners};