Skip to content
Snippets Groups Projects
pay_form.dart 5.11 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 _commentController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return BlocBuilder<PaymentCubit, PaymentState>(
        builder: (BuildContext context, PaymentState state) {
      if (state.comment != null && _commentController.text != state.comment) {
        _commentController.text = state.comment;
      }
      return Form(
        key: _formKey,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            const G1PayAmountField(),
            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 {
                      // We disable the number, anyway
                      context.read<PaymentCubit>().sending();
                      final bool? confirmed = await _confirmSend(
                          context,
                          state.amount!.toString(),
                          humanizePubKey(state.publicKey));
                      if (!mounted) {
                        return;
                      }
                      if (confirmed == null || !confirmed) {
                        context.read<PaymentCubit>().sentFailed();
                      } else {
                        final String response = await pay(