| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- import { useCallback } from 'react';
- import type { HtmlElementNode } from 'rehype-toc';
- import useSWR, { type SWRResponse } from 'swr';
- import {
- type RendererOptions,
- generateSimpleViewOptions, generatePreviewOptions,
- generateViewOptions, generateTocOptions, generatePresentationViewOptions,
- } from '~/services/renderer/renderer';
- import { getGrowiFacade } from '~/utils/growi-facade';
- import {
- useRendererConfig,
- } from './context';
- import { useCurrentPagePath } from './page';
- import { useCurrentPageTocNode } from './ui';
- export const useViewOptions = (): SWRResponse<RendererOptions, Error> => {
- const { data: currentPagePath } = useCurrentPagePath();
- const { data: rendererConfig } = useRendererConfig();
- const { mutate: mutateCurrentPageTocNode } = useCurrentPageTocNode();
- const storeTocNodeHandler = useCallback((toc: HtmlElementNode) => {
- mutateCurrentPageTocNode(toc, { revalidate: false });
- }, [mutateCurrentPageTocNode]);
- const isAllDataValid = currentPagePath != null && rendererConfig != null;
- return useSWR(
- isAllDataValid
- ? ['viewOptions', currentPagePath, rendererConfig]
- : null,
- ([, currentPagePath, rendererConfig]) => {
- // determine options generator
- const optionsGenerator = getGrowiFacade().markdownRenderer?.optionsGenerators?.customGenerateViewOptions ?? generateViewOptions;
- return optionsGenerator(currentPagePath, rendererConfig, storeTocNodeHandler);
- },
- {
- keepPreviousData: true,
- fallbackData: isAllDataValid ? generateViewOptions(currentPagePath, rendererConfig, storeTocNodeHandler) : undefined,
- revalidateOnFocus: false,
- revalidateOnReconnect: false,
- },
- );
- };
- export const useTocOptions = (): SWRResponse<RendererOptions, Error> => {
- const { data: currentPagePath } = useCurrentPagePath();
- const { data: rendererConfig } = useRendererConfig();
- const { data: tocNode } = useCurrentPageTocNode();
- const isAllDataValid = currentPagePath != null && rendererConfig != null && tocNode != null;
- return useSWR(
- isAllDataValid
- ? ['tocOptions', currentPagePath, tocNode, rendererConfig]
- : null,
- ([, , tocNode, rendererConfig]) => generateTocOptions(rendererConfig, tocNode),
- {
- keepPreviousData: true,
- fallbackData: isAllDataValid ? generateTocOptions(rendererConfig, tocNode) : undefined,
- revalidateOnFocus: false,
- revalidateOnReconnect: false,
- },
- );
- };
- export const usePreviewOptions = (): SWRResponse<RendererOptions, Error> => {
- const { data: currentPagePath } = useCurrentPagePath();
- const { data: rendererConfig } = useRendererConfig();
- const isAllDataValid = currentPagePath != null && rendererConfig != null;
- return useSWR(
- isAllDataValid
- ? ['previewOptions', rendererConfig, currentPagePath]
- : null,
- ([, rendererConfig, pagePath]) => {
- // determine options generator
- const optionsGenerator = getGrowiFacade().markdownRenderer?.optionsGenerators?.customGeneratePreviewOptions ?? generatePreviewOptions;
- return optionsGenerator(rendererConfig, pagePath);
- },
- {
- keepPreviousData: true,
- fallbackData: isAllDataValid ? generatePreviewOptions(rendererConfig, currentPagePath) : undefined,
- revalidateOnFocus: false,
- revalidateOnReconnect: false,
- },
- );
- };
- export const useCommentForCurrentPageOptions = (): SWRResponse<RendererOptions, Error> => {
- const { data: currentPagePath } = useCurrentPagePath();
- const { data: rendererConfig } = useRendererConfig();
- const isAllDataValid = currentPagePath != null && rendererConfig != null;
- return useSWR(
- isAllDataValid
- ? ['commentPreviewOptions', rendererConfig, currentPagePath]
- : null,
- ([, rendererConfig, currentPagePath]) => generateSimpleViewOptions(
- rendererConfig,
- currentPagePath,
- undefined,
- rendererConfig.isEnabledLinebreaksInComments,
- ),
- {
- keepPreviousData: true,
- fallbackData: isAllDataValid ? generateSimpleViewOptions(
- rendererConfig,
- currentPagePath,
- undefined,
- rendererConfig.isEnabledLinebreaksInComments,
- ) : undefined,
- revalidateOnFocus: false,
- revalidateOnReconnect: false,
- },
- );
- };
- export const useCommentPreviewOptions = useCommentForCurrentPageOptions;
- export const useSelectedPagePreviewOptions = (pagePath: string, highlightKeywords?: string | string[]): SWRResponse<RendererOptions, Error> => {
- const { data: rendererConfig } = useRendererConfig();
- const isAllDataValid = rendererConfig != null;
- return useSWR(
- isAllDataValid
- ? ['selectedPagePreviewOptions', rendererConfig, pagePath, highlightKeywords]
- : null,
- ([, rendererConfig, pagePath, highlightKeywords]) => generateSimpleViewOptions(rendererConfig, pagePath, highlightKeywords),
- {
- fallbackData: isAllDataValid ? generateSimpleViewOptions(rendererConfig, pagePath, highlightKeywords) : undefined,
- revalidateOnFocus: false,
- revalidateOnReconnect: false,
- },
- );
- };
- export const useSearchResultOptions = useSelectedPagePreviewOptions;
- export const useTimelineOptions = useSelectedPagePreviewOptions;
- export const useCustomSidebarOptions = (): SWRResponse<RendererOptions, Error> => {
- const { data: rendererConfig } = useRendererConfig();
- const isAllDataValid = rendererConfig != null;
- return useSWR(
- isAllDataValid
- ? ['customSidebarOptions', rendererConfig]
- : null,
- ([, rendererConfig]) => generateSimpleViewOptions(rendererConfig, '/'),
- {
- keepPreviousData: true,
- fallbackData: isAllDataValid ? generateSimpleViewOptions(rendererConfig, '/') : undefined,
- revalidateOnFocus: false,
- revalidateOnReconnect: false,
- },
- );
- };
- export const usePresentationViewOptions = (): SWRResponse<RendererOptions, Error> => {
- const { data: currentPagePath } = useCurrentPagePath();
- const { data: rendererConfig } = useRendererConfig();
- const isAllDataValid = currentPagePath != null && rendererConfig != null;
- return useSWR(
- isAllDataValid
- ? ['presentationViewOptions', currentPagePath, rendererConfig]
- : null,
- ([, currentPagePath, rendererConfig]) => generatePresentationViewOptions(rendererConfig, currentPagePath),
- {
- fallbackData: isAllDataValid ? generatePresentationViewOptions(rendererConfig, currentPagePath) : undefined,
- revalidateOnFocus: false,
- revalidateOnReconnect: false,
- },
- );
- };
|