react-native-screenshot-aware 1.3.20 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +5 -2
- package/ScreenshotAware.podspec +3 -25
- package/android/build.gradle +18 -41
- package/android/src/main/AndroidManifest.xml +2 -1
- package/android/src/main/java/com/screenshotaware/ScreenshotAwareModule.kt +3 -9
- package/android/src/main/java/com/screenshotaware/ScreenshotAwarePackage.kt +12 -14
- package/app.plugin.js +1 -1
- package/ios/ScreenshotAware.h +2 -9
- package/ios/ScreenshotAware.mm +25 -32
- package/lib/module/NativeScreenshotAware.js +5 -0
- package/lib/module/NativeScreenshotAware.js.map +1 -0
- package/lib/module/index.js +6 -6
- package/lib/module/index.js.map +1 -1
- package/lib/module/package.json +1 -0
- package/lib/module/plugin/withReactNativeScreenshotAware.js +9 -6
- package/lib/module/plugin/withReactNativeScreenshotAware.js.map +1 -1
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/setupJest.d.ts +1 -0
- package/lib/typescript/setupJest.d.ts.map +1 -0
- package/lib/typescript/{codegenSpec → src}/NativeScreenshotAware.d.ts +1 -1
- package/lib/typescript/src/NativeScreenshotAware.d.ts.map +1 -0
- package/lib/typescript/{index.d.ts → src/index.d.ts} +1 -1
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/{plugin → src/plugin}/withReactNativeScreenshotAware.d.ts +1 -1
- package/lib/typescript/src/plugin/withReactNativeScreenshotAware.d.ts.map +1 -0
- package/package.json +81 -52
- package/src/NativeScreenshotAware.ts +9 -0
- package/src/index.tsx +7 -7
- package/src/plugin/withReactNativeScreenshotAware.ts +9 -8
- package/android/gradle.properties +0 -5
- package/android/src/newarch/ScreenshotAware.kt +0 -7
- package/android/src/oldarch/ScreenshotAware.kt +0 -11
- package/lib/commonjs/codegenSpec/NativeScreenshotAware.js +0 -9
- package/lib/commonjs/codegenSpec/NativeScreenshotAware.js.map +0 -1
- package/lib/commonjs/index.js +0 -85
- package/lib/commonjs/index.js.map +0 -1
- package/lib/commonjs/package.json +0 -1
- package/lib/commonjs/plugin/withReactNativeScreenshotAware.js +0 -48
- package/lib/commonjs/plugin/withReactNativeScreenshotAware.js.map +0 -1
- package/lib/module/codegenSpec/NativeScreenshotAware.js +0 -5
- package/lib/module/codegenSpec/NativeScreenshotAware.js.map +0 -1
- package/lib/typescript/codegenSpec/NativeScreenshotAware.d.ts.map +0 -1
- package/lib/typescript/index.d.ts.map +0 -1
- package/lib/typescript/plugin/withReactNativeScreenshotAware.d.ts.map +0 -1
- package/src/codegenSpec/NativeScreenshotAware.ts +0 -9
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c)
|
|
3
|
+
Copyright (c) 2026 Hugo Extrat
|
|
4
4
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
5
|
of this software and associated documentation files (the "Software"), to deal
|
|
6
6
|
in the Software without restriction, including without limitation the rights
|
package/README.md
CHANGED
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
Real-time screenshot detection for React Native apps
|
|
11
11
|
</h3>
|
|
12
12
|
|
|
13
|
+
> **v2 is here:** Version 2 supports **only the New Architecture**. Versions older than v2 are **no longer maintained**.
|
|
14
|
+
|
|
13
15
|
## Features
|
|
14
16
|
|
|
15
17
|
- 🚀 Real-time screenshot detection
|
|
@@ -17,11 +19,12 @@
|
|
|
17
19
|
- 🎣 Easy-to-use React hooks
|
|
18
20
|
- ⚡ Optimized for performance
|
|
19
21
|
- 📱 Supports Android 14+ (API level 34+) and iOS 14+
|
|
20
|
-
- 🏗️
|
|
21
|
-
|
|
22
|
+
- 🏗️ New Architecture only
|
|
22
23
|
|
|
23
24
|
## Compatibility
|
|
24
25
|
|
|
26
|
+
- **v2:** New Architecture only. No legacy architecture support.
|
|
27
|
+
- **v1.x and below:** **No longer maintained.**
|
|
25
28
|
- React Native <0.76, use version 1.2.2 or below 1.2.0 of this package (1.2.1 is buggy)
|
|
26
29
|
- React Native >=0.76, use version 1.3.0 or later
|
|
27
30
|
- React Native >=0.79, use version 1.3.10 or later
|
package/ScreenshotAware.podspec
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
require "json"
|
|
2
2
|
|
|
3
3
|
package = JSON.parse(File.read(File.join(__dir__, "package.json")))
|
|
4
|
-
folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
|
|
5
4
|
|
|
6
5
|
Pod::Spec.new do |s|
|
|
7
6
|
s.name = "ScreenshotAware"
|
|
@@ -14,29 +13,8 @@ Pod::Spec.new do |s|
|
|
|
14
13
|
s.platforms = { :ios => min_ios_version_supported }
|
|
15
14
|
s.source = { :git => "https://github.com/huextrat/react-native-screenshot-aware.git", :tag => "#{s.version}" }
|
|
16
15
|
|
|
17
|
-
s.source_files = "ios/**/*.{h,m,mm,cpp}"
|
|
18
|
-
s.private_header_files = "ios
|
|
16
|
+
s.source_files = "ios/**/*.{h,m,mm,swift,cpp}"
|
|
17
|
+
s.private_header_files = "ios/**/*.h"
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
# See https://github.com/facebook/react-native/blob/febf6b7f33fdb4904669f99d795eba4c0f95d7bf/scripts/cocoapods/new_architecture.rb#L79.
|
|
22
|
-
if respond_to?(:install_modules_dependencies, true)
|
|
23
|
-
install_modules_dependencies(s)
|
|
24
|
-
else
|
|
25
|
-
s.dependency "React-Core"
|
|
26
|
-
|
|
27
|
-
# Don't install the dependencies when we run `pod install` in the old architecture.
|
|
28
|
-
if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then
|
|
29
|
-
s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1"
|
|
30
|
-
s.pod_target_xcconfig = {
|
|
31
|
-
"HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"",
|
|
32
|
-
"OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1",
|
|
33
|
-
"CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
|
|
34
|
-
}
|
|
35
|
-
s.dependency "React-Codegen"
|
|
36
|
-
s.dependency "RCT-Folly"
|
|
37
|
-
s.dependency "RCTRequired"
|
|
38
|
-
s.dependency "RCTTypeSafety"
|
|
39
|
-
s.dependency "ReactCommon/turbomodule/core"
|
|
40
|
-
end
|
|
41
|
-
end
|
|
19
|
+
install_modules_dependencies(s)
|
|
42
20
|
end
|
package/android/build.gradle
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
buildscript {
|
|
2
|
-
ext.
|
|
3
|
-
|
|
2
|
+
ext.ScreenshotAware = [
|
|
3
|
+
kotlinVersion: "2.0.21",
|
|
4
|
+
minSdkVersion: 24,
|
|
5
|
+
compileSdkVersion: 36,
|
|
6
|
+
targetSdkVersion: 36
|
|
7
|
+
]
|
|
8
|
+
|
|
9
|
+
ext.getExtOrDefault = { prop ->
|
|
10
|
+
if (rootProject.ext.has(prop)) {
|
|
11
|
+
return rootProject.ext.get(prop)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return ScreenshotAware[prop]
|
|
4
15
|
}
|
|
5
16
|
|
|
6
17
|
repositories {
|
|
@@ -16,30 +27,19 @@ buildscript {
|
|
|
16
27
|
}
|
|
17
28
|
|
|
18
29
|
|
|
19
|
-
def isNewArchitectureEnabled() {
|
|
20
|
-
return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true"
|
|
21
|
-
}
|
|
22
|
-
|
|
23
30
|
apply plugin: "com.android.library"
|
|
24
31
|
apply plugin: "kotlin-android"
|
|
25
32
|
|
|
26
|
-
|
|
27
|
-
apply plugin: "com.facebook.react"
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
def getExtOrIntegerDefault(name) {
|
|
31
|
-
return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["ScreenshotAware_" + name]).toInteger()
|
|
32
|
-
}
|
|
33
|
+
apply plugin: "com.facebook.react"
|
|
33
34
|
|
|
34
35
|
android {
|
|
35
36
|
namespace "com.screenshotaware"
|
|
36
37
|
|
|
37
|
-
compileSdkVersion
|
|
38
|
+
compileSdkVersion getExtOrDefault("compileSdkVersion")
|
|
38
39
|
|
|
39
40
|
defaultConfig {
|
|
40
|
-
minSdkVersion
|
|
41
|
-
targetSdkVersion
|
|
42
|
-
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
|
|
41
|
+
minSdkVersion getExtOrDefault("minSdkVersion")
|
|
42
|
+
targetSdkVersion getExtOrDefault("targetSdkVersion")
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
buildFeatures {
|
|
@@ -52,7 +52,7 @@ android {
|
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
lint {
|
|
56
56
|
disable "GradleCompatible"
|
|
57
57
|
}
|
|
58
58
|
|
|
@@ -60,31 +60,8 @@ android {
|
|
|
60
60
|
sourceCompatibility JavaVersion.VERSION_1_8
|
|
61
61
|
targetCompatibility JavaVersion.VERSION_1_8
|
|
62
62
|
}
|
|
63
|
-
|
|
64
|
-
sourceSets {
|
|
65
|
-
main {
|
|
66
|
-
if (isNewArchitectureEnabled()) {
|
|
67
|
-
java.srcDirs += [
|
|
68
|
-
"src/newarch",
|
|
69
|
-
"generated/java",
|
|
70
|
-
"generated/jni"
|
|
71
|
-
]
|
|
72
|
-
} else {
|
|
73
|
-
java.srcDirs += ["src/oldarch"]
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
63
|
}
|
|
78
64
|
|
|
79
|
-
repositories {
|
|
80
|
-
mavenCentral()
|
|
81
|
-
google()
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
def kotlin_version = getExtOrDefault("kotlinVersion")
|
|
85
|
-
|
|
86
65
|
dependencies {
|
|
87
66
|
implementation "com.facebook.react:react-android"
|
|
88
|
-
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
|
89
|
-
implementation "com.google.android.play:review:2.0.1"
|
|
90
67
|
}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
1
|
+
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
|
2
|
+
</manifest>
|
|
@@ -5,18 +5,12 @@ import android.os.Build
|
|
|
5
5
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
6
|
import com.facebook.react.bridge.ReactMethod
|
|
7
7
|
import com.facebook.react.modules.core.DeviceEventManagerModule
|
|
8
|
-
import com.facebook.react.module.annotations.ReactModule
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
ScreenshotAwareSpec(reactContext) {
|
|
9
|
+
class ScreenshotAwareModule(reactContext: ReactApplicationContext) :
|
|
10
|
+
NativeScreenshotAwareSpec(reactContext) {
|
|
13
11
|
|
|
14
12
|
private var screenCaptureCallback: Any? = null
|
|
15
13
|
|
|
16
|
-
override fun getName(): String {
|
|
17
|
-
return NAME
|
|
18
|
-
}
|
|
19
|
-
|
|
20
14
|
override fun initialize() {
|
|
21
15
|
super.initialize()
|
|
22
16
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
|
@@ -63,7 +57,7 @@ class ScreenshotAwareModule internal constructor(reactContext: ReactApplicationC
|
|
|
63
57
|
}
|
|
64
58
|
|
|
65
59
|
companion object {
|
|
66
|
-
const val NAME =
|
|
60
|
+
const val NAME = NativeScreenshotAwareSpec.NAME
|
|
67
61
|
const val EVENT_NAME: String = "ScreenshotAwareEvent"
|
|
68
62
|
}
|
|
69
63
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
package com.screenshotaware
|
|
2
2
|
|
|
3
3
|
import com.facebook.react.BaseReactPackage
|
|
4
|
-
import com.facebook.react.bridge.ReactApplicationContext
|
|
5
4
|
import com.facebook.react.bridge.NativeModule
|
|
6
|
-
import com.facebook.react.
|
|
5
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
7
6
|
import com.facebook.react.module.model.ReactModuleInfo
|
|
7
|
+
import com.facebook.react.module.model.ReactModuleInfoProvider
|
|
8
8
|
import java.util.HashMap
|
|
9
9
|
|
|
10
10
|
class ScreenshotAwarePackage : BaseReactPackage() {
|
|
@@ -16,18 +16,16 @@ class ScreenshotAwarePackage : BaseReactPackage() {
|
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
override fun getReactModuleInfoProvider()
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
ScreenshotAwareModule.NAME,
|
|
24
|
-
|
|
25
|
-
false,
|
|
26
|
-
false,
|
|
27
|
-
|
|
28
|
-
true // isTurboModule
|
|
19
|
+
override fun getReactModuleInfoProvider() = ReactModuleInfoProvider {
|
|
20
|
+
mapOf(
|
|
21
|
+
ScreenshotAwareModule.NAME to ReactModuleInfo(
|
|
22
|
+
name = ScreenshotAwareModule.NAME,
|
|
23
|
+
className = ScreenshotAwareModule.NAME,
|
|
24
|
+
canOverrideExistingModule = false,
|
|
25
|
+
needsEagerInit = false,
|
|
26
|
+
isCxxModule = false,
|
|
27
|
+
isTurboModule = true
|
|
29
28
|
)
|
|
30
|
-
|
|
31
|
-
}
|
|
29
|
+
)
|
|
32
30
|
}
|
|
33
31
|
}
|
package/app.plugin.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
module.exports = require(
|
|
1
|
+
module.exports = require('./lib/module/plugin/withReactNativeScreenshotAware');
|
package/ios/ScreenshotAware.h
CHANGED
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
#import <React/RCTEventEmitter.h>
|
|
2
|
+
#import <ScreenshotAwareSpec/ScreenshotAwareSpec.h>
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
#import "ScreenshotAwareSpec/ScreenshotAwareSpec.h"
|
|
5
|
-
|
|
6
|
-
@interface ScreenshotAware : RCTEventEmitter <RCTBridgeModule>
|
|
7
|
-
#else
|
|
8
|
-
#import <React/RCTBridgeModule.h>
|
|
9
|
-
|
|
10
|
-
@interface ScreenshotAware : RCTEventEmitter <RCTBridgeModule>
|
|
11
|
-
#endif
|
|
4
|
+
@interface ScreenshotAware : RCTEventEmitter <NativeScreenshotAwareSpec>
|
|
12
5
|
|
|
13
6
|
@end
|
package/ios/ScreenshotAware.mm
CHANGED
|
@@ -5,53 +5,46 @@
|
|
|
5
5
|
@end
|
|
6
6
|
|
|
7
7
|
@implementation ScreenshotAware {
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
ScreenshotAwareImpl *moduleImpl;
|
|
9
|
+
BOOL hasListeners;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
RCT_EXPORT_MODULE()
|
|
13
|
-
|
|
14
12
|
- (instancetype)init {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
self = [super init];
|
|
14
|
+
if (self) {
|
|
15
|
+
moduleImpl = [ScreenshotAwareImpl new];
|
|
16
|
+
moduleImpl.delegate = self;
|
|
17
|
+
}
|
|
18
|
+
return self;
|
|
21
19
|
}
|
|
22
20
|
|
|
23
|
-
- (
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
|
|
22
|
+
(const facebook::react::ObjCTurboModule::InitParams &)params
|
|
23
|
+
{
|
|
24
|
+
return std::make_shared<facebook::react::NativeScreenshotAwareSpecJSI>(params);
|
|
27
25
|
}
|
|
28
26
|
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
+ (NSString *)moduleName
|
|
28
|
+
{
|
|
29
|
+
return @"ScreenshotAware";
|
|
31
30
|
}
|
|
32
31
|
|
|
33
|
-
- (void)
|
|
34
|
-
{
|
|
35
|
-
|
|
32
|
+
- (void)handleEventWithName:(NSString * _Nonnull)name {
|
|
33
|
+
if (hasListeners) {
|
|
34
|
+
[super sendEventWithName:name body:nil];
|
|
35
|
+
}
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
-(
|
|
39
|
-
|
|
40
|
-
hasListeners = NO;
|
|
38
|
+
- (NSArray<NSString *> *)supportedEvents {
|
|
39
|
+
return [ScreenshotAwareImpl supportedEvents];
|
|
41
40
|
}
|
|
42
41
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
return NO;
|
|
42
|
+
- (void)startObserving {
|
|
43
|
+
hasListeners = YES;
|
|
46
44
|
}
|
|
47
45
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
|
|
51
|
-
(const facebook::react::ObjCTurboModule::InitParams &)params
|
|
52
|
-
{
|
|
53
|
-
return std::make_shared<facebook::react::NativeScreenshotAwareSpecJSI>(params);
|
|
46
|
+
- (void)stopObserving {
|
|
47
|
+
hasListeners = NO;
|
|
54
48
|
}
|
|
55
|
-
#endif
|
|
56
49
|
|
|
57
50
|
@end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeScreenshotAware.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;AAOlD,eAAeA,mBAAmB,CAACC,YAAY,CAAO,iBAAiB,CAAC","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { useEffect } from
|
|
4
|
-
import { NativeEventEmitter } from
|
|
5
|
-
import NativeScreenshotAware from "./
|
|
3
|
+
import { useEffect } from 'react';
|
|
4
|
+
import { NativeEventEmitter } from 'react-native';
|
|
5
|
+
import NativeScreenshotAware from "./NativeScreenshotAware.js";
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* @fileoverview This module provides functionality to detect screenshot events in a React Native application.
|
|
@@ -31,7 +31,7 @@ const moduleEventEmitter = new NativeEventEmitter(NativeScreenshotAware);
|
|
|
31
31
|
*/
|
|
32
32
|
export const useScreenshotAware = callback => {
|
|
33
33
|
useEffect(() => {
|
|
34
|
-
const subscription = moduleEventEmitter.addListener(
|
|
34
|
+
const subscription = moduleEventEmitter.addListener('ScreenshotAwareEvent', callback);
|
|
35
35
|
return () => subscription.remove();
|
|
36
36
|
}, [callback]);
|
|
37
37
|
};
|
|
@@ -69,12 +69,12 @@ const ScreenshotAware = {
|
|
|
69
69
|
* @returns {import('react-native').EmitterSubscription} A subscription object that can be used to remove the listener.
|
|
70
70
|
*/
|
|
71
71
|
addListener: callback => {
|
|
72
|
-
return moduleEventEmitter.addListener(
|
|
72
|
+
return moduleEventEmitter.addListener('ScreenshotAwareEvent', callback);
|
|
73
73
|
},
|
|
74
74
|
/**
|
|
75
75
|
* Removes all listeners for screenshot events.
|
|
76
76
|
*/
|
|
77
|
-
removeAllListeners: () => moduleEventEmitter.removeAllListeners(
|
|
77
|
+
removeAllListeners: () => moduleEventEmitter.removeAllListeners('ScreenshotAwareEvent')
|
|
78
78
|
};
|
|
79
79
|
export default ScreenshotAware;
|
|
80
80
|
//# sourceMappingURL=index.js.map
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useEffect","NativeEventEmitter","NativeScreenshotAware","moduleEventEmitter","useScreenshotAware","callback","subscription","addListener","remove","ScreenshotAware","removeAllListeners"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,SAAS,QAAQ,OAAO;AACjC,SAASC,kBAAkB,QAAQ,cAAc;AACjD,OAAOC,qBAAqB,MAAM,
|
|
1
|
+
{"version":3,"names":["useEffect","NativeEventEmitter","NativeScreenshotAware","moduleEventEmitter","useScreenshotAware","callback","subscription","addListener","remove","ScreenshotAware","removeAllListeners"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,SAAS,QAAQ,OAAO;AACjC,SAASC,kBAAkB,QAAQ,cAAc;AACjD,OAAOC,qBAAqB,MAAM,4BAAyB;;AAE3D;AACA;AACA;AACA;;AAEA,MAAMC,kBAAkB,GAAG,IAAIF,kBAAkB,CAACC,qBAAqB,CAAC;;AAExE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAME,kBAAkB,GAAIC,QAAoB,IAAK;EAC1DL,SAAS,CAAC,MAAM;IACd,MAAMM,YAAY,GAAGH,kBAAkB,CAACI,WAAW,CACjD,sBAAsB,EACtBF,QACF,CAAC;IACD,OAAO,MAAMC,YAAY,CAACE,MAAM,CAAC,CAAC;EACpC,CAAC,EAAE,CAACH,QAAQ,CAAC,CAAC;AAChB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMI,eAAe,GAAG;EACtB;AACF;AACA;AACA;AACA;AACA;EACEF,WAAW,EAAGF,QAAoB,IAAK;IACrC,OAAOF,kBAAkB,CAACI,WAAW,CAAC,sBAAsB,EAAEF,QAAQ,CAAC;EACzE,CAAC;EAED;AACF;AACA;EACEK,kBAAkB,EAAEA,CAAA,KAClBP,kBAAkB,CAACO,kBAAkB,CAAC,sBAAsB;AAChE,CAAC;AAED,eAAeD,eAAe","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import configPlugins from '@expo/config-plugins';
|
|
4
|
+
const {
|
|
5
|
+
withAndroidManifest
|
|
6
|
+
} = configPlugins;
|
|
4
7
|
|
|
5
8
|
/**
|
|
6
9
|
* Modifies the `AndroidManifest.xml` file to add `DETECT_SCREEN_CAPTURE` permission,
|
|
@@ -12,18 +15,18 @@ import { withAndroidManifest } from "@expo/config-plugins";
|
|
|
12
15
|
const withCustomAndroidManifest = config => {
|
|
13
16
|
return withAndroidManifest(config, config => {
|
|
14
17
|
const androidManifest = config.modResults;
|
|
15
|
-
if (!androidManifest.manifest[
|
|
16
|
-
androidManifest.manifest[
|
|
18
|
+
if (!androidManifest.manifest['uses-permission']) {
|
|
19
|
+
androidManifest.manifest['uses-permission'] = [];
|
|
17
20
|
}
|
|
18
21
|
|
|
19
22
|
// Check if the permission already exists
|
|
20
|
-
const permissionExists = androidManifest.manifest[
|
|
23
|
+
const permissionExists = androidManifest.manifest['uses-permission'].some(permission => permission.$?.['android:name'] === 'android.permission.DETECT_SCREEN_CAPTURE');
|
|
21
24
|
|
|
22
25
|
// Only add the permission if it doesn't already exist
|
|
23
26
|
if (!permissionExists) {
|
|
24
|
-
androidManifest.manifest[
|
|
27
|
+
androidManifest.manifest['uses-permission'].push({
|
|
25
28
|
$: {
|
|
26
|
-
|
|
29
|
+
'android:name': 'android.permission.DETECT_SCREEN_CAPTURE'
|
|
27
30
|
}
|
|
28
31
|
});
|
|
29
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["withAndroidManifest","withCustomAndroidManifest","config","androidManifest","modResults","manifest","permissionExists","some","permission","$","push","withReactNativeScreenshotAware"],"sourceRoot":"../../../src","sources":["plugin/withReactNativeScreenshotAware.ts"],"mappings":";;AAAA,
|
|
1
|
+
{"version":3,"names":["configPlugins","withAndroidManifest","withCustomAndroidManifest","config","androidManifest","modResults","manifest","permissionExists","some","permission","$","push","withReactNativeScreenshotAware"],"sourceRoot":"../../../src","sources":["plugin/withReactNativeScreenshotAware.ts"],"mappings":";;AAAA,OAAOA,aAAa,MAA6B,sBAAsB;AACvE,MAAM;EAAEC;AAAoB,CAAC,GAAGD,aAAa;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAME,yBAAuC,GAAIC,MAAM,IAAK;EAC1D,OAAOF,mBAAmB,CAACE,MAAM,EAAGA,MAAM,IAAK;IAC7C,MAAMC,eAAe,GAAGD,MAAM,CAACE,UAAU;IAEzC,IAAI,CAACD,eAAe,CAACE,QAAQ,CAAC,iBAAiB,CAAC,EAAE;MAChDF,eAAe,CAACE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,EAAE;IAClD;;IAEA;IACA,MAAMC,gBAAgB,GAAGH,eAAe,CAACE,QAAQ,CAAC,iBAAiB,CAAC,CAACE,IAAI,CACtEC,UAAU,IACTA,UAAU,CAACC,CAAC,GAAG,cAAc,CAAC,KAC9B,0CACJ,CAAC;;IAED;IACA,IAAI,CAACH,gBAAgB,EAAE;MACrBH,eAAe,CAACE,QAAQ,CAAC,iBAAiB,CAAC,CAACK,IAAI,CAAC;QAC/CD,CAAC,EAAE;UACD,cAAc,EAAE;QAClB;MACF,CAAC,CAAC;IACJ;IAEA,OAAOP,MAAM;EACf,CAAC,CAAC;AACJ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMS,8BAA4C,GAAIT,MAAM,IAAK;EAC/D,OAAOD,yBAAyB,CAACC,MAAM,CAAC;AAC1C,CAAC;AAED,eAAeS,8BAA8B","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=setupJest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupJest.d.ts","sourceRoot":"","sources":["../../setupJest.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NativeScreenshotAware.d.ts","sourceRoot":"","sources":["../../../src/NativeScreenshotAware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;;AAED,wBAAyE"}
|
|
@@ -49,7 +49,7 @@ declare const ScreenshotAware: {
|
|
|
49
49
|
* @param {() => void} callback - The function to be called when a screenshot event occurs.
|
|
50
50
|
* @returns {import('react-native').EmitterSubscription} A subscription object that can be used to remove the listener.
|
|
51
51
|
*/
|
|
52
|
-
addListener: (callback: () => void) => import("react-native").
|
|
52
|
+
addListener: (callback: () => void) => import("react-native").EventSubscription;
|
|
53
53
|
/**
|
|
54
54
|
* Removes all listeners for screenshot events.
|
|
55
55
|
*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,IAAI,SAQtD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,QAAA,MAAM,eAAe;IACnB;;;;;OAKG;4BACqB,MAAM,IAAI;IAIlC;;OAEG;;CAGJ,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withReactNativeScreenshotAware.d.ts","sourceRoot":"","sources":["../../../../src/plugin/withReactNativeScreenshotAware.ts"],"names":[],"mappings":"AAAA,OAAsB,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAsCxE;;;;;;GAMG;AACH,QAAA,MAAM,8BAA8B,EAAE,YAErC,CAAC;AAEF,eAAe,8BAA8B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-screenshot-aware",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "React Native module for real-time screenshot detection on Android and iOS",
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
"main": "./lib/module/index.js",
|
|
6
|
+
"types": "./lib/typescript/src/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"source": "./src/index.tsx",
|
|
10
|
+
"types": "./lib/typescript/src/index.d.ts",
|
|
11
|
+
"default": "./lib/module/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./package.json": "./package.json",
|
|
14
|
+
"./app.plugin.js": "./app.plugin.js"
|
|
15
|
+
},
|
|
10
16
|
"files": [
|
|
11
17
|
"src",
|
|
12
18
|
"lib",
|
|
@@ -28,13 +34,11 @@
|
|
|
28
34
|
],
|
|
29
35
|
"scripts": {
|
|
30
36
|
"example": "yarn workspace react-native-screenshot-aware-example",
|
|
31
|
-
"
|
|
32
|
-
"lint": "npx biome check ./src && npx biome format ./src && yarn lint:example",
|
|
33
|
-
"lint:example": "npx biome check ./example/src && npx biome format ./example/src",
|
|
34
|
-
"lint:fix": "npx biome lint --write ./src && npx biome format --write ./src && npx biome check --write ./src && yarn lint:fix:example",
|
|
35
|
-
"lint:fix:example": "npx biome lint --write ./example/src && npx biome format --write ./example/src && npx biome check --write ./example/src",
|
|
36
|
-
"clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
|
|
37
|
+
"clean": "del-cli lib",
|
|
37
38
|
"prepare": "bob build",
|
|
39
|
+
"typecheck": "tsc",
|
|
40
|
+
"lint": "eslint \"**/*.{js,ts,tsx}\"",
|
|
41
|
+
"test": "jest",
|
|
38
42
|
"release": "semantic-release"
|
|
39
43
|
},
|
|
40
44
|
"keywords": [
|
|
@@ -50,7 +54,7 @@
|
|
|
50
54
|
"type": "git",
|
|
51
55
|
"url": "git+https://github.com/huextrat/react-native-screenshot-aware.git"
|
|
52
56
|
},
|
|
53
|
-
"author": "Hugo
|
|
57
|
+
"author": "Hugo Extrat <extrat.h@gmail.com> (https://github.com/huextrat)",
|
|
54
58
|
"license": "MIT",
|
|
55
59
|
"bugs": {
|
|
56
60
|
"url": "https://github.com/huextrat/react-native-screenshot-aware/issues"
|
|
@@ -60,32 +64,37 @@
|
|
|
60
64
|
"registry": "https://registry.npmjs.org/"
|
|
61
65
|
},
|
|
62
66
|
"devDependencies": {
|
|
63
|
-
"@
|
|
64
|
-
"@commitlint/
|
|
65
|
-
"@
|
|
66
|
-
"@
|
|
67
|
+
"@commitlint/cli": "20.4.3",
|
|
68
|
+
"@commitlint/config-conventional": "20.4.3",
|
|
69
|
+
"@eslint/compat": "2.0.3",
|
|
70
|
+
"@eslint/eslintrc": "3.3.5",
|
|
71
|
+
"@eslint/js": "9.35.0",
|
|
72
|
+
"@react-native/babel-preset": "0.84.1",
|
|
73
|
+
"@react-native/eslint-config": "0.84.1",
|
|
67
74
|
"@semantic-release/changelog": "6.0.3",
|
|
68
75
|
"@semantic-release/git": "10.0.1",
|
|
69
76
|
"@testing-library/react-native": "13.3.3",
|
|
70
|
-
"@types/jest": "
|
|
71
|
-
"@types/react": "19.
|
|
72
|
-
"commitlint": "20.4.
|
|
77
|
+
"@types/jest": "29.5.14",
|
|
78
|
+
"@types/react": "19.1.12",
|
|
79
|
+
"commitlint": "20.4.3",
|
|
73
80
|
"del-cli": "7.0.0",
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"
|
|
78
|
-
"
|
|
81
|
+
"eslint": "9.35.0",
|
|
82
|
+
"eslint-config-prettier": "10.1.8",
|
|
83
|
+
"eslint-plugin-prettier": "5.5.5",
|
|
84
|
+
"expo": "55.0.5",
|
|
85
|
+
"jest": "29.7.0",
|
|
86
|
+
"prettier": "3.8.1",
|
|
87
|
+
"react": "19.2.4",
|
|
79
88
|
"react-native": "0.84.1",
|
|
80
89
|
"react-native-builder-bob": "0.40.18",
|
|
81
|
-
"react-test-renderer": "19.
|
|
90
|
+
"react-test-renderer": "19.2.4",
|
|
82
91
|
"semantic-release": "25.0.3",
|
|
83
|
-
"turbo": "2.8.
|
|
92
|
+
"turbo": "2.8.14",
|
|
84
93
|
"typescript": "5.9.3"
|
|
85
94
|
},
|
|
86
95
|
"peerDependencies": {
|
|
87
96
|
"react": "*",
|
|
88
|
-
"react-native": "
|
|
97
|
+
"react-native": "*"
|
|
89
98
|
},
|
|
90
99
|
"peerDependenciesMeta": {
|
|
91
100
|
"expo": {
|
|
@@ -95,7 +104,40 @@
|
|
|
95
104
|
"workspaces": [
|
|
96
105
|
"example"
|
|
97
106
|
],
|
|
98
|
-
"packageManager": "yarn@4.
|
|
107
|
+
"packageManager": "yarn@4.11.0",
|
|
108
|
+
"react-native-builder-bob": {
|
|
109
|
+
"source": "src",
|
|
110
|
+
"output": "lib",
|
|
111
|
+
"targets": [
|
|
112
|
+
[
|
|
113
|
+
"module",
|
|
114
|
+
{
|
|
115
|
+
"esm": true
|
|
116
|
+
}
|
|
117
|
+
],
|
|
118
|
+
[
|
|
119
|
+
"typescript",
|
|
120
|
+
{
|
|
121
|
+
"project": "tsconfig.build.json"
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
]
|
|
125
|
+
},
|
|
126
|
+
"codegenConfig": {
|
|
127
|
+
"name": "ScreenshotAwareSpec",
|
|
128
|
+
"type": "modules",
|
|
129
|
+
"jsSrcsDir": "src",
|
|
130
|
+
"android": {
|
|
131
|
+
"javaPackageName": "com.screenshotaware"
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
"prettier": {
|
|
135
|
+
"quoteProps": "consistent",
|
|
136
|
+
"singleQuote": true,
|
|
137
|
+
"tabWidth": 2,
|
|
138
|
+
"trailingComma": "es5",
|
|
139
|
+
"useTabs": false
|
|
140
|
+
},
|
|
99
141
|
"jest": {
|
|
100
142
|
"preset": "react-native",
|
|
101
143
|
"modulePathIgnorePatterns": [
|
|
@@ -109,35 +151,22 @@
|
|
|
109
151
|
"src/**/*.ts",
|
|
110
152
|
"src/**/*.tsx",
|
|
111
153
|
"!src/types.ts",
|
|
112
|
-
"!src/
|
|
154
|
+
"!src/NativeScreenshotAware.ts"
|
|
113
155
|
],
|
|
114
156
|
"collectCoverage": true
|
|
115
157
|
},
|
|
158
|
+
"create-react-native-library": {
|
|
159
|
+
"type": "turbo-module",
|
|
160
|
+
"languages": "kotlin-objc",
|
|
161
|
+
"tools": [
|
|
162
|
+
"eslint",
|
|
163
|
+
"jest"
|
|
164
|
+
],
|
|
165
|
+
"version": "0.57.2"
|
|
166
|
+
},
|
|
116
167
|
"commitlint": {
|
|
117
168
|
"extends": [
|
|
118
169
|
"@commitlint/config-conventional"
|
|
119
170
|
]
|
|
120
|
-
},
|
|
121
|
-
"react-native-builder-bob": {
|
|
122
|
-
"source": "src",
|
|
123
|
-
"output": "lib",
|
|
124
|
-
"targets": [
|
|
125
|
-
"commonjs",
|
|
126
|
-
"module",
|
|
127
|
-
"typescript"
|
|
128
|
-
]
|
|
129
|
-
},
|
|
130
|
-
"codegenConfig": {
|
|
131
|
-
"name": "ScreenshotAwareSpec",
|
|
132
|
-
"type": "modules",
|
|
133
|
-
"jsSrcsDir": "./src/codegenSpec",
|
|
134
|
-
"android": {
|
|
135
|
-
"javaPackageName": "com.screenshotaware"
|
|
136
|
-
}
|
|
137
|
-
},
|
|
138
|
-
"create-react-native-library": {
|
|
139
|
-
"type": "turbo-module",
|
|
140
|
-
"languages": "kotlin-objc",
|
|
141
|
-
"version": "0.52.1"
|
|
142
171
|
}
|
|
143
172
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
import { TurboModuleRegistry } from 'react-native';
|
|
3
|
+
|
|
4
|
+
export interface Spec extends TurboModule {
|
|
5
|
+
addListener(eventName: string): void;
|
|
6
|
+
removeListeners(count: number): void;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export default TurboModuleRegistry.getEnforcing<Spec>('ScreenshotAware');
|
package/src/index.tsx
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { useEffect } from
|
|
2
|
-
import { NativeEventEmitter } from
|
|
3
|
-
import NativeScreenshotAware from
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { NativeEventEmitter } from 'react-native';
|
|
3
|
+
import NativeScreenshotAware from './NativeScreenshotAware';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @fileoverview This module provides functionality to detect screenshot events in a React Native application.
|
|
@@ -30,8 +30,8 @@ const moduleEventEmitter = new NativeEventEmitter(NativeScreenshotAware);
|
|
|
30
30
|
export const useScreenshotAware = (callback: () => void) => {
|
|
31
31
|
useEffect(() => {
|
|
32
32
|
const subscription = moduleEventEmitter.addListener(
|
|
33
|
-
|
|
34
|
-
callback
|
|
33
|
+
'ScreenshotAwareEvent',
|
|
34
|
+
callback
|
|
35
35
|
);
|
|
36
36
|
return () => subscription.remove();
|
|
37
37
|
}, [callback]);
|
|
@@ -70,14 +70,14 @@ const ScreenshotAware = {
|
|
|
70
70
|
* @returns {import('react-native').EmitterSubscription} A subscription object that can be used to remove the listener.
|
|
71
71
|
*/
|
|
72
72
|
addListener: (callback: () => void) => {
|
|
73
|
-
return moduleEventEmitter.addListener(
|
|
73
|
+
return moduleEventEmitter.addListener('ScreenshotAwareEvent', callback);
|
|
74
74
|
},
|
|
75
75
|
|
|
76
76
|
/**
|
|
77
77
|
* Removes all listeners for screenshot events.
|
|
78
78
|
*/
|
|
79
79
|
removeAllListeners: () =>
|
|
80
|
-
moduleEventEmitter.removeAllListeners(
|
|
80
|
+
moduleEventEmitter.removeAllListeners('ScreenshotAwareEvent'),
|
|
81
81
|
};
|
|
82
82
|
|
|
83
83
|
export default ScreenshotAware;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { type ConfigPlugin
|
|
1
|
+
import configPlugins, { type ConfigPlugin } from '@expo/config-plugins';
|
|
2
|
+
const { withAndroidManifest } = configPlugins;
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Modifies the `AndroidManifest.xml` file to add `DETECT_SCREEN_CAPTURE` permission,
|
|
@@ -11,22 +12,22 @@ const withCustomAndroidManifest: ConfigPlugin = (config) => {
|
|
|
11
12
|
return withAndroidManifest(config, (config) => {
|
|
12
13
|
const androidManifest = config.modResults;
|
|
13
14
|
|
|
14
|
-
if (!androidManifest.manifest[
|
|
15
|
-
androidManifest.manifest[
|
|
15
|
+
if (!androidManifest.manifest['uses-permission']) {
|
|
16
|
+
androidManifest.manifest['uses-permission'] = [];
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
// Check if the permission already exists
|
|
19
|
-
const permissionExists = androidManifest.manifest[
|
|
20
|
+
const permissionExists = androidManifest.manifest['uses-permission'].some(
|
|
20
21
|
(permission) =>
|
|
21
|
-
permission.$?.[
|
|
22
|
-
|
|
22
|
+
permission.$?.['android:name'] ===
|
|
23
|
+
'android.permission.DETECT_SCREEN_CAPTURE'
|
|
23
24
|
);
|
|
24
25
|
|
|
25
26
|
// Only add the permission if it doesn't already exist
|
|
26
27
|
if (!permissionExists) {
|
|
27
|
-
androidManifest.manifest[
|
|
28
|
+
androidManifest.manifest['uses-permission'].push({
|
|
28
29
|
$: {
|
|
29
|
-
|
|
30
|
+
'android:name': 'android.permission.DETECT_SCREEN_CAPTURE',
|
|
30
31
|
},
|
|
31
32
|
});
|
|
32
33
|
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
package com.screenshotaware
|
|
2
|
-
|
|
3
|
-
import com.facebook.react.bridge.ReactApplicationContext
|
|
4
|
-
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
5
|
-
|
|
6
|
-
abstract class ScreenshotAwareSpec internal constructor(context: ReactApplicationContext) :
|
|
7
|
-
ReactContextBaseJavaModule(context) {
|
|
8
|
-
|
|
9
|
-
abstract fun addListener(eventName: String?)
|
|
10
|
-
abstract fun removeListeners(count: Double)
|
|
11
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _reactNative = require("react-native");
|
|
8
|
-
var _default = exports.default = _reactNative.TurboModuleRegistry.getEnforcing("ScreenshotAware");
|
|
9
|
-
//# sourceMappingURL=NativeScreenshotAware.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../../src","sources":["codegenSpec/NativeScreenshotAware.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAOpCC,gCAAmB,CAACC,YAAY,CAAO,iBAAiB,CAAC","ignoreList":[]}
|
package/lib/commonjs/index.js
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.useScreenshotAware = exports.default = void 0;
|
|
7
|
-
var _react = require("react");
|
|
8
|
-
var _reactNative = require("react-native");
|
|
9
|
-
var _NativeScreenshotAware = _interopRequireDefault(require("./codegenSpec/NativeScreenshotAware"));
|
|
10
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
-
/**
|
|
12
|
-
* @fileoverview This module provides functionality to detect screenshot events in a React Native application.
|
|
13
|
-
* It exports a hook for functional components and methods for class components to listen for screenshot events.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
const moduleEventEmitter = new _reactNative.NativeEventEmitter(_NativeScreenshotAware.default);
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* A React hook that listens for screenshot events and triggers a callback when a screenshot is taken.
|
|
20
|
-
*
|
|
21
|
-
* @param {() => void} callback - The function to be called when a screenshot event occurs.
|
|
22
|
-
*
|
|
23
|
-
* @example
|
|
24
|
-
* ```jsx
|
|
25
|
-
* import { useScreenshotAware } from 'react-native-screenshot-aware';
|
|
26
|
-
*
|
|
27
|
-
* function MyComponent() {
|
|
28
|
-
* useScreenshotAware(() => {
|
|
29
|
-
* console.log('A screenshot was taken!');
|
|
30
|
-
* });
|
|
31
|
-
*
|
|
32
|
-
* return <View>...</View>;
|
|
33
|
-
* }
|
|
34
|
-
* ```
|
|
35
|
-
*/
|
|
36
|
-
const useScreenshotAware = callback => {
|
|
37
|
-
(0, _react.useEffect)(() => {
|
|
38
|
-
const subscription = moduleEventEmitter.addListener("ScreenshotAwareEvent", callback);
|
|
39
|
-
return () => subscription.remove();
|
|
40
|
-
}, [callback]);
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Module object for managing screenshot event listeners.
|
|
45
|
-
* Useful for class components or non-React contexts.
|
|
46
|
-
*
|
|
47
|
-
* @example
|
|
48
|
-
* ```jsx
|
|
49
|
-
* import ScreenshotAware from 'react-native-screenshot-aware';
|
|
50
|
-
*
|
|
51
|
-
* class MyComponent extends React.Component {
|
|
52
|
-
* componentDidMount() {
|
|
53
|
-
* this.subscription = ScreenshotAware.addListener(() => {
|
|
54
|
-
* console.log('A screenshot was taken!');
|
|
55
|
-
* });
|
|
56
|
-
* }
|
|
57
|
-
*
|
|
58
|
-
* componentWillUnmount() {
|
|
59
|
-
* this.subscription.remove();
|
|
60
|
-
* }
|
|
61
|
-
*
|
|
62
|
-
* render() {
|
|
63
|
-
* return <View>...</View>;
|
|
64
|
-
* }
|
|
65
|
-
* }
|
|
66
|
-
* ```
|
|
67
|
-
*/
|
|
68
|
-
exports.useScreenshotAware = useScreenshotAware;
|
|
69
|
-
const ScreenshotAware = {
|
|
70
|
-
/**
|
|
71
|
-
* Adds a listener for screenshot events.
|
|
72
|
-
*
|
|
73
|
-
* @param {() => void} callback - The function to be called when a screenshot event occurs.
|
|
74
|
-
* @returns {import('react-native').EmitterSubscription} A subscription object that can be used to remove the listener.
|
|
75
|
-
*/
|
|
76
|
-
addListener: callback => {
|
|
77
|
-
return moduleEventEmitter.addListener("ScreenshotAwareEvent", callback);
|
|
78
|
-
},
|
|
79
|
-
/**
|
|
80
|
-
* Removes all listeners for screenshot events.
|
|
81
|
-
*/
|
|
82
|
-
removeAllListeners: () => moduleEventEmitter.removeAllListeners("ScreenshotAwareEvent")
|
|
83
|
-
};
|
|
84
|
-
var _default = exports.default = ScreenshotAware;
|
|
85
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_reactNative","_NativeScreenshotAware","_interopRequireDefault","e","__esModule","default","moduleEventEmitter","NativeEventEmitter","NativeScreenshotAware","useScreenshotAware","callback","useEffect","subscription","addListener","remove","exports","ScreenshotAware","removeAllListeners","_default"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,sBAAA,GAAAC,sBAAA,CAAAH,OAAA;AAAwE,SAAAG,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAExE;AACA;AACA;AACA;;AAEA,MAAMG,kBAAkB,GAAG,IAAIC,+BAAkB,CAACC,8BAAqB,CAAC;;AAExE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,kBAAkB,GAAIC,QAAoB,IAAK;EAC1D,IAAAC,gBAAS,EAAC,MAAM;IACd,MAAMC,YAAY,GAAGN,kBAAkB,CAACO,WAAW,CACjD,sBAAsB,EACtBH,QACF,CAAC;IACD,OAAO,MAAME,YAAY,CAACE,MAAM,CAAC,CAAC;EACpC,CAAC,EAAE,CAACJ,QAAQ,CAAC,CAAC;AAChB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAxBAK,OAAA,CAAAN,kBAAA,GAAAA,kBAAA;AAyBA,MAAMO,eAAe,GAAG;EACtB;AACF;AACA;AACA;AACA;AACA;EACEH,WAAW,EAAGH,QAAoB,IAAK;IACrC,OAAOJ,kBAAkB,CAACO,WAAW,CAAC,sBAAsB,EAAEH,QAAQ,CAAC;EACzE,CAAC;EAED;AACF;AACA;EACEO,kBAAkB,EAAEA,CAAA,KAClBX,kBAAkB,CAACW,kBAAkB,CAAC,sBAAsB;AAChE,CAAC;AAAC,IAAAC,QAAA,GAAAH,OAAA,CAAAV,OAAA,GAEaW,eAAe","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"type":"commonjs"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _configPlugins = require("@expo/config-plugins");
|
|
8
|
-
/**
|
|
9
|
-
* Modifies the `AndroidManifest.xml` file to add `DETECT_SCREEN_CAPTURE` permission,
|
|
10
|
-
* allowing the app to detect screen capture.
|
|
11
|
-
*
|
|
12
|
-
* @param {ConfigPlugin} config - The Expo configuration object.
|
|
13
|
-
* @returns {ConfigPlugin} - The modified Expo configuration.
|
|
14
|
-
*/
|
|
15
|
-
const withCustomAndroidManifest = config => {
|
|
16
|
-
return (0, _configPlugins.withAndroidManifest)(config, config => {
|
|
17
|
-
const androidManifest = config.modResults;
|
|
18
|
-
if (!androidManifest.manifest["uses-permission"]) {
|
|
19
|
-
androidManifest.manifest["uses-permission"] = [];
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// Check if the permission already exists
|
|
23
|
-
const permissionExists = androidManifest.manifest["uses-permission"].some(permission => permission.$?.["android:name"] === "android.permission.DETECT_SCREEN_CAPTURE");
|
|
24
|
-
|
|
25
|
-
// Only add the permission if it doesn't already exist
|
|
26
|
-
if (!permissionExists) {
|
|
27
|
-
androidManifest.manifest["uses-permission"].push({
|
|
28
|
-
$: {
|
|
29
|
-
"android:name": "android.permission.DETECT_SCREEN_CAPTURE"
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
return config;
|
|
34
|
-
});
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Applies `withCustomAndroidManifest`
|
|
39
|
-
* to enable screenshot detection on Android.
|
|
40
|
-
*
|
|
41
|
-
* @param {ConfigPlugin} config - The Expo configuration object.
|
|
42
|
-
* @returns {ConfigPlugin} - The modified Expo configuration.
|
|
43
|
-
*/
|
|
44
|
-
const withReactNativeScreenshotAware = config => {
|
|
45
|
-
return withCustomAndroidManifest(config);
|
|
46
|
-
};
|
|
47
|
-
var _default = exports.default = withReactNativeScreenshotAware;
|
|
48
|
-
//# sourceMappingURL=withReactNativeScreenshotAware.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_configPlugins","require","withCustomAndroidManifest","config","withAndroidManifest","androidManifest","modResults","manifest","permissionExists","some","permission","$","push","withReactNativeScreenshotAware","_default","exports","default"],"sourceRoot":"../../../src","sources":["plugin/withReactNativeScreenshotAware.ts"],"mappings":";;;;;;AAAA,IAAAA,cAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,yBAAuC,GAAIC,MAAM,IAAK;EAC1D,OAAO,IAAAC,kCAAmB,EAACD,MAAM,EAAGA,MAAM,IAAK;IAC7C,MAAME,eAAe,GAAGF,MAAM,CAACG,UAAU;IAEzC,IAAI,CAACD,eAAe,CAACE,QAAQ,CAAC,iBAAiB,CAAC,EAAE;MAChDF,eAAe,CAACE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,EAAE;IAClD;;IAEA;IACA,MAAMC,gBAAgB,GAAGH,eAAe,CAACE,QAAQ,CAAC,iBAAiB,CAAC,CAACE,IAAI,CACtEC,UAAU,IACTA,UAAU,CAACC,CAAC,GAAG,cAAc,CAAC,KAC9B,0CACJ,CAAC;;IAED;IACA,IAAI,CAACH,gBAAgB,EAAE;MACrBH,eAAe,CAACE,QAAQ,CAAC,iBAAiB,CAAC,CAACK,IAAI,CAAC;QAC/CD,CAAC,EAAE;UACD,cAAc,EAAE;QAClB;MACF,CAAC,CAAC;IACJ;IAEA,OAAOR,MAAM;EACf,CAAC,CAAC;AACJ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMU,8BAA4C,GAAIV,MAAM,IAAK;EAC/D,OAAOD,yBAAyB,CAACC,MAAM,CAAC;AAC1C,CAAC;AAAC,IAAAW,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEaH,8BAA8B","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../../src","sources":["codegenSpec/NativeScreenshotAware.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;AAOlD,eAAeA,mBAAmB,CAACC,YAAY,CAAO,iBAAiB,CAAC","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NativeScreenshotAware.d.ts","sourceRoot":"","sources":["../../../src/codegenSpec/NativeScreenshotAware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;;AAED,wBAAyE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,IAAI,SAQtD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,QAAA,MAAM,eAAe;IACnB;;;;;OAKG;4BACqB,MAAM,IAAI;IAIlC;;OAEG;;CAGJ,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"withReactNativeScreenshotAware.d.ts","sourceRoot":"","sources":["../../../src/plugin/withReactNativeScreenshotAware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAuB,MAAM,sBAAsB,CAAC;AAqC9E;;;;;;GAMG;AACH,QAAA,MAAM,8BAA8B,EAAE,YAErC,CAAC;AAEF,eAAe,8BAA8B,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { TurboModule } from "react-native";
|
|
2
|
-
import { TurboModuleRegistry } from "react-native";
|
|
3
|
-
|
|
4
|
-
export interface Spec extends TurboModule {
|
|
5
|
-
addListener(eventName: string): void;
|
|
6
|
-
removeListeners(count: number): void;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export default TurboModuleRegistry.getEnforcing<Spec>("ScreenshotAware");
|