import 'dart:typed_data'; import 'package:pdf/pdf.dart'; import 'package:pdf/widgets.dart' as pw; import 'file_service.dart'; import 'pdf_fonts.dart'; /// Renders the printable recovery sheet — a QR plus the typed code and short /// instructions ("keep two paper copies, like your best seed"). All strings /// arrive already localized. class RecoverySheetService { RecoverySheetService({required FileService files}) : _files = files; final FileService _files; Future buildPdf({ required String title, required String intro, required String code, }) async { final fonts = await loadPdfFonts(); final doc = pw.Document(theme: fonts.theme); doc.addPage( pw.Page( pageFormat: PdfPageFormat.a4, build: (context) => pw.Column( crossAxisAlignment: pw.CrossAxisAlignment.start, children: [ pw.Text(title, style: pw.TextStyle(font: fonts.bold, fontSize: 20)), pw.SizedBox(height: 12), pw.Text(intro, style: const pw.TextStyle(fontSize: 11)), pw.SizedBox(height: 24), pw.Center( child: pw.BarcodeWidget( barcode: pw.Barcode.qrCode(), data: code, width: 220, height: 220, // The code is printed below with the Unicode-capable face; // the widget's built-in caption would fall back to Courier. drawText: false, ), ), pw.SizedBox(height: 24), pw.Center( child: pw.Text( code, textAlign: pw.TextAlign.center, style: pw.TextStyle(font: fonts.bold, fontSize: 12), ), ), ], ), ), ); return doc.save(); } /// Builds the sheet and asks the user where to keep it. Returns true when /// saved, false when they cancelled. Future saveSheet({ required String title, required String intro, required String code, required String suggestedName, }) async { final bytes = await buildPdf(title: title, intro: intro, code: code); final path = await _files.saveFile( suggestedName: suggestedName, bytes: bytes, ); return path != null; } }