import 'dart:async'; import 'package:core/data/model/print_attachment.dart'; import 'package:core/presentation/resources/image_paths.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 { final logoBase64Data = await _fileUtils.convertImageAssetToBase64(_imagePaths.icTMailLogo); return Element.html('''
$appName $userName
'''); } Element get dividerElement => Element.html('
'); Element _createSubjectElement(String subject) { return Element.html('''
$subject
'''); } Element _createSenderElement({ required String senderName, required String senderEmailAddress, required String dateTime, }) { return Element.html(''' $senderName <$senderEmailAddress> $dateTime '''); } String _createRecipientHtmlTag(String prefix, String emailAddress) { Element element = Element.html('
'); element.text = '$prefix: $emailAddress'; return element.outerHtml; } Element _createRecipientsElement({ required String toPrefix, required String ccPrefix, required String bccPrefix, required String replyToPrefix, String? toAddress, String? ccAddress, String? bccAddress, String? replyToAddress, }) { 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!) : ''} '''); } Element _createEmailContentElement(String emailContent) { return Element.html('''
$emailContent
'''); } 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 }) { return Element.html(''' ${_createTitleAttachmentHtmlTag(countAttachments: listAttachment.length, titleAttachment: titleAttachment)} ${listAttachment.map((printAttachment) => _createAttachmentHtmlTag(printAttachment)).toList().join('')}
'''); } 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); bodyContainerElement.append(userInfoElement); bodyContainerElement.append(dividerElement); mainContentElement.append(subjectElement); mainContentElement.append(dividerElement); messageBodyElement.append(senderElement); messageBodyElement.append(recipientsElement); messageBodyElement.append(emailContentElement); messageElement.append(messageBodyElement); mainContentElement.append(messageElement); if (listAttachment?.isNotEmpty == true) { Element attachmentsElement = _createAttachmentsElement( titleAttachment: titleAttachment, listAttachment: listAttachment!); mainContentElement.append(dividerElement); mainContentElement.append(attachmentsElement); } bodyContainerElement.append(mainContentElement); document.body?.append(bodyContainerElement); Element scriptElement = Element.html(HtmlInteraction.scriptHandleInvokePrinterOnBrowser); document.body?.append(scriptElement); Element styleElement = Element.html(HtmlTemplate.printDocumentCssStyle); document.head?.append(styleElement); final htmlDocument = document.outerHtml; HtmlUtils.openNewTabHtmlDocument(htmlDocument); } }