<template>
<div class="flinks-container">
<div v-if="loading" class="loading-spinner">
Loading Flinks...
</div>
<div v-show="!loading" ref="flinksContainer"></div>
</div>
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue'
const flinksContainer = ref(null)
const loading = ref(true)
let iframe = null
const props = defineProps({
leadId: { type: [String, Number], required: true },
tenantId: { type: String, required: true },
redirectUrl: { type: String, required: true },
language: { type: String, default: 'en' }
})
const handleFlinksMessage = (event) => {
if (event.data.step === 'APP_MOUNTED') {
loading.value = false
}
}
const generateIframeUrl = () => {
const tag = JSON.stringify({
tenantId: props.tenantId,
leadId: props.leadId.toString()
})
const params = new URLSearchParams({
redirectUrl: encodeURIComponent(props.redirectUrl),
tag: encodeURIComponent(tag),
theme: 'light',
desktopLayout: 'true',
features: 'TransactionHistory,AccountNumberandAccountInfo',
backgroundColor: 'ffffff',
institutionFilterEnable: 'true',
headerEnable: 'false',
language: props.language,
accountSelectorEnable: 'true',
showAllAccounts: 'true'
})
return `https://saas-iframe.private.fin.ag/v2/?${params.toString()}`
}
const createIframe = () => {
iframe = document.createElement('iframe')
iframe.width = '100%'
iframe.height = '570'
iframe.src = generateIframeUrl()
if (flinksContainer.value) {
flinksContainer.value.appendChild(iframe)
}
}
onMounted(() => {
window.addEventListener('message', handleFlinksMessage)
createIframe()
})
onBeforeUnmount(() => {
window.removeEventListener('message', handleFlinksMessage)
if (iframe) {
iframe.remove()
}
})
</script>