_document.page.tsx 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import React from 'react';
  2. import Document, {
  3. DocumentContext, DocumentInitialProps,
  4. Html, Head, Main, NextScript,
  5. } from 'next/document';
  6. import { ActivatePluginService, GrowiPluginManifestEntries } from '~/client/services/activate-plugin';
  7. import { GrowiPlugin, GrowiPluginResourceType } from '~/interfaces/plugin';
  8. // FIXME: dummy data
  9. // ------------------
  10. const growiPluginsExample: GrowiPlugin[] = [
  11. {
  12. isEnabled: true,
  13. installedPath: 'weseek/growi-plugin-copy-code-to-clipboard',
  14. origin: {
  15. url: 'https://github.com/weseek/growi-plugin-copy-code-to-clipboard',
  16. },
  17. meta: {
  18. name: 'weseek/growi-plugin-copy-code-to-clipboard',
  19. types: [GrowiPluginResourceType.Script],
  20. },
  21. },
  22. ];
  23. // ------------------
  24. type HeadersForGrowiPluginProps = {
  25. pluginManifestEntries: GrowiPluginManifestEntries;
  26. }
  27. const HeadersForGrowiPlugin = (props: HeadersForGrowiPluginProps): JSX.Element => {
  28. const { pluginManifestEntries } = props;
  29. return (
  30. <>
  31. { pluginManifestEntries.map(([growiPlugin, manifest]) => {
  32. // type: script
  33. if (growiPlugin.meta.types.includes(GrowiPluginResourceType.Script)) {
  34. return (
  35. <>
  36. <link rel="stylesheet" key={`link_${growiPlugin.installedPath}`}
  37. href={`/plugins/${growiPlugin.installedPath}/dist/${manifest['client-entry.tsx'].css}`} />
  38. {/* eslint-disable-next-line @next/next/no-sync-scripts */ }
  39. <script type="module" key={`script_${growiPlugin.installedPath}`}
  40. src={`/plugins/${growiPlugin.installedPath}/dist/${manifest['client-entry.tsx'].file}`} />
  41. </>
  42. );
  43. }
  44. return <></>;
  45. }) }
  46. </>
  47. );
  48. };
  49. interface GrowiDocumentProps {
  50. pluginManifestEntries: GrowiPluginManifestEntries;
  51. }
  52. declare type GrowiDocumentInitialProps = DocumentInitialProps & GrowiDocumentProps;
  53. class GrowiDocument extends Document<GrowiDocumentProps> {
  54. static override async getInitialProps(ctx: DocumentContext): Promise<GrowiDocumentInitialProps> {
  55. const initialProps: DocumentInitialProps = await Document.getInitialProps(ctx);
  56. // TODO: load GrowiPlugin documents from DB
  57. // const pluginManifestEntries: GrowiPluginManifestEntries = await ActivatePluginService.retrievePluginManifests(growiPluginsExample);
  58. const pluginManifestEntries: GrowiPluginManifestEntries = await ActivatePluginService.retrievePluginManifests([]);
  59. return { ...initialProps, pluginManifestEntries };
  60. }
  61. override render(): JSX.Element {
  62. const { pluginManifestEntries } = this.props;
  63. return (
  64. <Html>
  65. <Head>
  66. {/*
  67. {renderScriptTagsByGroup('basis')}
  68. {renderStyleTagsByGroup('basis')}
  69. */}
  70. <HeadersForGrowiPlugin pluginManifestEntries={pluginManifestEntries} />
  71. </Head>
  72. <body>
  73. <Main />
  74. <NextScript />
  75. </body>
  76. </Html>
  77. );
  78. }
  79. }
  80. export default GrowiDocument;