components/story_iframe.vue (73 lines of code) (raw):
<script>
import { iframeResize } from 'iframe-resizer';
import { GlLoadingIcon } from '../helpers/gitlab_ui';
import { SkipOneTrustDirective } from '../directives/skip_one_trust_directive';
export default {
components: {
GlLoadingIcon,
},
directives: {
skipOneTrust: SkipOneTrustDirective,
},
props: {
url: {
type: String,
required: true,
},
iframePadding: {
type: String,
required: false,
default: null,
},
title: {
type: String,
required: true,
},
},
data() {
return {
loaded: false,
};
},
computed: {
iFrameClass() {
return {
'gl-opacity-0': !this.loaded,
};
},
iframeResizeOptions() {
const options = {};
if (this.iframePadding) {
options.bodyPadding = this.iframePadding;
}
return options;
},
},
methods: {
iFrameLoaded({ target }) {
iframeResize(this.iframeResizeOptions, target);
this.loaded = true;
},
},
};
</script>
<template>
<div class="gl-relative">
<div
v-if="!loaded"
class="gl-absolute gl-bottom-0 gl-left-0 gl-right-0 gl-top-0 gl-flex gl-flex-col gl-items-center gl-justify-center"
>
<gl-loading-icon size="lg" class="gl-mb-3" />
Loading story...
</div>
<iframe
v-skip-one-trust
:src="url"
:class="iFrameClass"
class="responsive-iframe gl-min-w-full gl-border-none"
allow="clipboard-write"
:title="title"
@load="iFrameLoaded"
></iframe>
</div>
</template>