-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #59 from nimblehq/feature/11-integrate-saving-toke…
…n-in-local-storage [#11] [Integrate] As a user, once I have logged in, I can see the app stores the access token in the local storage
- Loading branch information
Showing
11 changed files
with
203 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
import 'package:flutter_secure_storage/flutter_secure_storage.dart'; | ||
|
||
class FlutterSecureStorageProvider { | ||
FlutterSecureStorage? _storage; | ||
|
||
FlutterSecureStorage getStorage() { | ||
_storage ??= _createStorage(); | ||
return _storage!; | ||
} | ||
|
||
FlutterSecureStorage _createStorage() { | ||
return const FlutterSecureStorage( | ||
aOptions: AndroidOptions( | ||
encryptedSharedPreferences: true, | ||
), | ||
); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
import 'package:json_annotation/json_annotation.dart'; | ||
import 'package:survey_flutter/storage/secure_storage.dart'; | ||
|
||
part 'api_token.g.dart'; | ||
|
||
@JsonSerializable() | ||
class ApiToken extends SecureStorageModel { | ||
@JsonKey(name: 'access_token') | ||
final String accessToken; | ||
@JsonKey(name: 'refresh_token') | ||
final String refreshToken; | ||
@JsonKey(name: 'token_type') | ||
final String tokenType; | ||
|
||
ApiToken({ | ||
required this.accessToken, | ||
required this.refreshToken, | ||
required this.tokenType, | ||
}); | ||
|
||
factory ApiToken.fromJson(Map<String, dynamic> json) => | ||
_$ApiTokenFromJson(json); | ||
|
||
Map<String, dynamic> toJson() => _$ApiTokenToJson(this); | ||
|
||
@override | ||
bool operator ==(Object other) => | ||
other is ApiToken && | ||
accessToken == other.accessToken && | ||
refreshToken == other.refreshToken && | ||
tokenType == other.tokenType; | ||
|
||
@override | ||
int get hashCode => (accessToken + refreshToken + tokenType).hashCode; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
enum SecureStorageKey { | ||
apiToken, | ||
} | ||
|
||
extension SecureStorageKeyExt on SecureStorageKey { | ||
String get string { | ||
switch (this) { | ||
case SecureStorageKey.apiToken: | ||
return 'API_TOKEN_KEY'; | ||
} | ||
} | ||
} | ||
|
||
abstract class SecureStorageModel {} | ||
|
||
enum SecureStorageError { | ||
failToGetValue, | ||
} | ||
|
||
abstract class SecureStorage { | ||
Future<void> save<M extends SecureStorageModel>( | ||
{required M value, required SecureStorageKey key}); | ||
Future<M> getValue<M extends SecureStorageModel>( | ||
{required SecureStorageKey key}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
import 'dart:convert'; | ||
|
||
import 'package:flutter_riverpod/flutter_riverpod.dart'; | ||
import 'package:flutter_secure_storage/flutter_secure_storage.dart'; | ||
import 'package:survey_flutter/storage/secure_storage.dart'; | ||
|
||
import '../di/provider/flutter_secure_storage.dart'; | ||
|
||
final secureStorageProvider = Provider<SecureStorage>((_) { | ||
return SecureStorageImpl(FlutterSecureStorageProvider().getStorage()); | ||
}); | ||
|
||
class SecureStorageImpl extends SecureStorage { | ||
final FlutterSecureStorage _storage; | ||
SecureStorageImpl(this._storage); | ||
|
||
@override | ||
Future<M> getValue<M extends SecureStorageModel>( | ||
{required SecureStorageKey key}) async { | ||
final rawValue = await _storage.read(key: key.string); | ||
if (rawValue == null) { | ||
throw SecureStorageError.failToGetValue; | ||
} | ||
|
||
return await jsonDecode(rawValue); | ||
} | ||
|
||
@override | ||
Future<void> save<M extends SecureStorageModel>( | ||
{required M value, required SecureStorageKey key}) async { | ||
final encodedValue = jsonEncode(value); | ||
await _storage.write(key: key.string, value: encodedValue); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters