Browse Source

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

vishnukvmd 2 years ago
parent
commit
e264d3456b

+ 7 - 0
lib/models/authenticator/entity_result.dart

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

+ 1 - 0
lib/models/code.dart

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

+ 12 - 5
lib/services/authenticator_service.dart

@@ -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 {

+ 7 - 5
lib/store/code_store.dart

@@ -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) {

+ 31 - 16
lib/ui/code_widget.dart

@@ -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,
                                     ),
-                              ),
                             ],
                           ),
                         ),