import 'dart:convert'; import 'dart:io'; import 'package:MakerBook/utils/encrypt.dart'; import 'package:flutter/material.dart'; import 'package:path_provider/path_provider.dart'; import 'package:vocsy_epub_viewer/epub_viewer.dart'; class EpubViewer2Page extends StatefulWidget { final int book_id; const EpubViewer2Page({super.key, required this.book_id}); @override _EpubViewer2PageState createState() => _EpubViewer2PageState(); } class _EpubViewer2PageState extends State { String? lastLocation; String? epubPath; @override void initState() { super.initState(); _prepareTempEpub(); //_initializeEpubController(); // Registra um listener para capturar o lastLocation quando o leitor informar VocsyEpub.locatorStream.listen((locator) async { print('Localização atual: $locator'); // Armazena o locator como um Map em vez de string diretamente lastLocation = locator; await _saveLastLocation(); }); } @override void dispose() { super.dispose(); } // Função para salvar a última posição de leitura Future _saveLastLocation() async { if (lastLocation == null) return; final directory = await getApplicationDocumentsDirectory(); final file = File('${directory.path}/${widget.book_id}.epub'); // Recarrega o conteúdo protegido atual, atualiza o lastLocation, e salva novamente String protectedContent = await file.readAsString(); Map fileData = unprotectFile(protectedContent); String updatedProtectedContent = await protectFile(fileData['epubBytes'], lastLocation!); await file.writeAsString(updatedProtectedContent); Navigator.pop(context); } // Prepara o arquivo temporário para o leitor EPUB Future _prepareTempEpub_bkp() async { final directoryReal = await getApplicationDocumentsDirectory(); final file = File('${directoryReal.path}/${widget.book_id}.epub'); final directory = await getTemporaryDirectory(); final tempFile = File('${directory.path}/${widget.book_id}_temp.epub'); // Lê o conteúdo protegido e remove a proteção String protectedContent = await file.readAsString(); Map fileData = unprotectFile(protectedContent); List unprotectedBytes = fileData['epubBytes']; lastLocation = fileData['lastLocation']; // Recupera o lastLocation // Salva o arquivo descriptografado no diretório temporário await tempFile.writeAsBytes(unprotectedBytes); // Configuração do leitor VocsyEpub.setConfig( themeColor: Theme.of(context).primaryColor, identifier: widget.book_id.toString(), scrollDirection: EpubScrollDirection.ALLDIRECTIONS, allowSharing: false, enableTts: false, ); // Abrindo o arquivo EPUB e usando o lastLocation se estiver disponível VocsyEpub.open( tempFile.path, lastLocation: lastLocation != null ? EpubLocator.fromJson(jsonDecode(lastLocation!)) : null, ); } // Prepara o arquivo temporário para o leitor EPUB Future _prepareTempEpub() async { final directoryReal = await getApplicationDocumentsDirectory(); final file = File('${directoryReal.path}/${widget.book_id}.epub'); // Configuração do leitor VocsyEpub.setConfig( themeColor: Theme.of(context).primaryColor, identifier: widget.book_id.toString(), scrollDirection: EpubScrollDirection.ALLDIRECTIONS, allowSharing: false, enableTts: false, ); // Abrindo o arquivo EPUB e usando o lastLocation se estiver disponível VocsyEpub.open( file.path, lastLocation: lastLocation != null ? EpubLocator.fromJson(jsonDecode(lastLocation!)) : null, ); } @override Widget build(BuildContext context) { return const Center(child: CircularProgressIndicator()); } }