From 214f6aca06cf6520ce2e5cb5f07dc55b377bb139 Mon Sep 17 00:00:00 2001 From: Arkhip Date: Mon, 2 Sep 2024 17:16:31 +0300 Subject: [PATCH 1/2] dart web support --- example/pubspec.lock | 46 +++++++++---------- example/test/widget_test.dart | 3 +- lib/src/bridge/vk_bridge_web.dart | 30 ++++++------ .../vk_web_app_open_app_result.dart | 2 +- lib/src/utils.dart | 6 +-- pubspec.lock | 22 ++++----- pubspec.yaml | 6 +-- 7 files changed, 57 insertions(+), 58 deletions(-) diff --git a/example/pubspec.lock b/example/pubspec.lock index 90e8029e..3fd52af2 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -83,30 +83,22 @@ packages: description: flutter source: sdk version: "0.0.0" - js: - dependency: transitive - description: - name: js - sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf - url: "https://pub.dev" - source: hosted - version: "0.7.1" leak_tracker: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.4" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -127,18 +119,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" path: dependency: transitive description: @@ -151,10 +143,10 @@ packages: dependency: transitive description: name: rxdart - sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" url: "https://pub.dev" source: hosted - version: "0.28.0" + version: "0.27.7" sky_engine: dependency: transitive description: flutter @@ -204,10 +196,10 @@ packages: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.2" vector_math: dependency: transitive description: @@ -222,15 +214,23 @@ packages: path: ".." relative: true source: path - version: "2.5.0" + version: "2.6.0" vm_service: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + url: "https://pub.dev" + source: hosted + version: "14.2.5" + web: + dependency: transitive + description: + name: web + sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062 url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "1.0.0" sdks: dart: ">=3.4.1 <4.0.0" flutter: ">=3.18.0-18.0.pre.54" diff --git a/example/test/widget_test.dart b/example/test/widget_test.dart index 747db1da..a01bbe9c 100644 --- a/example/test/widget_test.dart +++ b/example/test/widget_test.dart @@ -5,11 +5,10 @@ // gestures. You can also use WidgetTester to find child widgets in the widget // tree, read text, and verify that the values of widget properties are correct. +import 'package:example/main.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:example/main.dart'; - void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame. diff --git a/lib/src/bridge/vk_bridge_web.dart b/lib/src/bridge/vk_bridge_web.dart index 2ef8354f..aca63bbd 100644 --- a/lib/src/bridge/vk_bridge_web.dart +++ b/lib/src/bridge/vk_bridge_web.dart @@ -3,16 +3,14 @@ library vk_bridge; import 'dart:async'; import 'dart:convert'; -import 'dart:html'; +import 'dart:js_interop'; import 'package:built_collection/built_collection.dart'; -import 'package:js/js.dart'; import 'package:rxdart/rxdart.dart'; import 'package:vk_bridge/src/bridge/vk_bridge.dart' as vk_bridge; import 'package:vk_bridge/src/data/model/events/vk_web_app_location_changed/vk_web_app_location_changed.dart'; import 'package:vk_bridge/src/data/model/events/vk_web_app_view_hide/vk_web_app_view_hide.dart'; import 'package:vk_bridge/src/data/model/options/allow_messages_from_group_options/allow_messages_from_group_options.dart'; -import 'package:vk_bridge/src/data/model/options/check_native_ads/ad_format.dart'; import 'package:vk_bridge/src/data/model/options/check_native_ads/check_native_ads_options.dart'; import 'package:vk_bridge/src/data/model/options/close_options/close_options.dart'; import 'package:vk_bridge/src/data/model/options/copy_text_options/copy_text_options.dart'; @@ -51,7 +49,6 @@ import 'package:vk_bridge/src/data/model/results/vk_web_app_add_to_home_screen_i import 'package:vk_bridge/src/data/model/results/vk_web_app_community_access_token_result/vk_web_app_community_access_token_result.dart'; import 'package:vk_bridge/src/data/model/results/vk_web_app_contacts_done/vk_web_app_contacts_done.dart'; import 'package:vk_bridge/src/data/model/results/vk_web_app_flash_get_info_result/vk_web_app_flash_get_info_result.dart'; -import 'package:vk_bridge/src/data/model/results/vk_web_app_get_ads_result/vk_web_app_get_ads_result.dart'; import 'package:vk_bridge/src/data/model/results/vk_web_app_get_friends_result/vk_web_app_get_friends_result.dart'; import 'package:vk_bridge/src/data/model/results/vk_web_app_get_group_info_result/vk_web_app_get_group_info_result.dart'; import 'package:vk_bridge/src/data/model/results/vk_web_app_get_personal_card_result/vk_web_app_get_personal_card_result.dart'; @@ -69,15 +66,19 @@ import 'package:vk_bridge/src/data/model/results/vk_web_app_subscribe_story_app_ import 'package:vk_bridge/src/data/model/serializers.dart'; import 'package:vk_bridge/src/utils.dart'; import 'package:vk_bridge/vk_bridge.dart'; +import 'package:web/web.dart' hide ScrollOptions; + +@JS('vkBridge.isEmbedded') +external JSBoolean _isEmbedded(); /// Method for sending something to the VK Mini Aps platform @JS('vkBridge.send') -external Object _send(String method, [Object props]); +external JSAny _send(JSString method, [JSObject props]); /// Allows assigning a function to be callable from /// `window.vkBridgeDartListener()` @JS('vkBridgeDartListener') -external set _vkBridgeDartListener(void Function(Object event) f); +external set _vkBridgeDartListener(JSFunction f); /// Web implementation of the VK Mini Aps platform contact class VKBridge implements vk_bridge.VKBridge { @@ -145,11 +146,10 @@ class VKBridge implements vk_bridge.VKBridge { } _logger.d('send($method, $propsJson)'); - final jsObjectResult = - await promiseToFuture(_send(method, parse(propsJson))); - final jsonResult = stringify(jsObjectResult); - final Object decodedJson = jsonDecode(jsonResult) as Object; + await (_send(method.toJS, parse(propsJson.toJS)) as JSPromise).toDart; + final jsonResult = stringify(jsObjectResult! as JSObject); + final Object decodedJson = jsonDecode(jsonResult.toDart); try { final result = deserialize(decodedJson); if (result == null) { @@ -169,8 +169,8 @@ class VKBridge implements vk_bridge.VKBridge { rethrow; } - final jsonError = stringify(jsObjectError); - final Object decodedJson = jsonDecode(jsonError) as Object; + final jsonError = stringify(jsObjectError as JSObject); + final Object decodedJson = jsonDecode(jsonError.toDart) as Object; VKWebAppError error; try { @@ -186,12 +186,12 @@ class VKBridge implements vk_bridge.VKBridge { } } - void _eventHandler(Object jsEvent) { + void _eventHandler(JSObject jsEvent) { final jsonEvent = stringify(jsEvent); _logger.d('_eventHandler: $jsonEvent'); - final decodedJsonEvent = jsonDecode(jsonEvent) as Map; + final decodedJsonEvent = jsonDecode(jsonEvent.toDart) as Map; final type = decodedJsonEvent['type']! as String; final dynamic data = decodedJsonEvent['data']; @@ -217,7 +217,7 @@ class VKBridge implements vk_bridge.VKBridge { @override Future init() async { - _vkBridgeDartListener = allowInterop(_eventHandler); + _vkBridgeDartListener = _eventHandler.toJS; final vkWebAppInitResult = await _sendInternal( 'VKWebAppInit', diff --git a/lib/src/data/model/results/vk_web_app_open_app_result/vk_web_app_open_app_result.dart b/lib/src/data/model/results/vk_web_app_open_app_result/vk_web_app_open_app_result.dart index d3f0fa73..097a6dff 100644 --- a/lib/src/data/model/results/vk_web_app_open_app_result/vk_web_app_open_app_result.dart +++ b/lib/src/data/model/results/vk_web_app_open_app_result/vk_web_app_open_app_result.dart @@ -18,7 +18,7 @@ abstract class VKWebAppOpenAppResult static Serializer get serializer => _$vKWebAppOpenAppResultSerializer; - /// TODO(sanekyy): enum + // TODO(sanekyy): enum /// The application close status passed to the parent application. /// Possible values: Possible values: failed, success String get status; diff --git a/lib/src/utils.dart b/lib/src/utils.dart index 6fe409d0..ef11a3e3 100644 --- a/lib/src/utils.dart +++ b/lib/src/utils.dart @@ -1,12 +1,12 @@ @JS() library stringify; -import 'package:js/js.dart'; +import 'dart:js_interop'; /// Calls invoke JavaScript `JSON.stringify(obj)` @JS('JSON.stringify') -external String stringify(Object obj); +external JSString stringify(JSObject obj); /// Calls invoke JavaScript `JSON.stringify(obj)` @JS('JSON.parse') -external Object parse(String json); +external JSObject parse(JSString json); diff --git a/pubspec.lock b/pubspec.lock index 9c4c3399..fc80163f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,23 +5,23 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "5aaf60d96c4cd00fe7f21594b5ad6a1b699c80a27420f8a837f4d68473ef09e3" + sha256: "45cfa8471b89fb6643fe9bf51bd7931a76b8f5ec2d65de4fb176dba8d4f22c77" url: "https://pub.dev" source: hosted - version: "68.0.0" + version: "73.0.0" _macros: dependency: transitive description: dart source: sdk - version: "0.1.0" + version: "0.3.2" analyzer: dependency: transitive description: name: analyzer - sha256: "21f1d3720fd1c70316399d5e2bccaebb415c434592d778cce8acb967b8578808" + sha256: "4959fec185fe70cce007c57e9ab6983101dbe593d2bf8bbfb4453aaec0cf470a" url: "https://pub.dev" source: hosted - version: "6.5.0" + version: "6.8.0" args: dependency: transitive description: @@ -239,7 +239,7 @@ packages: source: hosted version: "1.0.4" js: - dependency: "direct main" + dependency: transitive description: name: js sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf @@ -266,10 +266,10 @@ packages: dependency: transitive description: name: macros - sha256: "12e8a9842b5a7390de7a781ec63d793527582398d16ea26c60fed58833c9ae79" + sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" url: "https://pub.dev" source: hosted - version: "0.1.0-main.0" + version: "0.1.2-main.4" matcher: dependency: transitive description: @@ -346,10 +346,10 @@ packages: dependency: "direct main" description: name: rxdart - sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" url: "https://pub.dev" source: hosted - version: "0.28.0" + version: "0.27.7" shelf: dependency: transitive description: @@ -511,7 +511,7 @@ packages: source: hosted version: "1.1.0" web: - dependency: transitive + dependency: "direct main" description: name: web sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062 diff --git a/pubspec.yaml b/pubspec.yaml index dc212644..8457aec9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,18 +1,18 @@ name: vk_bridge description: A dart package for working with VK Mini Apps via VK Bridge. Works web, mobile-web homepage: https://github.com/optimist-dev/vk_bridge -version: 2.5.0 +version: 2.6.0 environment: sdk: '>=3.4.1 <4.0.0' dependencies: - js: ^0.7.1 built_value: ^8.9.2 built_collection: ^5.1.1 - rxdart: ^0.28.0 + rxdart: ^0.27.7 # Note: meta is pinned to version 1.12.0 by flutter_test from the flutter SDK. meta: ^1.12.0 + web: ^1.0.0 dev_dependencies: test: ^1.25.8 From 03c7b7e72298fc1780fe8a9c2e7aa77426cf5bf4 Mon Sep 17 00:00:00 2001 From: Arkhip Date: Mon, 2 Sep 2024 17:27:38 +0300 Subject: [PATCH 2/2] dart web support --- lib/src/bridge/vk_bridge_web.dart | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/src/bridge/vk_bridge_web.dart b/lib/src/bridge/vk_bridge_web.dart index aca63bbd..dda14be2 100644 --- a/lib/src/bridge/vk_bridge_web.dart +++ b/lib/src/bridge/vk_bridge_web.dart @@ -68,9 +68,6 @@ import 'package:vk_bridge/src/utils.dart'; import 'package:vk_bridge/vk_bridge.dart'; import 'package:web/web.dart' hide ScrollOptions; -@JS('vkBridge.isEmbedded') -external JSBoolean _isEmbedded(); - /// Method for sending something to the VK Mini Aps platform @JS('vkBridge.send') external JSAny _send(JSString method, [JSObject props]);