CustomSidebar.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import React, { FC } from 'react';
  2. import AppContainer from '~/client/services/AppContainer';
  3. import loggerFactory from '~/utils/logger';
  4. import { useSWRxPageByPath } from '~/stores/page';
  5. import { withUnstatedContainers } from '../UnstatedUtils';
  6. import RevisionRenderer from '../Page/RevisionRenderer';
  7. import { IRevision } from '~/interfaces/revision';
  8. const logger = loggerFactory('growi:cli:CustomSidebar');
  9. const SidebarNotFound = () => {
  10. return (
  11. <div className="grw-sidebar-content-header h5 text-center p-3">
  12. <a href="/Sidebar#edit">
  13. <i className="icon-magic-wand"></i> Create <strong>/Sidebar</strong> page
  14. </a>
  15. </div>
  16. );
  17. };
  18. type Props = {
  19. appContainer: AppContainer,
  20. };
  21. const CustomSidebar: FC<Props> = (props: Props) => {
  22. const { appContainer } = props;
  23. const renderer = appContainer.getRenderer('sidebar');
  24. const { data: page, mutate } = useSWRxPageByPath('/Sidebar');
  25. const isLoading = page === undefined;
  26. const markdown = (page?.revision as IRevision | undefined)?.body;
  27. return (
  28. <>
  29. <div className="grw-sidebar-content-header p-3 d-flex">
  30. <h3 className="mb-0">
  31. Custom Sidebar
  32. <a className="h6 ml-2" href="/Sidebar"><i className="icon-pencil"></i></a>
  33. </h3>
  34. <button type="button" className="btn btn-sm btn-outline-secondary ml-auto" onClick={() => mutate()}>
  35. <i className="icon icon-reload"></i>
  36. </button>
  37. </div>
  38. { !isLoading && markdown == null && <SidebarNotFound /> }
  39. {/* eslint-disable-next-line react/no-danger */}
  40. { markdown != null && (
  41. <div className="p-3">
  42. <RevisionRenderer
  43. growiRenderer={renderer}
  44. markdown={markdown}
  45. additionalClassName="grw-custom-sidebar-content"
  46. />
  47. </div>
  48. ) }
  49. </>
  50. );
  51. };
  52. /**
  53. * Wrapper component for using unstated
  54. */
  55. const CustomSidebarWrapper = withUnstatedContainers(CustomSidebar, [AppContainer]);
  56. export default CustomSidebarWrapper;