Skip to content
Snippets Groups Projects
pay_form.dart 3.47 KiB
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

import '../../data/models/payment_cubit.dart';
import '../../data/models/payment_state.dart';
import '../../data/models/transaction_cubit.dart';
import '../../g1/api.dart';
import '../ui_helpers.dart';
import 'g1_textfield.dart';

class PayForm extends StatefulWidget {
  const PayForm({super.key});

  @override
  State<PayForm> createState() => _PayFormState();
}

class _PayFormState extends State<PayForm> {
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
  final TextEditingController _amountController = TextEditingController();
  final TextEditingController _commentController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return BlocBuilder<PaymentCubit, PaymentState>(
        builder: (BuildContext context, PaymentState state) {
      _amountController.text = state.amount != null ? '${state.amount}' : '';
      return Form(
        key: _formKey,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            G1PayAmountField(controller: _amountController),
            const SizedBox(height: 10.0),
            TextField(
              controller: _commentController,
              onChanged: (String? value) {
                if (value != null) {
                  context.read<PaymentCubit>().setDescription(value);
                }
              },
              decoration: InputDecoration(
                labelText: tr('g1_form_pay_desc'),
                hintText: tr('g1_form_pay_hint'),
                border: const OutlineInputBorder(),
              ),
              maxLines: null,
            ),
            const SizedBox(height: 10.0),
            ElevatedButton(
              onPressed: !state.canBeSent() ||
                      state.amount == null ||
                      !_weHaveBalance(context, state.amount!)
                  ? null
                  : () async {
                      final String response = await pay(
                          to: state.publicKey,
                          comment: state.comment,
                          amount: state.amount!);
                      if (!mounted) {
                        // Cannot show a tooltip if the widget is not now visible
                        return;
                      }
                      showTooltip(context, '', tr(response));
                    },
              style: ElevatedButton.styleFrom(
                padding:
                    const EdgeInsets.symmetric(horizontal: 20, vertical: 25),
                shape: RoundedRectangleBorder(