main.dart 8,86 ko
Newer Older
import 'dart:convert';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:open_file/open_file.dart';
import 'package:pdf/widgets.dart' as pw;

import 'config.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter NFC App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  final TextEditingController _googleSheetsLinkController =
  TextEditingController();

  bool _isValidGoogleSheetsLink(String link) {
    RegExp regex = RegExp(
        r'https:\/\/docs\.google\.com\/spreadsheets\/d\/[a-zA-Z0-9_-]+\/(edit|pubhtml).*');
    return regex.hasMatch(link);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Flutter NFC App'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'Bienvenue dans votre application NFC !',
              style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold),
            ),
            const SizedBox(height: 20.0),
            TextField(
              controller: _googleSheetsLinkController,
              decoration: InputDecoration(
                labelText: 'Entrez le lien Google Sheets',
                border: OutlineInputBorder(),
              ),
            ),
            const SizedBox(height: 20.0),
            ElevatedButton(
              onPressed: () {
                String googleSheetsLink = _googleSheetsLinkController.text;
                if (_isValidGoogleSheetsLink(googleSheetsLink)) {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) =>
                          DataPage(googleSheetsLink: googleSheetsLink),
                    ),
                  );
                } else {
                  showDialog(
                    context: context,
                    builder: (context) {
                      return AlertDialog(
                        title: const Text('Lien Google Sheets invalide'),
                        content: const Text(
                            'Veuillez saisir un lien Google Sheets valide.'),
                        actions: <Widget>[
                          TextButton(
                            onPressed: () {
                              Navigator.pop(context);
                            },
                            child: const Text('OK'),
                          ),
                        ],
                      );
                    },
                  );
                }
              },
              child: const Text('Continuer'),
            ),
          ],
        ),
      ),
    );
  }
}

class DataPage extends StatefulWidget {
  final String googleSheetsLink;

  const DataPage({Key? key, required this.googleSheetsLink}) : super(key: key);

  @override
  _DataPageState createState() => _DataPageState();
}

class _DataPageState extends State<DataPage> {
  List<List<dynamic>> _sheetData = [];
  late bool _isLoading;

  @override
  void initState() {
    super.initState();
    _isLoading = true;
    _loadSheetData();
  }

  Future<void> _loadSheetData() async {
    RegExp regex = RegExp(
        r'https:\/\/docs\.google\.com\/spreadsheets\/d\/([a-zA-Z0-9_-]+)\/(edit|pubhtml).*');
    Match? match = regex.firstMatch(widget.googleSheetsLink);

    if (match != null) {
      String sheetId = match.group(1)!;
      String apiUrl =
          'https://sheets.googleapis.com/v4/spreadsheets/$sheetId/values/${AppConfig.sheetName}?key=${AppConfig.apiKey}';

      try {
        final response = await http.get(Uri.parse(apiUrl));

        if (response.statusCode == 200) {
          final Map<String, dynamic> data = json.decode(response.body);
          List<List<dynamic>> values = [];

          if (data['values'] == null) {
            setState(() {
              _isLoading = false;
            });
            return;
          }

          for (final entry in data['values']) {
            values.add(List.from(entry));
          }

          setState(() {
            _sheetData = values;
          });
        } else {
          print(
              'Erreur lors de la récupération des données du Google Sheets. Statut : ${response.statusCode}');
        }
      } catch (e) {
        print(
            'Erreur lors de la récupération des données du Google Sheets : $e');
      }
    }
  }

  Future<void> generatePdf(List<List<dynamic>> sheetData) async {
    final pdf = pw.Document();

    final List<pw.TableRow> rows = [];

    for (final row in sheetData) {
      final List<pw.Widget> rowWidgets = row.map((cell) => pw.Text('$cell')).toList();
      rows.add(pw.TableRow(children: rowWidgets));
    }

    pdf.addPage(pw.Page(
      build: (pw.Context context) {
        return pw.Table(
          columnWidths: {
            for (int i = 0; i < sheetData[0].length; i++)
              i: pw.FixedColumnWidth(100.0),
          },
          children: rows,
        );
      },
    ));

    final file = File('google_sheets_data.pdf');
    await file.writeAsBytes(await pdf.save());

    OpenFile.open(file.path);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Page de données'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            if (_sheetData.isNotEmpty)
              Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  const Text(
                    'Contenu du Google Sheets :',
                    style:
                    TextStyle(fontSize: 18.0, fontWeight: FontWeight.bold),
                  ),
                  const SizedBox(height: 10.0),
                  Table(
                    border: TableBorder.all(),
                    columnWidths: {
                      for (int i = 0; i < _sheetData[0].length; i++)
                        i: FixedColumnWidth(100.0),
                    },
                    children: _sheetData.map((row) {
                      if (row.length < _sheetData[0].length) {
                        final filledRow = List.from(row)
                          ..addAll(List.generate(
                              _sheetData[0].length - row.length, (_) => ''));

                        return TableRow(
                          children: filledRow.map((cell) => Padding(
                            padding: const EdgeInsets.all(8.0),
                            child: Text(
                              '$cell',
                              style: TextStyle(fontWeight: FontWeight.bold),
                            ),
                          )).toList(),
                        );
                      } else {
                        return TableRow(
                          children: row.map((cell) => Padding(
                            padding: const EdgeInsets.all(8.0),
                            child: Text(
                              '$cell',
                              style: TextStyle(fontWeight: FontWeight.bold),
                            ),
                          )).toList(),
                        );
                      }
                    }).toList(),
                  ),
                  const SizedBox(height: 20.0),
                  Row(
                    children: <Widget>[
                      ElevatedButton(
                        onPressed: () async {
                          await generatePdf(_sheetData);
                        },
                        child: const Text('Générer PDF'),
                      ),
firdaous elhalafi's avatar
firdaous elhalafi a validé
                      const SizedBox(width: 20.0),
                      ElevatedButton(
                        onPressed: () async {
                        },
                        child: const Text('Lire la leocarte'),
                      ),
                ],
              )
            else if (_isLoading)
              const Text(
                'Chargement des données..',
                style: TextStyle(fontSize: 16.0),
              )
            else if (_sheetData.isEmpty)
                const Text(
                  'Aucune donnée disponible.',
                  style: TextStyle(fontSize: 16.0),
                ),