import { watch, toValue, type MaybeRefOrGetter } from 'vue'; import useDJSSRContext from "@/useDJSSRContext.ts"; import { h } from "@/util.ts"; export default function useHead(params: { title: MaybeRefOrGetter, metatags?: MaybeRefOrGetter> }) { const context = useDJSSRContext(); if (context) { context.head.title = params.title; context.head.metatags = params.metatags ?? []; } else { watch([() => toValue(params.title), () => toValue(params.metatags) ?? []], ([newTitle, newMetatags]) => { if (newTitle) { document.title = newTitle; } const currMetatags = document.head.querySelectorAll('meta'); const existing = new Set(); for (const currMetatag of currMetatags) { const match = newMetatags.find(_ => _.name === currMetatag.name); if (!match) { currMetatag.remove(); } else { existing.add(match.name); currMetatag.content = match.content; } } for (const newMetatag of newMetatags) { if (!existing.has(newMetatag.name)) { document.head.appendChild(h('meta', newMetatag)); } } }, { immediate: true }); } }