import 'dart:async'; import 'package:core/data/model/print_attachment.dart'; import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/utils/app_logger.dart'; import 'package:core/utils/file_utils.dart'; import 'package:core/utils/html/html_interaction.dart'; import 'package:core/utils/html/html_template.dart'; import 'package:core/utils/html/html_utils.dart'; import 'package:html/dom.dart'; import 'package:html/parser.dart'; class PrintUtils { final ImagePaths _imagePaths; final FileUtils _fileUtils; PrintUtils(this._imagePaths, this._fileUtils); Future _createUserInformationElement({ required String appName, required String userName, }) async { try { final logoBase64Data = await _fileUtils.convertImageAssetToBase64(_imagePaths.icLogoApp); return Element.html('''
$userName
'''); } catch (e) { logError('PrintUtils::_createUserInformationElement: Exception = $e'); return null; } } Element? get dividerElement { try { return Element.html('
'); } catch (e) { logError('PrintUtils::dividerElement: Exception = $e'); return null; } } Element? _createSubjectElement(String subject) { try { return Element.html('''
$subject
'''); } catch (e) { logError('PrintUtils::_createSubjectElement: Exception = $e'); return null; } } Element? _createSenderElement({ required String senderName, required String senderEmailAddress, required String dateTime, }) { try { return Element.html(''' $senderName <$senderEmailAddress> $dateTime '''); } catch (e) { logError('PrintUtils::_createSenderElement: Exception = $e'); return null; } } String? _createRecipientHtmlTag(String prefix, String emailAddress) { try { Element element = Element.html('
'); element.text = '$prefix: $emailAddress'; return element.outerHtml; } catch (e) { logError('PrintUtils::_createRecipientHtmlTag: Exception = $e'); return ''; } } Element? _createRecipientsElement({ required String toPrefix, required String ccPrefix, required String bccPrefix, required String replyToPrefix, String? toAddress, String? ccAddress, String? bccAddress, String? replyToAddress, }) { try { return Element.html(''' ${replyToAddress?.isNotEmpty == true ? _createRecipientHtmlTag(replyToPrefix, replyToAddress!) : ''} ${toAddress?.isNotEmpty == true ? _createRecipientHtmlTag(toPrefix, toAddress!) : ''} ${ccAddress?.isNotEmpty == true ? _createRecipientHtmlTag(ccPrefix, ccAddress!) : ''} ${bccAddress?.isNotEmpty == true ? _createRecipientHtmlTag(bccPrefix, bccAddress!) : ''} '''); } catch (e) { logError('PrintUtils::_createRecipientsElement: Exception = $e'); return null; } } Element? _createEmailContentElement(String emailContent) { try { return Element.html('''
$emailContent
'''); } catch (e) { logError('PrintUtils::_createEmailContentElement: Exception = $e'); return null; } } String _createTitleAttachmentHtmlTag({ required int countAttachments, required String titleAttachment }) { return '$countAttachments $titleAttachment'; } String _createAttachmentHtmlTag(PrintAttachment printAttachment) { return '''
${printAttachment.name}
${printAttachment.size}
'''; } Element? _createAttachmentsElement({ required String titleAttachment, required List listAttachment }) { try { return Element.html(''' ${_createTitleAttachmentHtmlTag(countAttachments: listAttachment.length, titleAttachment: titleAttachment)} ${listAttachment.map((printAttachment) => _createAttachmentHtmlTag(printAttachment)).toList().join('')}
'''); } catch (e) { logError('PrintUtils::_createAttachmentsElement: Exception = $e'); return null; } } Future printEmail({ required String appName, required String userName, required String subject, required String emailContent, required String senderName, required String senderEmailAddress, required String locale, required String dateTime, required String toPrefix, required String ccPrefix, required String bccPrefix, required String replyToPrefix, required String titleAttachment, String? toAddress, String? ccAddress, String? bccAddress, String? replyToAddress, List? listAttachment, }) async { Document document = parse(HtmlUtils.createTemplateHtmlDocument(title: '$appName - $subject')); Element bodyContainerElement = Element.html('
'); Element mainContentElement = Element.html('
'); Element messageElement = Element.html('
'); Element messageBodyElement = Element.html(''); Element? userInfoElement = await _createUserInformationElement( appName: appName, userName: userName); Element? subjectElement = _createSubjectElement(subject); Element? senderElement = _createSenderElement( senderName: senderName, senderEmailAddress: senderEmailAddress, dateTime: dateTime); Element? recipientsElement = _createRecipientsElement( toPrefix: toPrefix, ccPrefix: ccPrefix, bccPrefix: bccPrefix, replyToPrefix: replyToPrefix, toAddress: toAddress, ccAddress: ccAddress, bccAddress: bccAddress, replyToAddress: replyToAddress, ); Element? emailContentElement = _createEmailContentElement(emailContent); if (senderElement != null) { messageBodyElement.append(senderElement); } if (recipientsElement != null) { messageBodyElement.append(recipientsElement); } if (emailContentElement != null) { messageBodyElement.append(emailContentElement); } messageElement.append(messageBodyElement); if (subjectElement != null) { mainContentElement.append(subjectElement); } if (dividerElement != null) { mainContentElement.append(dividerElement!); } mainContentElement.append(messageElement); if (listAttachment?.isNotEmpty == true) { final attachmentsElement = _createAttachmentsElement( titleAttachment: titleAttachment, listAttachment: listAttachment!); if (dividerElement != null) { mainContentElement.append(dividerElement!); } if (attachmentsElement != null) { mainContentElement.append(attachmentsElement); } } if (userInfoElement != null) { bodyContainerElement.append(userInfoElement); } if (dividerElement != null) { bodyContainerElement.append(dividerElement!); } bodyContainerElement.append(mainContentElement); Element styleElement = Element.html(HtmlTemplate.printDocumentCssStyle); document.head?.append(styleElement); document.body?.append(bodyContainerElement); Element scriptElement = Element.html(HtmlInteraction.scriptHandleInvokePrinterOnBrowser); document.body?.append(scriptElement); final htmlDocument = document.outerHtml; HtmlUtils.openNewTabHtmlDocument(htmlDocument); } }