import { useEffect } from 'react'; import { applyPageMeta, buildMachinePageMeta, type ApplyPageMetaOptions, type MachineMetaInput, type PageMeta, } from '../utils/meta'; export function usePageMeta( meta: PageMeta | null | undefined, options: ApplyPageMetaOptions = {}, ): void { const metaKey = safeStringify(meta); const optionsKey = safeStringify({ baseUrl: options.baseUrl, restoreOnCleanup: options.restoreOnCleanup, titleTemplate: options.titleTemplate, }); useEffect(() => { if (!meta) { return undefined; } return applyPageMeta(meta, options); // metaKey/optionsKey intentionally make object-literal calls stable without forcing callers // to memoise every page meta object. }, [meta, metaKey, options, options.document, optionsKey]); } export function useMachinePageMeta( machine: MachineMetaInput | null | undefined, options: ApplyPageMetaOptions & { pathPrefix?: string; siteName?: string } = {}, ): void { const machineKey = safeStringify(machine); const optionsKey = safeStringify({ baseUrl: options.baseUrl, pathPrefix: options.pathPrefix, restoreOnCleanup: options.restoreOnCleanup, siteName: options.siteName, titleTemplate: options.titleTemplate, }); useEffect(() => { if (!machine) { return undefined; } return applyPageMeta( buildMachinePageMeta(machine, { baseUrl: options.baseUrl, pathPrefix: options.pathPrefix, siteName: options.siteName, }), options, ); }, [machine, machineKey, options, options.document, optionsKey]); } function safeStringify(value: unknown): string { try { return JSON.stringify(value); } catch { return '[unserialisable]'; } }