diff --git a/ghost/admin/app/components/gh-site-iframe.js b/ghost/admin/app/components/gh-site-iframe.js index 8a3a6e53f3..4def8ce800 100644 --- a/ghost/admin/app/components/gh-site-iframe.js +++ b/ghost/admin/app/components/gh-site-iframe.js @@ -8,6 +8,10 @@ export default class GhSiteIframeComponent extends Component { @tracked isInvisible = this.args.invisibleUntilLoaded; + willDestroy() { + this.args.onDestroyed?.(); + } + get srcUrl() { return this.args.src || `${this.config.get('blogUrl')}/`; } diff --git a/ghost/admin/app/controllers/settings/membership.js b/ghost/admin/app/controllers/settings/membership.js index f2ec8f2437..47a0e454a7 100644 --- a/ghost/admin/app/controllers/settings/membership.js +++ b/ghost/admin/app/controllers/settings/membership.js @@ -3,6 +3,7 @@ import {action} from '@ember/object'; import {currencies, getCurrencyOptions, getSymbol} from 'ghost-admin/utils/currency'; import {inject as service} from '@ember/service'; import {task} from 'ember-concurrency-decorators'; +import {timeout} from 'ember-concurrency'; import {tracked} from '@glimmer/tracking'; const CURRENCIES = currencies.map((currency) => { @@ -184,6 +185,40 @@ export default class MembersAccessController extends Controller { monthlyPrice, yearlyPrice }); + + this.resizePortalPreviewTask.perform(); + } + + @action + portalPreviewLoaded(event) { + this.portalPreviewIframe = event.target; + this.resizePortalPreviewTask.perform(); + } + + @action + portalPreviewDestroyed() { + this.portalPreviewIframe = null; + this.resizePortalPreviewTask.cancelAll(); + } + + @task({restartable: true}) + *resizePortalPreviewTask() { + if (this.portalPreviewIframe && this.portalPreviewIframe.contentWindow) { + yield timeout(100); // give time for portal to re-render + + const portalIframe = this.portalPreviewIframe.contentWindow.document.querySelector('#ghost-portal-root iframe'); + if (!portalIframe) { + return; + } + + const portalContainer = portalIframe.contentWindow.document.querySelector('.gh-portal-popup-container'); + if (!portalContainer) { + return; + } + + const height = portalContainer.clientHeight; + this.portalPreviewIframe.parentNode.style.height = `${height}px`; + } } @action diff --git a/ghost/admin/app/templates/settings/membership.hbs b/ghost/admin/app/templates/settings/membership.hbs index 104b55e618..eeb61f6ba0 100644 --- a/ghost/admin/app/templates/settings/membership.hbs +++ b/ghost/admin/app/templates/settings/membership.hbs @@ -53,7 +53,9 @@ {{else}} + @invisibleUntilLoaded={{true}} + @onLoad={{this.portalPreviewLoaded}} + @onDestroyed={{this.portalPreviewDestroyed}} /> {{/if}}