UNPKG

react-native-screenguard

Version:

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

269 lines (267 loc) 9.97 kB
"use strict"; import { NativeModules, Platform, TurboModuleRegistry } from 'react-native'; import { useSGScreenShot } from './useSGScreenShot'; import { useSGScreenRecord } from './useSGScreenRecord'; import * as ScreenGuardConstants from './constant'; import * as ScreenGuardHelper from './helper'; const NativeScreenGuard = TurboModuleRegistry.get('ScreenGuard') || NativeModules.ScreenGuard; let _isInitialized = false; let _isTrackingLogEnabled = false; let _displayScreenguardOverlayAndroid = true; /** * Log error and reject promise * @param message error message * @private */ const _logError = message => { console.error(message); return Promise.reject(message); }; export default { /** * initialize the screen guard with settings * @param data ScreenGuardSettingsData * @version v2.0.0+ */ async initSettings(data) { let currentSettings = ScreenGuardConstants.ScreenGuardDefaultSettings; if (data !== null) { currentSettings = { enableCapture: data?.enableCapture ?? false, enableRecord: data?.enableRecord ?? false, enableContentMultitask: data?.enableContentMultitask ?? false, displayScreenGuardOverlay: data?.displayScreenGuardOverlay ?? false, displayScreenguardOverlayAndroid: data?.displayScreenguardOverlayAndroid ?? true, timeAfterResume: data?.timeAfterResume ?? ScreenGuardConstants.TIME_DELAYED, getScreenshotPath: data?.getScreenshotPath ?? false, limitCaptureEvtCount: data?.limitCaptureEvtCount ?? undefined, trackingLog: data?.trackingLog ?? false }; } if (currentSettings.timeAfterResume !== undefined && !currentSettings.displayScreenGuardOverlay && !currentSettings.displayScreenguardOverlayAndroid) { console.warn('ScreenGuard: setting timeAfterResume while displayScreenGuardOverlay/displayScreenguardOverlayAndroid = false'); } _isTrackingLogEnabled = currentSettings.trackingLog ?? false; try { if (NativeScreenGuard == null) { return _logError('ScreenGuard is not initialized, please double check!'); } await NativeScreenGuard?.initSettings(currentSettings); _isInitialized = true; _displayScreenguardOverlayAndroid = currentSettings.displayScreenguardOverlayAndroid ?? true; return; } catch (error) { _isInitialized = false; return _logError(error); } }, /** * activate screenshot blocking with a color effect (iOS 13+, Android 8+) * @param data ScreenGuardColorData object * throws error if ScreenGuard is not initialized * @version v0.0.2+ */ async register(data) { if (!_isInitialized) { return _logError('ScreenGuard is not initialized. Please call initSettings() first!'); } if (Platform.OS === 'android' && !_displayScreenguardOverlayAndroid) { console.warn('ScreenGuard: register() with overlay is not available when displayScreenguardOverlayAndroid = false. Switching to registerWithoutEffect().'); return this.registerWithoutEffect(); } let { backgroundColor = ScreenGuardConstants.BLACK_COLOR } = data; let currentColor = ScreenGuardHelper.resolveColorString(backgroundColor); try { await NativeScreenGuard?.activateShield({ backgroundColor: currentColor }); return; } catch (error) { return _logError(error); } }, /** * (Android only) activate screenshot and screen record blocking without * any effect (blur, image, color) on Android (Android 5+) * throws error if ScreenGuard is not initialized * warning if called on iOS platform * @deprecated Use register function with displayScreenguardOverlayAndroid = false instead * @version v1.0.0+ */ async registerWithoutEffect() { if (!_isInitialized) { return _logError('ScreenGuard is not initialized. Please call initSettings() first!'); } if (Platform.OS === 'android') { await NativeScreenGuard?.activateShieldWithoutEffect(); } else { console.warn('registerWithoutEffect is only available on Android platform!'); } return; }, /** * Activate screenshot blocking with a blur effect after captured (iOS 13+, Android 8+) * throws error if ScreenGuard is not initialized * @param data ScreenGuardBlurDataObject data object * @version v0.1.2+ */ async registerWithBlurView(data) { if (!_isInitialized) { return _logError('ScreenGuard is not initialized. Please call initSettings() first!'); } if (Platform.OS === 'android' && !_displayScreenguardOverlayAndroid) { console.warn('ScreenGuard: registerWithBlurView() is not available when displayScreenguardOverlayAndroid = false. Switching to registerWithoutEffect().'); return this.registerWithoutEffect(); } const { radius = ScreenGuardConstants.RADIUS_DEFAULT } = data; if (typeof radius !== 'number') { return _logError('radius must be a number and bigger than 1'); } if (radius < 1) { return _logError('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!'); } try { await NativeScreenGuard?.activateShieldWithBlurView({ radius }); return; } catch (error) { return _logError(error); } }, /** * Activate with an Image uri (iOS 13+, Android 8+) * throws error if ScreenGuard is not initialized * throws error if alignment is not in range from 0 -> 8 * @param data ScreenGuardImageDataObject data object, * @version v1.0.2+ */ async registerWithImage(data) { if (!_isInitialized) { return _logError('ScreenGuard is not initialized. Please call initSettings() first!'); } if (Platform.OS === 'android' && !_displayScreenguardOverlayAndroid) { console.warn('ScreenGuard: registerWithImage() is not available when displayScreenguardOverlayAndroid = false. Switching to registerWithoutEffect().'); return this.registerWithoutEffect(); } let { source, width, height, top, left, bottom, right, backgroundColor = ScreenGuardConstants.BLACK_COLOR, alignment, defaultSource } = data; let newDefaultSource = null; if (typeof source === 'object' && 'uri' in source) { if (source.uri.length === 0) { return _logError('uri must not be empty!'); } if (width < 1 || isNaN(width)) { return _logError('width of image must bigger than 0!'); } if (height < 1 || isNaN(height)) { return _logError('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: ScreenGuardHelper.resolveAssetSource(data.source) }; } if (defaultSource == null) { console.warn('Consider adding a default source to display image that cannot be loaded from uri!'); newDefaultSource = { uri: ScreenGuardHelper.resolveAssetSource(require('./images/screenshot_blocking.jpg')) }; } else { newDefaultSource = { uri: ScreenGuardHelper.resolveAssetSource(defaultSource) }; } if (alignment != null && (alignment > 8 || alignment < 0 || isNaN(alignment))) { return _logError('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; } let currentColor = ScreenGuardHelper.resolveColorString(backgroundColor); try { await NativeScreenGuard?.activateShieldWithImage({ source, defaultSource: newDefaultSource, width, height, top, left, bottom, right, alignment, backgroundColor: currentColor }); return; } catch (error) { return _logError(error); } }, /** * Deactivate screenguard * Clear all screen protector and event listening * throws error if ScreenGuard is not initialized * @version v0.0.2+ */ async unregister() { try { if (!_isInitialized) { return _logError('ScreenGuard is not initialized. Please call initSettings() first!'); } await NativeScreenGuard?.deactivateShield(); return; } catch (error) { return _logError(error); } }, /** * Get the current logs of screenguard * throws error if ScreenGuard is not initialized * @param maxCount maximum number of logs to retrieve * @version v2.0.0+ */ async getScreenGuardLogs(maxCount = 10) { try { if (!_isInitialized) { return _logError('ScreenGuard is not initialized. Please call initSettings() first!'); } if (maxCount < 1) { return _logError('maxCount must be >= 1!'); } if (maxCount > 1000000) { return _logError('maxCount must be <= 1000000!'); } if (!_isTrackingLogEnabled) { console.warn('ScreenGuard: you may not get logs properly while trackingLog = false'); } return await NativeScreenGuard?.getScreenGuardLogs(maxCount); } catch (error) { return _logError(error); } } }; export { ScreenGuardConstants, useSGScreenShot, useSGScreenRecord }; //# sourceMappingURL=index.js.map