Add indicator for codes that haven't synced to remote yet

This commit is contained in:
vishnukvmd 2022-11-15 17:44:04 +05:30
parent 56a73ab7ee
commit e264d3456b
5 changed files with 58 additions and 26 deletions

View file

@ -0,0 +1,7 @@
class EntityResult {
final int generatedID;
final String rawData;
final bool hasSynced;
EntityResult(this.generatedID, this.rawData, this.hasSynced);
}

View file

@ -13,6 +13,7 @@ class Code {
final Algorithm algorithm;
final Type type;
final String rawData;
bool? hasSynced;
Code(
this.account,

View file

@ -11,6 +11,7 @@ import 'package:ente_auth/events/signed_in_event.dart';
import 'package:ente_auth/gateway/authenticator.dart';
import 'package:ente_auth/models/authenticator/auth_entity.dart';
import 'package:ente_auth/models/authenticator/auth_key.dart';
import 'package:ente_auth/models/authenticator/entity_result.dart';
import 'package:ente_auth/models/authenticator/local_auth_entity.dart';
import 'package:ente_auth/store/authenticator_db.dart';
import 'package:ente_auth/utils/crypto_util.dart';
@ -44,11 +45,11 @@ class AuthenticatorService {
});
}
Future<Map<int, String>> getAllIDtoStringMap() async {
Future<List<EntityResult>> getEntities() async {
final List<LocalAuthEntity> result = await _db.getAll();
final Map<int, String> entries = <int, String>{};
final List<EntityResult> entities = [];
if (result.isEmpty) {
return entries;
return entities;
}
final key = await getOrCreateAuthDataKey();
for (LocalAuthEntity e in result) {
@ -58,12 +59,18 @@ class AuthenticatorService {
key,
Sodium.base642bin(e.header),
);
entries[e.generatedID] = utf8.decode(decryptedValue);
entities.add(
EntityResult(
e.generatedID,
utf8.decode(decryptedValue),
e.id != null,
),
);
} catch (e, s) {
_logger.severe(e, s);
}
}
return entries;
return entities;
}
Future<int> addEntry(String plainText, bool shouldSync) async {

View file

@ -2,6 +2,7 @@ import 'dart:convert';
import 'package:ente_auth/core/event_bus.dart';
import 'package:ente_auth/events/codes_updated_event.dart';
import 'package:ente_auth/models/authenticator/entity_result.dart';
import 'package:ente_auth/models/code.dart';
import 'package:ente_auth/services/authenticator_service.dart';
import 'package:logging/logging.dart';
@ -19,13 +20,14 @@ class CodeStore {
}
Future<List<Code>> getAllCodes() async {
final Map<int, String> rawCodesMap =
await _authenticatorService.getAllIDtoStringMap();
final List<EntityResult> entities =
await _authenticatorService.getEntities();
final List<Code> codes = [];
for (final entry in rawCodesMap.entries) {
final decodeJson = jsonDecode(entry.value);
for (final entity in entities) {
final decodeJson = jsonDecode(entity.rawData);
final code = Code.fromRawData(decodeJson);
code.id = entry.key;
code.id = entity.generatedID;
code.hasSynced = entity.hasSynced;
codes.add(code);
}
codes.sort((c1, c2) {

View file

@ -103,26 +103,41 @@ class _CodeWidgetState extends State<CodeWidget> {
),
Padding(
padding: const EdgeInsets.only(left: 16, right: 16),
child: Column(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
Uri.decodeFull(widget.code.issuer).trim(),
style: Theme.of(context).textTheme.headline6,
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
Uri.decodeFull(widget.code.issuer).trim(),
style:
Theme.of(context).textTheme.headline6,
),
const SizedBox(height: 2),
Text(
Uri.decodeFull(
widget.code.account,
).trim(),
style: Theme.of(context)
.textTheme
.caption
?.copyWith(
fontSize: 12,
color: Colors.grey,
),
),
],
),
const SizedBox(height: 2),
Text(
Uri.decodeFull(
widget.code.account,
).trim(),
style: Theme.of(context)
.textTheme
.caption
?.copyWith(
fontSize: 12,
color: Colors.grey,
widget.code.hasSynced != null &&
widget.code.hasSynced!
? Container()
: const Icon(
Icons.sync_disabled,
size: 20,
color: Colors.amber,
),
),
],
),
),