SidebarContents.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import React, { memo, useMemo } from 'react';
  2. import { AiAssistant } from '~/features/openai/client/components/AiAssistant/Sidebar/AiAssistant';
  3. import { SidebarContentsType } from '~/interfaces/ui';
  4. import { useIsAiEnabled, useIsGuestUser } from '~/stores-universal/context';
  5. import { useCollapsedContentsOpened, useCurrentSidebarContents, useSidebarMode } from '~/stores/ui';
  6. import { Bookmarks } from './Bookmarks';
  7. import { CustomSidebar } from './Custom';
  8. import { InAppNotification } from './InAppNotification';
  9. import { PageTree } from './PageTree';
  10. import { RecentChanges } from './RecentChanges';
  11. import Tag from './Tag';
  12. import styles from './SidebarContents.module.scss';
  13. export const SidebarContents = memo(() => {
  14. const { isCollapsedMode } = useSidebarMode();
  15. const { data: isGuestUser } = useIsGuestUser();
  16. const { data: isAiEnabled } = useIsAiEnabled();
  17. const { data: isCollapsedContentsOpened } = useCollapsedContentsOpened();
  18. const { data: currentSidebarContents } = useCurrentSidebarContents();
  19. const Contents = useMemo(() => {
  20. switch (currentSidebarContents) {
  21. case SidebarContentsType.RECENT:
  22. return RecentChanges;
  23. case SidebarContentsType.CUSTOM:
  24. return CustomSidebar;
  25. case SidebarContentsType.TAG:
  26. return Tag;
  27. case SidebarContentsType.BOOKMARKS:
  28. return Bookmarks;
  29. case SidebarContentsType.NOTIFICATION:
  30. if (isGuestUser == null) return () => <></>; // wait for isGuestUser to be determined
  31. if (!isGuestUser) {
  32. return InAppNotification;
  33. }
  34. return PageTree;
  35. case SidebarContentsType.AI_ASSISTANT:
  36. if (isAiEnabled == null) return () => <></>; // wait for isAiEnabled to be determined
  37. if (isAiEnabled) {
  38. return AiAssistant;
  39. }
  40. return PageTree;
  41. default:
  42. return PageTree;
  43. }
  44. }, [currentSidebarContents, isAiEnabled, isGuestUser]);
  45. const isHidden = isCollapsedMode() && !isCollapsedContentsOpened;
  46. const classToHide = isHidden ? 'd-none' : '';
  47. return (
  48. <div className={`grw-sidebar-contents ${styles['grw-sidebar-contents']} ${classToHide}`} data-testid="grw-sidebar-contents">
  49. <Contents />
  50. </div>
  51. );
  52. });
  53. SidebarContents.displayName = 'SidebarContents';