From 8f7941458b4e157760ca2d0b556df34e47e67b49 Mon Sep 17 00:00:00 2001 From: mobile-apps-deriv <134251399+mobile-apps-deriv@users.noreply.github.com> Date: Thu, 18 Jul 2024 19:43:01 +0800 Subject: [PATCH 1/3] chore(version): bump version and update changelog (#698) Co-authored-by: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: ramin-deriv --- CHANGELOG.md | 32 +++++++++++++++++++ README.md | 6 ++-- packages/deriv_auth/CHANGELOG.md | 4 +++ packages/deriv_auth/pubspec.yaml | 6 ++-- packages/deriv_localizations/CHANGELOG.md | 4 +++ packages/deriv_localizations/pubspec.yaml | 2 +- .../deriv_mobile_chart_wrapper/CHANGELOG.md | 4 +++ .../deriv_mobile_chart_wrapper/pubspec.yaml | 4 +-- packages/deriv_passkeys/CHANGELOG.md | 4 +++ packages/deriv_passkeys/pubspec.yaml | 4 +-- 10 files changed, 59 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3df7b664a..5f72600d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,38 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2024-07-18 + +### Changes + +--- + +Packages with breaking changes: + + - There are no breaking changes in this release. + +Packages with other changes: + + - [`deriv_localizations` - `v1.5.2`](#deriv_localizations---v152) + - [`deriv_auth` - `v6.7.18`](#deriv_auth---v6718) + - [`deriv_mobile_chart_wrapper` - `v0.0.2+4`](#deriv_mobile_chart_wrapper---v0024) + - [`deriv_passkeys` - `v0.0.3+6`](#deriv_passkeys---v0036) + +Packages with dependency updates only: + +> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project. + + - `deriv_auth` - `v6.7.18` + - `deriv_mobile_chart_wrapper` - `v0.0.2+4` + - `deriv_passkeys` - `v0.0.3+6` + +--- + +#### `deriv_localizations` - `v1.5.2` + + - **REFACTOR**(deriv_localizations): Crowdin Localization Generated ([#697](https://github.com/regentmarkets/flutter-deriv-packages/issues/697)). ([0aca8f2f](https://github.com/regentmarkets/flutter-deriv-packages/commit/0aca8f2fd4f0e3a16ab54a0bf040c1fabcff2324)) + + ## 2024-07-17 ### Changes diff --git a/README.md b/README.md index 829032b11..b197e17b1 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ cp $HOME/Downloads/commit-msg $HOME/.git/hooks/commit-msg \ ## Using the packages -Each package has been released as git tag with convention as **packageName-vVersionNumber**`(Example: deriv_auth-v6.7.17)`. To use the package, add the following to your pubspec.yaml file: +Each package has been released as git tag with convention as **packageName-vVersionNumber**`(Example: deriv_auth-v6.7.18)`. To use the package, add the following to your pubspec.yaml file: ```yaml deriv_ui: @@ -30,7 +30,7 @@ deriv_ui: | Name | Description | Version | | ------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | | [analytics](./packages/analytics) | Used to collect and send analytical information to 'Firebase' and 'Segment'. | [v2.1.0](./packages/analytics/CHANGELOG.md) | -| [deriv_auth](./packages/deriv_auth) | A Dart package that provides Authentication logic for Deriv applications. | [v6.7.17 ](./packages/deriv_auth/CHANGELOG.md) | +| [deriv_auth](./packages/deriv_auth) | A Dart package that provides Authentication logic for Deriv applications. | [v6.7.18 ](./packages/deriv_auth/CHANGELOG.md) | | [deriv_banner](./packages/deriv_banner) | A widget to show banner in apps. | [v0.0.1+1](./packages/deriv_banner/CHANGELOG.md) | | [deriv_bloc_manager](./packages/deriv_bloc_manager) | Provides some tools to manage blocs. | [v0.0.1](./packages/deriv_bloc_manager/CHANGELOG.md) | | [deriv_datadog](./packages/deriv_datadog) | A package that helps you monitor the performance and user interactions of your Flutter app by sending data to Datadog. | [v0.0.1](./packages/deriv_datadog/CHANGELOG.md) | @@ -42,7 +42,7 @@ deriv_ui: | [deriv_lint](./packages/deriv_lint) | A Dart package that provides lint rules for Dart and Flutter. | [v1.0.0](./packages/deriv_lint/CHANGELOG.md) | | [deriv_live_chat](./packages/deriv_live_chat) | A plugin for live chat SDK support to dart. | [v0.0.1+2](./packages/deriv_live_chat/CHANGELOG.md) | | [deriv_language_selector](./packages/deriv_language_selector) | A package to handle language change of the app. | [v0.0.2+9](./packages/deriv_language_selector/CHANGELOG.md) | -| [deriv_localizations](./packages/deriv_localizations) | A Package that contains the localization arb(coming from Crowdin) and dart generated files for flutter_deriv_packages. | [v1.5.1](./packages/deriv_localizations/CHANGELOG.md) | +| [deriv_localizations](./packages/deriv_localizations) | A Package that contains the localization arb(coming from Crowdin) and dart generated files for flutter_deriv_packages. | [v1.5.2](./packages/deriv_localizations/CHANGELOG.md) | | [deriv_numpad](./packages/deriv_numpad) | Number Pad Widget for number input. | [v1.1.5](./packages/deriv_numpad/CHANGELOG.md) | | [deriv_rudderstack](./packages/deriv_rudderstack) | A plugin that add RudderStack SDK support to Flutter. | [v1.1.0](./packages/deriv_rudderstack/CHANGELOG.md) | | [deriv_store_launcher](./packages/deriv_store_launcher) | A plugin to launch app stores base on platform and manufacturer. | [v0.0.1+1](./packages/deriv_store_launcher/CHANGELOG.md) | diff --git a/packages/deriv_auth/CHANGELOG.md b/packages/deriv_auth/CHANGELOG.md index 0560ff53b..025bda1e9 100644 --- a/packages/deriv_auth/CHANGELOG.md +++ b/packages/deriv_auth/CHANGELOG.md @@ -1,3 +1,7 @@ +## 6.7.18 + + - Update a dependency to the latest release. + ## 6.7.17 - **REFACTOR**(version): updated the version of flutter deriv api ([#694](https://github.com/regentmarkets/flutter-deriv-packages/issues/694)). ([eac7e8cb](https://github.com/regentmarkets/flutter-deriv-packages/commit/eac7e8cba4e9310d30296e07a47731f08d4d7342)) diff --git a/packages/deriv_auth/pubspec.yaml b/packages/deriv_auth/pubspec.yaml index e7a52565d..62417d515 100644 --- a/packages/deriv_auth/pubspec.yaml +++ b/packages/deriv_auth/pubspec.yaml @@ -1,6 +1,6 @@ name: deriv_auth description: Provides deriv authentication functionalities for dart/flutter apps. -version: 6.7.17 +version: 6.7.18 environment: sdk: ">=3.0.0 <4.0.0" @@ -51,13 +51,13 @@ dependencies: git: url: git@github.com:regentmarkets/flutter-deriv-packages.git path: packages/deriv_localizations - ref: deriv_localizations-v1.5.1 + ref: deriv_localizations-v1.5.2 deriv_passkeys: git: url: git@github.com:regentmarkets/flutter-deriv-packages.git path: packages/deriv_passkeys - ref: deriv_passkeys-v0.0.3+5 + ref: deriv_passkeys-v0.0.3+6 deriv_language_selector: git: diff --git a/packages/deriv_localizations/CHANGELOG.md b/packages/deriv_localizations/CHANGELOG.md index 302a624c8..37c89b242 100644 --- a/packages/deriv_localizations/CHANGELOG.md +++ b/packages/deriv_localizations/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.5.2 + + - **REFACTOR**(deriv_localizations): Crowdin Localization Generated ([#697](https://github.com/regentmarkets/flutter-deriv-packages/issues/697)). ([0aca8f2f](https://github.com/regentmarkets/flutter-deriv-packages/commit/0aca8f2fd4f0e3a16ab54a0bf040c1fabcff2324)) + ## 1.5.1 - **REFACTOR**(deriv_localizations): Crowdin Localization Generated ([#648](https://github.com/regentmarkets/flutter-deriv-packages/issues/648)). ([c925c22a](https://github.com/regentmarkets/flutter-deriv-packages/commit/c925c22a97e6e13568fefa0d86d993985093617c)) diff --git a/packages/deriv_localizations/pubspec.yaml b/packages/deriv_localizations/pubspec.yaml index f9fc08a0e..860147fae 100644 --- a/packages/deriv_localizations/pubspec.yaml +++ b/packages/deriv_localizations/pubspec.yaml @@ -3,7 +3,7 @@ description: This packages contains all localizations for the deriv packages publish_to: 'none' -version: 1.5.1 +version: 1.5.2 environment: sdk: '>=3.0.2 <4.0.0' diff --git a/packages/deriv_mobile_chart_wrapper/CHANGELOG.md b/packages/deriv_mobile_chart_wrapper/CHANGELOG.md index 0323f0d7c..c6f1f26ce 100644 --- a/packages/deriv_mobile_chart_wrapper/CHANGELOG.md +++ b/packages/deriv_mobile_chart_wrapper/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.2+4 + + - Update a dependency to the latest release. + ## 0.0.2+3 - **REFACTOR**(deriv_localizations): Crowdin Localization Generated ([#686](https://github.com/regentmarkets/flutter-deriv-packages/issues/686)). ([a0a6df21](https://github.com/regentmarkets/flutter-deriv-packages/commit/a0a6df21cbc6681b923ec3e060752de20ddad32b)) diff --git a/packages/deriv_mobile_chart_wrapper/pubspec.yaml b/packages/deriv_mobile_chart_wrapper/pubspec.yaml index 55e0f4d69..6eba6e7b7 100644 --- a/packages/deriv_mobile_chart_wrapper/pubspec.yaml +++ b/packages/deriv_mobile_chart_wrapper/pubspec.yaml @@ -1,6 +1,6 @@ name: deriv_mobile_chart_wrapper description: A new Flutter package project. -version: 0.0.2+3 +version: 0.0.2+4 homepage: environment: @@ -25,7 +25,7 @@ dependencies: git: url: git@github.com:regentmarkets/flutter-deriv-packages.git path: packages/deriv_localizations - ref: deriv_localizations-v1.5.1 + ref: deriv_localizations-v1.5.2 deriv_ui: git: diff --git a/packages/deriv_passkeys/CHANGELOG.md b/packages/deriv_passkeys/CHANGELOG.md index 18d4afa6a..149fb334e 100644 --- a/packages/deriv_passkeys/CHANGELOG.md +++ b/packages/deriv_passkeys/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.3+6 + + - Update a dependency to the latest release. + ## 0.0.3+5 - **REFACTOR**(version): updated the version of flutter deriv api ([#694](https://github.com/regentmarkets/flutter-deriv-packages/issues/694)). ([eac7e8cb](https://github.com/regentmarkets/flutter-deriv-packages/commit/eac7e8cba4e9310d30296e07a47731f08d4d7342)) diff --git a/packages/deriv_passkeys/pubspec.yaml b/packages/deriv_passkeys/pubspec.yaml index bc67652da..fba00b067 100644 --- a/packages/deriv_passkeys/pubspec.yaml +++ b/packages/deriv_passkeys/pubspec.yaml @@ -1,6 +1,6 @@ name: deriv_passkeys description: Deriv Passkeys Flutter Plugin -version: 0.0.3+5 +version: 0.0.3+6 publish_to: "none" environment: @@ -26,7 +26,7 @@ dependencies: git: url: git@github.com:regentmarkets/flutter-deriv-packages.git path: packages/deriv_localizations - ref: deriv_localizations-v1.5.1 + ref: deriv_localizations-v1.5.2 deriv_ui: git: From a32c7ed0f61e1c9965cc7d92f12e64eacb0faf52 Mon Sep 17 00:00:00 2001 From: behnam-deriv <133759298+behnam-deriv@users.noreply.github.com> Date: Thu, 18 Jul 2024 22:41:04 +0800 Subject: [PATCH 2/3] feat(deriv_mobile_chart_wrapper): Add Indicator bottom sheet and categories_ (#683) Co-authored-by: ramin-deriv <55975218+ramin-deriv@users.noreply.github.com> Co-authored-by: ramin-deriv Co-authored-by: Osama Co-authored-by: Osama Ghazal <124760982+osama-deriv@users.noreply.github.com> --- .../icons/ic_indicators_empty_state.svg | 5 + .../lib/src/assets.dart | 2 + .../lib/src/core_widgets/chips_list.dart | 46 +++ .../lib/src/core_widgets/core_widgets.dart | 2 + .../lib/src/core_widgets/custom_chip.dart | 93 ++++++ .../lib/src/core_widgets/deriv_badge.dart | 80 +++++ .../lib/src/core_widgets/info_banner.dart | 61 ++++ .../core_widgets/no_glow_scroll_behavior.dart | 10 + .../lib/src/enums.dart | 6 + .../lib/src/helpers.dart | 36 +++ .../lib/src/mobile_chart_wrapper.dart | 13 +- .../active_indicator_list_item.dart | 77 +++++ .../mobile_tools_ui/indicator_list_item.dart | 46 ++- .../mobile_tools_bottom_sheet_content.dart | 286 +++++++++++++++++- .../lib/src/models/indicator_item_model.dart | 12 + .../lib/src/models/indicator_tab_label.dart | 41 +++ .../deriv_mobile_chart_wrapper/pubspec.yaml | 1 + 17 files changed, 783 insertions(+), 34 deletions(-) create mode 100644 packages/deriv_mobile_chart_wrapper/assets/icons/ic_indicators_empty_state.svg create mode 100644 packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/chips_list.dart create mode 100644 packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/core_widgets.dart create mode 100644 packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/custom_chip.dart create mode 100644 packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/deriv_badge.dart create mode 100644 packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/info_banner.dart create mode 100644 packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/no_glow_scroll_behavior.dart create mode 100644 packages/deriv_mobile_chart_wrapper/lib/src/enums.dart create mode 100644 packages/deriv_mobile_chart_wrapper/lib/src/helpers.dart create mode 100644 packages/deriv_mobile_chart_wrapper/lib/src/mobile_tools_ui/active_indicator_list_item.dart create mode 100644 packages/deriv_mobile_chart_wrapper/lib/src/models/indicator_tab_label.dart diff --git a/packages/deriv_mobile_chart_wrapper/assets/icons/ic_indicators_empty_state.svg b/packages/deriv_mobile_chart_wrapper/assets/icons/ic_indicators_empty_state.svg new file mode 100644 index 000000000..5ce9f7911 --- /dev/null +++ b/packages/deriv_mobile_chart_wrapper/assets/icons/ic_indicators_empty_state.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/deriv_mobile_chart_wrapper/lib/src/assets.dart b/packages/deriv_mobile_chart_wrapper/lib/src/assets.dart index 95253e2e1..2274564a4 100644 --- a/packages/deriv_mobile_chart_wrapper/lib/src/assets.dart +++ b/packages/deriv_mobile_chart_wrapper/lib/src/assets.dart @@ -5,3 +5,5 @@ const String rsiIcon = '${iconAssetsFolder}ic_rsi.svg'; const String bollingerBandsIcon = '${iconAssetsFolder}ic_bollinger_bands.svg'; const String movingAverageIcon = '${iconAssetsFolder}ic_moving_average.svg'; const String indicatorsMenuIcon = '${iconAssetsFolder}ic_indicators_menu.svg'; +const String emptyStateIndicatorsIcon = + '${iconAssetsFolder}ic_indicators_empty_state.svg'; diff --git a/packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/chips_list.dart b/packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/chips_list.dart new file mode 100644 index 000000000..c8bdf8d7c --- /dev/null +++ b/packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/chips_list.dart @@ -0,0 +1,46 @@ +import 'package:deriv_theme/deriv_theme.dart'; +import 'package:flutter/material.dart'; + +import 'custom_chip.dart'; + +/// A widget to show a list of `CustomChip` widgets. +class ChipsList extends StatelessWidget { + /// Constructor of the widget + const ChipsList({ + required this.items, + this.isHorizontalPaddingEnabled = false, + double? horizontalPadding, + Key? key, + }) : horizontalPadding = isHorizontalPaddingEnabled + ? (horizontalPadding ?? ThemeProvider.margin16) + : ThemeProvider.zeroMargin, + super(key: key); + + /// The list of the items. + final List items; + + /// If true enable a padding at the start and end of the list. + /// Default value is false. + final bool isHorizontalPaddingEnabled; + + /// The padding value for the horizontal padding. + /// If [isHorizontalPaddingEnabled] is true and [horizontalPadding] is null + /// then [ThemeProvider.margin16] will be used as default value. + /// Otherwise [ThemeProvider.zeroMargin] will be used as default value. + final double horizontalPadding; + + @override + Widget build(BuildContext context) => SizedBox( + height: ThemeProvider.margin36, + child: ListView.builder( + padding: EdgeInsets.symmetric(horizontal: horizontalPadding), + scrollDirection: Axis.horizontal, + itemCount: items.length, + itemBuilder: (_, int index) => Padding( + padding: const EdgeInsets.only( + left: ThemeProvider.zeroMargin, right: ThemeProvider.margin08), + child: items[index], + ), + ), + ); +} diff --git a/packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/core_widgets.dart b/packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/core_widgets.dart new file mode 100644 index 000000000..83d13de4b --- /dev/null +++ b/packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/core_widgets.dart @@ -0,0 +1,2 @@ +export 'custom_chip.dart'; +export 'chips_list.dart'; diff --git a/packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/custom_chip.dart b/packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/custom_chip.dart new file mode 100644 index 000000000..a9a9c72db --- /dev/null +++ b/packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/custom_chip.dart @@ -0,0 +1,93 @@ +import 'package:flutter/material.dart'; + +import 'package:deriv_theme/deriv_theme.dart'; + +/// The type of function to be passed to [CustomChip]'s `onTap` property. +typedef OnTapCustomChip = void Function(T? value, String? title); + +/// Will be called to get the content that needs to be shown inside chips. +typedef LabelBuilder = String Function(T? value, String? title); + +/// Will be called to get the content that needs to be shown inside chips. +typedef LabelWidgetBuilder = Widget Function(T? value, String? title); + +/// A Custom chip with a disabled and enabled design based on [isSelected]. +class CustomChip extends StatelessWidget { + /// Initializes a [CustomChip] widget. + const CustomChip({ + this.value, + this.labelBuilder, + this.labelWidgetBuilder, + this.title, + this.isSelected = true, + this.textStyle, + this.onTap, + this.borderRadius = ThemeProvider.borderRadius04, + this.activeBackgroundColor, + Key? key, + }) : assert( + value != null || labelWidgetBuilder != null, + 'Both value and labelWidgetBuilder cannot be null at the same time.', + ), + super(key: key); + + /// Whether the chip is displayed as selected or not. + final bool isSelected; + + /// The title text to be shown inside of the chip. + final String? title; + + /// The value text to be shown inside of the chip. + final T? value; + + /// To get the content to be shown inside chips. + final LabelBuilder? labelBuilder; + + /// To get the widget to be shown inside chips. + final LabelWidgetBuilder? labelWidgetBuilder; + + /// Called when a custom chip is tapped. + /// Pass [onTap] as null to disable the functionality of the chips. + final OnTapCustomChip? onTap; + + /// The border radius of chips container. + final double borderRadius; + + /// Container background color when [isSelected] is true. + /// + /// If null then [base6] apply as container background. + final Color? activeBackgroundColor; + + /// TextStyle of the chip title. + final TextStyle? textStyle; + + @override + Widget build(BuildContext context) => TextButton( + style: TextButton.styleFrom( + backgroundColor: _backgroundColor(context), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(borderRadius), + ), + ), + ), + onPressed: onTap == null ? null : () => onTap?.call(value, title), + child: labelWidgetBuilder?.call(value, title) ?? + Text( + labelBuilder?.call(value, title) ?? + "${title ?? ''}${title == null ? '' : ': '}$value", + style: context.theme.textStyle( + textStyle: textStyle ?? TextStyles.body1, + color: _textColor(context), + ), + ), + ); + + Color _backgroundColor(BuildContext context) => isSelected + ? activeBackgroundColor ?? context.theme.colors.active + : context.theme.colors.secondary; + + Color _textColor(BuildContext context) => isSelected + ? context.theme.colors.prominent + : context.theme.colors.lessProminent; +} diff --git a/packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/deriv_badge.dart b/packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/deriv_badge.dart new file mode 100644 index 000000000..e7d586f61 --- /dev/null +++ b/packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/deriv_badge.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; + +import 'package:deriv_theme/deriv_theme.dart'; + +/// This widget displays a widget with the possibility of showing a badge icon +/// with a count value on the widget +class DerivBadge extends StatelessWidget { + /// Initializes the widget. + const DerivBadge({ + super.key, + this.child, + this.count, + this.enabled = true, + this.alignment = Alignment.topRight, + }); + + /// The widget that is going to be displayed. + final Widget? child; + + /// Is the badge of the widget is going to be displayed or not + /// + /// Default is true. + final bool enabled; + + /// Displays a count value in the badge widget. + final int? count; + + /// The position of the badge. + /// + /// Default is [Alignment.topRight]. + final Alignment alignment; + + @override + Widget build(BuildContext context) { + final bool showDot = count == null; + final bool hasCount = !showDot && count! > 0; + + return Stack( + alignment: alignment, + children: [ + Padding( + padding: const EdgeInsets.all(ThemeProvider.margin04), + child: child ?? const SizedBox(), + ), + Visibility( + visible: enabled, + child: Container( + decoration: showDot || hasCount + ? BoxDecoration( + shape: BoxShape.circle, + color: context.theme.colors.danger, + ) + : const BoxDecoration(), + constraints: BoxConstraints( + minWidth: + showDot ? ThemeProvider.margin12 : ThemeProvider.margin16, + minHeight: + showDot ? ThemeProvider.margin12 : ThemeProvider.margin16, + ), + child: hasCount + ? SizedBox( + width: ThemeProvider.margin16, + height: ThemeProvider.margin16, + child: Center( + child: Text( + '$count', + textAlign: TextAlign.center, + style: context.theme.textStyle( + textStyle: TextStyles.badgeCounter, + ), + ), + ), + ) + : const SizedBox.shrink(), + ), + ), + ], + ); + } +} diff --git a/packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/info_banner.dart b/packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/info_banner.dart new file mode 100644 index 000000000..0303f1379 --- /dev/null +++ b/packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/info_banner.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; +import 'package:deriv_theme/deriv_theme.dart'; + +/// Information banner used to display information to the user. +class InfoBanner extends StatelessWidget { + /// Initializes [InfoBanner]. + const InfoBanner({ + required this.message, + this.onClose, + Key? key, + }) : super(key: key); + + /// Message to be displayed. + final String message; + + /// This callback will be called when the user click on the close banner icon. + final VoidCallback? onClose; + + @override + Widget build(BuildContext context) => Container( + padding: const EdgeInsets.symmetric( + horizontal: ThemeProvider.margin16, + vertical: ThemeProvider.margin08, + ), + decoration: BoxDecoration( + color: context.theme.colors.information.withOpacity(0.24), + borderRadius: BorderRadius.circular(ThemeProvider.borderRadius04), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Icon( + Icons.info_outline, + color: context.theme.colors.information, + size: ThemeProvider.iconSize24, + ), + const SizedBox(width: ThemeProvider.margin08), + Expanded( + child: Text( + message, + style: TextStyles.overline, + ), + ), + if (onClose != null) + Padding( + padding: const EdgeInsetsDirectional.only( + start: ThemeProvider.margin08, + ), + child: GestureDetector( + onTap: onClose, + child: Icon( + Icons.close, + color: context.theme.colors.prominent, + size: ThemeProvider.iconSize16, + ), + ), + ), + ], + ), + ); +} diff --git a/packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/no_glow_scroll_behavior.dart b/packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/no_glow_scroll_behavior.dart new file mode 100644 index 000000000..45d4c43e8 --- /dev/null +++ b/packages/deriv_mobile_chart_wrapper/lib/src/core_widgets/no_glow_scroll_behavior.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +/// A custom scroll behavior that removes the glowing effect when scrolling. +class NoGlowScrollBehavior extends ScrollBehavior { + @override + Widget buildOverscrollIndicator( + BuildContext context, Widget child, ScrollableDetails details) { + return child; // This effectively removes the glow effect + } +} diff --git a/packages/deriv_mobile_chart_wrapper/lib/src/enums.dart b/packages/deriv_mobile_chart_wrapper/lib/src/enums.dart new file mode 100644 index 000000000..d79612617 --- /dev/null +++ b/packages/deriv_mobile_chart_wrapper/lib/src/enums.dart @@ -0,0 +1,6 @@ +/// Specifies which category the indicator belongs to. +enum IndicatorCategory { + momentum, + volatility, + movingAverages, +} diff --git a/packages/deriv_mobile_chart_wrapper/lib/src/helpers.dart b/packages/deriv_mobile_chart_wrapper/lib/src/helpers.dart new file mode 100644 index 000000000..85d897ddc --- /dev/null +++ b/packages/deriv_mobile_chart_wrapper/lib/src/helpers.dart @@ -0,0 +1,36 @@ +import 'package:deriv_chart/deriv_chart.dart'; +import 'package:deriv_mobile_chart_wrapper/src/assets.dart'; + +/// Returns abbreviation name of the indicator for the given [config]. +String getIndicatorAbbreviation(IndicatorConfig config) { + // TODO(Ramin): use config.shortTitle after updating to the new version of + // chart package. + switch (config.runtimeType) { + case MACDIndicatorConfig: + return 'MACD'; + case RSIIndicatorConfig: + return 'RSI'; + case BollingerBandsIndicatorConfig: + return 'BB'; + case MAIndicatorConfig: + return 'MA'; + default: + return ''; + } +} + +/// Returns the path to the icon of the indicator for the given [config]. +String getIndicatorIconPath(IndicatorConfig config) { + switch (config.runtimeType) { + case MACDIndicatorConfig: + return macdIcon; + case RSIIndicatorConfig: + return rsiIcon; + case BollingerBandsIndicatorConfig: + return bollingerBandsIcon; + case MAIndicatorConfig: + return movingAverageIcon; + default: + return ''; + } +} diff --git a/packages/deriv_mobile_chart_wrapper/lib/src/mobile_chart_wrapper.dart b/packages/deriv_mobile_chart_wrapper/lib/src/mobile_chart_wrapper.dart index bdf01b22b..a9022432b 100644 --- a/packages/deriv_mobile_chart_wrapper/lib/src/mobile_chart_wrapper.dart +++ b/packages/deriv_mobile_chart_wrapper/lib/src/mobile_chart_wrapper.dart @@ -237,12 +237,15 @@ class MobileChartWrapperState extends State { // outside. showModalBottomSheet( context: context, - builder: (_) => ChangeNotifierProvider>.value( + builder: (_) => + ChangeNotifierProvider>.value( value: indicatorsRepo, - child: ChartBottomSheet( - child: SizedBox( - height: MediaQuery.of(context).size.height * 0.5, - child: const MobileToolsBottomSheetContent(), + child: SafeArea( + child: ChartBottomSheet( + child: SizedBox( + height: MediaQuery.of(context).size.height * 0.5, + child: const MobileToolsBottomSheetContent(), + ), ), ), ), diff --git a/packages/deriv_mobile_chart_wrapper/lib/src/mobile_tools_ui/active_indicator_list_item.dart b/packages/deriv_mobile_chart_wrapper/lib/src/mobile_tools_ui/active_indicator_list_item.dart new file mode 100644 index 000000000..25a09ea25 --- /dev/null +++ b/packages/deriv_mobile_chart_wrapper/lib/src/mobile_tools_ui/active_indicator_list_item.dart @@ -0,0 +1,77 @@ +import 'package:deriv_mobile_chart_wrapper/src/extensions.dart'; +import 'package:deriv_theme/deriv_theme.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +/// List item for the active indicator list. +class ActiveIndicatorListItem extends StatelessWidget { + /// Initializes the active indicator list item. + const ActiveIndicatorListItem({ + required this.iconAssetPath, + required this.title, + required this.subtitle, + required this.onTapSetting, + required this.onTapDelete, + super.key, + }); + + /// The path to the SVG icon asset. + final String iconAssetPath; + + /// The title of the indicator. + final String title; + + /// The subtitle of the indicator to show its properties. + final String subtitle; + + /// The callback which will be called when the + /// indicator setting button is tapped. + final VoidCallback onTapSetting; + + /// The callback which will be called when the + /// indicator delete button is tapped. + final VoidCallback onTapDelete; + + @override + Widget build(BuildContext context) { + return Card( + margin: EdgeInsets.zero, + color: context.themeProvider.colors.secondary, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(ThemeProvider.borderRadius08), + ), + ), + child: ListTile( + title: Row( + children: [ + SvgPicture.asset( + iconAssetPath, + width: ThemeProvider.margin24, + height: ThemeProvider.margin24, + package: 'deriv_mobile_chart_wrapper', + ), + const SizedBox(width: ThemeProvider.margin08), + Text(title), + ], + ), + subtitle: Text(subtitle), + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + IconButton( + onPressed: onTapSetting, + color: context.themeProvider.colors.prominent, + icon: const Icon(Icons.settings_outlined), + ), + IconButton( + onPressed: onTapDelete, + color: context.themeProvider.colors.prominent, + icon: const Icon(Icons.delete_outline), + ), + ], + ), + ), + ); + } +} diff --git a/packages/deriv_mobile_chart_wrapper/lib/src/mobile_tools_ui/indicator_list_item.dart b/packages/deriv_mobile_chart_wrapper/lib/src/mobile_tools_ui/indicator_list_item.dart index 8bb00ec7f..b88d9b8ed 100644 --- a/packages/deriv_mobile_chart_wrapper/lib/src/mobile_tools_ui/indicator_list_item.dart +++ b/packages/deriv_mobile_chart_wrapper/lib/src/mobile_tools_ui/indicator_list_item.dart @@ -1,3 +1,4 @@ +import 'package:deriv_mobile_chart_wrapper/src/core_widgets/deriv_badge.dart'; import 'package:deriv_mobile_chart_wrapper/src/extensions.dart'; import 'package:deriv_theme/deriv_theme.dart'; import 'package:flutter/material.dart'; @@ -9,6 +10,7 @@ class IndicatorListItem extends StatelessWidget { const IndicatorListItem({ required this.iconAssetPath, required this.title, + required this.onTap, required this.onInfoIconTapped, this.count = 0, super.key, @@ -20,6 +22,9 @@ class IndicatorListItem extends StatelessWidget { /// The title of the indicator. final String title; + /// The callback which will be called when the indicator item is tapped. + final VoidCallback onTap; + /// The callback which will be called when the info icon is tapped. final VoidCallback onInfoIconTapped; @@ -30,20 +35,26 @@ class IndicatorListItem extends StatelessWidget { @override Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.all(ThemeProvider.margin16), - child: Row( - children: [ - _buildIndicatorIcon(), - const SizedBox(width: Dimens.margin08), - _buildIndicatorTitle(context), - const Spacer(), - IconButton( - icon: const Icon(Icons.info_outline), - color: context.themeProvider.colors.prominent, - onPressed: onInfoIconTapped, - ), - ], + return GestureDetector( + onTap: onTap, + behavior: HitTestBehavior.translucent, + child: Padding( + padding: const EdgeInsets.all(ThemeProvider.margin16), + child: Row( + children: [ + _buildIndicatorIcon(), + const SizedBox(width: Dimens.margin08), + _buildIndicatorTitle(context), + const SizedBox(width: Dimens.margin08), + _buildIndicatorBadge(count), + const Spacer(), + IconButton( + icon: const Icon(Icons.info_outline), + color: context.themeProvider.colors.prominent, + onPressed: onInfoIconTapped, + ), + ], + ), ), ); } @@ -62,4 +73,11 @@ class IndicatorListItem extends StatelessWidget { color: context.themeProvider.colors.general, ), ); + + Widget _buildIndicatorBadge(int count) { + return DerivBadge( + count: count, + enabled: count > 0, + ); + } } diff --git a/packages/deriv_mobile_chart_wrapper/lib/src/mobile_tools_ui/mobile_tools_bottom_sheet_content.dart b/packages/deriv_mobile_chart_wrapper/lib/src/mobile_tools_ui/mobile_tools_bottom_sheet_content.dart index cbbb7caa0..ad1966016 100644 --- a/packages/deriv_mobile_chart_wrapper/lib/src/mobile_tools_ui/mobile_tools_bottom_sheet_content.dart +++ b/packages/deriv_mobile_chart_wrapper/lib/src/mobile_tools_ui/mobile_tools_bottom_sheet_content.dart @@ -1,23 +1,88 @@ +import 'package:deriv_chart/deriv_chart.dart'; import 'package:deriv_mobile_chart_wrapper/src/assets.dart'; +import 'package:deriv_mobile_chart_wrapper/src/core_widgets/core_widgets.dart'; +import 'package:deriv_mobile_chart_wrapper/src/enums.dart'; +import 'package:deriv_mobile_chart_wrapper/src/extensions.dart'; +import 'package:deriv_mobile_chart_wrapper/src/helpers.dart'; +import 'package:deriv_mobile_chart_wrapper/src/mobile_tools_ui/active_indicator_list_item.dart'; import 'package:deriv_mobile_chart_wrapper/src/mobile_tools_ui/indicator_list_item.dart'; import 'package:deriv_mobile_chart_wrapper/src/models/indicator_item_model.dart'; +import 'package:deriv_mobile_chart_wrapper/src/models/indicator_tab_label.dart'; import 'package:deriv_theme/deriv_theme.dart'; -import 'package:deriv_mobile_chart_wrapper/src/extensions.dart'; +import 'package:deriv_ui/deriv_ui.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:provider/provider.dart'; + +import '../core_widgets/info_banner.dart'; +import '../core_widgets/no_glow_scroll_behavior.dart'; /// Bottom sheet content to show the list of support tools (indicators/ drawing /// tools) for the mobile version. -class MobileToolsBottomSheetContent extends StatelessWidget { +class MobileToolsBottomSheetContent extends StatefulWidget { /// Initializes the bottom sheet content. const MobileToolsBottomSheetContent({super.key}); static const List indicators = [ - IndicatorItemModel(title: 'MACD', icon: macdIcon), - IndicatorItemModel(title: 'Relative Strength Index (RSI)', icon: rsiIcon), - IndicatorItemModel(title: 'Bollinger Bands', icon: bollingerBandsIcon), - IndicatorItemModel(title: 'Moving Average', icon: movingAverageIcon), + IndicatorItemModel( + category: IndicatorCategory.momentum, + title: 'MACD', + icon: macdIcon, + config: MACDIndicatorConfig(), + ), + IndicatorItemModel( + category: IndicatorCategory.momentum, + title: 'Relative Strength Index (RSI)', + icon: rsiIcon, + config: RSIIndicatorConfig(), + ), + IndicatorItemModel( + category: IndicatorCategory.volatility, + title: 'Bollinger Bands', + icon: bollingerBandsIcon, + config: BollingerBandsIndicatorConfig(), + ), + IndicatorItemModel( + category: IndicatorCategory.movingAverages, + title: 'Moving Average', + icon: movingAverageIcon, + config: MAIndicatorConfig(), + ), ]; + @override + State createState() => + _MobileToolsBottomSheetContentState(); +} + +class _MobileToolsBottomSheetContentState + extends State { + IndicatorTabLabel _selectedChip = IndicatorTabLabel.all; + + List get filteredIndicators { + return _selectedChip == IndicatorTabLabel.all + ? MobileToolsBottomSheetContent.indicators + : MobileToolsBottomSheetContent.indicators + .where( + // TODO(Ramin): Check if we can only have one enum to use for + // labels and indicators' model category. + (indicator) => + indicator.category == _selectedChip.toIndicatorCategory, + ) + .toList(); + } + + /// Returns `true` if the limit of active indicators is reached. + bool get isLimitReached => indicatorsRepo.items.length >= 3; + + late AddOnsRepository indicatorsRepo; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + indicatorsRepo = Provider.of>(context); + } + @override Widget build(BuildContext context) => Column( children: [ @@ -29,7 +94,14 @@ class MobileToolsBottomSheetContent extends StatelessWidget { children: [ const SizedBox(height: ThemeProvider.margin16), _buildChipsList(), - Expanded(child: _buildIndicatorsList()), + const SizedBox(height: ThemeProvider.margin16), + if (isLimitReached && + _selectedChip != IndicatorTabLabel.active) + _buildLimitInfoBanner(), + Expanded( + child: _selectedChip == IndicatorTabLabel.active + ? _buildIndicatorsActiveTab() + : _buildIndicatorsList()), ], ), ), @@ -37,21 +109,175 @@ class MobileToolsBottomSheetContent extends StatelessWidget { ], ); + Widget _buildActiveTabHeader() { + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: ThemeProvider.margin16, + ), + child: Row( + children: [ + Text( + 'Up to 3 active indicators allowed.', + style: context.themeProvider.textStyle( + textStyle: TextStyles.caption, + color: context.themeProvider.colors.general, + ), + textAlign: TextAlign.start, + ), + const Spacer(), + Visibility( + visible: indicatorsRepo.items.isNotEmpty, + maintainSize: true, + maintainState: true, + maintainAnimation: true, + child: SecondaryButton( + child: Center( + child: Text( + 'Delete all', + style: context.themeProvider.textStyle( + textStyle: TextStyles.caption, + color: context.themeProvider.colors.prominent, + ), + ), + ), + onPressed: () {}, + ), + ), + ], + ), + ); + } + Widget _buildIndicatorsList() { return ListView.builder( - itemCount: indicators.length, + itemCount: filteredIndicators.length, itemBuilder: (_, index) { - final IndicatorItemModel indicator = indicators[index]; + final IndicatorItemModel indicator = filteredIndicators[index]; - return IndicatorListItem( - iconAssetPath: indicator.icon, - title: indicator.title, - onInfoIconTapped: () {}, + return Interaction( + isEnabled: !isLimitReached, + child: IndicatorListItem( + iconAssetPath: indicator.icon, + title: indicator.title, + count: _getIndicatorCount(indicator), + onInfoIconTapped: () {}, + onTap: () { + indicatorsRepo.add(indicator.config); + }, + ), ); }, ); } + Widget _buildIndicatorsActiveTab() { + return Column( + children: [ + _buildActiveTabHeader(), + const SizedBox(height: ThemeProvider.margin16), + Expanded( + child: indicatorsRepo.items.isEmpty + ? _buildIndicatorEmptyState() + : _buildActiveIndicatorsList(), + ), + ], + ); + } + + Widget _buildActiveIndicatorsList() { + return Padding( + padding: const EdgeInsets.only( + left: ThemeProvider.margin16, + right: ThemeProvider.margin16, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + child: ListView.separated( + itemCount: indicatorsRepo.items.length, + separatorBuilder: (_, __) => + const SizedBox(height: ThemeProvider.margin08), + itemBuilder: (_, index) { + final IndicatorConfig indicatorConfig = + indicatorsRepo.items[index]; + return ActiveIndicatorListItem( + iconAssetPath: getIndicatorIconPath(indicatorConfig), + title: getIndicatorAbbreviation(indicatorConfig), + // TODO(Ramin): use indicatorConfig.configSummary here. + subtitle: '', + onTapSetting: () {}, + onTapDelete: () => indicatorsRepo.removeAt(index), + ); + }, + ), + ), + ], + ), + ); + } + + Widget _buildIndicatorEmptyState() { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + SvgPicture.asset( + emptyStateIndicatorsIcon, + height: Dimens.iconSize48, + package: 'deriv_mobile_chart_wrapper', + ), + const SizedBox(height: ThemeProvider.margin08), + Text( + 'You have no active indicators yet.', + style: context.themeProvider.textStyle( + textStyle: TextStyles.body1, + color: const Color(0xFF999999), + ), + ), + ], + ), + ), + ), + Container( + color: context.theme.colors.secondary, + padding: const EdgeInsets.all(ThemeProvider.margin16), + child: PrimaryButton( + child: Text( + 'Add indicator', + style: context.theme.textStyle( + textStyle: TextStyles.body2, + color: context.theme.colors.prominent, + ), + ), + onPressed: () { + setState(() { + _selectedChip = IndicatorTabLabel.all; + }); + }, + ), + ), + ], + ); + } + + Widget _buildLimitInfoBanner() { + return const InfoBanner( + message: 'You\'ve added the maximum number of active indicators.', + ); + } + + /// Returns the number of active indicators for specified [indicator]. + int _getIndicatorCount(IndicatorItemModel indicator) { + return indicatorsRepo.items + .where((item) => item.runtimeType == indicator.config.runtimeType) + .length; + } + Widget _buildChipsList() { // Overscroll behaviour of horizontal chips list sometimes triggers // BottomSheet top <-> bottom dragging. That's why we're capturing the @@ -60,11 +286,41 @@ class MobileToolsBottomSheetContent extends StatelessWidget { onNotification: (OverscrollNotification notification) { return true; }, - // TODO(Ramin): add chips list. - child: const SizedBox.shrink(), + child: ScrollConfiguration( + behavior: NoGlowScrollBehavior(), + child: ChipsList( + isHorizontalPaddingEnabled: true, + horizontalPadding: Dimens.margin16, + items: [ + ...IndicatorTabLabel.values + .map((tabLabel) => tabLabel == + IndicatorTabLabel.active + ? CustomChip( + labelBuilder: (_, __) => IndicatorTabLabel.activeCount( + indicatorsRepo.items.length, + ), + value: IndicatorTabLabel.active, + onTap: _onChipTapped, + isSelected: _selectedChip == IndicatorTabLabel.active, + borderRadius: ThemeProvider.margin40, + ) + : CustomChip( + value: tabLabel, + labelBuilder: (_, __) => tabLabel.title, + onTap: _onChipTapped, + isSelected: _selectedChip == tabLabel, + borderRadius: ThemeProvider.margin40, + )) + .toList(), + ], + ), + ), ); } + void _onChipTapped(IndicatorTabLabel? value, String? title) => + setState(() => _selectedChip = value ?? IndicatorTabLabel.all); + Widget _buildHeader(BuildContext context) => Container( padding: const EdgeInsets.symmetric(vertical: Dimens.margin16), alignment: Alignment.center, diff --git a/packages/deriv_mobile_chart_wrapper/lib/src/models/indicator_item_model.dart b/packages/deriv_mobile_chart_wrapper/lib/src/models/indicator_item_model.dart index fc155c903..60efe6f01 100644 --- a/packages/deriv_mobile_chart_wrapper/lib/src/models/indicator_item_model.dart +++ b/packages/deriv_mobile_chart_wrapper/lib/src/models/indicator_item_model.dart @@ -1,9 +1,15 @@ +import 'package:deriv_chart/deriv_chart.dart'; + +import '../enums.dart'; + /// Model class to keep the information of an indicator item. class IndicatorItemModel { /// Initializes an indicator item model. const IndicatorItemModel({ required this.title, required this.icon, + required this.category, + required this.config, }); /// The title. @@ -11,4 +17,10 @@ class IndicatorItemModel { /// The path to the SVG icon. final String icon; + + /// The category of indicator i.e., momentum, volatility, moving averages. + final IndicatorCategory category; + + /// The [config] property holds the indicator configuration. + final IndicatorConfig config; } diff --git a/packages/deriv_mobile_chart_wrapper/lib/src/models/indicator_tab_label.dart b/packages/deriv_mobile_chart_wrapper/lib/src/models/indicator_tab_label.dart new file mode 100644 index 000000000..62a0e8dac --- /dev/null +++ b/packages/deriv_mobile_chart_wrapper/lib/src/models/indicator_tab_label.dart @@ -0,0 +1,41 @@ +import 'package:deriv_mobile_chart_wrapper/src/enums.dart'; + +/// An enum to define label of indicators chip. +enum IndicatorTabLabel { + active, + all, + momentum, + volatility, + movingAverages; + + static String activeCount(int count) => 'Active ($count)'; + + String get title { + switch (this) { + case IndicatorTabLabel.active: + return 'Active'; + case IndicatorTabLabel.all: + return 'All'; + case IndicatorTabLabel.momentum: + return 'Momentum'; + case IndicatorTabLabel.volatility: + return 'Volatility'; + case IndicatorTabLabel.movingAverages: + return 'Moving averages'; + } + } + + /// Defines each tab label is equivalent to which [IndicatorCategory]. + IndicatorCategory? get toIndicatorCategory { + switch (this) { + case IndicatorTabLabel.momentum: + return IndicatorCategory.momentum; + case IndicatorTabLabel.volatility: + return IndicatorCategory.volatility; + case IndicatorTabLabel.movingAverages: + return IndicatorCategory.movingAverages; + default: + return null; + } + } +} diff --git a/packages/deriv_mobile_chart_wrapper/pubspec.yaml b/packages/deriv_mobile_chart_wrapper/pubspec.yaml index 6eba6e7b7..ad5cdbc4a 100644 --- a/packages/deriv_mobile_chart_wrapper/pubspec.yaml +++ b/packages/deriv_mobile_chart_wrapper/pubspec.yaml @@ -56,6 +56,7 @@ flutter: - assets/icons/ic_bollinger_bands.svg - assets/icons/ic_moving_average.svg - assets/icons/ic_indicators_menu.svg + - assets/icons/ic_indicators_empty_state.svg # # For details regarding assets in packages, see # https://flutter.dev/assets-and-images/#from-packages From b48fcfd605b3d5a466f61f2839c6af74aa2d1fdf Mon Sep 17 00:00:00 2001 From: mobile-apps-deriv <134251399+mobile-apps-deriv@users.noreply.github.com> Date: Thu, 18 Jul 2024 22:55:59 +0800 Subject: [PATCH 3/3] chore(version): bump version and update changelog (#701) Co-authored-by: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 21 +++++++++++++++++++ .../deriv_mobile_chart_wrapper/CHANGELOG.md | 4 ++++ .../deriv_mobile_chart_wrapper/pubspec.yaml | 2 +- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f72600d2..a262694e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,27 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2024-07-18 + +### Changes + +--- + +Packages with breaking changes: + + - There are no breaking changes in this release. + +Packages with other changes: + + - [`deriv_mobile_chart_wrapper` - `v0.0.3`](#deriv_mobile_chart_wrapper---v003) + +--- + +#### `deriv_mobile_chart_wrapper` - `v0.0.3` + + - **FEAT**(deriv_mobile_chart_wrapper): Add Indicator bottom sheet and categories_ ([#683](https://github.com/regentmarkets/flutter-deriv-packages/issues/683)). ([a32c7ed0](https://github.com/regentmarkets/flutter-deriv-packages/commit/a32c7ed0f61e1c9965cc7d92f12e64eacb0faf52)) + + ## 2024-07-18 ### Changes diff --git a/packages/deriv_mobile_chart_wrapper/CHANGELOG.md b/packages/deriv_mobile_chart_wrapper/CHANGELOG.md index c6f1f26ce..2a9f4177c 100644 --- a/packages/deriv_mobile_chart_wrapper/CHANGELOG.md +++ b/packages/deriv_mobile_chart_wrapper/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.3 + + - **FEAT**(deriv_mobile_chart_wrapper): Add Indicator bottom sheet and categories_ ([#683](https://github.com/regentmarkets/flutter-deriv-packages/issues/683)). ([a32c7ed0](https://github.com/regentmarkets/flutter-deriv-packages/commit/a32c7ed0f61e1c9965cc7d92f12e64eacb0faf52)) + ## 0.0.2+4 - Update a dependency to the latest release. diff --git a/packages/deriv_mobile_chart_wrapper/pubspec.yaml b/packages/deriv_mobile_chart_wrapper/pubspec.yaml index ad5cdbc4a..ef49c63b3 100644 --- a/packages/deriv_mobile_chart_wrapper/pubspec.yaml +++ b/packages/deriv_mobile_chart_wrapper/pubspec.yaml @@ -1,6 +1,6 @@ name: deriv_mobile_chart_wrapper description: A new Flutter package project. -version: 0.0.2+4 +version: 0.0.3 homepage: environment: