From cf8a20f8db5ceb879c369d3f0cd69721af63a941 Mon Sep 17 00:00:00 2001
From: Konstantin Ullrich <konstantinullrich12@gmail.com>
Date: Wed, 22 May 2024 13:14:23 +0200
Subject: [PATCH] Close the wallet when the wallet gets changed

---
 cw_monero/lib/monero_wallet.dart         | 41 ++++++++++++++----------
 cw_monero/lib/monero_wallet_service.dart | 19 -----------
 2 files changed, 24 insertions(+), 36 deletions(-)

diff --git a/cw_monero/lib/monero_wallet.dart b/cw_monero/lib/monero_wallet.dart
index f5f786d27..a823ed9f6 100644
--- a/cw_monero/lib/monero_wallet.dart
+++ b/cw_monero/lib/monero_wallet.dart
@@ -147,10 +147,27 @@ abstract class MoneroWalletBase
   Future<void>? updateBalance() => null;
 
   @override
-  void close() {
+  void close() async {
     _listener?.stop();
     _onAccountChangeReaction?.reaction.dispose();
     _autoSaveTimer?.cancel();
+
+    final currentWalletDirPath = await pathForWalletDir(name: name, type: type);
+    if (openedWalletsByPath["$currentWalletDirPath/$name"] != null) {
+      // NOTE: this is realistically only required on windows.
+      print("closing wallet");
+      final wmaddr = wmPtr.address;
+      final waddr = openedWalletsByPath["$currentWalletDirPath/$name"]!.address;
+      await Isolate.run(() {
+        monero.WalletManager_closeWallet(
+            Pointer.fromAddress(wmaddr),
+            Pointer.fromAddress(waddr),
+            true
+        );
+      });
+      openedWalletsByPath.remove("$currentWalletDirPath/$name");
+      print("wallet closed");
+    }
   }
 
   @override
@@ -328,28 +345,18 @@ abstract class MoneroWalletBase
     }
 
     await walletAddresses.updateAddressesInBox();
-    await backupWalletFiles(name);
     await monero_wallet.store();
+    try {
+      await backupWalletFiles(name);
+    } catch (e) {
+      print("¯\\_(ツ)_/¯");
+      print(e);
+    }
   }
 
   @override
   Future<void> renameWalletFiles(String newWalletName) async {
     final currentWalletDirPath = await pathForWalletDir(name: name, type: type);
-    if (openedWalletsByPath[currentWalletDirPath] != null) {
-      // NOTE: this is realistically only required on windows.
-      print("closing wallet");
-      final wmaddr = wmPtr!.address;
-      final waddr = openedWalletsByPath[currentWalletDirPath]!.address;
-      await Isolate.run(() {
-        monero.WalletManager_closeWallet(
-          Pointer.fromAddress(wmaddr),
-          Pointer.fromAddress(waddr),
-          true
-        );
-      });
-      openedWalletsByPath.remove(currentWalletDirPath);
-      print("wallet closed");
-    }
     try {
       // -- rename the waller folder --
       final currentWalletDir = Directory(await pathForWalletDir(name: name, type: type));
diff --git a/cw_monero/lib/monero_wallet_service.dart b/cw_monero/lib/monero_wallet_service.dart
index 1933bab79..bc59499f9 100644
--- a/cw_monero/lib/monero_wallet_service.dart
+++ b/cw_monero/lib/monero_wallet_service.dart
@@ -1,6 +1,4 @@
-import 'dart:ffi';
 import 'dart:io';
-import 'dart:isolate';
 import 'package:cw_core/monero_wallet_utils.dart';
 import 'package:cw_core/pathForWallet.dart';
 import 'package:cw_core/unspent_coins_info.dart';
@@ -16,8 +14,6 @@ import 'package:cw_monero/monero_wallet.dart';
 import 'package:flutter/widgets.dart';
 import 'package:hive/hive.dart';
 import 'package:polyseed/polyseed.dart';
-import 'package:cw_monero/api/wallet_manager.dart';
-import 'package:monero/monero.dart' as monero;
 
 class MoneroNewWalletCredentials extends WalletCredentials {
   MoneroNewWalletCredentials(
@@ -178,21 +174,6 @@ class MoneroWalletService extends WalletService<MoneroNewWalletCredentials,
   @override
   Future<void> remove(String wallet) async {
     final path = await pathForWalletDir(name: wallet, type: getType());
-    if (openedWalletsByPath[path] != null) {
-      // NOTE: this is realistically only required on windows.
-      print("closing wallet");
-      final wmaddr = wmPtr!.address;
-      final waddr = openedWalletsByPath[path]!.address;
-      await Isolate.run(() {
-        monero.WalletManager_closeWallet(
-            Pointer.fromAddress(wmaddr),
-            Pointer.fromAddress(waddr),
-            false
-        );
-      });
-      openedWalletsByPath.remove(path);
-      print("wallet closed");
-    }
     final file = Directory(path);
     final isExist = file.existsSync();