75 lines
1.5 KiB
TypeScript
75 lines
1.5 KiB
TypeScript
import * as Keychain from 'react-native-keychain';
|
|
import { KEYCHAIN } from '../utils/constants';
|
|
|
|
class KeychainService {
|
|
/**
|
|
* Save access token securely
|
|
*/
|
|
async saveToken(token: string): Promise<boolean> {
|
|
try {
|
|
const result = await Keychain.setGenericPassword(
|
|
KEYCHAIN.USERNAME,
|
|
token,
|
|
{
|
|
service: KEYCHAIN.SERVICE,
|
|
accessible: Keychain.ACCESSIBLE.WHEN_UNLOCKED,
|
|
},
|
|
);
|
|
return !!result;
|
|
} catch (error) {
|
|
console.log('Keychain Save Error', error);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get stored token
|
|
*/
|
|
async getToken(): Promise<string | null> {
|
|
try {
|
|
const credentials = await Keychain.getGenericPassword({
|
|
service: KEYCHAIN.SERVICE,
|
|
});
|
|
|
|
if (!credentials) {
|
|
return null;
|
|
}
|
|
|
|
return credentials.password;
|
|
} catch (error) {
|
|
console.log('Keychain Get Error', error);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check whether token exists
|
|
*/
|
|
async hasToken(): Promise<boolean> {
|
|
const token = await this.getToken();
|
|
return !!token;
|
|
}
|
|
|
|
/**
|
|
* Remove token
|
|
*/
|
|
async removeToken(): Promise<boolean> {
|
|
try {
|
|
return await Keychain.resetGenericPassword({
|
|
service: KEYCHAIN.SERVICE,
|
|
});
|
|
} catch (error) {
|
|
console.log('Keychain Remove Error', error);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Save mock token for testing
|
|
*/
|
|
async mockLogin(): Promise<boolean> {
|
|
return this.saveToken('mock-access-token');
|
|
}
|
|
}
|
|
|
|
export default new KeychainService(); |