ADDED EXPORT FUNCTIONALITY
This commit is contained in:
@@ -8,9 +8,14 @@ import 'package:provider/provider.dart';
|
||||
|
||||
import 'package:frontend/values/constants.dart';
|
||||
|
||||
class ListPage extends StatelessWidget {
|
||||
class ListPage extends StatefulWidget {
|
||||
const ListPage({super.key});
|
||||
|
||||
@override
|
||||
State<ListPage> createState() => _ListPageState();
|
||||
}
|
||||
|
||||
class _ListPageState extends State<ListPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final provider = context.watch<QuoteProvider>();
|
||||
@@ -112,7 +117,7 @@ class ListPage extends StatelessWidget {
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
void _showUpdateDialog(BuildContext context, QuoteProvider provider, Quote quote) {
|
||||
final bodyController = TextEditingController(text: quote.body);
|
||||
final authorController = TextEditingController(text: quote.author);
|
||||
@@ -273,12 +278,15 @@ class ListPage extends StatelessWidget {
|
||||
ListTile(
|
||||
title: Text(Strings.exportSelectedQuotes),
|
||||
trailing: Icon(Icons.import_export),
|
||||
onTap: () {
|
||||
provider.exportQuotesToFile();
|
||||
onTap: () async {
|
||||
Navigator.pop(context);
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
final scaffoldMessenger = ScaffoldMessenger.of(context);
|
||||
final success = await provider.exportWithSAF();
|
||||
// Make sure the context is still valid
|
||||
if (!mounted) return;
|
||||
scaffoldMessenger.showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(Strings.fileExportedSuccessfully),
|
||||
content: Text(success ? Strings.fileExportedSuccessfully + provider.exportDir : "export [x]"),
|
||||
duration: const Duration(seconds: 3),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
// gets all quotes from the database and returns them in a list
|
||||
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:file_saver/file_saver.dart';
|
||||
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:flutter/foundation.dart'; // for kIsWeb
|
||||
|
||||
import 'dart:convert';
|
||||
import 'dart:typed_data';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:file_picker/file_picker.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:frontend/model/quote.dart';
|
||||
@@ -67,6 +74,8 @@ class QuoteProvider extends ChangeNotifier {
|
||||
|
||||
late Quote randomQuote;
|
||||
bool randomQuoteDeterminator = true;
|
||||
|
||||
String exportDir = "";
|
||||
String get randomQuoteText {
|
||||
if (randomQuoteDeterminator) {
|
||||
return randomQuote.body;
|
||||
@@ -170,30 +179,28 @@ class QuoteProvider extends ChangeNotifier {
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<bool> exportWithSAF() async {
|
||||
try {
|
||||
final datetime = DateTime.now().toUtc().toString()
|
||||
.replaceAll(" ", "T")
|
||||
.replaceAll(":", "-")
|
||||
.replaceAll(RegExp(r"\..*"), "");
|
||||
final filename = 'hlasky_$datetime.txt';
|
||||
final content = filteredQuotes.map((q) => "${q.body} – ${q.author}").join('\n') + '\n';
|
||||
final bytes = Uint8List.fromList(utf8.encode(content));
|
||||
|
||||
Future<Directory> _getSaveDirectory() async {
|
||||
if (Platform.isWindows || Platform.isLinux || Platform.isMacOS) {
|
||||
final path = Platform.isWindows
|
||||
? Platform.environment['USERPROFILE']
|
||||
: Platform.environment['HOME'];
|
||||
// Show folder picker
|
||||
final folderPath = await FilePicker.platform.getDirectoryPath();
|
||||
if (folderPath == null) return false; // user cancelled
|
||||
exportDir = folderPath;
|
||||
|
||||
return Directory(path!);
|
||||
final file = File('$folderPath/$filename');
|
||||
await file.writeAsBytes(bytes);
|
||||
|
||||
return true; // export successful
|
||||
} catch (e) {
|
||||
return false; // something went wrong
|
||||
}
|
||||
|
||||
// Mobile fallback
|
||||
return await getApplicationDocumentsDirectory();
|
||||
}
|
||||
|
||||
Future<void> exportQuotesToFile() async {
|
||||
final dir = await _getSaveDirectory();
|
||||
|
||||
final datetime = DateTime.now().toUtc().toString()
|
||||
.replaceAll(" ", "T")
|
||||
.replaceAll(":", "-")
|
||||
.replaceAll(RegExp(r"\..*"), "");
|
||||
|
||||
final file = File('${dir.path}/hlasky_$datetime.txt');
|
||||
await file.writeAsString("${filteredQuotes.join("\n")}\n");
|
||||
}
|
||||
|
||||
Color getLeaderboardEntryBgColor(BuildContext context, int index) {
|
||||
|
||||
@@ -23,7 +23,7 @@ class Strings {
|
||||
static const String nextFlashcard = "Další flashkarta";
|
||||
|
||||
//static const String importQuotesFromFile = "Importovat hlášky ze souboru";
|
||||
static const String fileExportedSuccessfully = "Soubor byl úspěšně vyexportován.";
|
||||
static const String fileExportedSuccessfully = "Soubor byl úspěšně vyexportován do: ";
|
||||
static const String noUndo = "Tuto akci nelze odčinit.";
|
||||
static const String filterQuery = "Filtrovací požadavek";
|
||||
static const String allQuotesCount = "Celkový počet hlášek";
|
||||
|
||||
Reference in New Issue
Block a user