react-native-screenshot-aware 1.3.21 → 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.
Files changed (46) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +5 -2
  3. package/ScreenshotAware.podspec +3 -25
  4. package/android/build.gradle +18 -41
  5. package/android/src/main/AndroidManifest.xml +2 -1
  6. package/android/src/main/java/com/screenshotaware/ScreenshotAwareModule.kt +3 -9
  7. package/android/src/main/java/com/screenshotaware/ScreenshotAwarePackage.kt +12 -14
  8. package/app.plugin.js +1 -1
  9. package/ios/ScreenshotAware.h +2 -9
  10. package/ios/ScreenshotAware.mm +25 -32
  11. package/lib/module/NativeScreenshotAware.js +5 -0
  12. package/lib/module/NativeScreenshotAware.js.map +1 -0
  13. package/lib/module/index.js +6 -6
  14. package/lib/module/index.js.map +1 -1
  15. package/lib/module/package.json +1 -0
  16. package/lib/module/plugin/withReactNativeScreenshotAware.js +9 -6
  17. package/lib/module/plugin/withReactNativeScreenshotAware.js.map +1 -1
  18. package/lib/typescript/package.json +1 -0
  19. package/lib/typescript/setupJest.d.ts +1 -0
  20. package/lib/typescript/setupJest.d.ts.map +1 -0
  21. package/lib/typescript/{codegenSpec → src}/NativeScreenshotAware.d.ts +1 -1
  22. package/lib/typescript/src/NativeScreenshotAware.d.ts.map +1 -0
  23. package/lib/typescript/{index.d.ts → src/index.d.ts} +1 -1
  24. package/lib/typescript/src/index.d.ts.map +1 -0
  25. package/lib/typescript/{plugin → src/plugin}/withReactNativeScreenshotAware.d.ts +1 -1
  26. package/lib/typescript/src/plugin/withReactNativeScreenshotAware.d.ts.map +1 -0
  27. package/package.json +76 -47
  28. package/src/NativeScreenshotAware.ts +9 -0
  29. package/src/index.tsx +7 -7
  30. package/src/plugin/withReactNativeScreenshotAware.ts +9 -8
  31. package/android/gradle.properties +0 -5
  32. package/android/src/newarch/ScreenshotAware.kt +0 -7
  33. package/android/src/oldarch/ScreenshotAware.kt +0 -11
  34. package/lib/commonjs/codegenSpec/NativeScreenshotAware.js +0 -9
  35. package/lib/commonjs/codegenSpec/NativeScreenshotAware.js.map +0 -1
  36. package/lib/commonjs/index.js +0 -85
  37. package/lib/commonjs/index.js.map +0 -1
  38. package/lib/commonjs/package.json +0 -1
  39. package/lib/commonjs/plugin/withReactNativeScreenshotAware.js +0 -48
  40. package/lib/commonjs/plugin/withReactNativeScreenshotAware.js.map +0 -1
  41. package/lib/module/codegenSpec/NativeScreenshotAware.js +0 -5
  42. package/lib/module/codegenSpec/NativeScreenshotAware.js.map +0 -1
  43. package/lib/typescript/codegenSpec/NativeScreenshotAware.d.ts.map +0 -1
  44. package/lib/typescript/index.d.ts.map +0 -1
  45. package/lib/typescript/plugin/withReactNativeScreenshotAware.d.ts.map +0 -1
  46. package/src/codegenSpec/NativeScreenshotAware.ts +0 -9
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 Hugo EXTRAT
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
- - 🏗️ Supports the new architecture for React Native
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
@@ -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/generated/**/*.h"
16
+ s.source_files = "ios/**/*.{h,m,mm,swift,cpp}"
17
+ s.private_header_files = "ios/**/*.h"
19
18
 
20
- # Use install_modules_dependencies helper to install the dependencies if React Native version >=0.71.0.
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
@@ -1,6 +1,17 @@
1
1
  buildscript {
2
- ext.getExtOrDefault = {name ->
3
- return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties['ScreenshotAware_' + name]
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
- if (isNewArchitectureEnabled()) {
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 getExtOrIntegerDefault("compileSdkVersion")
38
+ compileSdkVersion getExtOrDefault("compileSdkVersion")
38
39
 
39
40
  defaultConfig {
40
- minSdkVersion getExtOrIntegerDefault("minSdkVersion")
41
- targetSdkVersion getExtOrIntegerDefault("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
- lintOptions {
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
- @ReactModule(name = ScreenshotAwareModule.NAME)
11
- class ScreenshotAwareModule internal constructor(reactContext: ReactApplicationContext) :
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 = "ScreenshotAware"
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.module.model.ReactModuleInfoProvider
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(): ReactModuleInfoProvider {
20
- return ReactModuleInfoProvider {
21
- val moduleInfos: MutableMap<String, ReactModuleInfo> = HashMap()
22
- moduleInfos[ScreenshotAwareModule.NAME] = ReactModuleInfo(
23
- ScreenshotAwareModule.NAME,
24
- ScreenshotAwareModule.NAME,
25
- false, // canOverrideExistingModule
26
- false, // needsEagerInit
27
- false, // isCxxModule
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
- moduleInfos
31
- }
29
+ )
32
30
  }
33
31
  }
package/app.plugin.js CHANGED
@@ -1 +1 @@
1
- module.exports = require("./lib/commonjs/plugin/withReactNativeScreenshotAware");
1
+ module.exports = require('./lib/module/plugin/withReactNativeScreenshotAware');
@@ -1,13 +1,6 @@
1
1
  #import <React/RCTEventEmitter.h>
2
+ #import <ScreenshotAwareSpec/ScreenshotAwareSpec.h>
2
3
 
3
- #ifdef RCT_NEW_ARCH_ENABLED
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
@@ -5,53 +5,46 @@
5
5
  @end
6
6
 
7
7
  @implementation ScreenshotAware {
8
- ScreenshotAwareImpl *moduleImpl;
9
- BOOL hasListeners;
8
+ ScreenshotAwareImpl *moduleImpl;
9
+ BOOL hasListeners;
10
10
  }
11
11
 
12
- RCT_EXPORT_MODULE()
13
-
14
12
  - (instancetype)init {
15
- self = [super init];
16
- if (self) {
17
- moduleImpl = [ScreenshotAwareImpl new];
18
- moduleImpl.delegate = self;
19
- }
20
- return self;
13
+ self = [super init];
14
+ if (self) {
15
+ moduleImpl = [ScreenshotAwareImpl new];
16
+ moduleImpl.delegate = self;
17
+ }
18
+ return self;
21
19
  }
22
20
 
23
- - (void)handleEventWithName:(NSString * _Nonnull)name {
24
- if (hasListeners) {
25
- [self sendEventWithName:name body:nil];
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
- - (NSArray<NSString *> *)supportedEvents {
30
- return [ScreenshotAwareImpl supportedEvents];
27
+ + (NSString *)moduleName
28
+ {
29
+ return @"ScreenshotAware";
31
30
  }
32
31
 
33
- - (void)startObserving
34
- {
35
- hasListeners = YES;
32
+ - (void)handleEventWithName:(NSString * _Nonnull)name {
33
+ if (hasListeners) {
34
+ [super sendEventWithName:name body:nil];
35
+ }
36
36
  }
37
37
 
38
- -(void)stopObserving
39
- {
40
- hasListeners = NO;
38
+ - (NSArray<NSString *> *)supportedEvents {
39
+ return [ScreenshotAwareImpl supportedEvents];
41
40
  }
42
41
 
43
- + (BOOL)requiresMainQueueSetup
44
- {
45
- return NO;
42
+ - (void)startObserving {
43
+ hasListeners = YES;
46
44
  }
47
45
 
48
- // Don't compile this code when we build for the old architecture.
49
- #ifdef RCT_NEW_ARCH_ENABLED
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,5 @@
1
+ "use strict";
2
+
3
+ import { TurboModuleRegistry } from 'react-native';
4
+ export default TurboModuleRegistry.getEnforcing('ScreenshotAware');
5
+ //# sourceMappingURL=NativeScreenshotAware.js.map
@@ -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":[]}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
 
3
- import { useEffect } from "react";
4
- import { NativeEventEmitter } from "react-native";
5
- import NativeScreenshotAware from "./codegenSpec/NativeScreenshotAware";
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("ScreenshotAwareEvent", callback);
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("ScreenshotAwareEvent", callback);
72
+ return moduleEventEmitter.addListener('ScreenshotAwareEvent', callback);
73
73
  },
74
74
  /**
75
75
  * Removes all listeners for screenshot events.
76
76
  */
77
- removeAllListeners: () => moduleEventEmitter.removeAllListeners("ScreenshotAwareEvent")
77
+ removeAllListeners: () => moduleEventEmitter.removeAllListeners('ScreenshotAwareEvent')
78
78
  };
79
79
  export default ScreenshotAware;
80
80
  //# sourceMappingURL=index.js.map
@@ -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,qCAAqC;;AAEvE;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":[]}
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 { withAndroidManifest } from "@expo/config-plugins";
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["uses-permission"]) {
16
- androidManifest.manifest["uses-permission"] = [];
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["uses-permission"].some(permission => permission.$?.["android:name"] === "android.permission.DETECT_SCREEN_CAPTURE");
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["uses-permission"].push({
27
+ androidManifest.manifest['uses-permission'].push({
25
28
  $: {
26
- "android:name": "android.permission.DETECT_SCREEN_CAPTURE"
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,SAA4BA,mBAAmB,QAAQ,sBAAsB;;AAE7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,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":[]}
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":""}
@@ -1,4 +1,4 @@
1
- import type { TurboModule } from "react-native";
1
+ import type { TurboModule } from 'react-native';
2
2
  export interface Spec extends TurboModule {
3
3
  addListener(eventName: string): void;
4
4
  removeListeners(count: number): void;
@@ -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").EmitterSubscription;
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"}
@@ -1,4 +1,4 @@
1
- import { type ConfigPlugin } from "@expo/config-plugins";
1
+ import { type ConfigPlugin } from '@expo/config-plugins';
2
2
  /**
3
3
  * Applies `withCustomAndroidManifest`
4
4
  * to enable screenshot detection on Android.
@@ -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": "1.3.21",
3
+ "version": "2.0.0",
4
4
  "description": "React Native module for real-time screenshot detection on Android and iOS",
5
- "source": "src/index.tsx",
6
- "main": "lib/commonjs/index.js",
7
- "react-native": "src/index.tsx",
8
- "module": "lib/module/index.js",
9
- "types": "lib/typescript/index.d.ts",
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
- "test": "jest",
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 EXTRAT <extrat.h@gmail.com> (https://github.com/huextrat)",
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
- "@biomejs/biome": "2.4.5",
64
67
  "@commitlint/cli": "20.4.3",
65
68
  "@commitlint/config-conventional": "20.4.3",
66
- "@react-native-community/cli": "20.1.2",
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": "30.0.0",
71
- "@types/react": "19.2.14",
77
+ "@types/jest": "29.5.14",
78
+ "@types/react": "19.1.12",
72
79
  "commitlint": "20.4.3",
73
80
  "del-cli": "7.0.0",
74
- "expo": "55.0.4",
75
- "husky": "9.1.7",
76
- "jest": "30.2.0",
77
- "prettier": "^3.6.2",
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",
78
87
  "react": "19.2.4",
79
88
  "react-native": "0.84.1",
80
89
  "react-native-builder-bob": "0.40.18",
81
90
  "react-test-renderer": "19.2.4",
82
91
  "semantic-release": "25.0.3",
83
- "turbo": "2.8.13",
92
+ "turbo": "2.8.14",
84
93
  "typescript": "5.9.3"
85
94
  },
86
95
  "peerDependencies": {
87
96
  "react": "*",
88
- "react-native": ">=0.76"
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.12.0",
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/codegenSpec/**"
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 "react";
2
- import { NativeEventEmitter } from "react-native";
3
- import NativeScreenshotAware from "./codegenSpec/NativeScreenshotAware";
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
- "ScreenshotAwareEvent",
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("ScreenshotAwareEvent", callback);
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("ScreenshotAwareEvent"),
80
+ moduleEventEmitter.removeAllListeners('ScreenshotAwareEvent'),
81
81
  };
82
82
 
83
83
  export default ScreenshotAware;
@@ -1,4 +1,5 @@
1
- import { type ConfigPlugin, withAndroidManifest } from "@expo/config-plugins";
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["uses-permission"]) {
15
- androidManifest.manifest["uses-permission"] = [];
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["uses-permission"].some(
20
+ const permissionExists = androidManifest.manifest['uses-permission'].some(
20
21
  (permission) =>
21
- permission.$?.["android:name"] ===
22
- "android.permission.DETECT_SCREEN_CAPTURE",
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["uses-permission"].push({
28
+ androidManifest.manifest['uses-permission'].push({
28
29
  $: {
29
- "android:name": "android.permission.DETECT_SCREEN_CAPTURE",
30
+ 'android:name': 'android.permission.DETECT_SCREEN_CAPTURE',
30
31
  },
31
32
  });
32
33
  }
@@ -1,5 +0,0 @@
1
- ScreenshotAware_kotlinVersion=2.0.21
2
- ScreenshotAware_minSdkVersion=24
3
- ScreenshotAware_targetSdkVersion=34
4
- ScreenshotAware_compileSdkVersion=35
5
- ScreenshotAware_ndkVersion=27.1.12297006
@@ -1,7 +0,0 @@
1
- package com.screenshotaware
2
-
3
- import com.facebook.react.bridge.ReactApplicationContext
4
-
5
- abstract class ScreenshotAwareSpec internal constructor(context: ReactApplicationContext) :
6
- NativeScreenshotAwareSpec(context) {
7
- }
@@ -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":[]}
@@ -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,5 +0,0 @@
1
- "use strict";
2
-
3
- import { TurboModuleRegistry } from "react-native";
4
- export default TurboModuleRegistry.getEnforcing("ScreenshotAware");
5
- //# sourceMappingURL=NativeScreenshotAware.js.map
@@ -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");