Some checks failed
Axolotl desktop CI / guardrails (push) Has been cancelled
Axolotl desktop CI / desktop (macos-latest) (push) Has been cancelled
Axolotl desktop CI / desktop (ubuntu-latest) (push) Has been cancelled
Axolotl desktop CI / desktop (windows-latest) (push) Has been cancelled
Axolotl desktop CI / website (push) Has been cancelled
Repository checks / typos (push) Has been cancelled
Repository checks / tombi (push) Has been cancelled
Rust checks / shear (push) Has been cancelled
Sync source to CNB / Sync Git ref (push) Has been cancelled
60 lines
1.4 KiB
Vue
60 lines
1.4 KiB
Vue
<script setup lang="ts">
|
|
import { defineMessages, useVIntl } from '@modrinth/ui'
|
|
import { onMounted, onUnmounted, ref } from 'vue'
|
|
|
|
import {
|
|
receiveSkinSiteMessage,
|
|
resetSkinSiteSession,
|
|
setSkinSiteFrame,
|
|
SKIN_SITE_ORIGIN,
|
|
skinSiteFrameUrl,
|
|
} from '@/composables/skin-site-session'
|
|
|
|
const { formatMessage } = useVIntl()
|
|
const messages = defineMessages({
|
|
frameTitle: {
|
|
id: 'app.starlight-skin.frame-title',
|
|
defaultMessage: 'StarLight Skin Site',
|
|
},
|
|
})
|
|
|
|
const frame = ref<HTMLIFrameElement>()
|
|
let lastMessage = 0
|
|
let expiryTimer: ReturnType<typeof setInterval> | undefined
|
|
|
|
function connect() {
|
|
const contentWindow = frame.value?.contentWindow ?? null
|
|
setSkinSiteFrame(contentWindow)
|
|
contentWindow?.postMessage({ type: 'starlight-skin-session-connect' }, SKIN_SITE_ORIGIN)
|
|
}
|
|
|
|
function receive(event: MessageEvent) {
|
|
if (receiveSkinSiteMessage(event, frame.value?.contentWindow ?? null)) lastMessage = Date.now()
|
|
}
|
|
|
|
onMounted(() => {
|
|
window.addEventListener('message', receive)
|
|
connect()
|
|
expiryTimer = setInterval(() => {
|
|
if (lastMessage && Date.now() - lastMessage > 90_000) resetSkinSiteSession()
|
|
}, 10_000)
|
|
})
|
|
|
|
onUnmounted(() => {
|
|
window.removeEventListener('message', receive)
|
|
clearInterval(expiryTimer)
|
|
setSkinSiteFrame(null)
|
|
resetSkinSiteSession()
|
|
})
|
|
</script>
|
|
|
|
<template>
|
|
<iframe
|
|
ref="frame"
|
|
:src="skinSiteFrameUrl"
|
|
:title="formatMessage(messages.frameTitle)"
|
|
class="block h-full min-h-0 w-full border-0"
|
|
@load="connect"
|
|
/>
|
|
</template>
|