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 { 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: [ 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: [ 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 { List> _sheetData = []; late bool _isLoading; @override void initState() { super.initState(); _isLoading = true; _loadSheetData(); } Future _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 data = json.decode(response.body); List> 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'); } } } @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: [ if (_sheetData.isNotEmpty) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Contenu du Google Sheets :', style: TextStyle(fontSize: 18.0, fontWeight: FontWeight.bold), ), const SizedBox(height: 10.0), for (List row in _sheetData) Text(row.join(' ; ')), const SizedBox(height: 20.0), ], ) 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), ), ], ), ), ); } }