diff --git a/assets/translations/en.json b/assets/translations/en.json index 4eeb925c12820054fe9b7341ef512855f348e156..ada15faf92f35db20a0ffcc906b098374d36e949 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -224,5 +224,6 @@ "qr_scanner_flash_off": "FLASH OFF", "qr_scanner_title": "Scan QR Code", "display_amounts_du": "Display amounts in DU", - "wallet_already_imported": "Wallet already imported" + "wallet_already_imported": "Wallet already imported", + "card_theme_select": "Select a theme for your card" } diff --git a/assets/translations/es.json b/assets/translations/es.json index 8b6382ab9979e405a436b93a8c9bfca5c3b1bbd2..ae4c7e0779ba3a8a5548498d45db37c3df2455cf 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -227,5 +227,6 @@ "qr_scanner_flash_off": "FLASH OFF", "qr_scanner_title": "Escanea un QR Code", "display_amounts_du": "Mostrar importes en DU", - "wallet_already_imported": "Monedero ya importado" + "wallet_already_imported": "Monedero ya importado", + "card_theme_select": "Selecciona un tema para tu tarjeta" } diff --git a/lib/data/models/credit_card_theme_selector.dart b/lib/data/models/credit_card_theme_selector.dart new file mode 100644 index 0000000000000000000000000000000000000000..2f4400548bde264b57252ccea952cdc5f8b611a7 --- /dev/null +++ b/lib/data/models/credit_card_theme_selector.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; + +import '../../ui/widgets/first_screen/credit_card_theme_item.dart'; +import 'cesium_card.dart'; +import 'credit_card_themes.dart'; + +class CardThemeSelector extends StatelessWidget { + const CardThemeSelector({super.key, required this.card}); + + final CesiumCard card; + + @override + Widget build(BuildContext context) { + return GridView.builder( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + childAspectRatio: 1.58, + ), + itemCount: CreditCardThemes.themes.length, + itemBuilder: (BuildContext context, int index) { + final CreditCardTheme themeData = CreditCardThemes.themes[index]; + return GestureDetector( + onTap: () {}, + child: Center( + child: CreditCardThemeItem(themeIndex: index), + ), + ); + }, + ); + } +} diff --git a/lib/data/models/credit_card_themes.dart b/lib/data/models/credit_card_themes.dart index 9f0c0838538840649f214fd1e439c62a809fca40..ea105e0566403bf28f70a86f1491e6c3ccbd9338 100644 --- a/lib/data/models/credit_card_themes.dart +++ b/lib/data/models/credit_card_themes.dart @@ -1,5 +1,4 @@ -import 'dart:ui'; - +import 'package:flutter/material.dart'; import 'package:json_annotation/json_annotation.dart'; import 'is_json_serializable.dart'; @@ -7,46 +6,53 @@ import 'is_json_serializable.dart'; part 'credit_card_themes.g.dart'; class CreditCardThemes { - static const CreditCardTheme theme1 = CreditCardTheme( - Color(0xFF1A237E), - Color(0xFFFFBA00), - ); + static const CreditCardTheme theme1 = + CreditCardTheme(Color(0xFF05112B), Color(0xFF085476)); static const CreditCardTheme theme2 = CreditCardTheme( - Color(0xFFEC1C24), - Color(0xFFFF5F00), + Colors.blueGrey, + Colors.pink, ); static const CreditCardTheme theme3 = CreditCardTheme( - Color(0xFF0077B5), Color(0xFF00A9E0), + Color(0xFF0077B5), ); static const CreditCardTheme theme4 = CreditCardTheme( - Color(0xFF8C1D40), Color(0xFFFDB813), + Color(0xFF8C1D40), ); static const CreditCardTheme theme5 = CreditCardTheme( - Color(0xFF117AC9), - Color(0xFFEE7203), - ); - static const CreditCardTheme theme6 = CreditCardTheme( - Color(0xFF00529B), - Color(0xFF00AEEF), + Colors.blueGrey, + Colors.deepPurple, ); + static const CreditCardTheme theme6 = + CreditCardTheme(Colors.lightGreen, Colors.green); static const CreditCardTheme theme7 = CreditCardTheme( - Color(0xFFE41422), - Color(0xFF1C5D8D), + Colors.black54, + Colors.black, ); static const CreditCardTheme theme8 = CreditCardTheme( + Colors.blueGrey, Color(0xFF004678), - Color(0xFFB5C8E5), ); static const CreditCardTheme theme9 = CreditCardTheme( Color(0xFFCE002D), Color(0xFF673F1E), ); - static const CreditCardTheme theme10 = CreditCardTheme( - Color(0xFFDD5600), - Color(0xFFC6A700), - ); + static const CreditCardTheme theme10 = + CreditCardTheme(Color(0xFF598040), Color(0xFF225500)); + + static const List<CreditCardTheme> themes = <CreditCardTheme>[ + CreditCardThemes.theme1, + CreditCardThemes.theme2, + CreditCardThemes.theme3, + CreditCardThemes.theme4, + CreditCardThemes.theme5, + CreditCardThemes.theme6, + CreditCardThemes.theme7, + CreditCardThemes.theme8, + CreditCardThemes.theme9, + CreditCardThemes.theme10, + ]; } @JsonSerializable() diff --git a/lib/main.dart b/lib/main.dart index 4fa5ac74521f519a04c7b8fd1e61a703c51e15e9..c9f37cb8b15b0eba7184178efff9eb55692b3a7b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -10,7 +10,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_displaymode/flutter_displaymode.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:ginkgo/ui/pay_helper.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'package:hydrated_bloc/hydrated_bloc.dart'; import 'package:introduction_screen/introduction_screen.dart'; @@ -44,6 +43,7 @@ import 'shared_prefs.dart'; import 'ui/contacts_cache.dart'; import 'ui/logger.dart'; import 'ui/notification_controller.dart'; +import 'ui/pay_helper.dart'; import 'ui/screens/skeleton_screen.dart'; import 'ui/ui_helpers.dart'; import 'ui/widgets/connectivity_widget_wrapper_wrapper.dart'; diff --git a/lib/ui/ui_helpers.dart b/lib/ui/ui_helpers.dart index 3ea44e0b45b610e498f4304721b851b2348a23bf..09653e89bb47b977af803f5c41321ed608b9ed3e 100644 --- a/lib/ui/ui_helpers.dart +++ b/lib/ui/ui_helpers.dart @@ -547,3 +547,5 @@ bool isDark(BuildContext context) => bool get isIOS => !kIsWeb && Platform.isIOS; const String userNameSuffix = ' â¥'; + +const double cardAspectRatio = 1.58; diff --git a/lib/ui/widgets/first_screen/credit_card.dart b/lib/ui/widgets/first_screen/credit_card.dart index 6326d0ca1c37a6a4b21465345fbbaae94d641c33..bf38c6955818d804910eb36f1b79ccb4a4b61dcc 100644 --- a/lib/ui/widgets/first_screen/credit_card.dart +++ b/lib/ui/widgets/first_screen/credit_card.dart @@ -28,7 +28,7 @@ class CreditCard extends StatelessWidget { borderRadius: BorderRadius.circular(cardRadius), ), child: AspectRatio( - aspectRatio: 1.58, // Credit cart aspect ratio + aspectRatio: cardAspectRatio, // Credit cart aspect ratio child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(cardRadius), diff --git a/lib/ui/widgets/first_screen/credit_card_mini.dart b/lib/ui/widgets/first_screen/credit_card_mini.dart index 5668103e9279e5fd5eb2853ad8203d1ebb95965c..ac18f03a56a1a1fe4ae238dd21c79205f390178a 100644 --- a/lib/ui/widgets/first_screen/credit_card_mini.dart +++ b/lib/ui/widgets/first_screen/credit_card_mini.dart @@ -1,21 +1,47 @@ +import 'dart:math'; + +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import '../../../data/models/cesium_card.dart'; +import '../../../data/models/credit_card_theme_selector.dart'; import '../../../data/models/credit_card_themes.dart'; import '../../ui_helpers.dart'; import 'card_name_editable.dart'; import 'card_text_style.dart'; -class CreditCardMini extends StatelessWidget { +class CreditCardMini extends StatefulWidget { const CreditCardMini({super.key, required this.card}); final CesiumCard card; + @override + State<CreditCardMini> createState() => _CreditCardMiniState(); +} + +class _CreditCardMiniState extends State<CreditCardMini> { + bool _showSettingsIcon = false; + + void _showThemeSelector(BuildContext context) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: Text(tr('card_theme_select')), + content: SizedBox( + width: double.maxFinite, + child: CardThemeSelector(card: widget.card)), + ); + }, + ); + } + @override Widget build(BuildContext context) { const double cardRadius = 10.0; final bool bigDevice = bigScreen(context); final double cardInternalElPadding = bigDevice ? 5 : 6.0; + final int themeIndex = Random().nextInt(10); return Padding( padding: const EdgeInsets.all(10), child: Card( @@ -24,7 +50,7 @@ class CreditCardMini extends StatelessWidget { borderRadius: BorderRadius.circular(cardRadius), ), child: AspectRatio( - aspectRatio: 1.58, // Credit cart aspect ratio + aspectRatio: cardAspectRatio, // Credit cart aspect ratio child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(cardRadius), @@ -39,8 +65,8 @@ class CreditCardMini extends StatelessWidget { begin: Alignment.bottomLeft, end: Alignment.topRight, colors: <Color>[ - CreditCardThemes.theme3.primaryColor, - CreditCardThemes.theme3.secondaryColor, + CreditCardThemes.themes[themeIndex].primaryColor, + CreditCardThemes.themes[themeIndex].secondaryColor, // card.theme.primaryColor, // card.theme.secondaryColor, ], @@ -49,10 +75,24 @@ class CreditCardMini extends StatelessWidget { child: Padding( padding: const EdgeInsets.all(10), child: Stack(children: <Widget>[ + Positioned( + top: -10, + right: -10, + child: Visibility( + visible: true, + child: FloatingActionButton( + backgroundColor: Colors.transparent, + elevation: 0, + onPressed: () => _showThemeSelector(context), + child: const Icon(Icons.settings, + color: Colors.white), + ), + ), + ), Padding( padding: const EdgeInsets.fromLTRB(120, 10, 0, 0), child: Opacity( - opacity: 0.1, + opacity: 0.2, child: Image.asset('assets/img/gbrevedot_alt.png', width: 100, height: 100), )), @@ -60,7 +100,7 @@ class CreditCardMini extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, // mainAxisAlignment: MainAxisAlignment.start, children: <Widget>[ - if (card.name.isNotEmpty) + if (widget.card.name.isNotEmpty) Padding( padding: EdgeInsets.symmetric( horizontal: cardInternalElPadding, @@ -68,9 +108,8 @@ class CreditCardMini extends StatelessWidget { child: Row(children: <Widget>[ Expanded( child: CardNameText( - currentText: card.name, - onTap: () {}, - )), + currentText: widget.card.name, + onTap: () {})), ])), Padding( padding: EdgeInsets.symmetric( @@ -80,11 +119,11 @@ class CreditCardMini extends StatelessWidget { GestureDetector( onTap: () => showQrDialog( context: context, - publicKey: card.pubKey), + publicKey: widget.card.pubKey), child: FittedBox( fit: BoxFit.scaleDown, child: Text( - '${card.pubKey.substring(0, 4)} ${card.pubKey.substring(4, 8)}', + '$themeIndex ${widget.card.pubKey.substring(0, 4)} ${widget.card.pubKey.substring(4, 8)}', style: cardTextStyle(context, fontSize: 16), ))), diff --git a/lib/ui/widgets/first_screen/credit_card_theme_item.dart b/lib/ui/widgets/first_screen/credit_card_theme_item.dart new file mode 100644 index 0000000000000000000000000000000000000000..17643260d86dfc93d4308e3f55c7e233725d227a --- /dev/null +++ b/lib/ui/widgets/first_screen/credit_card_theme_item.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; + +import '../../../data/models/credit_card_themes.dart'; +import '../../ui_helpers.dart'; +import 'card_text_style.dart'; + +class CreditCardThemeItem extends StatelessWidget { + const CreditCardThemeItem({super.key, required this.themeIndex}); + + final int themeIndex; + + @override + Widget build(BuildContext context) { + const double cardRadius = 10.0; + return Padding( + padding: const EdgeInsets.all(1), + child: Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(cardRadius), + ), + child: AspectRatio( + aspectRatio: cardAspectRatio, // Credit cart aspect ratio + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(cardRadius), + boxShadow: <BoxShadow>[ + BoxShadow( + color: Colors.grey[400]!, + blurRadius: 3.0, + spreadRadius: 1.0, + ) + ], + gradient: LinearGradient( + begin: Alignment.bottomLeft, + end: Alignment.topRight, + colors: <Color>[ + CreditCardThemes.themes[themeIndex].primaryColor, + CreditCardThemes.themes[themeIndex].secondaryColor, + // card.theme.primaryColor, + // card.theme.secondaryColor, + ], + ), + ), + child: Padding( + padding: const EdgeInsets.all(10), + child: Stack(children: <Widget>[ + if (inDevelopment) + Text('${themeIndex + 1}', + style: cardTextStyle(context, fontSize: 14)), + Padding( + padding: const EdgeInsets.fromLTRB(40, 0, 0, 0), + child: Opacity( + opacity: 0.2, + child: Image.asset('assets/img/gbrevedot_alt.png', + width: 100, height: 100), + )), + ]), + ))))); + } +} diff --git a/lib/ui/widgets/first_screen/g1_textfield.dart b/lib/ui/widgets/first_screen/g1_textfield.dart index f45f0d4316430355c872bc319e6883c513849c2a..a42f8fa0d6a64aadb2227a8307e9b88e93f7d156 100644 --- a/lib/ui/widgets/first_screen/g1_textfield.dart +++ b/lib/ui/widgets/first_screen/g1_textfield.dart @@ -113,7 +113,7 @@ class _G1PayAmountFieldState extends State<G1PayAmountField> { child: ToggleSwitch( minWidth: 40.0, radiusStyle: true, - initialLabelIndex: 0, + // initialLabelIndex: 0, cornerRadius: 20.0, activeFgColor: Colors.black, inactiveBgColor: Colors.grey[400],