import React, { useEffect, memo } from "react"; import Template from "./Template"; import type { KcProps } from "./KcProps"; import type { KcContextBase } from "../getKcContext/KcContextBase"; import { useCssAndCx } from "tss-react"; import { Evt } from "evt"; import { useRerenderOnStateChange } from "evt/hooks"; import { assert } from "tsafe/assert"; import { fallbackLanguageTag } from "../i18n"; import type { I18n } from "../i18n"; import memoize from "memoizee"; import { useConst } from "powerhooks/useConst"; import { useConstCallback } from "powerhooks/useConstCallback"; export const evtTermMarkdown = Evt.create(undefined); export type KcContextLike = { pageId: KcContextBase["pageId"]; locale?: { currentLanguageTag: string; }; }; assert(); /** Allow to avoid bundling the terms and download it on demand*/ export function useDownloadTerms(params: { kcContext: KcContextLike; downloadTermMarkdown: (params: { currentLanguageTag: string }) => Promise; }) { const { kcContext } = params; const { downloadTermMarkdownMemoized } = (function useClosure() { const { downloadTermMarkdown } = params; const downloadTermMarkdownConst = useConstCallback(downloadTermMarkdown); const downloadTermMarkdownMemoized = useConst(() => memoize((currentLanguageTag: string) => downloadTermMarkdownConst({ currentLanguageTag }), { "promise": true }), ); return { downloadTermMarkdownMemoized }; })(); useEffect(() => { if (kcContext.pageId !== "terms.ftl") { return; } downloadTermMarkdownMemoized(kcContext.locale?.currentLanguageTag ?? fallbackLanguageTag).then( thermMarkdown => (evtTermMarkdown.state = thermMarkdown), ); }, []); } const Terms = memo(({ kcContext, i18n, ...props }: { kcContext: KcContextBase.Terms; i18n: I18n } & KcProps) => { const { msg, msgStr } = i18n; useRerenderOnStateChange(evtTermMarkdown); const { cx } = useCssAndCx(); const { url } = kcContext; if (evtTermMarkdown.state === undefined) { return null; } return (