Skip to content
Snippets Groups Projects
credit_card.dart 6.59 KiB
Newer Older
vjrj's avatar
vjrj committed
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
vjrj's avatar
vjrj committed
import 'package:flutter_dotenv/flutter_dotenv.dart';
vjrj's avatar
vjrj committed
import 'package:flutter_svg/svg.dart';
import 'package:qr_flutter/qr_flutter.dart';
vjrj's avatar
vjrj committed

vjrj's avatar
vjrj committed
import '../../../shared_prefs.dart';
vjrj's avatar
vjrj committed
import '../../ui_helpers.dart';

class CreditCard extends StatelessWidget {
vjrj's avatar
vjrj committed
  CreditCard({super.key});

  final String publicKey = SharedPreferencesHelper().getPubKey();
vjrj's avatar
vjrj committed

  TextStyle cardTextStyle(BuildContext context) => TextStyle(
        fontFamily: 'SourceCodePro',
        // decoration: TextDecoration.underline,
        color: Colors.white,
        fontSize: MediaQuery.of(context).size.width * 0.06,
        fontWeight: FontWeight.bold,
        shadows: <Shadow>[
          Shadow(
            blurRadius: 1,
            color: Colors.black.withOpacity(0.7),
            offset: const Offset(0, 2),
          ),
          Shadow(
            blurRadius: 1,
            color: Colors.white.withOpacity(0.5),
            offset: const Offset(0, -1),
          ),
        ],
      );
vjrj's avatar
vjrj committed

  @override
  Widget build(BuildContext context) {
vjrj's avatar
vjrj committed
    const double cardRadius = 10.0;
vjrj's avatar
vjrj committed
    final double cardPadding =
        MediaQuery.of(context).size.width > 300 ? 26.0 : 16.0;
vjrj's avatar
vjrj committed
    final String pubKey = SharedPreferencesHelper().getPubKey();
vjrj's avatar
vjrj committed
    return Card(
vjrj's avatar
vjrj committed
        elevation: 8.0,
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(cardRadius),
vjrj's avatar
vjrj committed
        ),
vjrj's avatar
vjrj committed
        child: AspectRatio(
            aspectRatio: 1.58, // Credit cart aspect ratio
            child: Container(
              decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(cardRadius),
                boxShadow: <BoxShadow>[
                  BoxShadow(
                    color: Colors.grey[400]!,
                    blurRadius: 10.0,
                    spreadRadius: 1.0,
                  )
                ],
vjrj's avatar
vjrj committed
                gradient: LinearGradient(
vjrj's avatar
vjrj committed
                  begin: Alignment.bottomLeft,
                  end: Alignment.topRight,
                  colors: <Color>[
vjrj's avatar
vjrj committed
                    Color(int.parse("${dotenv.env['CARD_COLOR_LEFT']}")),
                    Color(int.parse("${dotenv.env['CARD_COLOR_RIGHT']}")),
vjrj's avatar
vjrj committed
                  ],
vjrj's avatar
vjrj committed
                ),
              ),
vjrj's avatar
vjrj committed
              child: Stack(children: <Widget>[
                Padding(
                    padding: const EdgeInsets.fromLTRB(160, 10, 0, 0),
                    child: Opacity(
                        opacity: 0.1,
                        child: Image.asset('assets/img/gbrevedot_alt.png'))),
                Column(crossAxisAlignment: CrossAxisAlignment.start, children: <
                    Widget>[
                  Padding(
vjrj's avatar
vjrj committed
                    padding: EdgeInsets.all(cardPadding),
                    child: FittedBox(
                        fit: BoxFit.scaleDown,
                        child: Text(
                          dotenv.env['CARD_COLOR_TEXT'] ?? tr('g1_wallet'),
                          style: TextStyle(
                            color: Colors.white,
                            fontSize: MediaQuery.of(context).size.width * 0.07,
                            fontWeight: FontWeight.bold,
                          ),
                        )),
vjrj's avatar
vjrj committed
                  ),
vjrj's avatar
vjrj committed
                  if (MediaQuery.of(context).size.width > 300)
                    const SizedBox(height: 8.0),
vjrj's avatar
vjrj committed
                  Padding(
vjrj's avatar
vjrj committed
                      padding: EdgeInsets.symmetric(horizontal: cardPadding),
vjrj's avatar
vjrj committed
                      child: GestureDetector(
                          onTap: () {
                            _showQrDialog(context);
                          },
                          child: SvgPicture.asset(
vjrj's avatar
vjrj committed
                            width: MediaQuery.of(context).size.width < 300
                                ? 25
                                : 40,
vjrj's avatar
vjrj committed
                            'assets/img/chip.svg',
                          ))),
                  const SizedBox(height: 8.0),
vjrj's avatar
vjrj committed
                  Padding(
vjrj's avatar
vjrj committed
                      padding: EdgeInsets.symmetric(horizontal: cardPadding),
vjrj's avatar
vjrj committed
                      child: Row(children: <Widget>[
                        GestureDetector(
                            onTap: () =>
vjrj's avatar
vjrj committed
                                showTooltip(context, '', tr('keys_tooltip')),
vjrj's avatar
vjrj committed
                            child: FittedBox(
                                fit: BoxFit.scaleDown,
                                child: Text('**** **** ',
                                    style: cardTextStyle(context)))),
vjrj's avatar
vjrj committed
                        GestureDetector(
                            onTap: () => copyPublicKeyToClipboard(context),
vjrj's avatar
vjrj committed
                            child: FittedBox(
                                fit: BoxFit.scaleDown,
                                child: Text(
                                  '${pubKey.substring(0, 4)} ${pubKey.substring(4, 8)}',
                                  style: cardTextStyle(context),
                                )))
vjrj's avatar
vjrj committed
                      ])),
vjrj's avatar
vjrj committed
                  if (MediaQuery.of(context).size.width > 300)
                    const SizedBox(height: 12.0),
vjrj's avatar
vjrj committed
                  Padding(
vjrj's avatar
vjrj committed
                    padding: EdgeInsets.symmetric(horizontal: cardPadding),
vjrj's avatar
vjrj committed
                    child: GestureDetector(
                      onTap: () =>
vjrj's avatar
vjrj committed
                          showTooltip(context, '', tr('card_validity_tooltip')),
vjrj's avatar
vjrj committed
                      child: Text(
vjrj's avatar
vjrj committed
                        tr('card_validity'),
vjrj's avatar
vjrj committed
                        style: TextStyle(
                          decoration: TextDecoration.underline,
                          color: Colors.white.withOpacity(0.8),
                          fontSize: 14.0,
                        ),
                      ),
                    ),
                  )
                ]),
              ]),
            )));
  }

  void _showQrDialog(BuildContext context) {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return Dialog(
vjrj's avatar
vjrj committed
            child: SizedBox(
                height: MediaQuery.of(context).size.width,
                child: Padding(
                    padding: const EdgeInsets.all(16.0),
                    child: GestureDetector(
                      onTap: () => copyPublicKeyToClipboard(context),
                      child: Column(children: <Widget>[
                        Text(tr('show_qr_to_client')),
                        QrImage(
                          data: publicKey,
                          size: MediaQuery.of(context).size.width * 0.8,
                          gapless: false,
                          foregroundColor: Colors.orange,
                        ),
                      ]),
                    ))));
vjrj's avatar
vjrj committed
    );
  }
}