diff --git a/CHANGELOG.md b/CHANGELOG.md index f2d4318c..39940f41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## Unreleased + +- `ShowToastAction` (`ActionType.showToast`): shows a short message at the + bottom of the screen, with an optional icon, colors, duration and offset. +- Every node with fills, strokes or opacity now lists `fill`, `stroke` and + `opacity` in its property variables, and every node lists `width` and + `height`, so conditions, bound variables and set value actions can change + them at runtime. + ## 5.2.0 ### New actions diff --git a/lib/src/api/mixins.dart b/lib/src/api/mixins.dart index 7c700fd4..b990ed0b 100644 --- a/lib/src/api/mixins.dart +++ b/lib/src/api/mixins.dart @@ -1044,9 +1044,27 @@ mixin VariablePropertiesMixin { mixin PropertyVariableMixin on BaseNode { /// Properties of the node that can be used in actions or can be changed by /// an action. + /// + /// Style properties (fill, stroke, opacity, width, height; a text's fill is + /// its color) can be set by + /// conditions, bound to variables or formulas, or changed by a set value + /// action, on any node that has them. late final List propertyVariables = [ BoolValue(name: 'visible', value: visible), IntValue(name: 'rotationDegrees', value: rotationDegrees), + if (this case final GeometryMixin geometry) ...[ + PaintValue(name: 'fill', value: geometry.fills.firstOrNull), + PaintValue(name: 'stroke', value: geometry.strokes.firstOrNull), + ], + if (this case final TextNode text) + PaintValue( + name: 'fill', + value: text.textMixedProps.firstOrNull?.fills.firstOrNull, + ), + if (this case final BlendMixin blend) + DoubleValue(name: 'opacity', value: blend.opacity), + DoubleValue(name: 'width', value: basicBoxLocal.width), + DoubleValue(name: 'height', value: basicBoxLocal.height), ]; } diff --git a/lib/src/api/models/action/action.dart b/lib/src/api/models/action/action.dart index 86932f50..1431ccee 100644 --- a/lib/src/api/models/action/action.dart +++ b/lib/src/api/models/action/action.dart @@ -49,7 +49,10 @@ enum ActionType { forEach, /// Upload or delete files in cloud storage. - cloudFiles; + cloudFiles, + + /// Show a short message near the bottom of the screen. + showToast; /// Displayable string representation of the [ActionType]. String get prettify { @@ -86,6 +89,8 @@ enum ActionType { return 'For Each'; case ActionType.cloudFiles: return 'Cloud Files'; + case ActionType.showToast: + return 'Show Toast'; } } } @@ -167,6 +172,8 @@ abstract class ActionModel with SerializableMixin { return ForEachAction.fromJson(json); case ActionType.cloudFiles: return CloudFilesAction.fromJson(json); + case ActionType.showToast: + return ShowToastAction.fromJson(json); } } diff --git a/lib/src/api/models/action/api_call_action.g.dart b/lib/src/api/models/action/api_call_action.g.dart index b6e55a16..bb5e0e38 100644 --- a/lib/src/api/models/action/api_call_action.g.dart +++ b/lib/src/api/models/action/api_call_action.g.dart @@ -54,4 +54,5 @@ const _$ActionTypeEnumMap = { ActionType.conditional: 'conditional', ActionType.forEach: 'forEach', ActionType.cloudFiles: 'cloudFiles', + ActionType.showToast: 'showToast', }; diff --git a/lib/src/api/models/action/auth_action.g.dart b/lib/src/api/models/action/auth_action.g.dart index cf15e6cc..94b569fc 100644 --- a/lib/src/api/models/action/auth_action.g.dart +++ b/lib/src/api/models/action/auth_action.g.dart @@ -77,4 +77,5 @@ const _$ActionTypeEnumMap = { ActionType.conditional: 'conditional', ActionType.forEach: 'forEach', ActionType.cloudFiles: 'cloudFiles', + ActionType.showToast: 'showToast', }; diff --git a/lib/src/api/models/action/call_function_action.g.dart b/lib/src/api/models/action/call_function_action.g.dart index dab28530..43db4314 100644 --- a/lib/src/api/models/action/call_function_action.g.dart +++ b/lib/src/api/models/action/call_function_action.g.dart @@ -52,4 +52,5 @@ const _$ActionTypeEnumMap = { ActionType.conditional: 'conditional', ActionType.forEach: 'forEach', ActionType.cloudFiles: 'cloudFiles', + ActionType.showToast: 'showToast', }; diff --git a/lib/src/api/models/action/cloud_files_action.g.dart b/lib/src/api/models/action/cloud_files_action.g.dart index 405b506e..3a6cb7e5 100644 --- a/lib/src/api/models/action/cloud_files_action.g.dart +++ b/lib/src/api/models/action/cloud_files_action.g.dart @@ -89,4 +89,5 @@ const _$ActionTypeEnumMap = { ActionType.conditional: 'conditional', ActionType.forEach: 'forEach', ActionType.cloudFiles: 'cloudFiles', + ActionType.showToast: 'showToast', }; diff --git a/lib/src/api/models/action/conditional_action.g.dart b/lib/src/api/models/action/conditional_action.g.dart index 712a95ba..b772e903 100644 --- a/lib/src/api/models/action/conditional_action.g.dart +++ b/lib/src/api/models/action/conditional_action.g.dart @@ -60,4 +60,5 @@ const _$ActionTypeEnumMap = { ActionType.conditional: 'conditional', ActionType.forEach: 'forEach', ActionType.cloudFiles: 'cloudFiles', + ActionType.showToast: 'showToast', }; diff --git a/lib/src/api/models/action/for_each_action.g.dart b/lib/src/api/models/action/for_each_action.g.dart index da82e766..1f3b7f93 100644 --- a/lib/src/api/models/action/for_each_action.g.dart +++ b/lib/src/api/models/action/for_each_action.g.dart @@ -55,4 +55,5 @@ const _$ActionTypeEnumMap = { ActionType.conditional: 'conditional', ActionType.forEach: 'forEach', ActionType.cloudFiles: 'cloudFiles', + ActionType.showToast: 'showToast', }; diff --git a/lib/src/api/models/action/link_action.g.dart b/lib/src/api/models/action/link_action.g.dart index 980c9775..625467e3 100644 --- a/lib/src/api/models/action/link_action.g.dart +++ b/lib/src/api/models/action/link_action.g.dart @@ -50,4 +50,5 @@ const _$ActionTypeEnumMap = { ActionType.conditional: 'conditional', ActionType.forEach: 'forEach', ActionType.cloudFiles: 'cloudFiles', + ActionType.showToast: 'showToast', }; diff --git a/lib/src/api/models/action/load_from_cloud_storage_action.g.dart b/lib/src/api/models/action/load_from_cloud_storage_action.g.dart index cffa3fe5..f7a2bcd3 100644 --- a/lib/src/api/models/action/load_from_cloud_storage_action.g.dart +++ b/lib/src/api/models/action/load_from_cloud_storage_action.g.dart @@ -93,4 +93,5 @@ const _$ActionTypeEnumMap = { ActionType.conditional: 'conditional', ActionType.forEach: 'forEach', ActionType.cloudFiles: 'cloudFiles', + ActionType.showToast: 'showToast', }; diff --git a/lib/src/api/models/action/navigation_action.g.dart b/lib/src/api/models/action/navigation_action.g.dart index a65dc37a..c290df20 100644 --- a/lib/src/api/models/action/navigation_action.g.dart +++ b/lib/src/api/models/action/navigation_action.g.dart @@ -64,4 +64,5 @@ const _$ActionTypeEnumMap = { ActionType.conditional: 'conditional', ActionType.forEach: 'forEach', ActionType.cloudFiles: 'cloudFiles', + ActionType.showToast: 'showToast', }; diff --git a/lib/src/api/models/action/set_cloud_storage_action.g.dart b/lib/src/api/models/action/set_cloud_storage_action.g.dart index 8e1486f0..dc66d499 100644 --- a/lib/src/api/models/action/set_cloud_storage_action.g.dart +++ b/lib/src/api/models/action/set_cloud_storage_action.g.dart @@ -101,6 +101,7 @@ const _$ActionTypeEnumMap = { ActionType.conditional: 'conditional', ActionType.forEach: 'forEach', ActionType.cloudFiles: 'cloudFiles', + ActionType.showToast: 'showToast', }; AddDocumentSubAction _$AddDocumentSubActionFromJson(Map json) => diff --git a/lib/src/api/models/action/set_storage_action.g.dart b/lib/src/api/models/action/set_storage_action.g.dart index 017fd47a..b2da1941 100644 --- a/lib/src/api/models/action/set_storage_action.g.dart +++ b/lib/src/api/models/action/set_storage_action.g.dart @@ -139,4 +139,5 @@ const _$ActionTypeEnumMap = { ActionType.conditional: 'conditional', ActionType.forEach: 'forEach', ActionType.cloudFiles: 'cloudFiles', + ActionType.showToast: 'showToast', }; diff --git a/lib/src/api/models/action/set_value_action.g.dart b/lib/src/api/models/action/set_value_action.g.dart index dc7a9d3f..2fe477c9 100644 --- a/lib/src/api/models/action/set_value_action.g.dart +++ b/lib/src/api/models/action/set_value_action.g.dart @@ -116,6 +116,7 @@ const _$ActionTypeEnumMap = { ActionType.conditional: 'conditional', ActionType.forEach: 'forEach', ActionType.cloudFiles: 'cloudFiles', + ActionType.showToast: 'showToast', }; BoolValue _$BoolValueFromJson(Map json) => BoolValue( diff --git a/lib/src/api/models/action/set_variable_action.g.dart b/lib/src/api/models/action/set_variable_action.g.dart index 88593304..d4d22984 100644 --- a/lib/src/api/models/action/set_variable_action.g.dart +++ b/lib/src/api/models/action/set_variable_action.g.dart @@ -107,4 +107,5 @@ const _$ActionTypeEnumMap = { ActionType.conditional: 'conditional', ActionType.forEach: 'forEach', ActionType.cloudFiles: 'cloudFiles', + ActionType.showToast: 'showToast', }; diff --git a/lib/src/api/models/action/set_variant_action.g.dart b/lib/src/api/models/action/set_variant_action.g.dart index e2b2f784..069c3904 100644 --- a/lib/src/api/models/action/set_variant_action.g.dart +++ b/lib/src/api/models/action/set_variant_action.g.dart @@ -52,4 +52,5 @@ const _$ActionTypeEnumMap = { ActionType.conditional: 'conditional', ActionType.forEach: 'forEach', ActionType.cloudFiles: 'cloudFiles', + ActionType.showToast: 'showToast', }; diff --git a/lib/src/api/models/action/show_dialog_action.g.dart b/lib/src/api/models/action/show_dialog_action.g.dart index f42b52eb..52122d9a 100644 --- a/lib/src/api/models/action/show_dialog_action.g.dart +++ b/lib/src/api/models/action/show_dialog_action.g.dart @@ -68,4 +68,5 @@ const _$ActionTypeEnumMap = { ActionType.conditional: 'conditional', ActionType.forEach: 'forEach', ActionType.cloudFiles: 'cloudFiles', + ActionType.showToast: 'showToast', }; diff --git a/lib/src/api/models/action/show_toast_action.dart b/lib/src/api/models/action/show_toast_action.dart new file mode 100644 index 00000000..8ec8ad49 --- /dev/null +++ b/lib/src/api/models/action/show_toast_action.dart @@ -0,0 +1,83 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:equatable/equatable.dart'; + +import '../../mixins.dart'; +import '../models.dart'; + +part 'show_toast_action.g.dart'; + +/// An action that shows a short message in a pill near the bottom of the +/// screen, then hides it. +@JsonSerializable() +class ShowToastAction extends ActionModel with Equatable, SerializableMixin { + /// The message. Supports variables and formulas, e.g. + /// `Added ${storage.drink.name} to your order`. + final String message; + + /// How long the message stays on screen, in milliseconds. + final int duration; + + /// Pill color. + final ColorRGBA backgroundColor; + + /// Message color. + final ColorRGBA textColor; + + /// Optional icon before the message. + final MultiSourceIconModel? icon; + + /// Distance from the bottom of the screen. + final double bottomOffset; + + /// Creates a new [ShowToastAction]. + ShowToastAction({ + required this.message, + this.duration = 2600, + this.backgroundColor = const ColorRGBA(r: 0.169, g: 0.141, b: 0.125, a: 1), + this.textColor = ColorRGBA.white, + this.icon, + this.bottomOffset = 104, + super.nonBlocking, + super.enabled, + }) : super(type: ActionType.showToast); + + @override + List get props => [ + message, + duration, + backgroundColor, + textColor, + icon, + bottomOffset, + ]; + + /// Duplicates this [ShowToastAction] with given data overrides. + ShowToastAction copyWith({ + String? message, + int? duration, + ColorRGBA? backgroundColor, + ColorRGBA? textColor, + MultiSourceIconModel? icon, + bool clearIcon = false, + double? bottomOffset, + }) => ShowToastAction( + message: message ?? this.message, + duration: duration ?? this.duration, + backgroundColor: backgroundColor ?? this.backgroundColor, + textColor: textColor ?? this.textColor, + icon: clearIcon ? null : icon ?? this.icon, + bottomOffset: bottomOffset ?? this.bottomOffset, + nonBlocking: nonBlocking, + enabled: enabled, + ); + + /// Creates a new [ShowToastAction] instance from JSON data. + factory ShowToastAction.fromJson(Map json) => _$ShowToastActionFromJson(json); + + @override + Map toJson() => + _$ShowToastActionOmitDefaults(this, _$ShowToastActionToJson(this)); + + @override + R? accept(ActionVisitor visitor) => visitor.visitShowToastAction(this); +} diff --git a/lib/src/api/models/action/show_toast_action.g.dart b/lib/src/api/models/action/show_toast_action.g.dart new file mode 100644 index 00000000..cb90810e --- /dev/null +++ b/lib/src/api/models/action/show_toast_action.g.dart @@ -0,0 +1,79 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'show_toast_action.dart'; + +// ************************************************************************** +// JsonDefaultsGenerator +// ************************************************************************** + +Map _$ShowToastActionOmitDefaults( + ShowToastAction instance, + Map json, +) { + if (isJsonDefault(instance.duration, 2600)) json.remove('duration'); + if (isJsonDefault( + instance.backgroundColor, + const ColorRGBA(r: 0.169, g: 0.141, b: 0.125, a: 1), + )) + json.remove('backgroundColor'); + if (isJsonDefault(instance.textColor, ColorRGBA.white)) + json.remove('textColor'); + if (isJsonDefault(instance.bottomOffset, 104)) json.remove('bottomOffset'); + if (isJsonDefault(instance.nonBlocking, false)) json.remove('nonBlocking'); + if (isJsonDefault(instance.enabled, true)) json.remove('enabled'); + return json; +} + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +ShowToastAction _$ShowToastActionFromJson(Map json) => ShowToastAction( + message: json['message'] as String, + duration: (json['duration'] as num?)?.toInt() ?? 2600, + backgroundColor: json['backgroundColor'] == null + ? const ColorRGBA(r: 0.169, g: 0.141, b: 0.125, a: 1) + : ColorRGBA.fromJson(json['backgroundColor']), + textColor: json['textColor'] == null + ? ColorRGBA.white + : ColorRGBA.fromJson(json['textColor']), + icon: json['icon'] == null + ? null + : MultiSourceIconModel.fromJson(json['icon'] as Map), + bottomOffset: (json['bottomOffset'] as num?)?.toDouble() ?? 104, + nonBlocking: json['nonBlocking'] as bool? ?? false, + enabled: json['enabled'] as bool? ?? true, +)..type = $enumDecode(_$ActionTypeEnumMap, json['type']); + +Map _$ShowToastActionToJson(ShowToastAction instance) => + { + 'type': _$ActionTypeEnumMap[instance.type]!, + 'nonBlocking': instance.nonBlocking, + 'enabled': instance.enabled, + 'message': instance.message, + 'duration': instance.duration, + 'backgroundColor': instance.backgroundColor.toJson(), + 'textColor': instance.textColor.toJson(), + 'icon': ?instance.icon?.toJson(), + 'bottomOffset': instance.bottomOffset, + }; + +const _$ActionTypeEnumMap = { + ActionType.navigation: 'navigation', + ActionType.showDialog: 'showDialog', + ActionType.link: 'link', + ActionType.submit: 'submit', + ActionType.setValue: 'setValue', + ActionType.setVariant: 'setVariant', + ActionType.setVariable: 'setVariable', + ActionType.callFunction: 'callFunction', + ActionType.callApi: 'callApi', + ActionType.setStorage: 'setStorage', + ActionType.setCloudStorage: 'setCloudStorage', + ActionType.loadFromCloudStorage: 'loadFromCloudStorage', + ActionType.auth: 'auth', + ActionType.conditional: 'conditional', + ActionType.forEach: 'forEach', + ActionType.cloudFiles: 'cloudFiles', + ActionType.showToast: 'showToast', +}; diff --git a/lib/src/api/models/action/submit_action.g.dart b/lib/src/api/models/action/submit_action.g.dart index 4ce331d7..ac9337f7 100644 --- a/lib/src/api/models/action/submit_action.g.dart +++ b/lib/src/api/models/action/submit_action.g.dart @@ -68,6 +68,7 @@ const _$ActionTypeEnumMap = { ActionType.conditional: 'conditional', ActionType.forEach: 'forEach', ActionType.cloudFiles: 'cloudFiles', + ActionType.showToast: 'showToast', }; MailchimpSubmitAction _$MailchimpSubmitActionFromJson(Map json) => diff --git a/lib/src/api/models/condition.dart b/lib/src/api/models/condition.dart index 3822a4d7..2d1e6f91 100644 --- a/lib/src/api/models/condition.dart +++ b/lib/src/api/models/condition.dart @@ -773,6 +773,9 @@ abstract interface class ActionVisitor { /// Evaluates the action and returns the result. R? visitLinkAction(LinkAction action); + /// Evaluates the action and returns the result. + R? visitShowToastAction(ShowToastAction action); + /// Evaluates the action and returns the result. R? visitCallFunctionAction(CallFunctionAction action); diff --git a/lib/src/api/models/models.dart b/lib/src/api/models/models.dart index f12d72cc..1cb2e39a 100644 --- a/lib/src/api/models/models.dart +++ b/lib/src/api/models/models.dart @@ -7,6 +7,7 @@ export 'action/conditional_action.dart'; export 'action/for_each_action.dart'; export 'action/call_function_action.dart'; export 'action/link_action.dart'; +export 'action/show_toast_action.dart'; export 'action/load_from_cloud_storage_action.dart'; export 'action/navigation_action.dart'; export 'action/set_cloud_storage_action.dart'; diff --git a/lib/src/api/nodes/frame_node.g.dart b/lib/src/api/nodes/frame_node.g.dart index aae81472..e906cbe3 100644 --- a/lib/src/api/nodes/frame_node.g.dart +++ b/lib/src/api/nodes/frame_node.g.dart @@ -248,7 +248,6 @@ FrameNode _$FrameNodeFromJson(Map json) => ..type = json['type'] as String; Map _$FrameNodeToJson(FrameNode instance) => { - 'reactions': instance.reactions.map((e) => e.toJson()).toList(), 'variables': instance.variables, 'multipleVariables': instance.multipleVariables, 'componentId': ?instance.componentId, @@ -266,6 +265,7 @@ Map _$FrameNodeToJson(FrameNode instance) => { 'flex': instance.flex, 'aspectRatioLock': instance.aspectRatioLock, 'alignment': instance.alignment.toJson(), + 'reactions': instance.reactions.map((e) => e.toJson()).toList(), 'basicBoxLocal': instance.basicBoxLocal.toJson(), 'margin': instance.margin.toJson(), 'padding': instance.padding.toJson(), diff --git a/lib/src/api/nodes/page_view_node.g.dart b/lib/src/api/nodes/page_view_node.g.dart index fbd5ef83..25fb29f5 100644 --- a/lib/src/api/nodes/page_view_node.g.dart +++ b/lib/src/api/nodes/page_view_node.g.dart @@ -194,6 +194,7 @@ PageViewNode _$PageViewNodeFromJson(Map json) => Map _$PageViewNodeToJson(PageViewNode instance) => { + 'reactions': instance.reactions.map((e) => e.toJson()).toList(), 'variables': instance.variables, 'multipleVariables': instance.multipleVariables, 'componentId': ?instance.componentId, @@ -211,7 +212,6 @@ Map _$PageViewNodeToJson(PageViewNode instance) => 'flex': instance.flex, 'aspectRatioLock': instance.aspectRatioLock, 'alignment': instance.alignment.toJson(), - 'reactions': instance.reactions.map((e) => e.toJson()).toList(), 'basicBoxLocal': instance.basicBoxLocal.toJson(), 'margin': instance.margin.toJson(), 'padding': instance.padding.toJson(), diff --git a/lib/src/api/nodes/variance_node.g.dart b/lib/src/api/nodes/variance_node.g.dart index bb5fa3c0..09e2b71f 100644 --- a/lib/src/api/nodes/variance_node.g.dart +++ b/lib/src/api/nodes/variance_node.g.dart @@ -186,8 +186,8 @@ Map _$VarianceNodeToJson(VarianceNode instance) => 'enabled': instance.enabled, 'ephemeral': instance.ephemeral, 'allowedTypes': instance.allowedTypes, - 'deniedTypes': instance.deniedTypes, 'maxAllowedSize': ?instance.maxAllowedSize?.toJson(), + 'deniedTypes': instance.deniedTypes, 'type': instance.type, 'currentVariantId': instance.currentVariantId, 'variants': instance.variants.map((e) => e.toJson()).toList(), diff --git a/lib/src/api/nodes/web_view_google_maps_properties.g.dart b/lib/src/api/nodes/web_view_google_maps_properties.g.dart index e684c2a5..1e243a54 100644 --- a/lib/src/api/nodes/web_view_google_maps_properties.g.dart +++ b/lib/src/api/nodes/web_view_google_maps_properties.g.dart @@ -122,7 +122,7 @@ PlacesGoogleMapsWebViewProperties _$PlacesGoogleMapsWebViewPropertiesFromJson( ? null : ColorRGBA.fromJson(json['backgroundColor']), ) - ..src = _$JsonConverterFromJson( + ..src = _$JsonConverterFromJson( json['src'], const Base64JsonConverter().fromJson, ) @@ -133,7 +133,7 @@ PlacesGoogleMapsWebViewProperties _$PlacesGoogleMapsWebViewPropertiesFromJson( Map _$PlacesGoogleMapsWebViewPropertiesToJson( PlacesGoogleMapsWebViewProperties instance, ) => { - 'src': ?const Base64JsonConverter().toJson(instance.src), + 'src': const Base64JsonConverter().toJson(instance.src), 'controlVerticalScrollGesture': ?instance.controlVerticalScrollGesture, 'controlHorizontalScrollGesture': ?instance.controlHorizontalScrollGesture, 'controlScaleGesture': ?instance.controlScaleGesture, @@ -218,7 +218,7 @@ ViewGoogleMapsWebViewProperties _$ViewGoogleMapsWebViewPropertiesFromJson( ? null : ColorRGBA.fromJson(json['backgroundColor']), ) - ..src = _$JsonConverterFromJson( + ..src = _$JsonConverterFromJson( json['src'], const Base64JsonConverter().fromJson, ) @@ -229,7 +229,7 @@ ViewGoogleMapsWebViewProperties _$ViewGoogleMapsWebViewPropertiesFromJson( Map _$ViewGoogleMapsWebViewPropertiesToJson( ViewGoogleMapsWebViewProperties instance, ) => { - 'src': ?const Base64JsonConverter().toJson(instance.src), + 'src': const Base64JsonConverter().toJson(instance.src), 'controlVerticalScrollGesture': ?instance.controlVerticalScrollGesture, 'controlHorizontalScrollGesture': ?instance.controlHorizontalScrollGesture, 'controlScaleGesture': ?instance.controlScaleGesture, @@ -296,7 +296,7 @@ _$DirectionsGoogleMapsWebViewPropertiesFromJson(Map json) => ? null : ColorRGBA.fromJson(json['backgroundColor']), ) - ..src = _$JsonConverterFromJson( + ..src = _$JsonConverterFromJson( json['src'], const Base64JsonConverter().fromJson, ) @@ -307,7 +307,7 @@ _$DirectionsGoogleMapsWebViewPropertiesFromJson(Map json) => Map _$DirectionsGoogleMapsWebViewPropertiesToJson( DirectionsGoogleMapsWebViewProperties instance, ) => { - 'src': ?const Base64JsonConverter().toJson(instance.src), + 'src': const Base64JsonConverter().toJson(instance.src), 'controlVerticalScrollGesture': ?instance.controlVerticalScrollGesture, 'controlHorizontalScrollGesture': ?instance.controlHorizontalScrollGesture, 'controlScaleGesture': ?instance.controlScaleGesture, @@ -395,7 +395,7 @@ _$StreetViewGoogleMapsWebViewPropertiesFromJson(Map json) => ? null : ColorRGBA.fromJson(json['backgroundColor']), ) - ..src = _$JsonConverterFromJson( + ..src = _$JsonConverterFromJson( json['src'], const Base64JsonConverter().fromJson, ) @@ -406,7 +406,7 @@ _$StreetViewGoogleMapsWebViewPropertiesFromJson(Map json) => Map _$StreetViewGoogleMapsWebViewPropertiesToJson( StreetViewGoogleMapsWebViewProperties instance, ) => { - 'src': ?const Base64JsonConverter().toJson(instance.src), + 'src': const Base64JsonConverter().toJson(instance.src), 'controlVerticalScrollGesture': ?instance.controlVerticalScrollGesture, 'controlHorizontalScrollGesture': ?instance.controlHorizontalScrollGesture, 'controlScaleGesture': ?instance.controlScaleGesture, @@ -466,7 +466,7 @@ SearchGoogleMapsWebViewProperties _$SearchGoogleMapsWebViewPropertiesFromJson( ? null : ColorRGBA.fromJson(json['backgroundColor']), ) - ..src = _$JsonConverterFromJson( + ..src = _$JsonConverterFromJson( json['src'], const Base64JsonConverter().fromJson, ) @@ -477,7 +477,7 @@ SearchGoogleMapsWebViewProperties _$SearchGoogleMapsWebViewPropertiesFromJson( Map _$SearchGoogleMapsWebViewPropertiesToJson( SearchGoogleMapsWebViewProperties instance, ) => { - 'src': ?const Base64JsonConverter().toJson(instance.src), + 'src': const Base64JsonConverter().toJson(instance.src), 'controlVerticalScrollGesture': ?instance.controlVerticalScrollGesture, 'controlHorizontalScrollGesture': ?instance.controlHorizontalScrollGesture, 'controlScaleGesture': ?instance.controlScaleGesture, diff --git a/lib/src/api/nodes/web_view_node.g.dart b/lib/src/api/nodes/web_view_node.g.dart index 4d1707c3..a0352604 100644 --- a/lib/src/api/nodes/web_view_node.g.dart +++ b/lib/src/api/nodes/web_view_node.g.dart @@ -214,7 +214,7 @@ WebPageWebViewProperties _$WebPageWebViewPropertiesFromJson(Map json) => ? null : ColorRGBA.fromJson(json['backgroundColor']), ) - ..src = _$JsonConverterFromJson( + ..src = _$JsonConverterFromJson( json['src'], const Base64JsonConverter().fromJson, ) @@ -223,7 +223,7 @@ WebPageWebViewProperties _$WebPageWebViewPropertiesFromJson(Map json) => Map _$WebPageWebViewPropertiesToJson( WebPageWebViewProperties instance, ) => { - 'src': ?const Base64JsonConverter().toJson(instance.src), + 'src': const Base64JsonConverter().toJson(instance.src), 'controlVerticalScrollGesture': ?instance.controlVerticalScrollGesture, 'controlHorizontalScrollGesture': ?instance.controlHorizontalScrollGesture, 'controlScaleGesture': ?instance.controlScaleGesture, diff --git a/lib/src/api/nodes/web_view_twitter_properties.g.dart b/lib/src/api/nodes/web_view_twitter_properties.g.dart index b6bd82f3..52dd4ac2 100644 --- a/lib/src/api/nodes/web_view_twitter_properties.g.dart +++ b/lib/src/api/nodes/web_view_twitter_properties.g.dart @@ -95,7 +95,7 @@ TweetTwitterWebViewProperties _$TweetTwitterWebViewPropertiesFromJson( twitterTailoring: json['twitterTailoring'] as bool?, languageCode: json['languageCode'] as String?, ) - ..src = _$JsonConverterFromJson( + ..src = _$JsonConverterFromJson( json['src'], const Base64JsonConverter().fromJson, ) @@ -121,7 +121,7 @@ TweetTwitterWebViewProperties _$TweetTwitterWebViewPropertiesFromJson( Map _$TweetTwitterWebViewPropertiesToJson( TweetTwitterWebViewProperties instance, ) => { - 'src': ?const Base64JsonConverter().toJson(instance.src), + 'src': const Base64JsonConverter().toJson(instance.src), 'controlVerticalScrollGesture': ?instance.controlVerticalScrollGesture, 'controlHorizontalScrollGesture': ?instance.controlHorizontalScrollGesture, 'controlScaleGesture': ?instance.controlScaleGesture, @@ -201,7 +201,7 @@ TimelineTwitterWebViewProperties _$TimelineTwitterWebViewPropertiesFromJson( ? null : ColorRGBA.fromJson(json['backgroundColor']), ) - ..src = _$JsonConverterFromJson( + ..src = _$JsonConverterFromJson( json['src'], const Base64JsonConverter().fromJson, ) @@ -211,7 +211,7 @@ TimelineTwitterWebViewProperties _$TimelineTwitterWebViewPropertiesFromJson( Map _$TimelineTwitterWebViewPropertiesToJson( TimelineTwitterWebViewProperties instance, ) => { - 'src': ?const Base64JsonConverter().toJson(instance.src), + 'src': const Base64JsonConverter().toJson(instance.src), 'controlVerticalScrollGesture': ?instance.controlVerticalScrollGesture, 'controlHorizontalScrollGesture': ?instance.controlHorizontalScrollGesture, 'controlScaleGesture': ?instance.controlScaleGesture, @@ -261,7 +261,7 @@ _$FollowButtonTwitterWebViewPropertiesFromJson(Map json) => ? null : ColorRGBA.fromJson(json['backgroundColor']), ) - ..src = _$JsonConverterFromJson( + ..src = _$JsonConverterFromJson( json['src'], const Base64JsonConverter().fromJson, ) @@ -271,7 +271,7 @@ _$FollowButtonTwitterWebViewPropertiesFromJson(Map json) => Map _$FollowButtonTwitterWebViewPropertiesToJson( FollowButtonTwitterWebViewProperties instance, ) => { - 'src': ?const Base64JsonConverter().toJson(instance.src), + 'src': const Base64JsonConverter().toJson(instance.src), 'controlVerticalScrollGesture': ?instance.controlVerticalScrollGesture, 'controlHorizontalScrollGesture': ?instance.controlHorizontalScrollGesture, 'controlScaleGesture': ?instance.controlScaleGesture, @@ -324,7 +324,7 @@ _$MentionButtonTwitterWebViewPropertiesFromJson(Map json) => ? null : ColorRGBA.fromJson(json['backgroundColor']), ) - ..src = _$JsonConverterFromJson( + ..src = _$JsonConverterFromJson( json['src'], const Base64JsonConverter().fromJson, ) @@ -334,7 +334,7 @@ _$MentionButtonTwitterWebViewPropertiesFromJson(Map json) => Map _$MentionButtonTwitterWebViewPropertiesToJson( MentionButtonTwitterWebViewProperties instance, ) => { - 'src': ?const Base64JsonConverter().toJson(instance.src), + 'src': const Base64JsonConverter().toJson(instance.src), 'controlVerticalScrollGesture': ?instance.controlVerticalScrollGesture, 'controlHorizontalScrollGesture': ?instance.controlHorizontalScrollGesture, 'controlScaleGesture': ?instance.controlScaleGesture, @@ -389,7 +389,7 @@ _$HashtagButtonTwitterWebViewPropertiesFromJson(Map json) => ? null : ColorRGBA.fromJson(json['backgroundColor']), ) - ..src = _$JsonConverterFromJson( + ..src = _$JsonConverterFromJson( json['src'], const Base64JsonConverter().fromJson, ) @@ -399,7 +399,7 @@ _$HashtagButtonTwitterWebViewPropertiesFromJson(Map json) => Map _$HashtagButtonTwitterWebViewPropertiesToJson( HashtagButtonTwitterWebViewProperties instance, ) => { - 'src': ?const Base64JsonConverter().toJson(instance.src), + 'src': const Base64JsonConverter().toJson(instance.src), 'controlVerticalScrollGesture': ?instance.controlVerticalScrollGesture, 'controlHorizontalScrollGesture': ?instance.controlHorizontalScrollGesture, 'controlScaleGesture': ?instance.controlScaleGesture, diff --git a/test/show_toast_action_test.dart b/test/show_toast_action_test.dart new file mode 100644 index 00000000..20cb4511 --- /dev/null +++ b/test/show_toast_action_test.dart @@ -0,0 +1,23 @@ +import 'package:codelessly_api/codelessly_api.dart'; +import 'package:test/test.dart'; + +void main() { + test('ShowToastAction round-trips and omits defaults', () { + final ActionModel action = ActionModel.fromJson({ + 'type': 'showToast', + 'message': r'Added ${storage.drink.name} to your order', + }); + expect(action, isA()); + final toast = action as ShowToastAction; + expect(toast.duration, 2600); + expect(toast.icon, isNull); + expect(toast.toJson(), { + 'type': 'showToast', + 'message': r'Added ${storage.drink.name} to your order', + }); + + final custom = toast.copyWith(duration: 4000, bottomOffset: 40); + expect(ActionModel.fromJson(custom.toJson()), custom); + expect(ActionType.showToast.prettify, 'Show Toast'); + }); +}