JezK
Edit File: settings-qr-code.min.js
export default function(p,e,r,o,t){let n=t.$builder,c={qr:null,libPromise:null,upsellUpgraded:!1,els:{},init(){n.on("wpformsBuilderReady",c.ready)},ready(){c.cacheElements(),c.els.$content.length&&(navigator.clipboard||c.els.$generatedActions.find('[data-qr-action="copy"]').remove(),c.bindEvents(),c.restoreState())},cacheElements(){var e=r("#wpforms-panel-field-settings-qr_code-content");c.els={$content:e,$type:r("#wpforms-panel-field-settings-qr_code"),$pageRow:e.find(".wpforms-panel-field-qr-code-page"),$pageSelect:e.find("#wpforms-panel-field-settings-qr_code_page_id"),$urlRow:e.find(".wpforms-panel-field-qr-code-url"),$urlInput:e.find("#wpforms-panel-field-settings-qr_code_url"),$logoSelect:e.find("#wpforms-panel-field-settings-qr_code_logo"),$preview:e.find(".wpforms-qr-code-preview"),$canvas:e.find(".wpforms-qr-code-preview-canvas"),$generate:e.find(".wpforms-qr-code-generate"),$generatedActions:e.find(".wpforms-qr-code-actions-generated"),$formatMenu:e.find(".wpforms-qr-code-format-menu"),$snapshot:e.find('input[name="settings[qr_code_generated]"]')}},bindEvents(){n.on("change","#wpforms-panel-field-settings-qr_code",c.onTypeChange).on("change","#wpforms-panel-field-settings-qr_code_page_id",c.onDestinationChange).on("input change","#wpforms-panel-field-settings-qr_code_url",c.onDestinationChange).on("change","#wpforms-panel-field-settings-qr_code_logo",c.onLogoChange).on("wpformsQrCodeLogoChanged",c.onLogoChange).on("click",".wpforms-qr-code-generate",c.onGenerate).on("click",".wpforms-qr-code-action",c.onActionClick).on("click",".wpforms-qr-code-format",c.onFormatClick).on("click",".wpforms-qr-code-preview",c.onPreviewClick),r(p).on("keydown",c.onDocumentKeydown).on("click",c.onDocumentClick),n.on("click",".wpforms-panel-field-qr-code-logo .education-modal",()=>c.sendUpsellEvent("shown")),n.on("mousedown",".wpforms-panel-field-qr-code-logo select.education-modal",e=>e.preventDefault()),r(p).on("wpformsEducationUpgradeModalUpgrade",(e,o)=>{"QR Code Logo"===o&&(c.upsellUpgraded=!0,c.sendUpsellEvent("upgraded"))}).on("wpformsEducationUpgradeModalClose",(e,o)=>{"QR Code Logo"!==o||c.upsellUpgraded||c.sendUpsellEvent("dismissed"),c.upsellUpgraded=!1})},sendUpsellEvent(e){r.post(wpforms_builder.ajax_url,{action:"wpforms_qr_code_logo_upsell",nonce:wpforms_builder.nonce,event:e})},restoreState(){var e=c.els.$snapshot.val();"none"!==c.getDestinationType()&&e?c.renderQr(e).then(()=>c.refreshStale()).catch(()=>c.setState("initial")):c.setState("initial")},onTypeChange(){var e=c.getDestinationType();c.els.$content.toggleClass("wpforms-hidden","none"===e),c.els.$pageRow.toggleClass("wpforms-hidden","page"!==e),c.els.$urlRow.toggleClass("wpforms-hidden","url"!==e),c.clearDestinationError(),"none"===e?c.discardCode():c.refreshStale()},discardCode(){c.els.$snapshot.val(""),c.els.$canvas.empty(),c.setState("initial")},onDestinationChange(){c.clearDestinationError(),c.refreshStale()},onLogoChange(){var e=c.els.$snapshot.val();e&&["success","generated","error-copy"].includes(c.els.$content.attr("data-state"))&&c.renderQr(e).then(()=>c.setState("generated")).catch(c.onRenderError)},refreshStale(){var e;"generating"!==c.els.$content.attr("data-state")&&((e=c.els.$snapshot.val())?c.setState(c.getDestinationUrl()===e?"generated":"stale"):c.setState("initial"))},onGenerate(){let e=c.getDestinationUrl();var o;e?("url"===c.getDestinationType()&&c.els.$urlInput.val(e),c.setState("generating"),o=new Promise(e=>setTimeout(e,1e3)),Promise.all([c.renderQr(e),o]).then(()=>{c.els.$snapshot.val(e),c.setState("success"),setTimeout(c.refreshStale,1e3)}).catch(c.onRenderError)):c.showDestinationError()},onRenderError(e){c.setState("logo"===e?.message?"error-logo":"error")},onPreviewClick(){"stale"===c.els.$content.attr("data-state")&&c.onGenerate()},onActionClick(){var e=r(this),o="true"===e.attr("aria-expanded");c.closeFormatMenu(),o||(e.attr("aria-expanded","true"),o="rtl"===getComputedStyle(e[0]).direction?e.offsetParent().width()-e.position().left-e.outerWidth():e.position().left,c.els.$formatMenu.attr("data-qr-menu-action",e.data("qr-action")).removeClass("wpforms-hidden").css("inset-inline-start",o))},onFormatClick(){var e=c.els.$formatMenu.attr("data-qr-menu-action"),o=r(this).data("qr-format");c.closeFormatMenu(),"download"===e?c.download(o):c.copy(o).then(c.showCopiedTooltip).catch(c.showCopyError)},showCopyError(){c.setState("error-copy"),setTimeout(()=>{"error-copy"===c.els.$content.attr("data-state")&&c.refreshStale()},4e3)},showCopiedTooltip(){let e=c.els.$generatedActions.find('[data-qr-action="copy"]');c.setPreviewTooltip(""),c.showTooltip(e,wpforms_builder.qr_code.copied),setTimeout(()=>e.tooltipster("hide"),2e3)},showTooltip(e,o,r="top"){e.hasClass("tooltipstered")?e.tooltipster("content",o):e.tooltipster({content:o,trigger:"custom",position:r,contentAsHTML:!1}),e.tooltipster("show")},onDocumentKeydown(e){"Escape"===e.key&&c.closeFormatMenu()},onDocumentClick(e){r(e.target).closest(".wpforms-qr-code-actions").length||c.closeFormatMenu()},closeFormatMenu(){c.els.$formatMenu.addClass("wpforms-hidden").removeAttr("data-qr-menu-action"),c.els.$generatedActions.find(".wpforms-qr-code-action").attr("aria-expanded","false")},setState(e){var o=c.els,r=["success","generated","error-copy"].includes(e),t="generating"===e,o=(o.$content.attr("data-state",e),o.$generate.toggleClass("wpforms-hidden",r).prop("disabled",t).text(o.$snapshot.val()?wpforms_builder.qr_code.regenerate:wpforms_builder.qr_code.generate),o.$generatedActions.toggleClass("wpforms-hidden",!r),c.setControlsDisabled(t),{error:wpforms_builder.qr_code.error_generate,"error-copy":wpforms_builder.qr_code.error_copy,"error-logo":wpforms_builder.qr_code.error_logo});c.setPreviewTooltip(o[e]||"")},setControlsDisabled(e){c.els.$urlInput.prop("disabled",e),c.els.$pageSelect.prop("disabled",e),c.els.$logoSelect.prop("disabled",e),c.els.$content.find(".wpforms-qr-code-logo-remove").prop("disabled",e),c.els.$content.find(".wpforms-qr-code-logo-upload").toggleClass("wpforms-disabled",e);var o=c.els.$pageSelect.data("choicesjs");e?o?.disable():o?.enable()},setPreviewTooltip(e){var o=c.els.$preview;e?c.showTooltip(o,e):o.hasClass("tooltipstered")&&o.tooltipster("destroy")},showDestinationError(){var e="page"===c.getDestinationType(),o=e?c.els.$pageSelect.closest(".choices"):c.els.$urlInput,e=e?wpforms_builder.qr_code.error_page:wpforms_builder.qr_code.error_url;o.addClass("wpforms-qr-code-field-error"),c.showTooltip(o,e,"right")},clearDestinationError(){c.els.$content.find(".wpforms-qr-code-field-error").each(function(){var e=r(this);e.removeClass("wpforms-qr-code-field-error"),e.hasClass("tooltipstered")&&e.tooltipster("destroy")})},getDestinationType(){return c.els.$type.val()||"none"},getDestinationUrl(){var e=c.getDestinationType();return"page"===e?c.getPagePermalink():"url"===e?c.normalizeUrl((c.els.$urlInput.val()||"").trim()):""},getPagePermalink(){var e=c.els.$pageSelect.val();return e&&((c.els.$pageSelect.data("choicesjs")?.getValue())?.customProperties?.permalink||(c.els.$content.data("pages")||{})[e])||""},normalizeUrl(e){try{var o=new URL(e);return["http:","https:"].includes(o.protocol)&&c.isResolvableHostname(o.hostname)?o.href:""}catch(e){return""}},isResolvableHostname(e){return!!e.startsWith("[")||!(253<(e=e.replace(/\.$/,"")).length||"localhost"!==e&&!e.includes("."))&&e.split(".").every(e=>/^[a-z0-9_]([a-z0-9_-]{0,61}[a-z0-9_])?$/.test(e))},loadLibrary(){return e.QRCodeStyling?Promise.resolve():(c.libPromise||(c.libPromise=new Promise((e,o)=>{var r=p.createElement("script");r.src=wpforms_builder.qr_code.lib_url,r.onload=e,r.onerror=o,p.head.appendChild(r)})),c.libPromise)},create({url:e,logo:o,size:n,quietZone:a,type:s}){return c.loadLibrary().then(()=>{let r=new QRCodeStyling({type:s||"canvas",width:n,height:n,margin:a,data:e,image:o||void 0,qrOptions:{errorCorrectionLevel:"H"},dotsOptions:{roundSize:!1},imageOptions:{crossOrigin:"anonymous",imageSize:.3,margin:4}}),t=Boolean(o);return{append:e=>r.append(e),download:(o,e)=>"png"===e?c.exportPngBlob(r,t,n).then(e=>c.saveBlob(e,o+".png")):r.download({name:o,extension:e}),toBlob:e=>"png"===e?c.exportPngBlob(r,t,n):r.getRawData(e)}})},exportPngBlob(e,i,d){return e.getRawData("svg").then(o=>new Promise((n,e)=>{let a=URL.createObjectURL(o),s=new Image,l=()=>{URL.revokeObjectURL(a),e(new Error("render"))};s.onerror=l,s.onload=()=>{let e=p.createElement("canvas"),o=(e.width=d,e.height=d,e.getContext("2d")),r=Date.now(),t=()=>{o.drawImage(s,0,0,d,d),!i||c.hasLogoPixels(o,d)||1500<Date.now()-r?(URL.revokeObjectURL(a),e.toBlob(e=>e?n(e):l(),"image/png")):setTimeout(t,150)};t()},s.src=a}))},hasLogoPixels(e,o){var r=Math.floor(.1*o),o=Math.floor((o-r)/2),t=e.getImageData(o,o,r,r).data;for(let e=0;e<t.length;e+=4)if(0<t[e+3]&&(t[e]<250||t[e+1]<250||t[e+2]<250))return!0;return!1},saveBlob(e,o){let r=URL.createObjectURL(e);e=p.createElement("a");e.href=r,e.download=o,p.body.appendChild(e),e.click(),e.remove(),setTimeout(()=>URL.revokeObjectURL(r),1e4)},createExportQr(){return c.create({url:c.els.$snapshot.val(),logo:c.getLogoUrl(),size:1024,quietZone:51})},getLogoUrl(){var e=c.els.$logoSelect,e=e.length?e.val():"wpforms";return"none"===e?"":"custom"===e?c.followPageScheme(c.els.$content.attr("data-logo-url")):c.followPageScheme(wpforms_builder.qr_code.logo_wpforms)},followPageScheme(e){return e?e.replace(/^https?:/i,""):""},loadLogo(t){return t?new Promise((e,o)=>{var r=new Image;r.crossOrigin="anonymous",r.onload=()=>e(t),r.onerror=()=>o(new Error("logo")),r.src=t}):Promise.resolve("")},withTimeout(e,r){var o=new Promise((e,o)=>{setTimeout(()=>o(new Error(r?"logo":"render")),1e4)});return Promise.race([e,o])},renderQr(o){var e=c.getLogoUrl();return c.withTimeout(c.loadLogo(e).then(e=>c.drawQr(o,e)),e)},drawQr(o,e){e={url:o,logo:e,size:1024,quietZone:0,type:"svg"};return c.create(e).then(e=>(c.qr=e,c.els.$canvas.empty(),e.append(c.els.$canvas[0]),c.els.$preview.attr("aria-label",wpforms_builder.qr_code.preview_label.replace("%s",o)),e.toBlob("svg")))},download(o){return c.createExportQr().then(e=>e.download(wpforms_builder.qr_code.file_name,o))},copy(e){return"svg"===e?c.createExportQr().then(e=>e.toBlob("svg")).then(e=>e.text()).then(e=>navigator.clipboard.writeText(e)):Promise.resolve().then(()=>navigator.clipboard.write([new ClipboardItem({"image/png":c.createExportQr().then(e=>e.toBlob("png"))})]))}};return c}