renderer.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { Key, SWRResponse } from 'swr';
  2. import useSWRImmutable from 'swr/immutable';
  3. import {
  4. ReactMarkdownOptionsGenerator, RendererOptions,
  5. generatePreviewOptions, generateCommentPreviewOptions, generateOthersOptions,
  6. generateViewOptions, generateTocOptions,
  7. } from '~/services/renderer/renderer';
  8. import { useCurrentPageTocNode, useRendererConfig } from './context';
  9. // The base hook with common processes
  10. const _useOptionsBase = (
  11. rendererId: string, generator: ReactMarkdownOptionsGenerator,
  12. ): SWRResponse<RendererOptions, Error> => {
  13. const { data: rendererConfig } = useRendererConfig();
  14. const isAllDataValid = rendererConfig != null;
  15. const key = isAllDataValid
  16. ? [rendererId, rendererConfig]
  17. : null;
  18. const swrResult = useSWRImmutable<RendererOptions, Error>(key);
  19. if (isAllDataValid && swrResult.data == null) {
  20. swrResult.mutate(generator(rendererConfig));
  21. }
  22. // call useSWRImmutable again to foce to update cache
  23. return useSWRImmutable<RendererOptions, Error>(key);
  24. };
  25. export const useViewOptions = (): SWRResponse<RendererOptions, Error> => {
  26. const key = 'viewOptions';
  27. const { mutate: storeTocNode } = useCurrentPageTocNode();
  28. return _useOptionsBase(key, config => generateViewOptions(config, storeTocNode));
  29. };
  30. export const useTocOptions = (): SWRResponse<RendererOptions, Error> => {
  31. const key = 'tocOptions';
  32. const { data: tocNode } = useCurrentPageTocNode();
  33. return _useOptionsBase(key, config => generateTocOptions(config, tocNode));
  34. };
  35. export const usePreviewOptions = (): SWRResponse<RendererOptions, Error> => {
  36. const key = 'previewOptions';
  37. return _useOptionsBase(key, generatePreviewOptions);
  38. };
  39. export const useCommentPreviewOptions = (): SWRResponse<RendererOptions, Error> => {
  40. const key = 'commentPreviewOptions';
  41. return _useOptionsBase(key, generateCommentPreviewOptions);
  42. };
  43. export const useSearchResultOptions = (): SWRResponse<RendererOptions, Error> => {
  44. const key = 'searchResultOptions';
  45. return _useOptionsBase(key, generateOthersOptions);
  46. };
  47. export const useTimelineOptions = (): SWRResponse<RendererOptions, Error> => {
  48. const key = 'timelineOptions';
  49. return _useOptionsBase(key, generateOthersOptions);
  50. };
  51. export const useDraftOptions = (): SWRResponse<RendererOptions, Error> => {
  52. const key = 'draftOptions';
  53. return _useOptionsBase(key, generateOthersOptions);
  54. };
  55. export const useCustomSidebarOptions = (): SWRResponse<RendererOptions, Error> => {
  56. const key: Key = 'customSidebarOptions';
  57. return _useOptionsBase(key, generateOthersOptions);
  58. };