import 'dart:ffi'; import 'package:ffi/ffi.dart'; import 'package:cw_haven/api/signatures.dart'; import 'package:cw_haven/api/types.dart'; import 'package:cw_haven/api/haven_api.dart'; import 'package:cw_haven/api/structs/account_row.dart'; import 'package:cw_haven/api/wallet.dart'; final accountSizeNative = havenApi .lookup>('account_size') .asFunction(); final accountRefreshNative = havenApi .lookup>('account_refresh') .asFunction(); final accountGetAllNative = havenApi .lookup>('account_get_all') .asFunction(); final accountAddNewNative = havenApi .lookup>('account_add_row') .asFunction(); final accountSetLabelNative = havenApi .lookup>('account_set_label_row') .asFunction(); bool isUpdating = false; void refreshAccounts() { try { isUpdating = true; accountRefreshNative(); isUpdating = false; } catch (e) { isUpdating = false; rethrow; } } List getAllAccount() { final size = accountSizeNative(); final accountAddressesPointer = accountGetAllNative(); final accountAddresses = accountAddressesPointer.asTypedList(size); return accountAddresses .map((addr) => Pointer.fromAddress(addr).ref) .toList(); } void addAccountSync({required String label}) { final labelPointer = label.toNativeUtf8(); accountAddNewNative(labelPointer); calloc.free(labelPointer); } void setLabelForAccountSync({required int accountIndex, required String label}) { final labelPointer = label.toNativeUtf8(); accountSetLabelNative(accountIndex, labelPointer); calloc.free(labelPointer); } void _addAccount(String label) => addAccountSync(label: label); void _setLabelForAccount(Map args) { final label = args['label'] as String; final accountIndex = args['accountIndex'] as int; setLabelForAccountSync(label: label, accountIndex: accountIndex); } Future addAccount({required String label}) async { _addAccount(label); await store(); } Future setLabelForAccount({required int accountIndex, required String label}) async { _setLabelForAccount({'accountIndex': accountIndex, 'label': label}); await store(); }