Skip to content

Commit 7331771

Browse files
committed
added ping and websocket manager
1 parent 248010f commit 7331771

16 files changed

+416
-191
lines changed

lib/providers/collection_providers.dart

Lines changed: 138 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'dart:developer';
2+
import 'dart:io';
23

34
import 'package:apidash_core/apidash_core.dart';
45
import 'package:flutter/material.dart';
@@ -29,21 +30,24 @@ final requestSequenceProvider = StateProvider<List<String>>((ref) {
2930
});
3031

3132
final httpClientManager = HttpClientManager();
33+
final WebSocketManager webSocketManager = WebSocketManager();
3234

3335
final StateNotifierProvider<CollectionStateNotifier, Map<String, RequestModel>?>
3436
collectionStateNotifierProvider =
3537
StateNotifierProvider((ref) => CollectionStateNotifier(
3638
ref,
3739
hiveHandler,
3840
httpClientManager,
39-
));
41+
webSocketManager
42+
));
4043

4144
class CollectionStateNotifier
4245
extends StateNotifier<Map<String, RequestModel>?> {
4346
CollectionStateNotifier(
4447
this.ref,
4548
this.hiveHandler,
4649
this.httpClientManager,
50+
this.webSocketManager
4751
) : super(null) {
4852
var status = loadData();
4953
Future.microtask(() {
@@ -61,6 +65,8 @@ class CollectionStateNotifier
6165
final HiveHandler hiveHandler;
6266
final baseHttpResponseModel = const HttpResponseModel();
6367
final HttpClientManager httpClientManager;
68+
final WebSocketManager webSocketManager;
69+
6470

6571
bool hasId(String id) => state?.keys.contains(id) ?? false;
6672

@@ -471,8 +477,8 @@ class CollectionStateNotifier
471477
return;
472478
}
473479
RequestModel? requestModel = state![requestId];
474-
475-
if (requestModel?.webSocketRequestModel== null) {
480+
var currentWebSocketRequestModel = requestModel!.webSocketRequestModel;
481+
if (currentWebSocketRequestModel == null) {
476482
return;
477483
}
478484

@@ -482,20 +488,51 @@ class CollectionStateNotifier
482488

483489
// set current model's isWorking to true and update state
484490
var map = {...state!};
485-
map[requestId] = requestModel!.copyWith(
491+
map[requestId] = requestModel.copyWith(
486492
isWorking: true,
487493
);
488494
state = map;
489495

490496

491497

492-
final client = httpClientManager.createWebSocketClient(requestId);
493-
await client.sendText(requestModel.webSocketRequestModel!);
498+
String message = currentWebSocketRequestModel.message ?? '';
499+
(String?,DateTime?,String?) frame = await webSocketManager.sendText(requestId,message);
500+
501+
var newWebSocketResponseModel;
502+
if(frame.$1 != null){
503+
newWebSocketResponseModel = requestModel.webSocketResponseModel!.copyWith(
504+
frames: [
505+
...?requestModel.webSocketResponseModel?.frames,
506+
WebSocketFrameModel(
507+
id: getNewUuid(),
508+
message:frame.$1!,
509+
timeStamp: frame.$2,
510+
isSend: true
511+
),
512+
],
513+
);
514+
515+
}else if(frame.$3 != null){
516+
newWebSocketResponseModel = requestModel.webSocketResponseModel!.copyWith(
517+
frames: [
518+
...?requestModel.webSocketResponseModel?.frames,
519+
WebSocketFrameModel(
520+
id: getNewUuid(),
521+
message:frame.$3!,
522+
timeStamp: null,
523+
isSend: true
524+
),
525+
],
526+
);
527+
528+
529+
}
530+
531+
494532

495533

496534
final newRequestModel = requestModel.copyWith(
497-
webSocketRequestModel: requestModel.webSocketRequestModel,
498-
isWorking: false,
535+
webSocketResponseModel: newWebSocketResponseModel,
499536
);
500537
// update state with response data
501538
map = {...state!};
@@ -517,6 +554,7 @@ class CollectionStateNotifier
517554

518555
RequestModel? requestModel = state![requestId];
519556

557+
520558
// if (requestModel?.webSocketRequestModel == null) {
521559
// print("no web socket request model");
522560
// return;
@@ -525,48 +563,61 @@ class CollectionStateNotifier
525563
print("entered null");
526564
return;
527565
}
528-
529-
final client = httpClientManager.createWebSocketClient(requestId);
566+
webSocketManager.createWebSocketClient(requestId);
567+
// webSocketClient.pingDuration = Duration(seconds: 5);
530568
final url = requestModel!.webSocketRequestModel!.url;
531-
(String?,DateTime?) result = await client.connect(url);
569+
(String?,DateTime?) result = await webSocketManager.connect(requestId,url);
532570

533571
var map = {...state!};
534572
map[requestId] = requestModel.copyWith(
535573
isWorking: result.$1 == "Connected",
536574
sendingTime: result.$2,
537-
webSocketResponseModel: WebSocketResponseModel(),
575+
webSocketResponseModel: const WebSocketResponseModel(),
538576
);
577+
539578
state = map;
540579

541580

542-
client.listen(
581+
webSocketManager.listen(
582+
requestId,
543583
(message) async{
544584
var map = {...state!};
545585
RequestModel? requestModel = state![requestId];
546586
WebSocketResponseModel webSocketResponseModel = requestModel!.webSocketResponseModel!;
547587
WebSocketResponseModel newWebSocketResponseModel = webSocketResponseModel.copyWith(
548588
frames: [...webSocketResponseModel.frames, WebSocketFrameModel(
549-
id: '1',
589+
id: getNewUuid(),
550590
message: message,
551591
timeStamp: DateTime.now(),
592+
isSend: false
552593
)]
553594
);
554-
map[requestId] = requestModel.copyWith(
595+
var newRequestModel = requestModel.copyWith(
555596
webSocketResponseModel: newWebSocketResponseModel,
556597
);
557-
state = map;
598+
599+
600+
map = {...state!};
601+
map[requestId] = newRequestModel;
602+
state = map;
558603
print(message);
559604
},
560605
onError: (error) async{
606+
print("error found");
607+
561608
// var map = {...state!};
562609
// map[requestId] = requestModel.copyWith(
563610
// responseStatus: -1,
564611
// message: error.toString(),
565612
// isWorking: false,
566613
// );
567614
// state = map;
615+
568616
},
569617
onDone: () async{
618+
print("Connection done");
619+
620+
570621
// var map = {...state!};
571622
// map[requestId] = requestModel.copyWith(
572623
// responseStatus: 200,
@@ -575,36 +626,85 @@ class CollectionStateNotifier
575626
// );
576627
// state = map;
577628
},
629+
cancelOnError: false,
578630
);
579631
}
632+
Future<void> disconnect() async {
633+
final requestId = ref.read(selectedIdStateProvider);
634+
if (requestId == null || state == null) {
635+
print(requestId);
636+
return;
637+
}
580638

581-
// ignore: unused_element
582-
// Future<void> disconnect() async {
583-
// print("connect fired");
584-
// final requestId = ref.read(selectedIdStateProvider);
585-
// ref.read(codePaneVisibleStateProvider.notifier).state = false;
586-
// if (requestId == null || state == null) {
587-
// print(requestId);
588-
// return;
589-
// }
590-
639+
webSocketManager.disconnect(requestId);
591640

592641

593642

594-
// RequestModel? requestModel = state![requestId];
643+
RequestModel? requestModel = state![requestId];
644+
WebSocketRequestModel webSocketRequestModel = requestModel!.webSocketRequestModel!;
645+
WebSocketRequestModel newWebSocketRequestModel = webSocketRequestModel.copyWith(
646+
isConnected: false
647+
);
648+
649+
var newRequestModel = requestModel.copyWith(
650+
isWorking: false,
651+
webSocketRequestModel: newWebSocketRequestModel,
652+
653+
);
654+
655+
656+
var map = {...state!};
657+
map[requestId] = newRequestModel;
658+
state = map;
595659

660+
}
661+
662+
663+
void deleteAllFrames(){
664+
final requestId = ref.read(selectedIdStateProvider);
665+
if (requestId == null || state == null) {
666+
print(requestId);
667+
return;
668+
}
669+
RequestModel? requestModel = state![requestId];
670+
WebSocketResponseModel webSocketResponseModel = requestModel!.webSocketResponseModel!;
671+
WebSocketResponseModel newWebSocketResponseModel = webSocketResponseModel.copyWith(
672+
frames: [],
673+
);
596674

597-
// // if (requestModel?.webSocketRequestModel == null) {
598-
// // print("no web socket request model");
599-
// // return;
600-
// // }
675+
var newRequestModel = requestModel.copyWith(
676+
webSocketResponseModel: newWebSocketResponseModel,
677+
);
678+
var map = {...state!};
679+
map[requestId] = newRequestModel;
680+
state = map;
681+
}
601682

602-
// final client = httpClientManager.(requestId);
683+
void deleteFrame(String id){
684+
final requestId = ref.read(selectedIdStateProvider);
685+
if (requestId == null || state == null) {
686+
print(requestId);
687+
return;
688+
}
689+
RequestModel? requestModel = state![requestId];
690+
if (requestModel == null || state == null) {
691+
print(requestId);
692+
return;
693+
}
694+
WebSocketResponseModel webSocketResponseModel = requestModel!.webSocketResponseModel!;
695+
List<WebSocketFrameModel> newFrames = requestModel!.webSocketResponseModel!.frames.where((element) => element.id != id).toList();
696+
WebSocketResponseModel newWebSocketResponseModel = webSocketResponseModel.copyWith(
697+
frames: newFrames,
698+
);
699+
700+
var newRequestModel = requestModel.copyWith(
701+
webSocketResponseModel: newWebSocketResponseModel,
702+
);
703+
var map = {...state!};
704+
map[requestId] = newRequestModel;
705+
state = map;
706+
707+
}
603708

604-
// var map = {...state!};
605-
// map[requestId] = requestModel!.copyWith(
606-
// isWorking: false,
607-
// );
608-
// state = map;
609-
// }
709+
610710
}

lib/screens/home_page/editor_pane/details_card/response_pane.dart

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,18 @@ class ResponsePane extends ConsumerWidget{
2121
selectedRequestModelProvider.select((value) => value?.responseStatus));
2222
final message = ref
2323
.watch(selectedRequestModelProvider.select((value) => value?.message));
24+
final apiType = ref
25+
.watch(selectedRequestModelProvider.select((value) => value?.apiType));
2426

2527
if (isWorking) {
26-
return const ResponseDetails();
28+
// if(apiType == APIType.webSocket ){
29+
// return const SendingWidget(
30+
// startSendingTime: null,
31+
// );
32+
// }else{
33+
34+
// }
35+
return const ResponseDetails();
2736
// return SendingWidget(
2837
// startSendingTime: startSendingTime,
2938
// );
@@ -149,6 +158,10 @@ class _WebsocketResponseViewState extends ConsumerState<WebsocketResponseView> {
149158
setState(() {
150159
_controller.jumpTo(_controller.position.maxScrollExtent);
151160
});
161+
}else{
162+
setState(() {
163+
_controller.jumpTo(_controller.offset);
164+
});
152165
}
153166
});
154167
}
@@ -171,6 +184,7 @@ class _WebsocketResponseViewState extends ConsumerState<WebsocketResponseView> {
171184
itemBuilder: (context, index) {
172185
return WebsocketFrame(
173186
websocketFrame: frames[frames.length-index-1],
187+
ref: ref,
174188
);
175189
},
176190
);

lib/screens/home_page/editor_pane/url_card.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ class ConnectionRequestButton extends ConsumerWidget {
173173
},
174174
onDisconnect: () {
175175
onTap?.call();
176-
ref.read(collectionStateNotifierProvider.notifier).cancelRequest();
176+
print("disconnected inside disconnect");
177+
ref.read(collectionStateNotifierProvider.notifier).disconnect();
177178

178179
},
179180
);

lib/screens/settings_page.dart

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -224,20 +224,25 @@ class SettingsPage extends ConsumerWidget {
224224
),
225225
),
226226
),
227-
ListTile(
227+
228+
ListTile(
228229
hoverColor: kColorTransparent,
229-
title: const Text('Maximum Reconnection Attempts'),
230+
title: const Text('Interval Between Ping Requests'),
230231
subtitle: Text(
231-
'Your request history will be retained${settings.historyRetentionPeriod == HistoryRetentionPeriod.forever ? "" : " for"} ${settings.historyRetentionPeriod.label}'),
232-
trailing: HistoryRetentionPopupMenu(
233-
value: settings.historyRetentionPeriod,
232+
'Current interval: seconds'),
233+
trailing: SizedBox(
234+
width: 120,
235+
child: TextField(
236+
controller: TextEditingController(text: "22"),
237+
keyboardType: TextInputType.number,
234238
onChanged: (value) {
235-
ref
236-
.read(settingsProvider.notifier)
237-
.update(historyRetentionPeriod: value);
239+
// ref
240+
// .read(settingsProvider.notifier)
241+
// .update(pingInterval: int.parse(value));
238242
},
243+
),
244+
),
239245
),
240-
),
241246
ListTile(
242247
title: const Text('About'),
243248
subtitle: const Text(

0 commit comments

Comments
 (0)