UNPKG

react-native-screenguard

Version:

A Native screenshot blocking library for React-Native developer, with background customizable after captured. Screenshot detector are also supported.

254 lines (236 loc) 7.74 kB
import { NativeEventEmitter, Platform } from 'react-native'; import * as ScreenGuardData from './data'; import NativeScreenGuard from './NativeScreenGuard'; import * as ScreenGuardConstants from './constant'; var screenShotEmitter: NativeEventEmitter | null = null; var screenRecordingEmitter: NativeEventEmitter | null = null; export default { /** * activate screenshot blocking with a color effect (iOS 13+, Android 8+) * @param data ScreenGuardColorData object * @version v0.0.2+ */ register(data: ScreenGuardData.ScreenGuardColorData) { let { backgroundColor = ScreenGuardConstants.BLACK_COLOR, timeAfterResume = ScreenGuardConstants.TIME_DELAYED, } = data; let currentColor = backgroundColor.trim().length === 0 || !backgroundColor.trim().startsWith('#') || ScreenGuardConstants.REGEX.test(backgroundColor.trim().substring(1)) ? ScreenGuardConstants.BLACK_COLOR : data.backgroundColor; NativeScreenGuard?.activateShield({ backgroundColor: currentColor, timeAfterResume, }); }, /** * (Android only) activate screenshot and screen record blocking without * any effect (blur, image, color) on Android (Android 5+) * @version v1.0.0+ */ registerWithoutEffect() { if (Platform.OS === 'android') { NativeScreenGuard?.activateShieldWithoutEffect(); } }, /** * Activate screenshot blocking with a blur effect after captured (iOS 13+, Android 8+) * @param data ScreenGuardBlurDataObject data object * @version v0.1.2+ */ registerWithBlurView(data: ScreenGuardData.ScreenGuardBlurDataObject) { const { radius = ScreenGuardConstants.RADIUS_DEFAULT, timeAfterResume = ScreenGuardConstants.TIME_DELAYED, } = data; if (typeof radius !== 'number') { throw new Error('radius must be a number and bigger than 1'); } if (radius < 1) { throw new Error('radius must bigger than 1!'); } if (radius >= 1 && radius < 15) { console.warn( 'Consider a radius value bigger than 15, as content still very clear and easy to read!' ); } if (radius > 50) { console.warn( 'Consider a radius value in between 15 and 50, as blur contents may vanish inside the view!' ); } if (Platform.OS === 'android' && timeAfterResume > 3000) { console.warn( 'Consider a number in between 1000 and 3000 for better user experience!' ); } if ( Platform.OS === 'android' && (timeAfterResume < 0 || isNaN(timeAfterResume)) ) { throw new Error('timeAfterResume must be > 0!'); } NativeScreenGuard?.activateShieldWithBlurView({ radius, timeAfterResume, }); }, /** * activate with an Image uri (iOS 13+, Android 8+) * @param data ScreenGuardImageDataObject data object, * @version v1.0.2+ */ registerWithImage(data: ScreenGuardData.ScreenGuardImageDataObject) { let { source, width, height, top, left, bottom, right, backgroundColor = ScreenGuardConstants.BLACK_COLOR, alignment, timeAfterResume = ScreenGuardConstants.TIME_DELAYED, defaultSource, } = data; let newDefaultSource: { uri: string } | null = null; if (typeof source === 'object' && 'uri' in source) { if (source.uri.length === 0) { throw new Error('uri must not be empty!'); } if (width < 1 || isNaN(width)) { throw new Error('width of image must bigger than 0!'); } if (height < 1 || isNaN(height)) { throw new Error('height of image must bigger than 0!'); } if (!ScreenGuardConstants.IMAGE_REGEX.test(source.uri)) { console.warn( 'Looks like the uri is not an image uri. Try to provide a correct image uri for better result!' ); } } else if (typeof source === 'number') { source = { uri: ScreenGuardConstants.resolveAssetSource(data.source) }; } if (defaultSource == null) { console.warn( 'Consider adding a default source to display image that cannot be loaded from uri!' ); newDefaultSource = { uri: ScreenGuardConstants.resolveAssetSource( require('../images/screenshot_blocking.webp') ), }; } else { newDefaultSource = { uri: ScreenGuardConstants.resolveAssetSource(data.source), }; } if ( alignment != null && (alignment > 8 || alignment < 0 || isNaN(alignment)) ) { throw new Error( 'alignment must be in range from 0 -> 8 only, values: \n topLeft: 0; \n topCenter: 1; \n topRight: 2; \n centerLeft: 3; \n Center: 4; \n centerRight: 5; \n bottomLeft: 6; \n bottomCenter: 7;\n bottomRight: 8; \n If you want to center the image, leave null instead!' ); } if ( alignment == null && ((top == null && left == null && bottom == null && right == null) || Platform.OS === 'android') ) { alignment = ScreenGuardConstants.Alignment.center; } NativeScreenGuard?.activateShieldWithImage({ source, defaultSource: newDefaultSource, width, height, top, left, bottom, right, alignment, backgroundColor, timeAfterResume, }); }, /** * Deactivate screenguard * Clear all screen protector and event listening * @version v0.0.2+ */ unregister() { NativeScreenGuard?.deactivateShield(); if (screenShotEmitter != null) { screenShotEmitter.removeAllListeners(ScreenGuardConstants.SCREENSHOT_EVT); screenShotEmitter = null; } if (screenRecordingEmitter != null) { screenRecordingEmitter.removeAllListeners( ScreenGuardConstants.SCREEN_RECORDING_EVT ); screenRecordingEmitter = null; } }, /** * Screenshot event listener * Register for screenshot event listener * @param getScreenShotPath if true, callback will return a ScreenGuardScreenShotPathDataObject containing info of an image after captured, null otherwise. Default = false * @param callback callback after a screenshot has been triggered. * @version v0.3.6+ */ registerScreenshotEventListener( getScreenShotPath: boolean, callback: ( data?: ScreenGuardData.ScreenGuardScreenShotPathDataObject | null ) => void ) { NativeScreenGuard?.registerScreenshotEventListener(getScreenShotPath); if (screenShotEmitter == null) { screenShotEmitter = new NativeEventEmitter(NativeScreenGuard); } const _onScreenCapture = ( res?: ScreenGuardData.ScreenGuardScreenShotPathDataObject | null ) => { callback(res); }; screenShotEmitter.addListener( ScreenGuardConstants.SCREENSHOT_EVT, _onScreenCapture ); return () => screenShotEmitter?.removeAllListeners( ScreenGuardConstants.SCREENSHOT_EVT ); }, /** * Screen recording event listener (iOS only) * Register for screen recording event listener * @version v0.3.6+ */ registerScreenRecordingEventListener(callback: () => void) { if (Platform.OS === 'ios') { NativeScreenGuard?.registerScreenRecordingEventListener(); if (screenRecordingEmitter == null) { screenRecordingEmitter = new NativeEventEmitter(NativeScreenGuard); } const _onScreenRecording = () => { callback(); }; screenRecordingEmitter.addListener( ScreenGuardConstants.SCREEN_RECORDING_EVT, _onScreenRecording ); } return () => screenShotEmitter?.removeAllListeners( ScreenGuardConstants.SCREEN_RECORDING_EVT ); }, }; export { ScreenGuardConstants };