Skip to content
Snippets Groups Projects
history.dart 15.5 KiB
Newer Older
poka's avatar
poka committed
import 'dart:io';

poka's avatar
poka committed
import 'package:flutter/services.dart';
poka's avatar
poka committed
import 'package:gecko/globals.dart';
import 'package:gecko/models/cesiumPlus.dart';
poka's avatar
poka committed
import 'package:gecko/models/queries.dart';
poka's avatar
poka committed
import 'package:gecko/models/history.dart';
poka's avatar
poka committed
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
poka's avatar
poka committed
import 'dart:ui';
poka's avatar
poka committed
import 'package:graphql_flutter/graphql_flutter.dart';
poka's avatar
poka committed
// ignore: must_be_immutable
poka's avatar
poka committed
class HistoryScreen extends StatelessWidget with ChangeNotifier {
poka's avatar
poka committed
  final TextEditingController _outputPubkey = TextEditingController();
  ScrollController scrollController = ScrollController();
  final nRepositories = 20;
poka's avatar
poka committed
  // HistoryProvider _historyProvider;
poka's avatar
poka committed
  final _formKey = GlobalKey<FormState>();
  FocusNode _pubkeyFocus = FocusNode();
poka's avatar
poka committed
  List cesiumData;
  final double avatarsSize = 80;
poka's avatar
poka committed
  @override
  Widget build(BuildContext context) {
    HistoryProvider _historyProvider = Provider.of<HistoryProvider>(context);
poka's avatar
poka committed
    this._outputPubkey.text = _historyProvider.pubkey;
    print('Build pubkey : ' + _historyProvider.pubkey);
    // _historyProvider.snackNode(context);
    WidgetsBinding.instance.addPostFrameCallback((_) {
      _historyProvider.snackNode(context);
    });
    return Scaffold(
        floatingActionButton: Container(
          height: 80.0,
          width: 80.0,
          child: FittedBox(
            child: FloatingActionButton(
              heroTag: "buttonScan",
              onPressed: () async {
                await _historyProvider.scan(context);
              },
              child: Container(
                  height: 40.0,
                  width: 40.0,
                  child: Padding(
                      padding: EdgeInsets.symmetric(horizontal: 3),
                      child: Image.asset('assets/qrcode-scan.png'))),
              backgroundColor: Color(
                  0xffEFEFBF), //Color(0xffFFD68E), //Color.fromARGB(500, 204, 255, 255),
            ),
        ),
        body: Column(children: <Widget>[
          if (_historyProvider.pubkey != '')
            historyQuery(context, _historyProvider),
  Widget historyQuery(context, HistoryProvider _historyProvider) {
poka's avatar
poka committed
    _pubkeyFocus.unfocus();
    // HistoryProvider _historyProvider = Provider.of<HistoryProvider>(context);
poka's avatar
poka committed
    CesiumPlusProvider _cesiumPlusProvider =
        Provider.of<CesiumPlusProvider>(context);
poka's avatar
poka committed
    bool _isFirstExec = true;
    return Expanded(
        child: Column(
      mainAxisAlignment: MainAxisAlignment.start,
      mainAxisSize: MainAxisSize.max,
      children: <Widget>[
        Query(
          options: QueryOptions(
            document: gql(getHistory),
            variables: <String, dynamic>{
              'number': nRepositories,
              'cursor': null
            },
          ),
          builder: (QueryResult result, {fetchMore, refetch}) {
poka's avatar
poka committed
            print("I'M HERE 2 ! $_isFirstExec");
            // print(result.source.isEager);
            if (result.isLoading && result.data == null) {
              return const Center(
                child: CircularProgressIndicator(),
              );
            }

            if (result.hasException) {
              print('Error GVA: ' + result.exception.toString());
              return Column(children: <Widget>[
                SizedBox(height: 50),
                Text(
                  "Aucun noeud GVA valide n'a pu être trouvé.\nVeuillez réessayer ultérieurement.",
                  style: TextStyle(fontSize: 17.0),
                )
              ]);
            }

            if (result.data == null && result.exception.toString() == null) {
              return const Text('Aucune donnée à afficher.');
poka's avatar
poka committed
            final num balance = _historyProvider
                .removeDecimalZero(result.data['balance']['amount'] / 100);
            opts = _historyProvider.checkQueryResult(
                result, opts, _outputPubkey.text);
poka's avatar
poka committed

poka's avatar
poka committed
            // _historyProvider.transBC = null;

            // Build history list
            return NotificationListener(
                child: Expanded(
                    child: ListView(
                  controller: scrollController,
                  children: <Widget>[
poka's avatar
poka committed
                      Row(
                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
poka's avatar
poka committed
                          mainAxisSize: MainAxisSize.min,
                          crossAxisAlignment: CrossAxisAlignment.center,
poka's avatar
poka committed
                          children: [
poka's avatar
poka committed
                            if (_isFirstExec)
                              Container(
                                  padding:
                                      const EdgeInsets.fromLTRB(12, 0, 5, 0),
poka's avatar
poka committed
                                  child: FutureBuilder(
                                      future: _cesiumPlusProvider
                                          .getAvatar(_historyProvider.pubkey),
                                      initialData: [
                                        File(appPath.path +
                                            '/default_avatar.png')
                                      ],
                                      builder: (BuildContext context,
                                          AsyncSnapshot<List> _avatar) {
                                        cesiumData = _avatar.data;
                                        // _cesiumPlusProvider.isComplete = true;
                                        if (_avatar.connectionState !=
                                            ConnectionState.done) {
                                          return Image.file(
                                              File(appPath.path +
                                                  '/default_avatar.png'),
poka's avatar
poka committed
                                        }
                                        if (_avatar.hasError) {
                                          return Image.file(
                                              File(appPath.path +
                                                  '/default_avatar.png'),
poka's avatar
poka committed
                                        }
                                        if (_avatar.hasData) {
                                          return SingleChildScrollView(
                                              padding: EdgeInsets.all(0.0),
                                              child: Image.file(_avatar.data[0],
poka's avatar
poka committed
                                        return Image.file(
                                            File(appPath.path +
                                                '/default_avatar.png'),
poka's avatar
poka committed
                                      })),
                            GestureDetector(
                              onTap: () {
                                Clipboard.setData(ClipboardData(
                                    text: _historyProvider.pubkey));
                                _historyProvider.snackCopyKey(context);
                              },
                              child: Text(
                                  _historyProvider
                                      .getShortPubkey(_historyProvider.pubkey),
                                  style: TextStyle(
                                      fontSize: 22,
                                      fontWeight: FontWeight.w800,
                                      fontFamily: 'Monospace')),
                            ),
poka's avatar
poka committed
                            Container(
poka's avatar
poka committed
                                padding: const EdgeInsets.fromLTRB(
                                    30, 0, 5, 0), // .only(right: 15),
                                child: Text('TODO')),
                            SizedBox(width: 0)
poka's avatar
poka committed
                          ]),
poka's avatar
poka committed
                    if (_isFirstExec)
                      Row(
                          mainAxisAlignment: MainAxisAlignment.spaceAround,
                          crossAxisAlignment: CrossAxisAlignment.center,
                          children: [
                            Container(
                                padding: const EdgeInsets.fromLTRB(0, 0, 0, 0),
poka's avatar
poka committed
                                // padding: const EdgeInsets.,
                                child: FutureBuilder(
                                    future: _cesiumPlusProvider
                                        .getName(_historyProvider.pubkey),
poka's avatar
poka committed
                                    builder: (context, snapshot) {
                                      return Text(
                                          snapshot.data != ''
                                              ? snapshot.data
                                              : '-',
                                          style: TextStyle(fontSize: 20));
poka's avatar
poka committed
                    if (_isFirstExec)
                      Container(
                          padding: const EdgeInsets.fromLTRB(0, 0, 0, 0),
                          child: Text(balance.toString() + ' Ğ1',
                              textAlign: TextAlign.center,
                              style: TextStyle(fontSize: 18.0))),
poka's avatar
poka committed
                    SizedBox(height: 20),
                    ElevatedButton(
                        style: ElevatedButton.styleFrom(
                          elevation: 1,
                          primary: Colors.grey[50], // background
                          onPrimary: Colors.black, // foreground
                        ),
                        onPressed: () {
                          _historyProvider.switchProfileView();
                        },
                        child: Text(_historyProvider.historySwitchButtun,
                            style: TextStyle(
                                fontSize: 15, color: Color(0xffD28928)))),
                    // const Divider(
                    //   color: Colors.grey,
                    //   height: 5,
                    //   thickness: 0.5,
                    //   indent: 0,
                    //   endIndent: 0,
                    // ),
                    _historyProvider.isHistoryScreen
                        ? historyView(context, result)
                        : payView(context),
                  ],
                )),
                onNotification: (t) {
                  if (t is ScrollEndNotification &&
                      scrollController.position.pixels >=
poka's avatar
poka committed
                          scrollController.position.maxScrollExtent * 0.7) {
poka's avatar
poka committed

  Widget payView(context) {
    TextEditingController payComment = new TextEditingController();
poka's avatar
poka committed

    return Stack(
      overflow: Overflow.visible,
      children: <Widget>[
        Form(
          key: _formKey,
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              SizedBox(height: 20),
              Text('Commentaire:'),
              Padding(
poka's avatar
poka committed
                  padding: EdgeInsets.all(8.0),
                  child: TextField(
                      controller: payComment,
                      maxLines: 2,
poka's avatar
poka committed
                      textAlign: TextAlign.center,
                      decoration: InputDecoration(),
                      style: TextStyle(
                          fontSize: 14.0,
                          color: Colors.black,
                          fontWeight: FontWeight.bold))),
              SizedBox(height: 20),
              Text('Montant (Ğ1):'),
              Padding(
                padding: EdgeInsets.all(8.0),
                child: TextFormField(
                  textAlign: TextAlign.center,
                  maxLines: 1,
                  keyboardType: TextInputType.number,
                  inputFormatters: <TextInputFormatter>[
                    FilteringTextInputFormatter.allow(RegExp(r'(^\d*\.?\d*)'))
                  ],
poka's avatar
poka committed
                ),
poka's avatar
poka committed
                  padding: const EdgeInsets.only(top: 15),
                  child: OutlineButton(
                    borderSide: BorderSide(width: 2, color: Color(0xffD28928)),
                    onPressed: () {
                      if (_formKey.currentState.validate()) {
                        _formKey.currentState.save();
                      }
                    },
                    child: Padding(
                        padding: const EdgeInsets.all(12),
                        child: Text("PAYER",
                            style: TextStyle(
                                fontSize: 25, color: Colors.grey[850]))),
                  ))
poka's avatar
poka committed
          ),
poka's avatar
poka committed
    );
poka's avatar
poka committed
  }

  Widget historyView(context, result) {
    HistoryProvider _historyProvider = Provider.of<HistoryProvider>(context);

    return _historyProvider.transBC == null
        ? Text('Aucune transaction à afficher.')
        : Column(children: <Widget>[
            for (var repository in _historyProvider.transBC)
              Padding(
                  padding: const EdgeInsets.symmetric(horizontal: 5.0),
                  child: ListTile(
                      contentPadding: const EdgeInsets.all(5.0),
                      leading: Text(repository[1].toString(),
                          style: TextStyle(
                              fontSize: 12,
                              color: Colors.grey[800],
                              fontWeight: FontWeight.w700),
                          textAlign: TextAlign.center),
                      title: Text(repository[3],
                          style: TextStyle(
                              fontSize: 15.0, fontFamily: 'Monospace'),
                          textAlign: TextAlign.center),
                      subtitle: Text(repository[6] != '' ? repository[6] : '-',
                          style: TextStyle(fontSize: 12.0),
                          textAlign: TextAlign.center),
                      trailing: Text("${repository[4]} Ğ1",
                          style: TextStyle(fontSize: 14.0),
                          textAlign: TextAlign.justify),
                      dense: true,
                      isThreeLine: false,
                      onTap: () {
                        // this._outputPubkey.text = repository[2];
                        _historyProvider.isPubkey(context, repository[2]);
                      })),
            if (result.isLoading)
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  CircularProgressIndicator(),
                ],
              ),
            // if (_historyProvider.isTheEnd) // What I did before ...
            if (!_historyProvider.pageInfo['hasPreviousPage'])
              Column(children: <Widget>[
                SizedBox(height: 15),
                Text("Début de l'historique.",
                    textAlign: TextAlign.center,
                    style: TextStyle(fontSize: 20)),
                SizedBox(height: 15)
              ])
          ]);
  }