From a27c28c24f6a42a8661c5cd41a8e7fbbd0453149 Mon Sep 17 00:00:00 2001 From: garronej Date: Mon, 1 Aug 2022 00:29:58 +0200 Subject: [PATCH] Avoid downloading the Terms Markdown twice in safe mode --- src/lib/components/Terms.tsx | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/lib/components/Terms.tsx b/src/lib/components/Terms.tsx index 7f057a93..25c2ab75 100644 --- a/src/lib/components/Terms.tsx +++ b/src/lib/components/Terms.tsx @@ -8,6 +8,9 @@ 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); @@ -24,24 +27,24 @@ export function useDownloadTerms(params: { kcContext: KcContextLike; downloadTermMarkdown: (params: { currentLanguageTag: string }) => Promise; }) { - const { kcContext, downloadTermMarkdown } = params; + 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(() => { - let isMounted = true; - - downloadTermMarkdown({ - "currentLanguageTag": kcContext.locale?.currentLanguageTag ?? fallbackLanguageTag, - }).then(thermMarkdown => { - if (!isMounted) { - return; - } - - evtTermMarkdown.state = thermMarkdown; - }); - - return () => { - isMounted = false; - }; + downloadTermMarkdownMemoized(kcContext.locale?.currentLanguageTag ?? fallbackLanguageTag).then( + thermMarkdown => (evtTermMarkdown.state = thermMarkdown), + ); }, []); }