import 'dart:convert'; import 'dart:ui' as ui; import 'package:ente_auth/models/code.dart'; import 'package:ente_auth/store/code_store.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:qr_flutter/qr_flutter.dart'; Future generateQRImageBase64(String data) async { const size = 250.0; const padding = 20.0; final qrCode = QrCode.fromData( data: data, errorCorrectLevel: QrErrorCorrectLevel.L, ); final qrPainter = QrPainter.withQr( qr: qrCode, gapless: true, eyeStyle: const QrEyeStyle( eyeShape: QrEyeShape.square, color: Colors.black, ), dataModuleStyle: const QrDataModuleStyle( dataModuleShape: QrDataModuleShape.square, color: Colors.black, ), ); const totalSize = size + padding * 2; final recorder = ui.PictureRecorder(); final canvas = Canvas(recorder); const paintBounds = Size(size, size); canvas.translate(padding, padding); qrPainter.paint(canvas, paintBounds); final picture = recorder.endRecording(); final img = await picture.toImage(totalSize.toInt(), totalSize.toInt()); final byteData = await img.toByteData(format: ui.ImageByteFormat.png); final pngBytes = byteData!.buffer.asUint8List(); return base64Encode(pngBytes); } Future generateOTPEntryHtml(Code code, BuildContext context) async { final qrBase64 = await generateQRImageBase64(code.rawData); String notes = code.display.note; if (notes.isNotEmpty) { notes = '

Note: $notes

'; } return '''

${code.issuer}

${code.account}

Type: ${code.type.name}

Algorithm: ${code.algorithm.name}

Digits: ${code.digits}

Secret: ${code.secret}

$notes
QR Code



'''; } Future generateHtml(BuildContext context) async { DateTime now = DateTime.now().toUtc(); String formattedDate = DateFormat('d MMMM, yyyy').format(now); final allCodes = await CodeStore.instance.getAllCodes(); final List enteries = []; for (final code in allCodes) { if (code.hasError) continue; final entry = await generateOTPEntryHtml(code, context); enteries.add(entry); } return '''

Ente Auth

OTP Data Export

$formattedDate

 

${enteries.join('')}


'''; }