From e4f91128ed3e6f0f6411c035e53aecef07be0bae Mon Sep 17 00:00:00 2001 From: mansi-dev Date: Fri, 16 Jan 2026 23:51:44 +0530 Subject: [PATCH] Working on secure device lock authentication with automatic app locking. --- package-lock.json | 14 ++++++++++++++ package.json | 1 + src/screen/Managelock.tsx | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 src/screen/Managelock.tsx diff --git a/package-lock.json b/package-lock.json index 7d7c1c5..6597265 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "react": "19.2.0", "react-native": "0.83.1", "react-native-biometrics": "^3.0.1", + "react-native-keychain": "^10.0.0", "react-native-safe-area-context": "^5.5.2" }, "devDependencies": { @@ -10111,6 +10112,19 @@ "react-native": ">=0.60.0" } }, + "node_modules/react-native-keychain": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/react-native-keychain/-/react-native-keychain-10.0.0.tgz", + "integrity": "sha512-YzPKSAnSzGEJ12IK6CctNLU79T1W15WDrElRQ+1/FsOazGX9ucFPTQwgYe8Dy8jiSEDJKM4wkVa3g4lD2Z+Pnw==", + "license": "MIT", + "workspaces": [ + "KeychainExample", + "website" + ], + "engines": { + "node": ">=16" + } + }, "node_modules/react-native-safe-area-context": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.2.tgz", diff --git a/package.json b/package.json index 26db412..788ead4 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "react": "19.2.0", "react-native": "0.83.1", "react-native-biometrics": "^3.0.1", + "react-native-keychain": "^10.0.0", "react-native-safe-area-context": "^5.5.2" }, "devDependencies": { diff --git a/src/screen/Managelock.tsx b/src/screen/Managelock.tsx new file mode 100644 index 0000000..91a70ce --- /dev/null +++ b/src/screen/Managelock.tsx @@ -0,0 +1,34 @@ +import React, { useEffect, useState } from 'react'; +import { AppState, View, Text } from 'react-native'; + +const App = () => { + const [locked, setLocked] = useState(true); + const [pinExists, setPinExists] = useState(false); + + useEffect(() => { + isPinSet().then(setPinExists); + isAppLocked().then(setLocked); + + const sub = AppState.addEventListener('change', state => { + if (state !== 'active') lockApp(); + }); + + return () => sub.remove(); + }, []); + + if (!pinExists) { + return setPinExists(true)} />; + } + + if (locked) { + return setLocked(false)} />; + } + + return ( + + 🔓 App Unlocked (Home Screen) + + ); +}; + +export default App;