Skip to content

Commit 1bb66f3

Browse files
TF-3308 Integrate super_drag_and_drop
1 parent 47b842d commit 1bb66f3

File tree

8 files changed

+453
-26
lines changed

8 files changed

+453
-26
lines changed

contact/pubspec.lock

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,10 +252,10 @@ packages:
252252
dependency: transitive
253253
description:
254254
name: device_info_plus
255-
sha256: "1d6e5a61674ba3a68fb048a7c7b4ff4bebfed8d7379dbe8f2b718231be9a7c95"
255+
sha256: "2c35b6d1682b028e42d07b3aee4b98fa62996c10bc12cb651ec856a80d6a761b"
256256
url: "https://pub.dev"
257257
source: hosted
258-
version: "8.1.0"
258+
version: "9.0.2"
259259
device_info_plus_platform_interface:
260260
dependency: transitive
261261
description:
@@ -655,6 +655,22 @@ packages:
655655
url: "https://pub.dev"
656656
source: hosted
657657
version: "1.0.4"
658+
irondash_engine_context:
659+
dependency: transitive
660+
description:
661+
name: irondash_engine_context
662+
sha256: "0e803321935ca7af1a88f1391be9edfdb940df800353670bfc694934c7643ff3"
663+
url: "https://pub.dev"
664+
source: hosted
665+
version: "0.4.1"
666+
irondash_message_channel:
667+
dependency: transitive
668+
description:
669+
name: irondash_message_channel
670+
sha256: "500daa1fbe679f7d28a5258df3ff47dab6de352e680dc93c1ca9eae1555d8db5"
671+
url: "https://pub.dev"
672+
source: hosted
673+
version: "0.3.1"
658674
jmap_dart_client:
659675
dependency: "direct main"
660676
description:
@@ -904,6 +920,14 @@ packages:
904920
url: "https://pub.dev"
905921
source: hosted
906922
version: "6.0.1"
923+
pixel_snap:
924+
dependency: transitive
925+
description:
926+
name: pixel_snap
927+
sha256: "677410ea37b07cd37ecb6d5e6c0d8d7615a7cf3bd92ba406fd1ac57e937d1fb0"
928+
url: "https://pub.dev"
929+
source: hosted
930+
version: "0.1.5"
907931
platform:
908932
dependency: transitive
909933
description:
@@ -1062,6 +1086,14 @@ packages:
10621086
url: "https://pub.dev"
10631087
source: hosted
10641088
version: "1.10.0"
1089+
sprintf:
1090+
dependency: transitive
1091+
description:
1092+
name: sprintf
1093+
sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23"
1094+
url: "https://pub.dev"
1095+
source: hosted
1096+
version: "7.0.0"
10651097
stack_trace:
10661098
dependency: transitive
10671099
description:
@@ -1094,6 +1126,30 @@ packages:
10941126
url: "https://pub.dev"
10951127
source: hosted
10961128
version: "1.2.0"
1129+
super_clipboard:
1130+
dependency: transitive
1131+
description:
1132+
name: super_clipboard
1133+
sha256: "1031873af66c796177eff073d1453c9f19a75e6f9b308ca0b950928d0a20aedd"
1134+
url: "https://pub.dev"
1135+
source: hosted
1136+
version: "0.7.3"
1137+
super_drag_and_drop:
1138+
dependency: transitive
1139+
description:
1140+
name: super_drag_and_drop
1141+
sha256: cb884e24f75127ddfba7908808ac265249075511c72584148345b259ca99788c
1142+
url: "https://pub.dev"
1143+
source: hosted
1144+
version: "0.7.0"
1145+
super_native_extensions:
1146+
dependency: transitive
1147+
description:
1148+
name: super_native_extensions
1149+
sha256: fd658e096e99ed7555c0727a8201dbe3b8afc0059742ac14bdcff115e08f589c
1150+
url: "https://pub.dev"
1151+
source: hosted
1152+
version: "0.7.3"
10971153
term_glyph:
10981154
dependency: transitive
10991155
description:
@@ -1222,6 +1278,14 @@ packages:
12221278
url: "https://pub.dev"
12231279
source: hosted
12241280
version: "3.1.0"
1281+
uuid:
1282+
dependency: transitive
1283+
description:
1284+
name: uuid
1285+
sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff
1286+
url: "https://pub.dev"
1287+
source: hosted
1288+
version: "4.5.1"
12251289
vector_graphics:
12261290
dependency: transitive
12271291
description:
@@ -1294,6 +1358,14 @@ packages:
12941358
url: "https://pub.dev"
12951359
source: hosted
12961360
version: "4.1.4"
1361+
win32_registry:
1362+
dependency: transitive
1363+
description:
1364+
name: win32_registry
1365+
sha256: "1c52f994bdccb77103a6231ad4ea331a244dbcef5d1f37d8462f713143b0bfae"
1366+
url: "https://pub.dev"
1367+
source: hosted
1368+
version: "1.1.0"
12971369
xdg_directories:
12981370
dependency: transitive
12991371
description:
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import 'dart:async';
2+
3+
import 'package:collection/collection.dart';
4+
import 'package:core/presentation/extensions/list_nullable_extensions.dart';
5+
import 'package:core/utils/app_logger.dart';
6+
import 'package:flutter/material.dart';
7+
import 'package:super_drag_and_drop/super_drag_and_drop.dart';
8+
import 'package:universal_html/html.dart' hide VoidCallback;
9+
10+
typedef OnSuperTextDrop = void Function(String value);
11+
12+
class TextDropZoneWeb extends StatefulWidget {
13+
const TextDropZoneWeb({
14+
super.key,
15+
required this.child,
16+
this.onHover,
17+
this.onLeave,
18+
this.onDrop,
19+
});
20+
21+
final Widget child;
22+
final VoidCallback? onHover;
23+
final VoidCallback? onLeave;
24+
final OnSuperTextDrop? onDrop;
25+
26+
@override
27+
State<TextDropZoneWeb> createState() => _TextDropZoneWebState();
28+
}
29+
30+
class _TextDropZoneWebState extends State<TextDropZoneWeb> {
31+
bool _textIsDragging = false;
32+
StreamSubscription? _dragEnterSubscription;
33+
StreamSubscription? _dragOverSubscription;
34+
StreamSubscription? _dropSubscription;
35+
StreamSubscription? _dragLeaveSubscription;
36+
37+
@override
38+
void initState() {
39+
super.initState();
40+
WidgetsBinding.instance.addPostFrameCallback((_) {
41+
_dragEnterSubscription = window.onDragEnter.listen((event) {
42+
setState(() {
43+
_textIsDragging = event.dataTransfer.types?.validateFilesTransfer != true;
44+
});
45+
});
46+
_dragOverSubscription = window.onDragOver.listen((event) {
47+
setState(() {
48+
_textIsDragging = event.dataTransfer.types?.validateFilesTransfer != true;
49+
});
50+
});
51+
_dropSubscription = window.onDrop.listen((event) {
52+
setState(() {
53+
_textIsDragging = false;
54+
});
55+
});
56+
_dragLeaveSubscription = window.onDragLeave.listen((event) {
57+
setState(() {
58+
_textIsDragging = false;
59+
});
60+
});
61+
});
62+
}
63+
64+
@override
65+
void dispose() {
66+
_dragEnterSubscription?.cancel();
67+
_dragOverSubscription?.cancel();
68+
_dropSubscription?.cancel();
69+
_dragLeaveSubscription?.cancel();
70+
super.dispose();
71+
}
72+
73+
@override
74+
Widget build(BuildContext context) {
75+
if (!_textIsDragging) return widget.child;
76+
77+
return DropRegion(
78+
formats: const [Formats.plainText],
79+
onDropOver: (dropOverEvent) {
80+
final dragItem = dropOverEvent.session.items.firstOrNull;
81+
if (dragItem == null || !dragItem.canProvide(Formats.plainText)) {
82+
return DropOperation.none;
83+
}
84+
85+
widget.onHover?.call();
86+
87+
return DropOperation.copy;
88+
},
89+
onDropLeave: (_) => widget.onLeave?.call(),
90+
onPerformDrop: (performDropEvent) async {
91+
final item = performDropEvent.session.items.firstOrNull;
92+
if (item == null) return;
93+
94+
item.dataReader?.getValue<String>(
95+
Formats.plainText,
96+
(value) {
97+
log('TextDropZoneWeb::onPerformDrop:value = $value');
98+
if (value == null) return;
99+
widget.onDrop?.call(value);
100+
},
101+
onError: (error) {
102+
logError('TextDropZoneWeb::onPerformDrop:error: $error');
103+
}
104+
);
105+
},
106+
child: widget.child,
107+
);
108+
}
109+
}

core/pubspec.lock

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,10 +245,10 @@ packages:
245245
dependency: "direct main"
246246
description:
247247
name: device_info_plus
248-
sha256: "1d6e5a61674ba3a68fb048a7c7b4ff4bebfed8d7379dbe8f2b718231be9a7c95"
248+
sha256: "2c35b6d1682b028e42d07b3aee4b98fa62996c10bc12cb651ec856a80d6a761b"
249249
url: "https://pub.dev"
250250
source: hosted
251-
version: "8.1.0"
251+
version: "9.0.2"
252252
device_info_plus_platform_interface:
253253
dependency: transitive
254254
description:
@@ -640,6 +640,22 @@ packages:
640640
url: "https://pub.dev"
641641
source: hosted
642642
version: "1.0.4"
643+
irondash_engine_context:
644+
dependency: transitive
645+
description:
646+
name: irondash_engine_context
647+
sha256: "0e803321935ca7af1a88f1391be9edfdb940df800353670bfc694934c7643ff3"
648+
url: "https://pub.dev"
649+
source: hosted
650+
version: "0.4.1"
651+
irondash_message_channel:
652+
dependency: transitive
653+
description:
654+
name: irondash_message_channel
655+
sha256: "500daa1fbe679f7d28a5258df3ff47dab6de352e680dc93c1ca9eae1555d8db5"
656+
url: "https://pub.dev"
657+
source: hosted
658+
version: "0.3.1"
643659
js:
644660
dependency: transitive
645661
description:
@@ -865,6 +881,14 @@ packages:
865881
url: "https://pub.dev"
866882
source: hosted
867883
version: "6.0.1"
884+
pixel_snap:
885+
dependency: transitive
886+
description:
887+
name: pixel_snap
888+
sha256: "677410ea37b07cd37ecb6d5e6c0d8d7615a7cf3bd92ba406fd1ac57e937d1fb0"
889+
url: "https://pub.dev"
890+
source: hosted
891+
version: "0.1.5"
868892
platform:
869893
dependency: transitive
870894
description:
@@ -1007,6 +1031,14 @@ packages:
10071031
url: "https://pub.dev"
10081032
source: hosted
10091033
version: "1.10.0"
1034+
sprintf:
1035+
dependency: transitive
1036+
description:
1037+
name: sprintf
1038+
sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23"
1039+
url: "https://pub.dev"
1040+
source: hosted
1041+
version: "7.0.0"
10101042
stack_trace:
10111043
dependency: transitive
10121044
description:
@@ -1039,6 +1071,30 @@ packages:
10391071
url: "https://pub.dev"
10401072
source: hosted
10411073
version: "1.2.0"
1074+
super_clipboard:
1075+
dependency: transitive
1076+
description:
1077+
name: super_clipboard
1078+
sha256: "1031873af66c796177eff073d1453c9f19a75e6f9b308ca0b950928d0a20aedd"
1079+
url: "https://pub.dev"
1080+
source: hosted
1081+
version: "0.7.3"
1082+
super_drag_and_drop:
1083+
dependency: "direct main"
1084+
description:
1085+
name: super_drag_and_drop
1086+
sha256: cb884e24f75127ddfba7908808ac265249075511c72584148345b259ca99788c
1087+
url: "https://pub.dev"
1088+
source: hosted
1089+
version: "0.7.0"
1090+
super_native_extensions:
1091+
dependency: transitive
1092+
description:
1093+
name: super_native_extensions
1094+
sha256: fd658e096e99ed7555c0727a8201dbe3b8afc0059742ac14bdcff115e08f589c
1095+
url: "https://pub.dev"
1096+
source: hosted
1097+
version: "0.7.3"
10421098
term_glyph:
10431099
dependency: transitive
10441100
description:
@@ -1159,6 +1215,14 @@ packages:
11591215
url: "https://pub.dev"
11601216
source: hosted
11611217
version: "3.1.0"
1218+
uuid:
1219+
dependency: transitive
1220+
description:
1221+
name: uuid
1222+
sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff
1223+
url: "https://pub.dev"
1224+
source: hosted
1225+
version: "4.5.1"
11621226
vector_graphics:
11631227
dependency: transitive
11641228
description:
@@ -1231,6 +1295,14 @@ packages:
12311295
url: "https://pub.dev"
12321296
source: hosted
12331297
version: "4.1.4"
1298+
win32_registry:
1299+
dependency: transitive
1300+
description:
1301+
name: win32_registry
1302+
sha256: "1c52f994bdccb77103a6231ad4ea331a244dbcef5d1f37d8462f713143b0bfae"
1303+
url: "https://pub.dev"
1304+
source: hosted
1305+
version: "1.1.0"
12341306
xdg_directories:
12351307
dependency: transitive
12361308
description:

core/pubspec.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ dependencies:
6060

6161
get: 4.6.6
6262

63-
device_info_plus: 8.1.0
63+
device_info_plus: 9.0.2
6464

6565
flutter_inappwebview: 6.0.0
6666

@@ -100,6 +100,8 @@ dependencies:
100100

101101
debounce_throttle: 2.0.0
102102

103+
super_drag_and_drop: 0.7.0
104+
103105
dev_dependencies:
104106
flutter_test:
105107
sdk: flutter

0 commit comments

Comments
 (0)