Skip to content
Snippets Groups Projects
shared_prefs.dart 2.46 KiB
Newer Older
vjrj's avatar
vjrj committed
import 'dart:convert';
vjrj's avatar
vjrj committed
import 'dart:typed_data';

import 'package:durt/durt.dart';
import 'package:shared_preferences/shared_preferences.dart';

vjrj's avatar
vjrj committed
import 'data/models/cesium_card.dart';
vjrj's avatar
vjrj committed
import 'g1/g1_helper.dart';
vjrj's avatar
vjrj committed
import 'ui/logger.dart';
vjrj's avatar
vjrj committed

class SharedPreferencesHelper {
  factory SharedPreferencesHelper() {
    return _instance;
  }

  SharedPreferencesHelper._internal() {
    SharedPreferences.getInstance().then((SharedPreferences value) {
      _prefs = value;
    });
  }

vjrj's avatar
vjrj committed
  List<CesiumCard> cesiumCards = <CesiumCard>[];

vjrj's avatar
vjrj committed
  static final SharedPreferencesHelper _instance =
      SharedPreferencesHelper._internal();

  late SharedPreferences _prefs;

  static const String _seedKey = 'seed';
  static const String _pubKey = 'pub';

  Future<void> init() async {
    _prefs = await SharedPreferences.getInstance();
vjrj's avatar
vjrj committed

    final String? json = _prefs.getString('cesiumCards');
    if (json != null) {
      final List<dynamic> list = jsonDecode(json) as List<dynamic>;
      cesiumCards = list
          .map((dynamic e) => CesiumCard.fromJson(e as Map<String, dynamic>))
          .toList();
    }
vjrj's avatar
vjrj committed
  void addCesiumCard(CesiumCard cesiumCard) {
    cesiumCards.add(cesiumCard);
    saveCesiumCards();
  }

  void removeCesiumCard(int index) {
    cesiumCards.removeAt(index);
    saveCesiumCards();
  }

  Future<void> saveCesiumCards() async {
    final String json =
        jsonEncode(cesiumCards.map((CesiumCard e) => e.toJson()).toList());
    await _prefs.setString('cesiumCards', json);
  }

/* WIP part */

// I'll only use shared prefs for the duniter seed
vjrj's avatar
vjrj committed
  Future<void> _saveString(String key, String value) async {
    await _prefs.setString(key, value);
  }

  Future<CesiumWallet> getWallet() async {
    String? s = _getString(_seedKey);
    if (s == null) {
      final Uint8List uS = generateUintSeed();
      s = seedToString(uS);
      await _saveString(_seedKey, s);
      final CesiumWallet wallet = CesiumWallet.fromSeed(uS);
      logger('Generated public key: ${wallet.pubkey}');
      await _saveString(_pubKey, wallet.pubkey);
      return wallet;
    } else {
      return CesiumWallet.fromSeed(seedFromString(s));
    }
  }

  String getPubKey() {
    // At this point should exists
    final String? pubKey = _prefs.getString(_pubKey);
    return pubKey!;
vjrj's avatar
vjrj committed
  }

  String? _getString(String key) {
    return _prefs.getString(key);
  }

  Future<void> setKeys(String pubKey, String seed) async {
    await _saveString(_seedKey, seed);
    await _saveString(_pubKey, pubKey);
  }