From a62c44e40900edb0d95c134be65351f77a66d917 Mon Sep 17 00:00:00 2001 From: Divyanshu Bhargava Date: Sun, 3 Aug 2025 18:17:27 +0530 Subject: [PATCH 1/7] feat: Introduce StacAction base class --- packages/stac_models/lib/actions/actions.dart | 1 + .../stac_models/lib/core/stac_action.dart | 76 +++++++++++++++++++ .../stac_models/lib/core/stac_widget.dart | 3 - packages/stac_models/lib/stac_models.dart | 1 + 4 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 packages/stac_models/lib/actions/actions.dart create mode 100644 packages/stac_models/lib/core/stac_action.dart diff --git a/packages/stac_models/lib/actions/actions.dart b/packages/stac_models/lib/actions/actions.dart new file mode 100644 index 00000000..9eefef38 --- /dev/null +++ b/packages/stac_models/lib/actions/actions.dart @@ -0,0 +1 @@ +export 'navigate/stac_navigate_action.dart'; diff --git a/packages/stac_models/lib/core/stac_action.dart b/packages/stac_models/lib/core/stac_action.dart new file mode 100644 index 00000000..5a522d11 --- /dev/null +++ b/packages/stac_models/lib/core/stac_action.dart @@ -0,0 +1,76 @@ +import 'package:json_annotation/json_annotation.dart'; + +/// Base class for all Stac actions that can be performed on widgets. +/// +/// Actions represent user interactions or system events that can be triggered +/// on Stac widgets. Each action type extends this base class and provides +/// specific functionality through the `actionType` getter. +/// +/// Example usage: +/// ```dart +/// // Create a custom action +/// class CustomAction extends StacAction { +/// const CustomAction({super.jsonData}); +/// +/// @override +/// String get actionType => 'custom'; +/// } +/// +/// // Parse from JSON +/// final action = StacAction.fromJson({'type': 'custom', 'data': 'value'}); +/// ``` +/// +/// JSON representation: +/// ```json +/// { +/// "type": "action_type", +/// "data": "action_specific_data" +/// } +/// ``` +@JsonSerializable() +class StacAction { + /// Creates a new StacAction instance. + /// + /// [jsonData] contains the raw JSON data for this action. This is used + /// for serialization and deserialization purposes. + const StacAction({this.jsonData}); + + /// The raw JSON data associated with this action. + /// + /// This field stores the complete JSON representation of the action, + /// including any action-specific properties and metadata. + final Map? jsonData; + + /// The type identifier for this action. + /// + /// Each action subclass must override this getter to return a unique + /// string identifier that distinguishes it from other action types. + /// This identifier is used for routing and processing actions. + /// + /// Example: + /// ```dart + /// @override + /// String get actionType => 'navigate'; + /// ``` + @JsonKey(includeToJson: true) + String get actionType => throw UnimplementedError(); + + /// Creates a StacAction instance from JSON data. + /// + /// This factory constructor takes a JSON map and creates a StacAction + /// instance. The JSON data is stored in the [jsonData] field for + /// later processing by action-specific parsers. + /// + /// [json] - The JSON map containing action data + /// + /// Returns a new StacAction instance with the provided JSON data. + factory StacAction.fromJson(Map json) { + return StacAction(jsonData: json); + } + + /// Converts this action to its JSON representation. + /// + /// Returns the raw JSON data associated with this action, or an empty + /// map if no data is available. + Map toJson() => jsonData ?? {}; +} diff --git a/packages/stac_models/lib/core/stac_widget.dart b/packages/stac_models/lib/core/stac_widget.dart index 488eb641..e4427a76 100644 --- a/packages/stac_models/lib/core/stac_widget.dart +++ b/packages/stac_models/lib/core/stac_widget.dart @@ -1,8 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; -/// Type aliases for common STAC types -typedef StacAction = dynamic; - /// Base interface for all STAC elements that can be serialized to JSON abstract class StacElement { const StacElement(); diff --git a/packages/stac_models/lib/stac_models.dart b/packages/stac_models/lib/stac_models.dart index 2b06a5ba..7db74af6 100644 --- a/packages/stac_models/lib/stac_models.dart +++ b/packages/stac_models/lib/stac_models.dart @@ -1,5 +1,6 @@ library; +export 'actions/actions.dart'; export 'core/stac_widget.dart'; export 'painting/painting.dart'; export 'types/types.dart'; From e6571d59c3fe40815603c4bca64cc0ca18c5ad34 Mon Sep 17 00:00:00 2001 From: Divyanshu Bhargava Date: Sun, 3 Aug 2025 18:18:19 +0530 Subject: [PATCH 2/7] refactor: Integrate Stac models into navigation actions --- examples/stac_gallery/lib/main.dart | 21 +- .../stac_navigate_action.dart | 34 -- .../stac_navigate_action.freezed.dart | 356 ------------------ .../stac_navigate_action.g.dart | 44 --- .../stac_navigate_action_parser.dart | 10 +- 5 files changed, 26 insertions(+), 439 deletions(-) delete mode 100644 packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action.dart delete mode 100644 packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action.freezed.dart delete mode 100644 packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action.g.dart diff --git a/examples/stac_gallery/lib/main.dart b/examples/stac_gallery/lib/main.dart index 0a85314e..e93cf0d0 100644 --- a/examples/stac_gallery/lib/main.dart +++ b/examples/stac_gallery/lib/main.dart @@ -7,6 +7,7 @@ import 'package:stac_gallery/app/details/details_screen.dart'; import 'package:stac_gallery/app/example/example_screen_parser.dart'; import 'package:stac_gallery/app/home/home_screen.dart'; import 'package:stac_gallery/app_theme/app_theme_cubit.dart'; +import 'package:stac_models/stac_models.dart'; import 'package:stac_webview/stac_webview.dart'; class MyHttpOverrides extends HttpOverrides { @@ -43,7 +44,10 @@ class MyApp extends StatelessWidget { theme: state.lightTheme, darkTheme: state.darkTheme, themeMode: state.themeMode, - homeBuilder: (context) => HomeScreen(), + homeBuilder: (context) => Stac.fromStacWidget( + widget: home(), + context: context, + ), title: 'Stac Gallery', routes: { '/homeScreen': (context) => const HomeScreen(), @@ -55,3 +59,18 @@ class MyApp extends StatelessWidget { ); } } + +StacWidget home() { + return StacScaffold( + body: StacCenter( + child: StacElevatedButton( + onPressed: StacNavigateAction( + assetPath: 'assets/json/app_bar_example.json', + ), + child: StacText( + data: 'click me!', + ), + ), + ), + ); +} diff --git a/packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action.dart b/packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action.dart deleted file mode 100644 index adcb5f95..00000000 --- a/packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:stac/src/parsers/actions/stac_network_request/stac_network_request.dart'; - -part 'stac_navigate_action.freezed.dart'; -part 'stac_navigate_action.g.dart'; - -enum NavigationStyle { - push, - pop, - pushReplacement, - pushAndRemoveAll, - popAll, - pushNamed, - pushNamedAndRemoveAll, - pushReplacementNamed -} - -@freezed -abstract class StacNavigateAction with _$StacNavigateAction { - const StacNavigateAction._(); - - factory StacNavigateAction({ - StacNetworkRequest? request, - Map? widgetJson, - String? assetPath, - String? routeName, - NavigationStyle? navigationStyle, - Map? result, - Map? arguments, - }) = _StacNavigateAction; - - factory StacNavigateAction.fromJson(Map json) => - _$StacNavigateActionFromJson(json); -} diff --git a/packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action.freezed.dart b/packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action.freezed.dart deleted file mode 100644 index 4ea474fa..00000000 --- a/packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action.freezed.dart +++ /dev/null @@ -1,356 +0,0 @@ -// dart format width=80 -// coverage:ignore-file -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of 'stac_navigate_action.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -// dart format off -T _$identity(T value) => value; - -/// @nodoc -mixin _$StacNavigateAction { - StacNetworkRequest? get request; - Map? get widgetJson; - String? get assetPath; - String? get routeName; - NavigationStyle? get navigationStyle; - Map? get result; - Map? get arguments; - - /// Create a copy of StacNavigateAction - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @pragma('vm:prefer-inline') - $StacNavigateActionCopyWith get copyWith => - _$StacNavigateActionCopyWithImpl( - this as StacNavigateAction, _$identity); - - /// Serializes this StacNavigateAction to a JSON map. - Map toJson(); - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is StacNavigateAction && - (identical(other.request, request) || other.request == request) && - const DeepCollectionEquality() - .equals(other.widgetJson, widgetJson) && - (identical(other.assetPath, assetPath) || - other.assetPath == assetPath) && - (identical(other.routeName, routeName) || - other.routeName == routeName) && - (identical(other.navigationStyle, navigationStyle) || - other.navigationStyle == navigationStyle) && - const DeepCollectionEquality().equals(other.result, result) && - const DeepCollectionEquality().equals(other.arguments, arguments)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, - request, - const DeepCollectionEquality().hash(widgetJson), - assetPath, - routeName, - navigationStyle, - const DeepCollectionEquality().hash(result), - const DeepCollectionEquality().hash(arguments)); - - @override - String toString() { - return 'StacNavigateAction(request: $request, widgetJson: $widgetJson, assetPath: $assetPath, routeName: $routeName, navigationStyle: $navigationStyle, result: $result, arguments: $arguments)'; - } -} - -/// @nodoc -abstract mixin class $StacNavigateActionCopyWith<$Res> { - factory $StacNavigateActionCopyWith( - StacNavigateAction value, $Res Function(StacNavigateAction) _then) = - _$StacNavigateActionCopyWithImpl; - @useResult - $Res call( - {StacNetworkRequest? request, - Map? widgetJson, - String? assetPath, - String? routeName, - NavigationStyle? navigationStyle, - Map? result, - Map? arguments}); - - $StacNetworkRequestCopyWith<$Res>? get request; -} - -/// @nodoc -class _$StacNavigateActionCopyWithImpl<$Res> - implements $StacNavigateActionCopyWith<$Res> { - _$StacNavigateActionCopyWithImpl(this._self, this._then); - - final StacNavigateAction _self; - final $Res Function(StacNavigateAction) _then; - - /// Create a copy of StacNavigateAction - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? request = freezed, - Object? widgetJson = freezed, - Object? assetPath = freezed, - Object? routeName = freezed, - Object? navigationStyle = freezed, - Object? result = freezed, - Object? arguments = freezed, - }) { - return _then(_self.copyWith( - request: freezed == request - ? _self.request - : request // ignore: cast_nullable_to_non_nullable - as StacNetworkRequest?, - widgetJson: freezed == widgetJson - ? _self.widgetJson - : widgetJson // ignore: cast_nullable_to_non_nullable - as Map?, - assetPath: freezed == assetPath - ? _self.assetPath - : assetPath // ignore: cast_nullable_to_non_nullable - as String?, - routeName: freezed == routeName - ? _self.routeName - : routeName // ignore: cast_nullable_to_non_nullable - as String?, - navigationStyle: freezed == navigationStyle - ? _self.navigationStyle - : navigationStyle // ignore: cast_nullable_to_non_nullable - as NavigationStyle?, - result: freezed == result - ? _self.result - : result // ignore: cast_nullable_to_non_nullable - as Map?, - arguments: freezed == arguments - ? _self.arguments - : arguments // ignore: cast_nullable_to_non_nullable - as Map?, - )); - } - - /// Create a copy of StacNavigateAction - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $StacNetworkRequestCopyWith<$Res>? get request { - if (_self.request == null) { - return null; - } - - return $StacNetworkRequestCopyWith<$Res>(_self.request!, (value) { - return _then(_self.copyWith(request: value)); - }); - } -} - -/// @nodoc -@JsonSerializable() -class _StacNavigateAction extends StacNavigateAction { - _StacNavigateAction( - {this.request, - final Map? widgetJson, - this.assetPath, - this.routeName, - this.navigationStyle, - final Map? result, - final Map? arguments}) - : _widgetJson = widgetJson, - _result = result, - _arguments = arguments, - super._(); - factory _StacNavigateAction.fromJson(Map json) => - _$StacNavigateActionFromJson(json); - - @override - final StacNetworkRequest? request; - final Map? _widgetJson; - @override - Map? get widgetJson { - final value = _widgetJson; - if (value == null) return null; - if (_widgetJson is EqualUnmodifiableMapView) return _widgetJson; - // ignore: implicit_dynamic_type - return EqualUnmodifiableMapView(value); - } - - @override - final String? assetPath; - @override - final String? routeName; - @override - final NavigationStyle? navigationStyle; - final Map? _result; - @override - Map? get result { - final value = _result; - if (value == null) return null; - if (_result is EqualUnmodifiableMapView) return _result; - // ignore: implicit_dynamic_type - return EqualUnmodifiableMapView(value); - } - - final Map? _arguments; - @override - Map? get arguments { - final value = _arguments; - if (value == null) return null; - if (_arguments is EqualUnmodifiableMapView) return _arguments; - // ignore: implicit_dynamic_type - return EqualUnmodifiableMapView(value); - } - - /// Create a copy of StacNavigateAction - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - @pragma('vm:prefer-inline') - _$StacNavigateActionCopyWith<_StacNavigateAction> get copyWith => - __$StacNavigateActionCopyWithImpl<_StacNavigateAction>(this, _$identity); - - @override - Map toJson() { - return _$StacNavigateActionToJson( - this, - ); - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _StacNavigateAction && - (identical(other.request, request) || other.request == request) && - const DeepCollectionEquality() - .equals(other._widgetJson, _widgetJson) && - (identical(other.assetPath, assetPath) || - other.assetPath == assetPath) && - (identical(other.routeName, routeName) || - other.routeName == routeName) && - (identical(other.navigationStyle, navigationStyle) || - other.navigationStyle == navigationStyle) && - const DeepCollectionEquality().equals(other._result, _result) && - const DeepCollectionEquality() - .equals(other._arguments, _arguments)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, - request, - const DeepCollectionEquality().hash(_widgetJson), - assetPath, - routeName, - navigationStyle, - const DeepCollectionEquality().hash(_result), - const DeepCollectionEquality().hash(_arguments)); - - @override - String toString() { - return 'StacNavigateAction(request: $request, widgetJson: $widgetJson, assetPath: $assetPath, routeName: $routeName, navigationStyle: $navigationStyle, result: $result, arguments: $arguments)'; - } -} - -/// @nodoc -abstract mixin class _$StacNavigateActionCopyWith<$Res> - implements $StacNavigateActionCopyWith<$Res> { - factory _$StacNavigateActionCopyWith( - _StacNavigateAction value, $Res Function(_StacNavigateAction) _then) = - __$StacNavigateActionCopyWithImpl; - @override - @useResult - $Res call( - {StacNetworkRequest? request, - Map? widgetJson, - String? assetPath, - String? routeName, - NavigationStyle? navigationStyle, - Map? result, - Map? arguments}); - - @override - $StacNetworkRequestCopyWith<$Res>? get request; -} - -/// @nodoc -class __$StacNavigateActionCopyWithImpl<$Res> - implements _$StacNavigateActionCopyWith<$Res> { - __$StacNavigateActionCopyWithImpl(this._self, this._then); - - final _StacNavigateAction _self; - final $Res Function(_StacNavigateAction) _then; - - /// Create a copy of StacNavigateAction - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $Res call({ - Object? request = freezed, - Object? widgetJson = freezed, - Object? assetPath = freezed, - Object? routeName = freezed, - Object? navigationStyle = freezed, - Object? result = freezed, - Object? arguments = freezed, - }) { - return _then(_StacNavigateAction( - request: freezed == request - ? _self.request - : request // ignore: cast_nullable_to_non_nullable - as StacNetworkRequest?, - widgetJson: freezed == widgetJson - ? _self._widgetJson - : widgetJson // ignore: cast_nullable_to_non_nullable - as Map?, - assetPath: freezed == assetPath - ? _self.assetPath - : assetPath // ignore: cast_nullable_to_non_nullable - as String?, - routeName: freezed == routeName - ? _self.routeName - : routeName // ignore: cast_nullable_to_non_nullable - as String?, - navigationStyle: freezed == navigationStyle - ? _self.navigationStyle - : navigationStyle // ignore: cast_nullable_to_non_nullable - as NavigationStyle?, - result: freezed == result - ? _self._result - : result // ignore: cast_nullable_to_non_nullable - as Map?, - arguments: freezed == arguments - ? _self._arguments - : arguments // ignore: cast_nullable_to_non_nullable - as Map?, - )); - } - - /// Create a copy of StacNavigateAction - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $StacNetworkRequestCopyWith<$Res>? get request { - if (_self.request == null) { - return null; - } - - return $StacNetworkRequestCopyWith<$Res>(_self.request!, (value) { - return _then(_self.copyWith(request: value)); - }); - } -} - -// dart format on diff --git a/packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action.g.dart b/packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action.g.dart deleted file mode 100644 index 603aa55e..00000000 --- a/packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action.g.dart +++ /dev/null @@ -1,44 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'stac_navigate_action.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -_StacNavigateAction _$StacNavigateActionFromJson(Map json) => - _StacNavigateAction( - request: json['request'] == null - ? null - : StacNetworkRequest.fromJson( - json['request'] as Map), - widgetJson: json['widgetJson'] as Map?, - assetPath: json['assetPath'] as String?, - routeName: json['routeName'] as String?, - navigationStyle: $enumDecodeNullable( - _$NavigationStyleEnumMap, json['navigationStyle']), - result: json['result'] as Map?, - arguments: json['arguments'] as Map?, - ); - -Map _$StacNavigateActionToJson(_StacNavigateAction instance) => - { - 'request': instance.request, - 'widgetJson': instance.widgetJson, - 'assetPath': instance.assetPath, - 'routeName': instance.routeName, - 'navigationStyle': _$NavigationStyleEnumMap[instance.navigationStyle], - 'result': instance.result, - 'arguments': instance.arguments, - }; - -const _$NavigationStyleEnumMap = { - NavigationStyle.push: 'push', - NavigationStyle.pop: 'pop', - NavigationStyle.pushReplacement: 'pushReplacement', - NavigationStyle.pushAndRemoveAll: 'pushAndRemoveAll', - NavigationStyle.popAll: 'popAll', - NavigationStyle.pushNamed: 'pushNamed', - NavigationStyle.pushNamedAndRemoveAll: 'pushNamedAndRemoveAll', - NavigationStyle.pushReplacementNamed: 'pushReplacementNamed', -}; diff --git a/packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action_parser.dart b/packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action_parser.dart index ab02998f..db1c3270 100644 --- a/packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action_parser.dart +++ b/packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action_parser.dart @@ -2,9 +2,9 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:stac/src/framework/framework.dart'; -import 'package:stac/src/parsers/actions/stac_navigate_action/stac_navigate_action.dart'; import 'package:stac/src/utils/action_type.dart'; import 'package:stac_framework/stac_framework.dart'; +import 'package:stac_models/stac_models.dart'; class StacNavigateActionParser extends StacActionParser { const StacNavigateActionParser(); @@ -21,9 +21,11 @@ class StacNavigateActionParser extends StacActionParser { Widget? widget; if (model.widgetJson != null) { widget = Stac.fromJson(model.widgetJson, context); - } else if (model.request != null) { - widget = Stac.fromNetwork(context: context, request: model.request!); - } else if (model.assetPath != null) { + } + // else if (model.request != null) { + // widget = Stac.fromNetwork(context: context, request: model.request!); + // } + else if (model.assetPath != null) { widget = Stac.fromAssets(model.assetPath!); } return _navigate( From c6828d1cd2a89e7e5c6f855c90ecdba0a929bcff Mon Sep 17 00:00:00 2001 From: Divyanshu Bhargava Date: Sun, 3 Aug 2025 18:20:43 +0530 Subject: [PATCH 3/7] refactor: Update parsers to use StacAction for event handlers --- .../stac_elevated_button_parser.dart | 4 +- .../stac_filled_button_parser.dart | 10 +++-- .../stac_floating_action_button_parser.dart | 10 ++--- .../stac_icon_button_parser.dart | 7 +-- .../stac_outlined_button_parser.dart | 10 +++-- .../stac_text_button_parser.dart | 10 +++-- .../navigate/stac_navigate_action.dart | 44 +++++++++++++++++++ .../navigate/stac_navigate_action.g.dart | 42 ++++++++++++++++++ .../elevated_button/stac_elevated_button.dart | 11 ++--- .../stac_elevated_button.g.dart | 24 ++++++---- .../filled_button/stac_filled_button.dart | 9 ++-- .../filled_button/stac_filled_button.g.dart | 24 ++++++---- .../stac_floating_action_button.dart | 5 ++- .../stac_floating_action_button.g.dart | 12 +++-- .../widgets/icon_button/stac_icon_button.dart | 7 +-- .../icon_button/stac_icon_button.g.dart | 18 +++++--- .../outlined_button/stac_outlined_button.dart | 9 ++-- .../stac_outlined_button.g.dart | 24 ++++++---- .../lib/widgets/scaffold/stac_scaffold.dart | 5 ++- .../lib/widgets/scaffold/stac_scaffold.g.dart | 12 +++-- .../widgets/text_button/stac_text_button.dart | 9 ++-- .../text_button/stac_text_button.g.dart | 24 ++++++---- 22 files changed, 238 insertions(+), 92 deletions(-) create mode 100644 packages/stac_models/lib/actions/navigate/stac_navigate_action.dart create mode 100644 packages/stac_models/lib/actions/navigate/stac_navigate_action.g.dart diff --git a/packages/stac/lib/src/parsers/widgets/stac_elevated_button/stac_elevated_button_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_elevated_button/stac_elevated_button_parser.dart index 48bcb8c9..a1a24f7c 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_elevated_button/stac_elevated_button_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_elevated_button/stac_elevated_button_parser.dart @@ -22,10 +22,10 @@ class StacElevatedButtonParser extends StacParser { return ElevatedButton( onPressed: model.onPressed == null ? null - : () => Stac.onCallFromJson(model.onPressed, context), + : () => Stac.onCallFromJson(model.onPressed?.toJson(), context), onLongPress: model.onLongPress == null ? null - : () => Stac.onCallFromJson(model.onLongPress, context), + : () => Stac.onCallFromJson(model.onLongPress?.toJson(), context), onHover: (bool value) => value == false ? null : model.onHover, onFocusChange: (bool value) => value == false ? null : model.onFocusChange, diff --git a/packages/stac/lib/src/parsers/widgets/stac_filled_button/stac_filled_button_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_filled_button/stac_filled_button_parser.dart index e8663d85..90f8188f 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_filled_button/stac_filled_button_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_filled_button/stac_filled_button_parser.dart @@ -22,16 +22,18 @@ class StacFilledButtonParser extends StacParser { return FilledButton( onPressed: model.onPressed == null ? null - : () => Stac.onCallFromJson(model.onPressed, context), + : () => Stac.onCallFromJson(model.onPressed?.toJson(), context), onLongPress: model.onLongPress == null ? null - : () => Stac.onCallFromJson(model.onLongPress, context), + : () => Stac.onCallFromJson(model.onLongPress?.toJson(), context), onHover: model.onHover == null ? null - : (bool value) => Stac.onCallFromJson(model.onHover, context), + : (bool value) => + Stac.onCallFromJson(model.onHover?.toJson(), context), onFocusChange: model.onFocusChange == null ? null - : (bool value) => Stac.onCallFromJson(model.onFocusChange, context), + : (bool value) => + Stac.onCallFromJson(model.onFocusChange?.toJson(), context), style: model.style?.parseFilledButton(context), autofocus: model.autofocus ?? false, clipBehavior: model.clipBehavior?.parse, diff --git a/packages/stac/lib/src/parsers/widgets/stac_floating_action_button/stac_floating_action_button_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_floating_action_button/stac_floating_action_button_parser.dart index a69f5651..cf2484ba 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_floating_action_button/stac_floating_action_button_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_floating_action_button/stac_floating_action_button_parser.dart @@ -26,8 +26,8 @@ class StacFloatingActionButtonParser return FloatingActionButton.extended( onPressed: model.onPressed == null ? null - : () => Stac.onCallFromJson(model.onPressed, context), - icon: Stac.fromJson(model.icon, context), + : () => Stac.onCallFromJson(model.onPressed?.toJson(), context), + icon: model.icon?.parse(context), backgroundColor: model.backgroundColor?.toColor(context), foregroundColor: model.foregroundColor?.toColor(context), focusColor: model.focusColor?.toColor(context), @@ -51,7 +51,7 @@ class StacFloatingActionButtonParser return FloatingActionButton.large( onPressed: model.onPressed == null ? null - : () => Stac.onCallFromJson(model.onPressed, context), + : () => Stac.onCallFromJson(model.onPressed?.toJson(), context), backgroundColor: model.backgroundColor?.toColor(context), foregroundColor: model.foregroundColor?.toColor(context), focusColor: model.focusColor?.toColor(context), @@ -73,7 +73,7 @@ class StacFloatingActionButtonParser return FloatingActionButton( onPressed: model.onPressed == null ? null - : () => Stac.onCallFromJson(model.onPressed, context), + : () => Stac.onCallFromJson(model.onPressed?.toJson(), context), backgroundColor: model.backgroundColor?.toColor(context), foregroundColor: model.foregroundColor?.toColor(context), focusColor: model.focusColor?.toColor(context), @@ -95,7 +95,7 @@ class StacFloatingActionButtonParser return FloatingActionButton.small( onPressed: model.onPressed == null ? null - : () => Stac.onCallFromJson(model.onPressed, context), + : () => Stac.onCallFromJson(model.onPressed?.toJson(), context), backgroundColor: model.backgroundColor?.toColor(context), foregroundColor: model.foregroundColor?.toColor(context), focusColor: model.focusColor?.toColor(context), diff --git a/packages/stac/lib/src/parsers/widgets/stac_icon_button/stac_icon_button_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_icon_button/stac_icon_button_parser.dart index c73d3453..5240e3ef 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_icon_button/stac_icon_button_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_icon_button/stac_icon_button_parser.dart @@ -34,13 +34,14 @@ class StacIconButtonParser extends StacParser { disabledColor: model.disabledColor?.toColor(context), onPressed: model.onPressed == null ? null - : () => Stac.onCallFromJson(model.onPressed, context), + : () => Stac.onCallFromJson(model.onPressed?.toJson(), context), onHover: model.onHover == null ? null - : (bool value) => Stac.onCallFromJson(model.onHover, context), + : (bool value) => + Stac.onCallFromJson(model.onHover?.toJson(), context), onLongPress: model.onLongPress == null ? null - : () => Stac.onCallFromJson(model.onLongPress, context), + : () => Stac.onCallFromJson(model.onLongPress?.toJson(), context), mouseCursor: model.mouseCursor?.parse, autofocus: model.autofocus ?? false, tooltip: model.tooltip, diff --git a/packages/stac/lib/src/parsers/widgets/stac_outlined_button/stac_outlined_button_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_outlined_button/stac_outlined_button_parser.dart index 0e9a6312..7889200d 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_outlined_button/stac_outlined_button_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_outlined_button/stac_outlined_button_parser.dart @@ -22,16 +22,18 @@ class StacOutlinedButtonParser extends StacParser { return OutlinedButton( onPressed: model.onPressed == null ? null - : () => Stac.onCallFromJson(model.onPressed, context), + : () => Stac.onCallFromJson(model.onPressed?.toJson(), context), onLongPress: model.onLongPress == null ? null - : () => Stac.onCallFromJson(model.onLongPress, context), + : () => Stac.onCallFromJson(model.onLongPress?.toJson(), context), onHover: model.onHover == null ? null - : (bool value) => Stac.onCallFromJson(model.onHover, context), + : (bool value) => + Stac.onCallFromJson(model.onHover?.toJson(), context), onFocusChange: model.onFocusChange == null ? null - : (bool value) => Stac.onCallFromJson(model.onFocusChange, context), + : (bool value) => + Stac.onCallFromJson(model.onFocusChange?.toJson(), context), style: model.style?.parseOutlinedButton(context), autofocus: model.autofocus ?? false, clipBehavior: model.clipBehavior?.parse, diff --git a/packages/stac/lib/src/parsers/widgets/stac_text_button/stac_text_button_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_text_button/stac_text_button_parser.dart index 8c0c5867..457423d8 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_text_button/stac_text_button_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_text_button/stac_text_button_parser.dart @@ -22,16 +22,18 @@ class StacTextButtonParser extends StacParser { return TextButton( onPressed: model.onPressed == null ? null - : () => Stac.onCallFromJson(model.onPressed, context), + : () => Stac.onCallFromJson(model.onPressed?.toJson(), context), onLongPress: model.onLongPress == null ? null - : () => Stac.onCallFromJson(model.onLongPress, context), + : () => Stac.onCallFromJson(model.onLongPress?.toJson(), context), onHover: model.onHover == null ? null - : (bool value) => Stac.onCallFromJson(model.onHover, context), + : (bool value) => + Stac.onCallFromJson(model.onHover?.toJson(), context), onFocusChange: model.onFocusChange == null ? null - : (bool value) => Stac.onCallFromJson(model.onFocusChange, context), + : (bool value) => + Stac.onCallFromJson(model.onFocusChange?.toJson(), context), style: model.style?.parseTextButton(context), autofocus: model.autofocus ?? false, clipBehavior: model.clipBehavior?.parse, diff --git a/packages/stac_models/lib/actions/navigate/stac_navigate_action.dart b/packages/stac_models/lib/actions/navigate/stac_navigate_action.dart new file mode 100644 index 00000000..edb29205 --- /dev/null +++ b/packages/stac_models/lib/actions/navigate/stac_navigate_action.dart @@ -0,0 +1,44 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:stac_models/core/stac_action.dart'; + +part 'stac_navigate_action.g.dart'; + +enum NavigationStyle { + push, + pop, + pushReplacement, + pushAndRemoveAll, + popAll, + pushNamed, + pushNamedAndRemoveAll, + pushReplacementNamed, +} + +@JsonSerializable() +class StacNavigateAction extends StacAction { + const StacNavigateAction({ + this.widgetJson, + this.assetPath, + this.routeName, + this.navigationStyle, + this.result, + this.arguments, + }); + + // StacNetworkRequest? request, + final Map? widgetJson; + final String? assetPath; + final String? routeName; + final NavigationStyle? navigationStyle; + final Map? result; + final Map? arguments; + + @override + String get actionType => 'navigate'; + + factory StacNavigateAction.fromJson(Map json) => + _$StacNavigateActionFromJson(json); + + @override + Map toJson() => _$StacNavigateActionToJson(this); +} diff --git a/packages/stac_models/lib/actions/navigate/stac_navigate_action.g.dart b/packages/stac_models/lib/actions/navigate/stac_navigate_action.g.dart new file mode 100644 index 00000000..209e563b --- /dev/null +++ b/packages/stac_models/lib/actions/navigate/stac_navigate_action.g.dart @@ -0,0 +1,42 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'stac_navigate_action.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +StacNavigateAction _$StacNavigateActionFromJson(Map json) => + StacNavigateAction( + widgetJson: json['widgetJson'] as Map?, + assetPath: json['assetPath'] as String?, + routeName: json['routeName'] as String?, + navigationStyle: $enumDecodeNullable( + _$NavigationStyleEnumMap, + json['navigationStyle'], + ), + result: json['result'] as Map?, + arguments: json['arguments'] as Map?, + ); + +Map _$StacNavigateActionToJson(StacNavigateAction instance) => + { + 'widgetJson': instance.widgetJson, + 'assetPath': instance.assetPath, + 'routeName': instance.routeName, + 'navigationStyle': _$NavigationStyleEnumMap[instance.navigationStyle], + 'result': instance.result, + 'arguments': instance.arguments, + 'actionType': instance.actionType, + }; + +const _$NavigationStyleEnumMap = { + NavigationStyle.push: 'push', + NavigationStyle.pop: 'pop', + NavigationStyle.pushReplacement: 'pushReplacement', + NavigationStyle.pushAndRemoveAll: 'pushAndRemoveAll', + NavigationStyle.popAll: 'popAll', + NavigationStyle.pushNamed: 'pushNamed', + NavigationStyle.pushNamedAndRemoveAll: 'pushNamedAndRemoveAll', + NavigationStyle.pushReplacementNamed: 'pushReplacementNamed', +}; diff --git a/packages/stac_models/lib/widgets/elevated_button/stac_elevated_button.dart b/packages/stac_models/lib/widgets/elevated_button/stac_elevated_button.dart index 50749045..47ae7fa9 100644 --- a/packages/stac_models/lib/widgets/elevated_button/stac_elevated_button.dart +++ b/packages/stac_models/lib/widgets/elevated_button/stac_elevated_button.dart @@ -1,4 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; +import 'package:stac_models/core/stac_action.dart'; import 'package:stac_models/core/stac_widget.dart'; import 'package:stac_models/theme/stac_button_style/stac_button_style.dart'; import 'package:stac_models/types/stac_clip.dart'; @@ -36,21 +37,21 @@ class StacElevatedButton extends StacWidget { this.style, this.autofocus, this.clipBehavior, - this.child, + required this.child, }); /// Called when the button is tapped or otherwise activated. /// If null, the button will be disabled. - final Map? onPressed; + final StacAction? onPressed; /// Called when the button is long-pressed. - final Map? onLongPress; + final StacAction? onLongPress; /// Called when a pointer enters or exits the button response area. - final Map? onHover; + final StacAction? onHover; /// Called when the focus changes. - final Map? onFocusChange; + final StacAction? onFocusChange; /// Customizes this button's appearance. final StacButtonStyle? style; diff --git a/packages/stac_models/lib/widgets/elevated_button/stac_elevated_button.g.dart b/packages/stac_models/lib/widgets/elevated_button/stac_elevated_button.g.dart index 832796d1..bd19dcd8 100644 --- a/packages/stac_models/lib/widgets/elevated_button/stac_elevated_button.g.dart +++ b/packages/stac_models/lib/widgets/elevated_button/stac_elevated_button.g.dart @@ -8,10 +8,18 @@ part of 'stac_elevated_button.dart'; StacElevatedButton _$StacElevatedButtonFromJson(Map json) => StacElevatedButton( - onPressed: json['onPressed'] as Map?, - onLongPress: json['onLongPress'] as Map?, - onHover: json['onHover'] as Map?, - onFocusChange: json['onFocusChange'] as Map?, + onPressed: json['onPressed'] == null + ? null + : StacAction.fromJson(json['onPressed'] as Map), + onLongPress: json['onLongPress'] == null + ? null + : StacAction.fromJson(json['onLongPress'] as Map), + onHover: json['onHover'] == null + ? null + : StacAction.fromJson(json['onHover'] as Map), + onFocusChange: json['onFocusChange'] == null + ? null + : StacAction.fromJson(json['onFocusChange'] as Map), style: json['style'] == null ? null : StacButtonStyle.fromJson(json['style'] as Map), @@ -27,10 +35,10 @@ StacElevatedButton _$StacElevatedButtonFromJson(Map json) => Map _$StacElevatedButtonToJson(StacElevatedButton instance) => { - 'onPressed': instance.onPressed, - 'onLongPress': instance.onLongPress, - 'onHover': instance.onHover, - 'onFocusChange': instance.onFocusChange, + 'onPressed': instance.onPressed?.toJson(), + 'onLongPress': instance.onLongPress?.toJson(), + 'onHover': instance.onHover?.toJson(), + 'onFocusChange': instance.onFocusChange?.toJson(), 'style': instance.style?.toJson(), 'autofocus': instance.autofocus, 'clipBehavior': _$StacClipEnumMap[instance.clipBehavior], diff --git a/packages/stac_models/lib/widgets/filled_button/stac_filled_button.dart b/packages/stac_models/lib/widgets/filled_button/stac_filled_button.dart index 594e9aa0..bf520b00 100644 --- a/packages/stac_models/lib/widgets/filled_button/stac_filled_button.dart +++ b/packages/stac_models/lib/widgets/filled_button/stac_filled_button.dart @@ -1,4 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; +import 'package:stac_models/core/stac_action.dart'; import 'package:stac_models/core/stac_widget.dart'; import 'package:stac_models/theme/stac_button_style/stac_button_style.dart'; import 'package:stac_models/types/stac_clip.dart'; @@ -41,16 +42,16 @@ class StacFilledButton extends StacWidget { /// Called when the button is tapped or otherwise activated. /// If null, the button will be disabled. - final Map? onPressed; + final StacAction? onPressed; /// Called when the button is long-pressed. - final Map? onLongPress; + final StacAction? onLongPress; /// Called when a pointer enters or exits the button response area. - final Map? onHover; + final StacAction? onHover; /// Called when the focus changes. - final Map? onFocusChange; + final StacAction? onFocusChange; /// Customizes this button's appearance. final StacButtonStyle? style; diff --git a/packages/stac_models/lib/widgets/filled_button/stac_filled_button.g.dart b/packages/stac_models/lib/widgets/filled_button/stac_filled_button.g.dart index 11c7fdd2..3f86f72f 100644 --- a/packages/stac_models/lib/widgets/filled_button/stac_filled_button.g.dart +++ b/packages/stac_models/lib/widgets/filled_button/stac_filled_button.g.dart @@ -8,10 +8,18 @@ part of 'stac_filled_button.dart'; StacFilledButton _$StacFilledButtonFromJson(Map json) => StacFilledButton( - onPressed: json['onPressed'] as Map?, - onLongPress: json['onLongPress'] as Map?, - onHover: json['onHover'] as Map?, - onFocusChange: json['onFocusChange'] as Map?, + onPressed: json['onPressed'] == null + ? null + : StacAction.fromJson(json['onPressed'] as Map), + onLongPress: json['onLongPress'] == null + ? null + : StacAction.fromJson(json['onLongPress'] as Map), + onHover: json['onHover'] == null + ? null + : StacAction.fromJson(json['onHover'] as Map), + onFocusChange: json['onFocusChange'] == null + ? null + : StacAction.fromJson(json['onFocusChange'] as Map), style: json['style'] == null ? null : StacButtonStyle.fromJson(json['style'] as Map), @@ -27,10 +35,10 @@ StacFilledButton _$StacFilledButtonFromJson(Map json) => Map _$StacFilledButtonToJson(StacFilledButton instance) => { - 'onPressed': instance.onPressed, - 'onLongPress': instance.onLongPress, - 'onHover': instance.onHover, - 'onFocusChange': instance.onFocusChange, + 'onPressed': instance.onPressed?.toJson(), + 'onLongPress': instance.onLongPress?.toJson(), + 'onHover': instance.onHover?.toJson(), + 'onFocusChange': instance.onFocusChange?.toJson(), 'style': instance.style?.toJson(), 'autofocus': instance.autofocus, 'clipBehavior': _$StacClipEnumMap[instance.clipBehavior], diff --git a/packages/stac_models/lib/widgets/floating_action_button/stac_floating_action_button.dart b/packages/stac_models/lib/widgets/floating_action_button/stac_floating_action_button.dart index 09e73c75..e4b7e3bc 100644 --- a/packages/stac_models/lib/widgets/floating_action_button/stac_floating_action_button.dart +++ b/packages/stac_models/lib/widgets/floating_action_button/stac_floating_action_button.dart @@ -1,4 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; +import 'package:stac_models/core/stac_action.dart'; import 'package:stac_models/core/stac_widget.dart'; import 'package:stac_models/painting/stac_text_style/stac_text_style.dart'; import 'package:stac_models/types/stac_floating_action_button_type.dart'; @@ -55,7 +56,7 @@ class StacFloatingActionButton extends StacWidget { /// Called when the button is tapped or otherwise activated. /// If null, the button will be disabled. - final Map? onPressed; + final StacAction? onPressed; /// The text style for the button's text. final StacTextStyle? textStyle; @@ -68,7 +69,7 @@ class StacFloatingActionButton extends StacWidget { final bool? autofocus; /// The icon to display in the button. - final Map? icon; + final StacWidget? icon; /// The background color of the button. final String? backgroundColor; diff --git a/packages/stac_models/lib/widgets/floating_action_button/stac_floating_action_button.g.dart b/packages/stac_models/lib/widgets/floating_action_button/stac_floating_action_button.g.dart index 37df1a82..d2c9d719 100644 --- a/packages/stac_models/lib/widgets/floating_action_button/stac_floating_action_button.g.dart +++ b/packages/stac_models/lib/widgets/floating_action_button/stac_floating_action_button.g.dart @@ -9,7 +9,9 @@ part of 'stac_floating_action_button.dart'; StacFloatingActionButton _$StacFloatingActionButtonFromJson( Map json, ) => StacFloatingActionButton( - onPressed: json['onPressed'] as Map?, + onPressed: json['onPressed'] == null + ? null + : StacAction.fromJson(json['onPressed'] as Map), textStyle: json['textStyle'] == null ? null : StacTextStyle.fromJson(json['textStyle'] as Map), @@ -20,7 +22,9 @@ StacFloatingActionButton _$StacFloatingActionButtonFromJson( ) ?? StacFloatingActionButtonType.small, autofocus: json['autofocus'] as bool?, - icon: json['icon'] as Map?, + icon: json['icon'] == null + ? null + : StacWidget.fromJson(json['icon'] as Map), backgroundColor: json['backgroundColor'] as String?, foregroundColor: json['foregroundColor'] as String?, focusColor: json['focusColor'] as String?, @@ -49,11 +53,11 @@ StacFloatingActionButton _$StacFloatingActionButtonFromJson( Map _$StacFloatingActionButtonToJson( StacFloatingActionButton instance, ) => { - 'onPressed': instance.onPressed, + 'onPressed': instance.onPressed?.toJson(), 'textStyle': instance.textStyle?.toJson(), 'buttonType': _$StacFloatingActionButtonTypeEnumMap[instance.buttonType]!, 'autofocus': instance.autofocus, - 'icon': instance.icon, + 'icon': instance.icon?.toJson(), 'backgroundColor': instance.backgroundColor, 'foregroundColor': instance.foregroundColor, 'focusColor': instance.focusColor, diff --git a/packages/stac_models/lib/widgets/icon_button/stac_icon_button.dart b/packages/stac_models/lib/widgets/icon_button/stac_icon_button.dart index 6b3aa8b8..30a72340 100644 --- a/packages/stac_models/lib/widgets/icon_button/stac_icon_button.dart +++ b/packages/stac_models/lib/widgets/icon_button/stac_icon_button.dart @@ -1,4 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; +import 'package:stac_models/core/stac_action.dart'; import 'package:stac_models/stac_models.dart'; import 'package:stac_models/theme/stac_button_style/stac_button_style.dart'; import 'package:stac_models/types/stac_alignment.dart'; @@ -91,13 +92,13 @@ class StacIconButton extends StacWidget { /// Called when the button is tapped or otherwise activated. /// If null, the button will be disabled. - final Map? onPressed; + final StacAction? onPressed; /// Called when the button is hovered. - final Map? onHover; + final StacAction? onHover; /// Called when the button is long pressed. - final Map? onLongPress; + final StacAction? onLongPress; /// The mouse cursor for the button. final StacMouseCursor? mouseCursor; diff --git a/packages/stac_models/lib/widgets/icon_button/stac_icon_button.g.dart b/packages/stac_models/lib/widgets/icon_button/stac_icon_button.g.dart index abcdaea0..ae018534 100644 --- a/packages/stac_models/lib/widgets/icon_button/stac_icon_button.g.dart +++ b/packages/stac_models/lib/widgets/icon_button/stac_icon_button.g.dart @@ -25,9 +25,15 @@ StacIconButton _$StacIconButtonFromJson(Map json) => highlightColor: json['highlightColor'] as String?, splashColor: json['splashColor'] as String?, disabledColor: json['disabledColor'] as String?, - onPressed: json['onPressed'] as Map?, - onHover: json['onHover'] as Map?, - onLongPress: json['onLongPress'] as Map?, + onPressed: json['onPressed'] == null + ? null + : StacAction.fromJson(json['onPressed'] as Map), + onHover: json['onHover'] == null + ? null + : StacAction.fromJson(json['onHover'] as Map), + onLongPress: json['onLongPress'] == null + ? null + : StacAction.fromJson(json['onLongPress'] as Map), mouseCursor: $enumDecodeNullable( _$StacMouseCursorEnumMap, json['mouseCursor'], @@ -65,9 +71,9 @@ Map _$StacIconButtonToJson(StacIconButton instance) => 'highlightColor': instance.highlightColor, 'splashColor': instance.splashColor, 'disabledColor': instance.disabledColor, - 'onPressed': instance.onPressed, - 'onHover': instance.onHover, - 'onLongPress': instance.onLongPress, + 'onPressed': instance.onPressed?.toJson(), + 'onHover': instance.onHover?.toJson(), + 'onLongPress': instance.onLongPress?.toJson(), 'mouseCursor': _$StacMouseCursorEnumMap[instance.mouseCursor], 'autofocus': instance.autofocus, 'tooltip': instance.tooltip, diff --git a/packages/stac_models/lib/widgets/outlined_button/stac_outlined_button.dart b/packages/stac_models/lib/widgets/outlined_button/stac_outlined_button.dart index b775a325..9f3cbd80 100644 --- a/packages/stac_models/lib/widgets/outlined_button/stac_outlined_button.dart +++ b/packages/stac_models/lib/widgets/outlined_button/stac_outlined_button.dart @@ -1,4 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; +import 'package:stac_models/core/stac_action.dart'; import 'package:stac_models/stac_models.dart'; import 'package:stac_models/theme/stac_button_style/stac_button_style.dart'; import 'package:stac_models/types/stac_clip.dart'; @@ -41,16 +42,16 @@ class StacOutlinedButton extends StacWidget { /// Called when the button is tapped or otherwise activated. /// If null, the button will be disabled. - final Map? onPressed; + final StacAction? onPressed; /// Called when the button is long-pressed. - final Map? onLongPress; + final StacAction? onLongPress; /// Called when a pointer enters or exits the button response area. - final Map? onHover; + final StacAction? onHover; /// Called when the focus changes. - final Map? onFocusChange; + final StacAction? onFocusChange; /// Customizes this button's appearance. final StacButtonStyle? style; diff --git a/packages/stac_models/lib/widgets/outlined_button/stac_outlined_button.g.dart b/packages/stac_models/lib/widgets/outlined_button/stac_outlined_button.g.dart index ab73e2b7..464bbfa0 100644 --- a/packages/stac_models/lib/widgets/outlined_button/stac_outlined_button.g.dart +++ b/packages/stac_models/lib/widgets/outlined_button/stac_outlined_button.g.dart @@ -8,10 +8,18 @@ part of 'stac_outlined_button.dart'; StacOutlinedButton _$StacOutlinedButtonFromJson(Map json) => StacOutlinedButton( - onPressed: json['onPressed'] as Map?, - onLongPress: json['onLongPress'] as Map?, - onHover: json['onHover'] as Map?, - onFocusChange: json['onFocusChange'] as Map?, + onPressed: json['onPressed'] == null + ? null + : StacAction.fromJson(json['onPressed'] as Map), + onLongPress: json['onLongPress'] == null + ? null + : StacAction.fromJson(json['onLongPress'] as Map), + onHover: json['onHover'] == null + ? null + : StacAction.fromJson(json['onHover'] as Map), + onFocusChange: json['onFocusChange'] == null + ? null + : StacAction.fromJson(json['onFocusChange'] as Map), style: json['style'] == null ? null : StacButtonStyle.fromJson(json['style'] as Map), @@ -27,10 +35,10 @@ StacOutlinedButton _$StacOutlinedButtonFromJson(Map json) => Map _$StacOutlinedButtonToJson(StacOutlinedButton instance) => { - 'onPressed': instance.onPressed, - 'onLongPress': instance.onLongPress, - 'onHover': instance.onHover, - 'onFocusChange': instance.onFocusChange, + 'onPressed': instance.onPressed?.toJson(), + 'onLongPress': instance.onLongPress?.toJson(), + 'onHover': instance.onHover?.toJson(), + 'onFocusChange': instance.onFocusChange?.toJson(), 'style': instance.style?.toJson(), 'autofocus': instance.autofocus, 'clipBehavior': _$StacClipEnumMap[instance.clipBehavior], diff --git a/packages/stac_models/lib/widgets/scaffold/stac_scaffold.dart b/packages/stac_models/lib/widgets/scaffold/stac_scaffold.dart index 34c4d4a2..67afa1a5 100644 --- a/packages/stac_models/lib/widgets/scaffold/stac_scaffold.dart +++ b/packages/stac_models/lib/widgets/scaffold/stac_scaffold.dart @@ -1,4 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; +import 'package:stac_models/core/stac_action.dart'; import 'package:stac_models/stac_models.dart'; part 'stac_scaffold.g.dart'; @@ -63,9 +64,9 @@ class StacScaffold extends StacWidget { final StacFloatingActionButtonLocation? floatingActionButtonLocation; - final Map? onDrawerChanged; + final StacAction? onDrawerChanged; - final Map? onEndDrawerChanged; + final StacAction? onEndDrawerChanged; final StacAlignmentDirectional? persistentFooterAlignment; diff --git a/packages/stac_models/lib/widgets/scaffold/stac_scaffold.g.dart b/packages/stac_models/lib/widgets/scaffold/stac_scaffold.g.dart index 7db6c3e1..d6e51b14 100644 --- a/packages/stac_models/lib/widgets/scaffold/stac_scaffold.g.dart +++ b/packages/stac_models/lib/widgets/scaffold/stac_scaffold.g.dart @@ -50,8 +50,12 @@ StacScaffold _$StacScaffoldFromJson(Map json) => StacScaffold( _$StacFloatingActionButtonLocationEnumMap, json['floatingActionButtonLocation'], ), - onDrawerChanged: json['onDrawerChanged'] as Map?, - onEndDrawerChanged: json['onEndDrawerChanged'] as Map?, + onDrawerChanged: json['onDrawerChanged'] == null + ? null + : StacAction.fromJson(json['onDrawerChanged'] as Map), + onEndDrawerChanged: json['onEndDrawerChanged'] == null + ? null + : StacAction.fromJson(json['onEndDrawerChanged'] as Map), persistentFooterAlignment: $enumDecodeNullable( _$StacAlignmentDirectionalEnumMap, json['persistentFooterAlignment'], @@ -85,8 +89,8 @@ Map _$StacScaffoldToJson(StacScaffold instance) => 'floatingActionButtonLocation': _$StacFloatingActionButtonLocationEnumMap[instance .floatingActionButtonLocation], - 'onDrawerChanged': instance.onDrawerChanged, - 'onEndDrawerChanged': instance.onEndDrawerChanged, + 'onDrawerChanged': instance.onDrawerChanged?.toJson(), + 'onEndDrawerChanged': instance.onEndDrawerChanged?.toJson(), 'persistentFooterAlignment': _$StacAlignmentDirectionalEnumMap[instance.persistentFooterAlignment], 'persistentFooterButtons': instance.persistentFooterButtons diff --git a/packages/stac_models/lib/widgets/text_button/stac_text_button.dart b/packages/stac_models/lib/widgets/text_button/stac_text_button.dart index 39fec9b0..1b93b0ca 100644 --- a/packages/stac_models/lib/widgets/text_button/stac_text_button.dart +++ b/packages/stac_models/lib/widgets/text_button/stac_text_button.dart @@ -1,4 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; +import 'package:stac_models/core/stac_action.dart'; import 'package:stac_models/stac_models.dart'; import 'package:stac_models/theme/stac_button_style/stac_button_style.dart'; import 'package:stac_models/types/stac_clip.dart'; @@ -42,16 +43,16 @@ class StacTextButton extends StacWidget { /// Called when the button is tapped or otherwise activated. /// If null, the button will be disabled. - final Map? onPressed; + final StacAction? onPressed; /// Called when the button is long-pressed. - final Map? onLongPress; + final StacAction? onLongPress; /// Called when a pointer enters or exits the button response area. - final Map? onHover; + final StacAction? onHover; /// Called when the focus changes. - final Map? onFocusChange; + final StacAction? onFocusChange; /// Customizes this button's appearance. final StacButtonStyle? style; diff --git a/packages/stac_models/lib/widgets/text_button/stac_text_button.g.dart b/packages/stac_models/lib/widgets/text_button/stac_text_button.g.dart index a22545ad..1f9df2f3 100644 --- a/packages/stac_models/lib/widgets/text_button/stac_text_button.g.dart +++ b/packages/stac_models/lib/widgets/text_button/stac_text_button.g.dart @@ -8,10 +8,18 @@ part of 'stac_text_button.dart'; StacTextButton _$StacTextButtonFromJson(Map json) => StacTextButton( - onPressed: json['onPressed'] as Map?, - onLongPress: json['onLongPress'] as Map?, - onHover: json['onHover'] as Map?, - onFocusChange: json['onFocusChange'] as Map?, + onPressed: json['onPressed'] == null + ? null + : StacAction.fromJson(json['onPressed'] as Map), + onLongPress: json['onLongPress'] == null + ? null + : StacAction.fromJson(json['onLongPress'] as Map), + onHover: json['onHover'] == null + ? null + : StacAction.fromJson(json['onHover'] as Map), + onFocusChange: json['onFocusChange'] == null + ? null + : StacAction.fromJson(json['onFocusChange'] as Map), style: json['style'] == null ? null : StacButtonStyle.fromJson(json['style'] as Map), @@ -28,10 +36,10 @@ StacTextButton _$StacTextButtonFromJson(Map json) => Map _$StacTextButtonToJson(StacTextButton instance) => { - 'onPressed': instance.onPressed, - 'onLongPress': instance.onLongPress, - 'onHover': instance.onHover, - 'onFocusChange': instance.onFocusChange, + 'onPressed': instance.onPressed?.toJson(), + 'onLongPress': instance.onLongPress?.toJson(), + 'onHover': instance.onHover?.toJson(), + 'onFocusChange': instance.onFocusChange?.toJson(), 'style': instance.style?.toJson(), 'autofocus': instance.autofocus, 'clipBehavior': _$StacClipEnumMap[instance.clipBehavior], From 8a038b984585b69dd800307aabba155769ab8943 Mon Sep 17 00:00:00 2001 From: Divyanshu Bhargava Date: Sun, 3 Aug 2025 18:33:25 +0530 Subject: [PATCH 4/7] refactor:Remoce StacAction typedef --- .../stac_set_value/stac_set_value_action.dart | 2 +- .../stac_set_value_action.freezed.dart | 16 ++++++++-------- .../stac_set_value_action_parser.dart | 2 +- .../lib/src/stac_action_parser.dart | 4 +--- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/packages/stac/lib/src/parsers/actions/stac_set_value/stac_set_value_action.dart b/packages/stac/lib/src/parsers/actions/stac_set_value/stac_set_value_action.dart index 0de736d7..94ac0cf3 100644 --- a/packages/stac/lib/src/parsers/actions/stac_set_value/stac_set_value_action.dart +++ b/packages/stac/lib/src/parsers/actions/stac_set_value/stac_set_value_action.dart @@ -8,7 +8,7 @@ part 'stac_set_value_action.g.dart'; abstract class StacSetValueAction with _$StacSetValueAction { const factory StacSetValueAction({ @Default([]) List> values, - StacAction? action, + Map? action, }) = _StacSetValueAction; factory StacSetValueAction.fromJson(Map json) => diff --git a/packages/stac/lib/src/parsers/actions/stac_set_value/stac_set_value_action.freezed.dart b/packages/stac/lib/src/parsers/actions/stac_set_value/stac_set_value_action.freezed.dart index 9e8a6de1..8b33d51a 100644 --- a/packages/stac/lib/src/parsers/actions/stac_set_value/stac_set_value_action.freezed.dart +++ b/packages/stac/lib/src/parsers/actions/stac_set_value/stac_set_value_action.freezed.dart @@ -16,7 +16,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$StacSetValueAction { List> get values; - StacAction? get action; + Map? get action; /// Create a copy of StacSetValueAction /// with the given fields replaced by the non-null parameter values. @@ -57,7 +57,7 @@ abstract mixin class $StacSetValueActionCopyWith<$Res> { StacSetValueAction value, $Res Function(StacSetValueAction) _then) = _$StacSetValueActionCopyWithImpl; @useResult - $Res call({List> values, StacAction? action}); + $Res call({List> values, Map? action}); } /// @nodoc @@ -84,7 +84,7 @@ class _$StacSetValueActionCopyWithImpl<$Res> action: freezed == action ? _self.action : action // ignore: cast_nullable_to_non_nullable - as StacAction?, + as Map?, )); } } @@ -94,7 +94,7 @@ class _$StacSetValueActionCopyWithImpl<$Res> class _StacSetValueAction implements StacSetValueAction { const _StacSetValueAction( {final List> values = const [], - final StacAction? action}) + final Map? action}) : _values = values, _action = action; factory _StacSetValueAction.fromJson(Map json) => @@ -109,9 +109,9 @@ class _StacSetValueAction implements StacSetValueAction { return EqualUnmodifiableListView(_values); } - final StacAction? _action; + final Map? _action; @override - StacAction? get action { + Map? get action { final value = _action; if (value == null) return null; if (_action is EqualUnmodifiableMapView) return _action; @@ -164,7 +164,7 @@ abstract mixin class _$StacSetValueActionCopyWith<$Res> __$StacSetValueActionCopyWithImpl; @override @useResult - $Res call({List> values, StacAction? action}); + $Res call({List> values, Map? action}); } /// @nodoc @@ -191,7 +191,7 @@ class __$StacSetValueActionCopyWithImpl<$Res> action: freezed == action ? _self._action : action // ignore: cast_nullable_to_non_nullable - as StacAction?, + as Map?, )); } } diff --git a/packages/stac/lib/src/parsers/actions/stac_set_value/stac_set_value_action_parser.dart b/packages/stac/lib/src/parsers/actions/stac_set_value/stac_set_value_action_parser.dart index 5ce3a49e..919b1dc0 100644 --- a/packages/stac/lib/src/parsers/actions/stac_set_value/stac_set_value_action_parser.dart +++ b/packages/stac/lib/src/parsers/actions/stac_set_value/stac_set_value_action_parser.dart @@ -12,7 +12,7 @@ class StacSetValueActionParser extends StacActionParser { String get actionType => ActionType.setValue.name; @override - StacSetValueAction getModel(StacAction json) => + StacSetValueAction getModel(Map json) => StacSetValueAction.fromJson(json); @override diff --git a/packages/stac_framework/lib/src/stac_action_parser.dart b/packages/stac_framework/lib/src/stac_action_parser.dart index ae9c572a..0d22e38a 100644 --- a/packages/stac_framework/lib/src/stac_action_parser.dart +++ b/packages/stac_framework/lib/src/stac_action_parser.dart @@ -2,8 +2,6 @@ import 'dart:async'; import 'package:flutter/widgets.dart'; -typedef StacAction = Map; - /// [StacActionParser] is an abstract class that is used to parse a JSON object into /// a model and then handle an action based on the model. /// @@ -21,7 +19,7 @@ abstract class StacActionParser { /// This method should be implemented to parse a JSON object into a model. /// The JSON object is typically a part of the STAC action. /// The model [T] should contain all the necessary data to handle the action. - T getModel(StacAction json); + T getModel(Map json); /// Handles the action based on the model [T]. /// From 7a958edcb4912993a91b419d5d1a44fcd994ab5d Mon Sep 17 00:00:00 2001 From: Divyanshu Bhargava Date: Sun, 3 Aug 2025 18:33:55 +0530 Subject: [PATCH 5/7] chore: Update imports --- examples/stac_gallery/lib/main.dart | 5 +---- .../lib/src/parsers/core/stac_action_parser.dart | 15 +++++++++++++++ packages/stac_models/lib/core/core.dart | 4 ++++ packages/stac_models/lib/stac_models.dart | 2 +- .../lib/widgets/icon_button/stac_icon_button.dart | 1 - .../outlined_button/stac_outlined_button.dart | 1 - .../lib/widgets/scaffold/stac_scaffold.dart | 1 - .../lib/widgets/text_button/stac_text_button.dart | 1 - 8 files changed, 21 insertions(+), 9 deletions(-) create mode 100644 packages/stac/lib/src/parsers/core/stac_action_parser.dart create mode 100644 packages/stac_models/lib/core/core.dart diff --git a/examples/stac_gallery/lib/main.dart b/examples/stac_gallery/lib/main.dart index e93cf0d0..6c85a0c1 100644 --- a/examples/stac_gallery/lib/main.dart +++ b/examples/stac_gallery/lib/main.dart @@ -44,10 +44,7 @@ class MyApp extends StatelessWidget { theme: state.lightTheme, darkTheme: state.darkTheme, themeMode: state.themeMode, - homeBuilder: (context) => Stac.fromStacWidget( - widget: home(), - context: context, - ), + homeBuilder: (context) => HomeScreen(), title: 'Stac Gallery', routes: { '/homeScreen': (context) => const HomeScreen(), diff --git a/packages/stac/lib/src/parsers/core/stac_action_parser.dart b/packages/stac/lib/src/parsers/core/stac_action_parser.dart new file mode 100644 index 00000000..62e429ca --- /dev/null +++ b/packages/stac/lib/src/parsers/core/stac_action_parser.dart @@ -0,0 +1,15 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:stac/stac.dart'; +import 'package:stac_models/stac_models.dart'; + +extension StacActionParser on StacAction? { + FutureOr parse(BuildContext context) { + if (this == null) { + return null; + } + + return Stac.onCallFromJson(this!.toJson(), context); + } +} diff --git a/packages/stac_models/lib/core/core.dart b/packages/stac_models/lib/core/core.dart new file mode 100644 index 00000000..2b585799 --- /dev/null +++ b/packages/stac_models/lib/core/core.dart @@ -0,0 +1,4 @@ +library; + +export 'stac_action.dart'; +export 'stac_widget.dart'; diff --git a/packages/stac_models/lib/stac_models.dart b/packages/stac_models/lib/stac_models.dart index 7db74af6..952a640d 100644 --- a/packages/stac_models/lib/stac_models.dart +++ b/packages/stac_models/lib/stac_models.dart @@ -1,7 +1,7 @@ library; export 'actions/actions.dart'; -export 'core/stac_widget.dart'; +export 'core/core.dart'; export 'painting/painting.dart'; export 'types/types.dart'; export 'widgets/widgets.dart'; diff --git a/packages/stac_models/lib/widgets/icon_button/stac_icon_button.dart b/packages/stac_models/lib/widgets/icon_button/stac_icon_button.dart index 30a72340..5d58e267 100644 --- a/packages/stac_models/lib/widgets/icon_button/stac_icon_button.dart +++ b/packages/stac_models/lib/widgets/icon_button/stac_icon_button.dart @@ -1,5 +1,4 @@ import 'package:json_annotation/json_annotation.dart'; -import 'package:stac_models/core/stac_action.dart'; import 'package:stac_models/stac_models.dart'; import 'package:stac_models/theme/stac_button_style/stac_button_style.dart'; import 'package:stac_models/types/stac_alignment.dart'; diff --git a/packages/stac_models/lib/widgets/outlined_button/stac_outlined_button.dart b/packages/stac_models/lib/widgets/outlined_button/stac_outlined_button.dart index 9f3cbd80..dcf7fc4c 100644 --- a/packages/stac_models/lib/widgets/outlined_button/stac_outlined_button.dart +++ b/packages/stac_models/lib/widgets/outlined_button/stac_outlined_button.dart @@ -1,5 +1,4 @@ import 'package:json_annotation/json_annotation.dart'; -import 'package:stac_models/core/stac_action.dart'; import 'package:stac_models/stac_models.dart'; import 'package:stac_models/theme/stac_button_style/stac_button_style.dart'; import 'package:stac_models/types/stac_clip.dart'; diff --git a/packages/stac_models/lib/widgets/scaffold/stac_scaffold.dart b/packages/stac_models/lib/widgets/scaffold/stac_scaffold.dart index 67afa1a5..3260812e 100644 --- a/packages/stac_models/lib/widgets/scaffold/stac_scaffold.dart +++ b/packages/stac_models/lib/widgets/scaffold/stac_scaffold.dart @@ -1,5 +1,4 @@ import 'package:json_annotation/json_annotation.dart'; -import 'package:stac_models/core/stac_action.dart'; import 'package:stac_models/stac_models.dart'; part 'stac_scaffold.g.dart'; diff --git a/packages/stac_models/lib/widgets/text_button/stac_text_button.dart b/packages/stac_models/lib/widgets/text_button/stac_text_button.dart index 1b93b0ca..cff296a9 100644 --- a/packages/stac_models/lib/widgets/text_button/stac_text_button.dart +++ b/packages/stac_models/lib/widgets/text_button/stac_text_button.dart @@ -1,5 +1,4 @@ import 'package:json_annotation/json_annotation.dart'; -import 'package:stac_models/core/stac_action.dart'; import 'package:stac_models/stac_models.dart'; import 'package:stac_models/theme/stac_button_style/stac_button_style.dart'; import 'package:stac_models/types/stac_clip.dart'; From e2b7aee7b5c6fe07bff38a5eaf401e3b676837d0 Mon Sep 17 00:00:00 2001 From: Divyanshu Bhargava Date: Sun, 3 Aug 2025 18:37:10 +0530 Subject: [PATCH 6/7] refactor: Update button parsers to use model's parse method for event handlers --- .../stac_elevated_button_parser.dart | 17 +++++++++++------ .../stac_filled_button_parser.dart | 12 +++++------- .../stac_floating_action_button_parser.dart | 10 +++++----- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/packages/stac/lib/src/parsers/widgets/stac_elevated_button/stac_elevated_button_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_elevated_button/stac_elevated_button_parser.dart index a1a24f7c..a03017fc 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_elevated_button/stac_elevated_button_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_elevated_button/stac_elevated_button_parser.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:stac/src/framework/framework.dart'; +import 'package:stac/src/parsers/core/stac_action_parser.dart'; import 'package:stac/src/parsers/core/stac_widget_parser.dart'; import 'package:stac/src/parsers/theme/stac_button_style/stac_button_style_parser.dart'; import 'package:stac/src/parsers/types/type_parser.dart'; @@ -22,13 +22,18 @@ class StacElevatedButtonParser extends StacParser { return ElevatedButton( onPressed: model.onPressed == null ? null - : () => Stac.onCallFromJson(model.onPressed?.toJson(), context), + : () => model.onPressed?.parse(context), onLongPress: model.onLongPress == null ? null - : () => Stac.onCallFromJson(model.onLongPress?.toJson(), context), - onHover: (bool value) => value == false ? null : model.onHover, - onFocusChange: (bool value) => - value == false ? null : model.onFocusChange, + : () => model.onLongPress?.parse(context), + onHover: model.onHover == null + ? null + : (bool value) => + value == false ? null : model.onHover?.parse(context), + onFocusChange: model.onFocusChange == null + ? null + : (bool value) => + value == false ? null : model.onFocusChange?.parse(context), style: model.style?.parseElevatedButton(context), autofocus: model.autofocus ?? false, clipBehavior: model.clipBehavior?.parse, diff --git a/packages/stac/lib/src/parsers/widgets/stac_filled_button/stac_filled_button_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_filled_button/stac_filled_button_parser.dart index 90f8188f..4638356c 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_filled_button/stac_filled_button_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_filled_button/stac_filled_button_parser.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:stac/src/framework/framework.dart'; +import 'package:stac/src/parsers/core/stac_action_parser.dart'; import 'package:stac/src/parsers/core/stac_widget_parser.dart'; import 'package:stac/src/parsers/theme/stac_button_style/stac_button_style_parser.dart'; import 'package:stac/src/parsers/types/type_parser.dart'; @@ -22,18 +22,16 @@ class StacFilledButtonParser extends StacParser { return FilledButton( onPressed: model.onPressed == null ? null - : () => Stac.onCallFromJson(model.onPressed?.toJson(), context), + : () => model.onPressed?.parse(context), onLongPress: model.onLongPress == null ? null - : () => Stac.onCallFromJson(model.onLongPress?.toJson(), context), + : () => model.onLongPress?.parse(context), onHover: model.onHover == null ? null - : (bool value) => - Stac.onCallFromJson(model.onHover?.toJson(), context), + : (bool value) => model.onHover?.parse(context), onFocusChange: model.onFocusChange == null ? null - : (bool value) => - Stac.onCallFromJson(model.onFocusChange?.toJson(), context), + : (bool value) => model.onFocusChange?.parse(context), style: model.style?.parseFilledButton(context), autofocus: model.autofocus ?? false, clipBehavior: model.clipBehavior?.parse, diff --git a/packages/stac/lib/src/parsers/widgets/stac_floating_action_button/stac_floating_action_button_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_floating_action_button/stac_floating_action_button_parser.dart index cf2484ba..aa1dd4e5 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_floating_action_button/stac_floating_action_button_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_floating_action_button/stac_floating_action_button_parser.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:stac/src/framework/framework.dart'; +import 'package:stac/src/parsers/core/stac_action_parser.dart'; import 'package:stac/src/parsers/core/stac_widget_parser.dart'; import 'package:stac/src/parsers/painting/stac_text_style_parser.dart'; import 'package:stac/src/utils/color_utils.dart'; @@ -26,7 +26,7 @@ class StacFloatingActionButtonParser return FloatingActionButton.extended( onPressed: model.onPressed == null ? null - : () => Stac.onCallFromJson(model.onPressed?.toJson(), context), + : () => model.onPressed?.parse(context), icon: model.icon?.parse(context), backgroundColor: model.backgroundColor?.toColor(context), foregroundColor: model.foregroundColor?.toColor(context), @@ -51,7 +51,7 @@ class StacFloatingActionButtonParser return FloatingActionButton.large( onPressed: model.onPressed == null ? null - : () => Stac.onCallFromJson(model.onPressed?.toJson(), context), + : () => model.onPressed?.parse(context), backgroundColor: model.backgroundColor?.toColor(context), foregroundColor: model.foregroundColor?.toColor(context), focusColor: model.focusColor?.toColor(context), @@ -73,7 +73,7 @@ class StacFloatingActionButtonParser return FloatingActionButton( onPressed: model.onPressed == null ? null - : () => Stac.onCallFromJson(model.onPressed?.toJson(), context), + : () => model.onPressed?.parse(context), backgroundColor: model.backgroundColor?.toColor(context), foregroundColor: model.foregroundColor?.toColor(context), focusColor: model.focusColor?.toColor(context), @@ -95,7 +95,7 @@ class StacFloatingActionButtonParser return FloatingActionButton.small( onPressed: model.onPressed == null ? null - : () => Stac.onCallFromJson(model.onPressed?.toJson(), context), + : () => model.onPressed?.parse(context), backgroundColor: model.backgroundColor?.toColor(context), foregroundColor: model.foregroundColor?.toColor(context), focusColor: model.focusColor?.toColor(context), From 589f251644bb4b02126908340a7f16c5e8e4a994 Mon Sep 17 00:00:00 2001 From: Divyanshu Bhargava Date: Sun, 3 Aug 2025 18:53:50 +0530 Subject: [PATCH 7/7] refactor: Migrate network request handling to stac_models --- .../movie_carousel/movie_carousel.dart | 2 +- examples/movie_app/pubspec.lock | 2 +- examples/movie_app/pubspec.yaml | 1 + packages/stac/lib/src/framework/stac.dart | 2 +- .../stac/lib/src/parsers/actions/actions.dart | 5 +- .../stac_dialog_action.dart | 2 +- .../stac_dialog_action.freezed.dart | 33 -- .../stac_modal_bottom_sheet_action.dart | 2 +- ...tac_modal_bottom_sheet_action.freezed.dart | 33 -- .../stac_navigate_action_parser.dart | 8 +- .../stac_network_request.dart | 38 -- .../stac_network_request.freezed.dart | 487 ------------------ .../stac_network_request.g.dart | 53 -- .../stac_network_request_parser.dart | 2 +- .../stac_set_value/stac_set_value_action.dart | 1 - .../stac_dynamic_view/stac_dynamic_view.dart | 2 +- .../stac_dynamic_view.freezed.dart | 25 - .../stac_network_widget.dart | 2 +- .../stac_network_widget.freezed.dart | 25 - .../src/services/stac_network_service.dart | 2 +- packages/stac_models/lib/actions/actions.dart | 1 + .../navigate/stac_navigate_action.dart | 4 +- .../navigate/stac_navigate_action.g.dart | 6 + .../network_request/stac_network_request.dart | 49 ++ .../stac_network_request.g.dart | 54 ++ 25 files changed, 128 insertions(+), 713 deletions(-) delete mode 100644 packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request.dart delete mode 100644 packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request.freezed.dart delete mode 100644 packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request.g.dart create mode 100644 packages/stac_models/lib/actions/network_request/stac_network_request.dart create mode 100644 packages/stac_models/lib/actions/network_request/stac_network_request.g.dart diff --git a/examples/movie_app/lib/widgets/movie_carousel/movie_carousel.dart b/examples/movie_app/lib/widgets/movie_carousel/movie_carousel.dart index d835abae..ac72ff39 100644 --- a/examples/movie_app/lib/widgets/movie_carousel/movie_carousel.dart +++ b/examples/movie_app/lib/widgets/movie_carousel/movie_carousel.dart @@ -1,4 +1,4 @@ -import 'package:stac/stac.dart'; +import 'package:stac_models/actions/network_request/stac_network_request.dart'; class MovieCarousel { MovieCarousel({required this.request}); diff --git a/examples/movie_app/pubspec.lock b/examples/movie_app/pubspec.lock index 2d930073..9f0dfa63 100644 --- a/examples/movie_app/pubspec.lock +++ b/examples/movie_app/pubspec.lock @@ -462,7 +462,7 @@ packages: source: path version: "1.1.0" stac_models: - dependency: "direct overridden" + dependency: "direct main" description: path: "../../packages/stac_models" relative: true diff --git a/examples/movie_app/pubspec.yaml b/examples/movie_app/pubspec.yaml index d2e4755a..620f300d 100644 --- a/examples/movie_app/pubspec.yaml +++ b/examples/movie_app/pubspec.yaml @@ -35,6 +35,7 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 stac: + stac_models: dio: ^5.8.0+1 smooth_page_indicator: ^1.2.1 diff --git a/packages/stac/lib/src/framework/stac.dart b/packages/stac/lib/src/framework/stac.dart index 292f88e2..c6c15007 100644 --- a/packages/stac/lib/src/framework/stac.dart +++ b/packages/stac/lib/src/framework/stac.dart @@ -18,7 +18,7 @@ import 'package:stac/src/utils/variable_resolver.dart'; import 'package:stac/src/utils/widget_type.dart'; import 'package:stac_framework/stac_framework.dart'; import 'package:stac_logger/stac_logger.dart'; -import 'package:stac_models/core/stac_widget.dart'; +import 'package:stac_models/stac_models.dart'; typedef ErrorWidgetBuilder = Widget Function( BuildContext context, diff --git a/packages/stac/lib/src/parsers/actions/actions.dart b/packages/stac/lib/src/parsers/actions/actions.dart index 654f714d..b9550bfd 100644 --- a/packages/stac/lib/src/parsers/actions/actions.dart +++ b/packages/stac/lib/src/parsers/actions/actions.dart @@ -1,11 +1,10 @@ +export 'package:stac/src/parsers/actions/stac_delay_action/stac_delay_action.dart'; export 'package:stac/src/parsers/actions/stac_dialog_action/stac_dialog_action.dart'; export 'package:stac/src/parsers/actions/stac_form_validate/stac_form_validate.dart'; export 'package:stac/src/parsers/actions/stac_get_form_value/stac_get_form_value.dart'; export 'package:stac/src/parsers/actions/stac_modal_bottom_sheet_action/stac_modal_bottom_sheet_action_parser.dart'; +export 'package:stac/src/parsers/actions/stac_multi_action/stac_multi_action.dart'; export 'package:stac/src/parsers/actions/stac_navigate_action/stac_navigate_action_parser.dart'; -export 'package:stac/src/parsers/actions/stac_network_request/stac_network_request.dart'; export 'package:stac/src/parsers/actions/stac_none_action/stac_none_action_parser.dart'; export 'package:stac/src/parsers/actions/stac_set_value/stac_set_value_action_parser.dart'; export 'package:stac/src/parsers/actions/stac_snack_bar/stac_snack_bar.dart'; -export 'package:stac/src/parsers/actions/stac_multi_action/stac_multi_action.dart'; -export 'package:stac/src/parsers/actions/stac_delay_action/stac_delay_action.dart'; diff --git a/packages/stac/lib/src/parsers/actions/stac_dialog_action/stac_dialog_action.dart b/packages/stac/lib/src/parsers/actions/stac_dialog_action/stac_dialog_action.dart index 7dd0475e..4f8552dc 100644 --- a/packages/stac/lib/src/parsers/actions/stac_dialog_action/stac_dialog_action.dart +++ b/packages/stac/lib/src/parsers/actions/stac_dialog_action/stac_dialog_action.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:stac/src/parsers/actions/stac_network_request/stac_network_request.dart'; +import 'package:stac_models/stac_models.dart'; export 'stac_dialog_action_parser.dart'; diff --git a/packages/stac/lib/src/parsers/actions/stac_dialog_action/stac_dialog_action.freezed.dart b/packages/stac/lib/src/parsers/actions/stac_dialog_action/stac_dialog_action.freezed.dart index 142b9b51..819e22ba 100644 --- a/packages/stac/lib/src/parsers/actions/stac_dialog_action/stac_dialog_action.freezed.dart +++ b/packages/stac/lib/src/parsers/actions/stac_dialog_action/stac_dialog_action.freezed.dart @@ -90,8 +90,6 @@ abstract mixin class $StacDialogActionCopyWith<$Res> { String? barrierLabel, bool useSafeArea, TraversalEdgeBehavior? traversalEdgeBehavior}); - - $StacNetworkRequestCopyWith<$Res>? get request; } /// @nodoc @@ -151,20 +149,6 @@ class _$StacDialogActionCopyWithImpl<$Res> as TraversalEdgeBehavior?, )); } - - /// Create a copy of StacDialogAction - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $StacNetworkRequestCopyWith<$Res>? get request { - if (_self.request == null) { - return null; - } - - return $StacNetworkRequestCopyWith<$Res>(_self.request!, (value) { - return _then(_self.copyWith(request: value)); - }); - } } /// @nodoc @@ -282,9 +266,6 @@ abstract mixin class _$StacDialogActionCopyWith<$Res> String? barrierLabel, bool useSafeArea, TraversalEdgeBehavior? traversalEdgeBehavior}); - - @override - $StacNetworkRequestCopyWith<$Res>? get request; } /// @nodoc @@ -344,20 +325,6 @@ class __$StacDialogActionCopyWithImpl<$Res> as TraversalEdgeBehavior?, )); } - - /// Create a copy of StacDialogAction - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $StacNetworkRequestCopyWith<$Res>? get request { - if (_self.request == null) { - return null; - } - - return $StacNetworkRequestCopyWith<$Res>(_self.request!, (value) { - return _then(_self.copyWith(request: value)); - }); - } } // dart format on diff --git a/packages/stac/lib/src/parsers/actions/stac_modal_bottom_sheet_action/stac_modal_bottom_sheet_action.dart b/packages/stac/lib/src/parsers/actions/stac_modal_bottom_sheet_action/stac_modal_bottom_sheet_action.dart index b086991c..519cf376 100644 --- a/packages/stac/lib/src/parsers/actions/stac_modal_bottom_sheet_action/stac_modal_bottom_sheet_action.dart +++ b/packages/stac/lib/src/parsers/actions/stac_modal_bottom_sheet_action/stac_modal_bottom_sheet_action.dart @@ -1,5 +1,5 @@ import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:stac/src/parsers/actions/stac_network_request/stac_network_request.dart'; +import 'package:stac_models/actions/network_request/stac_network_request.dart'; import 'package:stac_models/types/stac_border/stac_border.dart'; import 'package:stac_models/types/stac_box_constraints/stac_box_constraints.dart'; diff --git a/packages/stac/lib/src/parsers/actions/stac_modal_bottom_sheet_action/stac_modal_bottom_sheet_action.freezed.dart b/packages/stac/lib/src/parsers/actions/stac_modal_bottom_sheet_action/stac_modal_bottom_sheet_action.freezed.dart index 59380e61..deeb76cb 100644 --- a/packages/stac/lib/src/parsers/actions/stac_modal_bottom_sheet_action/stac_modal_bottom_sheet_action.freezed.dart +++ b/packages/stac/lib/src/parsers/actions/stac_modal_bottom_sheet_action/stac_modal_bottom_sheet_action.freezed.dart @@ -125,8 +125,6 @@ abstract mixin class $StacModalBottomSheetActionCopyWith<$Res> { bool enableDrag, bool? showDragHandle, bool useSafeArea}); - - $StacNetworkRequestCopyWith<$Res>? get request; } /// @nodoc @@ -221,20 +219,6 @@ class _$StacModalBottomSheetActionCopyWithImpl<$Res> as bool, )); } - - /// Create a copy of StacModalBottomSheetAction - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $StacNetworkRequestCopyWith<$Res>? get request { - if (_self.request == null) { - return null; - } - - return $StacNetworkRequestCopyWith<$Res>(_self.request!, (value) { - return _then(_self.copyWith(request: value)); - }); - } } /// @nodoc @@ -405,9 +389,6 @@ abstract mixin class _$StacModalBottomSheetActionCopyWith<$Res> bool enableDrag, bool? showDragHandle, bool useSafeArea}); - - @override - $StacNetworkRequestCopyWith<$Res>? get request; } /// @nodoc @@ -502,20 +483,6 @@ class __$StacModalBottomSheetActionCopyWithImpl<$Res> as bool, )); } - - /// Create a copy of StacModalBottomSheetAction - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $StacNetworkRequestCopyWith<$Res>? get request { - if (_self.request == null) { - return null; - } - - return $StacNetworkRequestCopyWith<$Res>(_self.request!, (value) { - return _then(_self.copyWith(request: value)); - }); - } } // dart format on diff --git a/packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action_parser.dart b/packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action_parser.dart index db1c3270..546d10fd 100644 --- a/packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action_parser.dart +++ b/packages/stac/lib/src/parsers/actions/stac_navigate_action/stac_navigate_action_parser.dart @@ -21,11 +21,9 @@ class StacNavigateActionParser extends StacActionParser { Widget? widget; if (model.widgetJson != null) { widget = Stac.fromJson(model.widgetJson, context); - } - // else if (model.request != null) { - // widget = Stac.fromNetwork(context: context, request: model.request!); - // } - else if (model.assetPath != null) { + } else if (model.request != null) { + widget = Stac.fromNetwork(context: context, request: model.request!); + } else if (model.assetPath != null) { widget = Stac.fromAssets(model.assetPath!); } return _navigate( diff --git a/packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request.dart b/packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request.dart deleted file mode 100644 index 884ca9e0..00000000 --- a/packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:freezed_annotation/freezed_annotation.dart'; - -part 'stac_network_request.freezed.dart'; -part 'stac_network_request.g.dart'; - -enum Method { - get, - post, - put, - delete, -} - -@freezed -abstract class StacNetworkRequest with _$StacNetworkRequest { - const factory StacNetworkRequest({ - required String url, - @Default(Method.get) Method method, - Map? queryParameters, - Map? headers, - String? contentType, - dynamic body, - @Default([]) List results, - }) = _StacNetworkRequest; - - factory StacNetworkRequest.fromJson(Map json) => - _$StacNetworkRequestFromJson(json); -} - -@freezed -abstract class StacNetworkResult with _$StacNetworkResult { - const factory StacNetworkResult({ - required int statusCode, - required Map action, - }) = _StacNetworkResult; - - factory StacNetworkResult.fromJson(Map json) => - _$StacNetworkResultFromJson(json); -} diff --git a/packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request.freezed.dart b/packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request.freezed.dart deleted file mode 100644 index 77f4763f..00000000 --- a/packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request.freezed.dart +++ /dev/null @@ -1,487 +0,0 @@ -// dart format width=80 -// coverage:ignore-file -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of 'stac_network_request.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -// dart format off -T _$identity(T value) => value; - -/// @nodoc -mixin _$StacNetworkRequest { - String get url; - Method get method; - Map? get queryParameters; - Map? get headers; - String? get contentType; - dynamic get body; - List get results; - - /// Create a copy of StacNetworkRequest - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @pragma('vm:prefer-inline') - $StacNetworkRequestCopyWith get copyWith => - _$StacNetworkRequestCopyWithImpl( - this as StacNetworkRequest, _$identity); - - /// Serializes this StacNetworkRequest to a JSON map. - Map toJson(); - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is StacNetworkRequest && - (identical(other.url, url) || other.url == url) && - (identical(other.method, method) || other.method == method) && - const DeepCollectionEquality() - .equals(other.queryParameters, queryParameters) && - const DeepCollectionEquality().equals(other.headers, headers) && - (identical(other.contentType, contentType) || - other.contentType == contentType) && - const DeepCollectionEquality().equals(other.body, body) && - const DeepCollectionEquality().equals(other.results, results)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, - url, - method, - const DeepCollectionEquality().hash(queryParameters), - const DeepCollectionEquality().hash(headers), - contentType, - const DeepCollectionEquality().hash(body), - const DeepCollectionEquality().hash(results)); - - @override - String toString() { - return 'StacNetworkRequest(url: $url, method: $method, queryParameters: $queryParameters, headers: $headers, contentType: $contentType, body: $body, results: $results)'; - } -} - -/// @nodoc -abstract mixin class $StacNetworkRequestCopyWith<$Res> { - factory $StacNetworkRequestCopyWith( - StacNetworkRequest value, $Res Function(StacNetworkRequest) _then) = - _$StacNetworkRequestCopyWithImpl; - @useResult - $Res call( - {String url, - Method method, - Map? queryParameters, - Map? headers, - String? contentType, - dynamic body, - List results}); -} - -/// @nodoc -class _$StacNetworkRequestCopyWithImpl<$Res> - implements $StacNetworkRequestCopyWith<$Res> { - _$StacNetworkRequestCopyWithImpl(this._self, this._then); - - final StacNetworkRequest _self; - final $Res Function(StacNetworkRequest) _then; - - /// Create a copy of StacNetworkRequest - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? url = null, - Object? method = null, - Object? queryParameters = freezed, - Object? headers = freezed, - Object? contentType = freezed, - Object? body = freezed, - Object? results = null, - }) { - return _then(_self.copyWith( - url: null == url - ? _self.url - : url // ignore: cast_nullable_to_non_nullable - as String, - method: null == method - ? _self.method - : method // ignore: cast_nullable_to_non_nullable - as Method, - queryParameters: freezed == queryParameters - ? _self.queryParameters - : queryParameters // ignore: cast_nullable_to_non_nullable - as Map?, - headers: freezed == headers - ? _self.headers - : headers // ignore: cast_nullable_to_non_nullable - as Map?, - contentType: freezed == contentType - ? _self.contentType - : contentType // ignore: cast_nullable_to_non_nullable - as String?, - body: freezed == body - ? _self.body - : body // ignore: cast_nullable_to_non_nullable - as dynamic, - results: null == results - ? _self.results - : results // ignore: cast_nullable_to_non_nullable - as List, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _StacNetworkRequest implements StacNetworkRequest { - const _StacNetworkRequest( - {required this.url, - this.method = Method.get, - final Map? queryParameters, - final Map? headers, - this.contentType, - this.body, - final List results = const []}) - : _queryParameters = queryParameters, - _headers = headers, - _results = results; - factory _StacNetworkRequest.fromJson(Map json) => - _$StacNetworkRequestFromJson(json); - - @override - final String url; - @override - @JsonKey() - final Method method; - final Map? _queryParameters; - @override - Map? get queryParameters { - final value = _queryParameters; - if (value == null) return null; - if (_queryParameters is EqualUnmodifiableMapView) return _queryParameters; - // ignore: implicit_dynamic_type - return EqualUnmodifiableMapView(value); - } - - final Map? _headers; - @override - Map? get headers { - final value = _headers; - if (value == null) return null; - if (_headers is EqualUnmodifiableMapView) return _headers; - // ignore: implicit_dynamic_type - return EqualUnmodifiableMapView(value); - } - - @override - final String? contentType; - @override - final dynamic body; - final List _results; - @override - @JsonKey() - List get results { - if (_results is EqualUnmodifiableListView) return _results; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_results); - } - - /// Create a copy of StacNetworkRequest - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - @pragma('vm:prefer-inline') - _$StacNetworkRequestCopyWith<_StacNetworkRequest> get copyWith => - __$StacNetworkRequestCopyWithImpl<_StacNetworkRequest>(this, _$identity); - - @override - Map toJson() { - return _$StacNetworkRequestToJson( - this, - ); - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _StacNetworkRequest && - (identical(other.url, url) || other.url == url) && - (identical(other.method, method) || other.method == method) && - const DeepCollectionEquality() - .equals(other._queryParameters, _queryParameters) && - const DeepCollectionEquality().equals(other._headers, _headers) && - (identical(other.contentType, contentType) || - other.contentType == contentType) && - const DeepCollectionEquality().equals(other.body, body) && - const DeepCollectionEquality().equals(other._results, _results)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, - url, - method, - const DeepCollectionEquality().hash(_queryParameters), - const DeepCollectionEquality().hash(_headers), - contentType, - const DeepCollectionEquality().hash(body), - const DeepCollectionEquality().hash(_results)); - - @override - String toString() { - return 'StacNetworkRequest(url: $url, method: $method, queryParameters: $queryParameters, headers: $headers, contentType: $contentType, body: $body, results: $results)'; - } -} - -/// @nodoc -abstract mixin class _$StacNetworkRequestCopyWith<$Res> - implements $StacNetworkRequestCopyWith<$Res> { - factory _$StacNetworkRequestCopyWith( - _StacNetworkRequest value, $Res Function(_StacNetworkRequest) _then) = - __$StacNetworkRequestCopyWithImpl; - @override - @useResult - $Res call( - {String url, - Method method, - Map? queryParameters, - Map? headers, - String? contentType, - dynamic body, - List results}); -} - -/// @nodoc -class __$StacNetworkRequestCopyWithImpl<$Res> - implements _$StacNetworkRequestCopyWith<$Res> { - __$StacNetworkRequestCopyWithImpl(this._self, this._then); - - final _StacNetworkRequest _self; - final $Res Function(_StacNetworkRequest) _then; - - /// Create a copy of StacNetworkRequest - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $Res call({ - Object? url = null, - Object? method = null, - Object? queryParameters = freezed, - Object? headers = freezed, - Object? contentType = freezed, - Object? body = freezed, - Object? results = null, - }) { - return _then(_StacNetworkRequest( - url: null == url - ? _self.url - : url // ignore: cast_nullable_to_non_nullable - as String, - method: null == method - ? _self.method - : method // ignore: cast_nullable_to_non_nullable - as Method, - queryParameters: freezed == queryParameters - ? _self._queryParameters - : queryParameters // ignore: cast_nullable_to_non_nullable - as Map?, - headers: freezed == headers - ? _self._headers - : headers // ignore: cast_nullable_to_non_nullable - as Map?, - contentType: freezed == contentType - ? _self.contentType - : contentType // ignore: cast_nullable_to_non_nullable - as String?, - body: freezed == body - ? _self.body - : body // ignore: cast_nullable_to_non_nullable - as dynamic, - results: null == results - ? _self._results - : results // ignore: cast_nullable_to_non_nullable - as List, - )); - } -} - -/// @nodoc -mixin _$StacNetworkResult { - int get statusCode; - Map get action; - - /// Create a copy of StacNetworkResult - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @pragma('vm:prefer-inline') - $StacNetworkResultCopyWith get copyWith => - _$StacNetworkResultCopyWithImpl( - this as StacNetworkResult, _$identity); - - /// Serializes this StacNetworkResult to a JSON map. - Map toJson(); - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is StacNetworkResult && - (identical(other.statusCode, statusCode) || - other.statusCode == statusCode) && - const DeepCollectionEquality().equals(other.action, action)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, statusCode, const DeepCollectionEquality().hash(action)); - - @override - String toString() { - return 'StacNetworkResult(statusCode: $statusCode, action: $action)'; - } -} - -/// @nodoc -abstract mixin class $StacNetworkResultCopyWith<$Res> { - factory $StacNetworkResultCopyWith( - StacNetworkResult value, $Res Function(StacNetworkResult) _then) = - _$StacNetworkResultCopyWithImpl; - @useResult - $Res call({int statusCode, Map action}); -} - -/// @nodoc -class _$StacNetworkResultCopyWithImpl<$Res> - implements $StacNetworkResultCopyWith<$Res> { - _$StacNetworkResultCopyWithImpl(this._self, this._then); - - final StacNetworkResult _self; - final $Res Function(StacNetworkResult) _then; - - /// Create a copy of StacNetworkResult - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? statusCode = null, - Object? action = null, - }) { - return _then(_self.copyWith( - statusCode: null == statusCode - ? _self.statusCode - : statusCode // ignore: cast_nullable_to_non_nullable - as int, - action: null == action - ? _self.action - : action // ignore: cast_nullable_to_non_nullable - as Map, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _StacNetworkResult implements StacNetworkResult { - const _StacNetworkResult( - {required this.statusCode, required final Map action}) - : _action = action; - factory _StacNetworkResult.fromJson(Map json) => - _$StacNetworkResultFromJson(json); - - @override - final int statusCode; - final Map _action; - @override - Map get action { - if (_action is EqualUnmodifiableMapView) return _action; - // ignore: implicit_dynamic_type - return EqualUnmodifiableMapView(_action); - } - - /// Create a copy of StacNetworkResult - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - @pragma('vm:prefer-inline') - _$StacNetworkResultCopyWith<_StacNetworkResult> get copyWith => - __$StacNetworkResultCopyWithImpl<_StacNetworkResult>(this, _$identity); - - @override - Map toJson() { - return _$StacNetworkResultToJson( - this, - ); - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _StacNetworkResult && - (identical(other.statusCode, statusCode) || - other.statusCode == statusCode) && - const DeepCollectionEquality().equals(other._action, _action)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, statusCode, const DeepCollectionEquality().hash(_action)); - - @override - String toString() { - return 'StacNetworkResult(statusCode: $statusCode, action: $action)'; - } -} - -/// @nodoc -abstract mixin class _$StacNetworkResultCopyWith<$Res> - implements $StacNetworkResultCopyWith<$Res> { - factory _$StacNetworkResultCopyWith( - _StacNetworkResult value, $Res Function(_StacNetworkResult) _then) = - __$StacNetworkResultCopyWithImpl; - @override - @useResult - $Res call({int statusCode, Map action}); -} - -/// @nodoc -class __$StacNetworkResultCopyWithImpl<$Res> - implements _$StacNetworkResultCopyWith<$Res> { - __$StacNetworkResultCopyWithImpl(this._self, this._then); - - final _StacNetworkResult _self; - final $Res Function(_StacNetworkResult) _then; - - /// Create a copy of StacNetworkResult - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $Res call({ - Object? statusCode = null, - Object? action = null, - }) { - return _then(_StacNetworkResult( - statusCode: null == statusCode - ? _self.statusCode - : statusCode // ignore: cast_nullable_to_non_nullable - as int, - action: null == action - ? _self._action - : action // ignore: cast_nullable_to_non_nullable - as Map, - )); - } -} - -// dart format on diff --git a/packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request.g.dart b/packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request.g.dart deleted file mode 100644 index 247666b2..00000000 --- a/packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request.g.dart +++ /dev/null @@ -1,53 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'stac_network_request.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -_StacNetworkRequest _$StacNetworkRequestFromJson(Map json) => - _StacNetworkRequest( - url: json['url'] as String, - method: - $enumDecodeNullable(_$MethodEnumMap, json['method']) ?? Method.get, - queryParameters: json['queryParameters'] as Map?, - headers: json['headers'] as Map?, - contentType: json['contentType'] as String?, - body: json['body'], - results: (json['results'] as List?) - ?.map( - (e) => StacNetworkResult.fromJson(e as Map)) - .toList() ?? - const [], - ); - -Map _$StacNetworkRequestToJson(_StacNetworkRequest instance) => - { - 'url': instance.url, - 'method': _$MethodEnumMap[instance.method]!, - 'queryParameters': instance.queryParameters, - 'headers': instance.headers, - 'contentType': instance.contentType, - 'body': instance.body, - 'results': instance.results, - }; - -const _$MethodEnumMap = { - Method.get: 'get', - Method.post: 'post', - Method.put: 'put', - Method.delete: 'delete', -}; - -_StacNetworkResult _$StacNetworkResultFromJson(Map json) => - _StacNetworkResult( - statusCode: (json['statusCode'] as num).toInt(), - action: json['action'] as Map, - ); - -Map _$StacNetworkResultToJson(_StacNetworkResult instance) => - { - 'statusCode': instance.statusCode, - 'action': instance.action, - }; diff --git a/packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request_parser.dart b/packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request_parser.dart index 03c98cd1..11e28c0e 100644 --- a/packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request_parser.dart +++ b/packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request_parser.dart @@ -3,11 +3,11 @@ import 'dart:async'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:stac/src/framework/framework.dart'; -import 'package:stac/src/parsers/actions/stac_network_request/stac_network_request.dart'; import 'package:stac/src/services/stac_network_service.dart'; import 'package:stac/src/utils/action_type.dart'; import 'package:stac_framework/stac_framework.dart'; import 'package:stac_logger/stac_logger.dart'; +import 'package:stac_models/stac_models.dart'; class StacNetworkRequestParser extends StacActionParser { const StacNetworkRequestParser(); diff --git a/packages/stac/lib/src/parsers/actions/stac_set_value/stac_set_value_action.dart b/packages/stac/lib/src/parsers/actions/stac_set_value/stac_set_value_action.dart index 94ac0cf3..5c9ef394 100644 --- a/packages/stac/lib/src/parsers/actions/stac_set_value/stac_set_value_action.dart +++ b/packages/stac/lib/src/parsers/actions/stac_set_value/stac_set_value_action.dart @@ -1,5 +1,4 @@ import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:stac_framework/stac_framework.dart'; part 'stac_set_value_action.freezed.dart'; part 'stac_set_value_action.g.dart'; diff --git a/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.dart b/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.dart index 4197d75d..93b5f656 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.dart @@ -1,5 +1,5 @@ import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:stac/stac.dart'; +import 'package:stac_models/actions/network_request/stac_network_request.dart'; export 'stac_dynamic_view_parser.dart'; diff --git a/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.freezed.dart b/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.freezed.dart index 435d16ae..66607222 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.freezed.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.freezed.dart @@ -85,8 +85,6 @@ abstract mixin class $StacDynamicViewCopyWith<$Res> { Map? emptyTemplate, Map? loaderWidget, Map? errorWidget}); - - $StacNetworkRequestCopyWith<$Res> get request; } /// @nodoc @@ -141,16 +139,6 @@ class _$StacDynamicViewCopyWithImpl<$Res> as Map?, )); } - - /// Create a copy of StacDynamicView - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $StacNetworkRequestCopyWith<$Res> get request { - return $StacNetworkRequestCopyWith<$Res>(_self.request, (value) { - return _then(_self.copyWith(request: value)); - }); - } } /// @nodoc @@ -285,9 +273,6 @@ abstract mixin class _$StacDynamicViewCopyWith<$Res> Map? emptyTemplate, Map? loaderWidget, Map? errorWidget}); - - @override - $StacNetworkRequestCopyWith<$Res> get request; } /// @nodoc @@ -342,16 +327,6 @@ class __$StacDynamicViewCopyWithImpl<$Res> as Map?, )); } - - /// Create a copy of StacDynamicView - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $StacNetworkRequestCopyWith<$Res> get request { - return $StacNetworkRequestCopyWith<$Res>(_self.request, (value) { - return _then(_self.copyWith(request: value)); - }); - } } // dart format on diff --git a/packages/stac/lib/src/parsers/widgets/stac_network_widget/stac_network_widget.dart b/packages/stac/lib/src/parsers/widgets/stac_network_widget/stac_network_widget.dart index af90fe4c..e5a5d596 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_network_widget/stac_network_widget.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_network_widget/stac_network_widget.dart @@ -1,5 +1,5 @@ import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:stac/src/parsers/actions/stac_network_request/stac_network_request.dart'; +import 'package:stac_models/actions/network_request/stac_network_request.dart'; export 'stac_network_widget_parser.dart'; diff --git a/packages/stac/lib/src/parsers/widgets/stac_network_widget/stac_network_widget.freezed.dart b/packages/stac/lib/src/parsers/widgets/stac_network_widget/stac_network_widget.freezed.dart index 629c7d1f..5ebac071 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_network_widget/stac_network_widget.freezed.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_network_widget/stac_network_widget.freezed.dart @@ -53,8 +53,6 @@ abstract mixin class $StacNetworkWidgetCopyWith<$Res> { _$StacNetworkWidgetCopyWithImpl; @useResult $Res call({StacNetworkRequest request}); - - $StacNetworkRequestCopyWith<$Res> get request; } /// @nodoc @@ -79,16 +77,6 @@ class _$StacNetworkWidgetCopyWithImpl<$Res> as StacNetworkRequest, )); } - - /// Create a copy of StacNetworkWidget - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $StacNetworkRequestCopyWith<$Res> get request { - return $StacNetworkRequestCopyWith<$Res>(_self.request, (value) { - return _then(_self.copyWith(request: value)); - }); - } } /// @nodoc @@ -143,9 +131,6 @@ abstract mixin class _$StacNetworkWidgetCopyWith<$Res> @override @useResult $Res call({StacNetworkRequest request}); - - @override - $StacNetworkRequestCopyWith<$Res> get request; } /// @nodoc @@ -170,16 +155,6 @@ class __$StacNetworkWidgetCopyWithImpl<$Res> as StacNetworkRequest, )); } - - /// Create a copy of StacNetworkWidget - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $StacNetworkRequestCopyWith<$Res> get request { - return $StacNetworkRequestCopyWith<$Res>(_self.request, (value) { - return _then(_self.copyWith(request: value)); - }); - } } // dart format on diff --git a/packages/stac/lib/src/services/stac_network_service.dart b/packages/stac/lib/src/services/stac_network_service.dart index f02b0c32..b6296c56 100644 --- a/packages/stac/lib/src/services/stac_network_service.dart +++ b/packages/stac/lib/src/services/stac_network_service.dart @@ -1,7 +1,7 @@ import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; -import 'package:stac/src/parsers/actions/stac_network_request/stac_network_request.dart'; import 'package:stac/src/framework/framework.dart'; +import 'package:stac_models/actions/network_request/stac_network_request.dart'; class StacNetworkService { const StacNetworkService._(); diff --git a/packages/stac_models/lib/actions/actions.dart b/packages/stac_models/lib/actions/actions.dart index 9eefef38..dc8a04dd 100644 --- a/packages/stac_models/lib/actions/actions.dart +++ b/packages/stac_models/lib/actions/actions.dart @@ -1 +1,2 @@ export 'navigate/stac_navigate_action.dart'; +export 'network_request/stac_network_request.dart'; diff --git a/packages/stac_models/lib/actions/navigate/stac_navigate_action.dart b/packages/stac_models/lib/actions/navigate/stac_navigate_action.dart index edb29205..dc0f3715 100644 --- a/packages/stac_models/lib/actions/navigate/stac_navigate_action.dart +++ b/packages/stac_models/lib/actions/navigate/stac_navigate_action.dart @@ -1,4 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; +import 'package:stac_models/actions/network_request/stac_network_request.dart'; import 'package:stac_models/core/stac_action.dart'; part 'stac_navigate_action.g.dart'; @@ -17,6 +18,7 @@ enum NavigationStyle { @JsonSerializable() class StacNavigateAction extends StacAction { const StacNavigateAction({ + this.request, this.widgetJson, this.assetPath, this.routeName, @@ -25,7 +27,7 @@ class StacNavigateAction extends StacAction { this.arguments, }); - // StacNetworkRequest? request, + final StacNetworkRequest? request; final Map? widgetJson; final String? assetPath; final String? routeName; diff --git a/packages/stac_models/lib/actions/navigate/stac_navigate_action.g.dart b/packages/stac_models/lib/actions/navigate/stac_navigate_action.g.dart index 209e563b..8e0e71bd 100644 --- a/packages/stac_models/lib/actions/navigate/stac_navigate_action.g.dart +++ b/packages/stac_models/lib/actions/navigate/stac_navigate_action.g.dart @@ -8,6 +8,11 @@ part of 'stac_navigate_action.dart'; StacNavigateAction _$StacNavigateActionFromJson(Map json) => StacNavigateAction( + request: json['request'] == null + ? null + : StacNetworkRequest.fromJson( + json['request'] as Map, + ), widgetJson: json['widgetJson'] as Map?, assetPath: json['assetPath'] as String?, routeName: json['routeName'] as String?, @@ -21,6 +26,7 @@ StacNavigateAction _$StacNavigateActionFromJson(Map json) => Map _$StacNavigateActionToJson(StacNavigateAction instance) => { + 'request': instance.request?.toJson(), 'widgetJson': instance.widgetJson, 'assetPath': instance.assetPath, 'routeName': instance.routeName, diff --git a/packages/stac_models/lib/actions/network_request/stac_network_request.dart b/packages/stac_models/lib/actions/network_request/stac_network_request.dart new file mode 100644 index 00000000..90d69bac --- /dev/null +++ b/packages/stac_models/lib/actions/network_request/stac_network_request.dart @@ -0,0 +1,49 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:stac_models/core/stac_action.dart'; + +part 'stac_network_request.g.dart'; + +enum Method { get, post, put, delete } + +@JsonSerializable() +class StacNetworkRequest extends StacAction { + const StacNetworkRequest({ + required this.url, + this.method = Method.get, + this.queryParameters, + this.headers, + this.contentType, + this.body, + this.results = const [], + }); + + final String url; + final Method method; + final Map? queryParameters; + final Map? headers; + final String? contentType; + final dynamic body; + final List results; + + @override + String get actionType => 'networkRequest'; + + factory StacNetworkRequest.fromJson(Map json) => + _$StacNetworkRequestFromJson(json); + + @override + Map toJson() => _$StacNetworkRequestToJson(this); +} + +@JsonSerializable() +class StacNetworkResult { + const StacNetworkResult({required this.statusCode, required this.action}); + + final int statusCode; + final Map action; + + factory StacNetworkResult.fromJson(Map json) => + _$StacNetworkResultFromJson(json); + + Map toJson() => _$StacNetworkResultToJson(this); +} diff --git a/packages/stac_models/lib/actions/network_request/stac_network_request.g.dart b/packages/stac_models/lib/actions/network_request/stac_network_request.g.dart new file mode 100644 index 00000000..a7d6e6e9 --- /dev/null +++ b/packages/stac_models/lib/actions/network_request/stac_network_request.g.dart @@ -0,0 +1,54 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'stac_network_request.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +StacNetworkRequest _$StacNetworkRequestFromJson( + Map json, +) => StacNetworkRequest( + url: json['url'] as String, + method: $enumDecodeNullable(_$MethodEnumMap, json['method']) ?? Method.get, + queryParameters: json['queryParameters'] as Map?, + headers: json['headers'] as Map?, + contentType: json['contentType'] as String?, + body: json['body'], + results: + (json['results'] as List?) + ?.map((e) => StacNetworkResult.fromJson(e as Map)) + .toList() ?? + const [], +); + +Map _$StacNetworkRequestToJson(StacNetworkRequest instance) => + { + 'url': instance.url, + 'method': _$MethodEnumMap[instance.method]!, + 'queryParameters': instance.queryParameters, + 'headers': instance.headers, + 'contentType': instance.contentType, + 'body': instance.body, + 'results': instance.results.map((e) => e.toJson()).toList(), + 'actionType': instance.actionType, + }; + +const _$MethodEnumMap = { + Method.get: 'get', + Method.post: 'post', + Method.put: 'put', + Method.delete: 'delete', +}; + +StacNetworkResult _$StacNetworkResultFromJson(Map json) => + StacNetworkResult( + statusCode: (json['statusCode'] as num).toInt(), + action: json['action'] as Map, + ); + +Map _$StacNetworkResultToJson(StacNetworkResult instance) => + { + 'statusCode': instance.statusCode, + 'action': instance.action, + };