Skip to content

Commit e619d6c

Browse files
TF-3308 Integrate super_drag_and_drop
1 parent 0a8d1b2 commit e619d6c

File tree

8 files changed

+428
-27
lines changed

8 files changed

+428
-27
lines changed

contact/pubspec.lock

Lines changed: 66 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: "499c61743e13909c13374a8c209075385858c614b9c0f2487b5f9995eeaf7369"
255+
sha256: "2c35b6d1682b028e42d07b3aee4b98fa62996c10bc12cb651ec856a80d6a761b"
256256
url: "https://pub.dev"
257257
source: hosted
258-
version: "9.0.1"
258+
version: "9.0.2"
259259
device_info_plus_platform_interface:
260260
dependency: transitive
261261
description:
@@ -664,6 +664,22 @@ packages:
664664
url: "https://pub.dev"
665665
source: hosted
666666
version: "1.0.4"
667+
irondash_engine_context:
668+
dependency: transitive
669+
description:
670+
name: irondash_engine_context
671+
sha256: "0e803321935ca7af1a88f1391be9edfdb940df800353670bfc694934c7643ff3"
672+
url: "https://pub.dev"
673+
source: hosted
674+
version: "0.4.1"
675+
irondash_message_channel:
676+
dependency: transitive
677+
description:
678+
name: irondash_message_channel
679+
sha256: "500daa1fbe679f7d28a5258df3ff47dab6de352e680dc93c1ca9eae1555d8db5"
680+
url: "https://pub.dev"
681+
source: hosted
682+
version: "0.3.1"
667683
jmap_dart_client:
668684
dependency: "direct main"
669685
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:
@@ -1070,6 +1094,14 @@ packages:
10701094
url: "https://pub.dev"
10711095
source: hosted
10721096
version: "1.10.0"
1097+
sprintf:
1098+
dependency: transitive
1099+
description:
1100+
name: sprintf
1101+
sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23"
1102+
url: "https://pub.dev"
1103+
source: hosted
1104+
version: "7.0.0"
10731105
stack_trace:
10741106
dependency: transitive
10751107
description:
@@ -1102,6 +1134,30 @@ packages:
11021134
url: "https://pub.dev"
11031135
source: hosted
11041136
version: "1.2.0"
1137+
super_clipboard:
1138+
dependency: transitive
1139+
description:
1140+
name: super_clipboard
1141+
sha256: "1031873af66c796177eff073d1453c9f19a75e6f9b308ca0b950928d0a20aedd"
1142+
url: "https://pub.dev"
1143+
source: hosted
1144+
version: "0.7.3"
1145+
super_drag_and_drop:
1146+
dependency: transitive
1147+
description:
1148+
name: super_drag_and_drop
1149+
sha256: cb884e24f75127ddfba7908808ac265249075511c72584148345b259ca99788c
1150+
url: "https://pub.dev"
1151+
source: hosted
1152+
version: "0.7.0"
1153+
super_native_extensions:
1154+
dependency: transitive
1155+
description:
1156+
name: super_native_extensions
1157+
sha256: fd658e096e99ed7555c0727a8201dbe3b8afc0059742ac14bdcff115e08f589c
1158+
url: "https://pub.dev"
1159+
source: hosted
1160+
version: "0.7.3"
11051161
term_glyph:
11061162
dependency: transitive
11071163
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:
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: 66 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: "499c61743e13909c13374a8c209075385858c614b9c0f2487b5f9995eeaf7369"
248+
sha256: "2c35b6d1682b028e42d07b3aee4b98fa62996c10bc12cb651ec856a80d6a761b"
249249
url: "https://pub.dev"
250250
source: hosted
251-
version: "9.0.1"
251+
version: "9.0.2"
252252
device_info_plus_platform_interface:
253253
dependency: transitive
254254
description:
@@ -649,6 +649,22 @@ packages:
649649
url: "https://pub.dev"
650650
source: hosted
651651
version: "1.0.4"
652+
irondash_engine_context:
653+
dependency: transitive
654+
description:
655+
name: irondash_engine_context
656+
sha256: "0e803321935ca7af1a88f1391be9edfdb940df800353670bfc694934c7643ff3"
657+
url: "https://pub.dev"
658+
source: hosted
659+
version: "0.4.1"
660+
irondash_message_channel:
661+
dependency: transitive
662+
description:
663+
name: irondash_message_channel
664+
sha256: "500daa1fbe679f7d28a5258df3ff47dab6de352e680dc93c1ca9eae1555d8db5"
665+
url: "https://pub.dev"
666+
source: hosted
667+
version: "0.3.1"
652668
js:
653669
dependency: transitive
654670
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:
@@ -1015,6 +1039,14 @@ packages:
10151039
url: "https://pub.dev"
10161040
source: hosted
10171041
version: "1.10.0"
1042+
sprintf:
1043+
dependency: transitive
1044+
description:
1045+
name: sprintf
1046+
sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23"
1047+
url: "https://pub.dev"
1048+
source: hosted
1049+
version: "7.0.0"
10181050
stack_trace:
10191051
dependency: transitive
10201052
description:
@@ -1047,6 +1079,30 @@ packages:
10471079
url: "https://pub.dev"
10481080
source: hosted
10491081
version: "1.2.0"
1082+
super_clipboard:
1083+
dependency: transitive
1084+
description:
1085+
name: super_clipboard
1086+
sha256: "1031873af66c796177eff073d1453c9f19a75e6f9b308ca0b950928d0a20aedd"
1087+
url: "https://pub.dev"
1088+
source: hosted
1089+
version: "0.7.3"
1090+
super_drag_and_drop:
1091+
dependency: "direct main"
1092+
description:
1093+
name: super_drag_and_drop
1094+
sha256: cb884e24f75127ddfba7908808ac265249075511c72584148345b259ca99788c
1095+
url: "https://pub.dev"
1096+
source: hosted
1097+
version: "0.7.0"
1098+
super_native_extensions:
1099+
dependency: transitive
1100+
description:
1101+
name: super_native_extensions
1102+
sha256: fd658e096e99ed7555c0727a8201dbe3b8afc0059742ac14bdcff115e08f589c
1103+
url: "https://pub.dev"
1104+
source: hosted
1105+
version: "0.7.3"
10501106
term_glyph:
10511107
dependency: transitive
10521108
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:

core/pubspec.yaml

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

5454
get: 4.6.6
5555

56-
device_info_plus: 9.0.1
56+
device_info_plus: 9.0.2
5757

5858
flutter_inappwebview: 6.1.0
5959

@@ -105,6 +105,8 @@ dependencies:
105105
pull_to_refresh: 2.0.0
106106

107107
html_unescape: 2.0.0
108+
109+
super_drag_and_drop: 0.7.0
108110

109111
dev_dependencies:
110112
flutter_test:

0 commit comments

Comments
 (0)