Skip to content

Commit 1819f50

Browse files
committed
Rebuild connection URI after pairing expiration
1 parent 768af05 commit 1819f50

3 files changed

Lines changed: 44 additions & 30 deletions

File tree

lib/services/walletconnect_modal/i_walletconnect_modal_service.dart

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:event/event.dart';
12
import 'package:flutter/material.dart';
23
import 'package:walletconnect_flutter_v2/walletconnect_flutter_v2.dart';
34
import 'package:walletconnect_modal_flutter/models/listings.dart';
@@ -33,8 +34,9 @@ abstract class IWalletConnectModalService implements ChangeNotifier {
3334
/// This is only available after the [open] function is called.
3435
String? get wcUri;
3536

36-
/// The service used to fetch wallet listings from the explorer API.
37-
// abstract final IExplorerService explorerService;
37+
final Event<EventArgs> onPairingExpire = Event();
38+
39+
Future<void> clearPreviousInactivePairings();
3840

3941
/// Sets up the explorer and the web3App if they already been initialized.
4042
Future<void> init();
@@ -55,15 +57,11 @@ abstract class IWalletConnectModalService implements ChangeNotifier {
5557

5658
/// Disconnects the session and pairing, if any.
5759
/// If there is no session, this does nothing.
58-
Future<void> disconnect({
59-
bool disconnectAllSessions = true,
60-
});
60+
Future<void> disconnect({bool disconnectAllSessions = true});
6161

6262
Future<void> launchCurrentWallet();
6363

64-
Future<void> connectWallet({
65-
required WalletData walletData,
66-
});
64+
Future<void> connectWallet({required WalletData walletData});
6765

6866
/// The required namespaces that will be used when connecting to the wallet
6967
Map<String, RequiredNamespace> get requiredNamespaces;

lib/services/walletconnect_modal/walletconnect_modal_service.dart

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ class WalletConnectModalService extends ChangeNotifier
7070
@override
7171
Map<String, RequiredNamespace> get optionalNamespaces => _optionalNamespaces;
7272

73+
@override
74+
final Event<EventArgs> onPairingExpire = Event();
75+
7376
ConnectResponse? connectResponse;
7477
Future<SessionData>? get sessionFuture => connectResponse?.session.future;
7578
BuildContext? context;
@@ -142,6 +145,8 @@ class WalletConnectModalService extends ChangeNotifier
142145
await WalletConnectModalServices.init();
143146
} catch (_) {}
144147

148+
await clearPreviousInactivePairings();
149+
145150
if (_web3App!.sessions.getAll().isNotEmpty) {
146151
_isConnected = true;
147152
_session = _web3App!.sessions.getAll().first;
@@ -155,6 +160,15 @@ class WalletConnectModalService extends ChangeNotifier
155160
notifyListeners();
156161
}
157162

163+
@override
164+
Future<void> clearPreviousInactivePairings() async {
165+
for (var pairing in _web3App!.pairings.getAll()) {
166+
if (!pairing.active) {
167+
await _web3App!.core.expirer.expire(pairing.topic);
168+
}
169+
}
170+
}
171+
158172
@override
159173
// ignore: prefer_void_to_null
160174
Future<Null> onDispose() async {
@@ -176,12 +190,8 @@ class WalletConnectModalService extends ChangeNotifier
176190

177191
_isOpen = true;
178192

179-
rebuildConnectionUri();
180-
181193
// Reset the explorer
182-
explorerService.instance!.filterList(
183-
query: '',
184-
);
194+
explorerService.instance!.filterList(query: '');
185195
widgetStack.instance.clear();
186196

187197
this.context = context;
@@ -341,17 +351,22 @@ class WalletConnectModalService extends ChangeNotifier
341351
}
342352
}
343353

354+
_web3App!.core.pairing.onPairingExpire.subscribe(_onPairingExpire);
344355
connectResponse = await web3App!.connect(
345356
requiredNamespaces: requiredNamespaces,
346357
optionalNamespaces: optionalNamespaces,
347358
);
348359

349360
notifyListeners();
350-
351361
awaitConnectResponse();
352362
}
353363
}
354364

365+
void _onPairingExpire(PairingEvent? args) async {
366+
_web3App!.core.pairing.onPairingExpire.unsubscribe(_onPairingExpire);
367+
onPairingExpire.broadcast();
368+
}
369+
355370
bool _connectingWallet = false;
356371

357372
@override

lib/widgets/qr_code_widget.dart

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'dart:math';
22

3+
import 'package:event/event.dart';
34
import 'package:flutter/material.dart';
45
import 'package:qr_flutter/qr_flutter.dart';
56
import 'package:walletconnect_modal_flutter/models/walletconnect_modal_theme_data.dart';
@@ -28,32 +29,32 @@ class _QRCodeWidgetState extends State<QRCodeWidget> {
2829
@override
2930
void initState() {
3031
super.initState();
31-
// _qrCode = widget.service.wcUri!;
32-
33-
_initialize();
34-
35-
// widget.service.addListener(_qrCodeChanged);
32+
WidgetsBinding.instance.addPostFrameCallback((_) async {
33+
widget.service.addListener(_rebuild);
34+
widget.service.onPairingExpire.subscribe(_onPairingExpire);
35+
await widget.service.rebuildConnectionUri();
36+
});
3637
}
3738

38-
Future<void> _initialize() async {
39-
if (_initialized) {
40-
return;
41-
}
42-
39+
void _onPairingExpire(EventArgs? args) async {
4340
await widget.service.rebuildConnectionUri();
41+
}
4442

43+
@override
44+
void dispose() {
45+
widget.service.onPairingExpire.unsubscribe(_onPairingExpire);
46+
widget.service.removeListener(_rebuild);
47+
widget.service.clearPreviousInactivePairings();
48+
super.dispose();
49+
}
50+
51+
void _rebuild() {
4552
setState(() {
4653
_qrCode = widget.service.wcUri!;
4754
_initialized = true;
4855
});
4956
}
5057

51-
// @override
52-
// void dispose() {
53-
// widget.service.removeListener(_qrCodeChanged);
54-
// super.dispose();
55-
// }
56-
5758
@override
5859
Widget build(BuildContext context) {
5960
WalletConnectModalThemeData themeData =

0 commit comments

Comments
 (0)