generate-preview.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import { doShortcodesFromLocalstorage } from "../utils.js";
  2. import previewOnly from "./preview-only.js";
  3. export default async function generatePreview(signed=false, forDownload=false, filename="contract-signed.html") {
  4. const signatureFileEmpty = "data/more-data/signature-empty.png"
  5. let clientSignatureData
  6. if (localStorage.getItem("client_signature") !== null) {
  7. clientSignatureData = localStorage.getItem("client_signature")
  8. }
  9. else {
  10. // todo: instantiate signature and get data; get rid of empty signature png file
  11. clientSignatureData = await toDataURL(signatureFileEmpty)
  12. localStorage.setItem("client_signature", clientSignatureData)
  13. }
  14. // get css
  15. let contract_css = localStorage.getItem("contract_css")
  16. // get main from editor (don't escape single quotes)
  17. let main = document.querySelector(".editor-container .ql-editor").innerHTML
  18. // replace each shortcode w/ its value
  19. main = doShortcodesFromLocalstorage(main)
  20. // js for unsigned contract
  21. let contract_script_unsigned = `
  22. <script id="contract_script_unsigned" type="module">
  23. ${localStorage.getItem("contract_script_unsigned")}
  24. </script>
  25. <script id="qr_code_script" type="module">
  26. ${localStorage.getItem("qr_code_script")}
  27. </script>`
  28. // js for signed contract
  29. let contract_script_signed = `
  30. <script id="contract_script_signed">
  31. ${localStorage.getItem("contract_script_signed")}
  32. </script>`
  33. let contract_script, clientSignature_html, ui_html, compiled_signatures, previewOverrides
  34. if (signed) {
  35. const client_timestamp = getTimestamp()
  36. const dev_timestamp = localStorage.getItem("dev_timestamp") ?? client_timestamp
  37. // get IP
  38. const client_ip = await fetch("https://api.ipify.org").then((data) => { return data.text() })
  39. contract_script = contract_script_signed
  40. clientSignature_html = `<img id="hk" src="${clientSignatureData}" />`
  41. ui_html = localStorage.getItem("ui_signed")
  42. ui_html = `<div id="ui-unsigned">${ui_html}</div>`
  43. compiled_signatures = `
  44. <div class="compiled-signatures">
  45. <div class="compiled-signature">
  46. <strong>${localStorage.getItem("dev_name")}</strong>
  47. <img id="dev_signature" src="${localStorage.getItem("dev_signature")}" />
  48. <div class="date-ip">
  49. <strong>Signed on:</strong> ${dev_timestamp}
  50. <br><strong>IP address:</strong> ${client_ip} <br>
  51. </div>
  52. </div>
  53. <div class="compiled-signature">
  54. <strong>${localStorage.getItem("client_name")}</strong>
  55. ${clientSignature_html}
  56. <div id="date-ip" class="date-ip">
  57. <strong>Signed on:</strong> ${client_timestamp}
  58. <br><strong>IP address:</strong> ${client_ip}<br>
  59. </div>
  60. </div>
  61. </div>`
  62. }
  63. else {
  64. localStorage.setItem("dev_timestamp", getTimestamp())
  65. contract_script = contract_script_unsigned
  66. clientSignature_html = ""
  67. ui_html = localStorage.getItem("ui_unsigned")
  68. ui_html = `<div id="ui-unsigned">${ui_html}</div>`
  69. compiled_signatures = `<img id="dev_signature" src="${localStorage.getItem("dev_signature")}" />`
  70. }
  71. previewOverrides = previewOnly(signed, forDownload, filename)
  72. // to do: move to external file; make function w/ props
  73. const output = `<!DOCTYPE html>
  74. <html lang="en">
  75. <head>
  76. <meta charset="UTF-8">
  77. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  78. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  79. <title>Signed Contract</title>
  80. <style>${contract_css}</style>
  81. </head>
  82. <body style="overscroll-behavior: contain;">
  83. <div id="content" class="ql-editor">
  84. ${main}
  85. ${compiled_signatures}
  86. ${ui_html}
  87. </div> <!-- #content -->
  88. ${contract_script}
  89. <!-- ! PREVIEW ONLY -->
  90. ${previewOverrides}
  91. </body>
  92. </html>
  93. `
  94. return (output)
  95. }
  96. const getTimestamp = () => {
  97. const date = new Date()
  98. let timestamp = new Intl.DateTimeFormat("en",
  99. { dateStyle: "long", timeStyle: "long" }
  100. ).format(date)
  101. return timestamp
  102. }
  103. const toDataURL = url => fetch(url)
  104. .then(response => response.blob())
  105. .then(blob => new Promise((resolve, reject) => {
  106. const reader = new FileReader()
  107. reader.onloadend = () => resolve(reader.result)
  108. reader.onerror = reject
  109. reader.readAsDataURL(blob)
  110. }))
  111. // from https://stackoverflow.com/a/20285053