import { Key, SWRResponse } from 'swr'; import useSWRImmutable from 'swr/immutable'; import { ReactMarkdownOptionsGenerator, RendererOptions, generatePreviewOptions, generateCommentPreviewOptions, generateOthersOptions, generateViewOptions, generateTocOptions, } from '~/services/renderer/renderer'; import { useCurrentPageTocNode, useRendererConfig } from './context'; // The base hook with common processes const _useOptionsBase = ( rendererId: string, generator: ReactMarkdownOptionsGenerator, ): SWRResponse => { const { data: rendererConfig } = useRendererConfig(); const isAllDataValid = rendererConfig != null; const key = isAllDataValid ? [rendererId, rendererConfig] : null; const swrResult = useSWRImmutable(key); if (isAllDataValid && swrResult.data == null) { swrResult.mutate(generator(rendererConfig)); } // call useSWRImmutable again to foce to update cache return useSWRImmutable(key); }; export const useViewOptions = (): SWRResponse => { const key = 'viewOptions'; const { mutate: storeTocNode } = useCurrentPageTocNode(); return _useOptionsBase(key, config => generateViewOptions(config, storeTocNode)); }; export const useTocOptions = (): SWRResponse => { const key = 'tocOptions'; const { data: tocNode } = useCurrentPageTocNode(); return _useOptionsBase(key, config => generateTocOptions(config, tocNode)); }; export const usePreviewOptions = (): SWRResponse => { const key = 'previewOptions'; return _useOptionsBase(key, generatePreviewOptions); }; export const useCommentPreviewOptions = (): SWRResponse => { const key = 'commentPreviewOptions'; return _useOptionsBase(key, generateCommentPreviewOptions); }; export const useSearchResultOptions = (): SWRResponse => { const key = 'searchResultOptions'; return _useOptionsBase(key, generateOthersOptions); }; export const useTimelineOptions = (): SWRResponse => { const key = 'timelineOptions'; return _useOptionsBase(key, generateOthersOptions); }; export const useDraftOptions = (): SWRResponse => { const key = 'draftOptions'; return _useOptionsBase(key, generateOthersOptions); }; export const useCustomSidebarOptions = (): SWRResponse => { const key: Key = 'customSidebarOptions'; return _useOptionsBase(key, generateOthersOptions); };