OpenDefaultAiAssistantButton.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import React, { type JSX, useCallback, useMemo } from 'react';
  2. import { useAtomValue } from 'jotai';
  3. import { useTranslation } from 'react-i18next';
  4. import { NotAvailable } from '~/client/components/NotAvailable';
  5. import { NotAvailableForGuest } from '~/client/components/NotAvailableForGuest';
  6. import { useGrowiAppIdForGrowiCloud, useGrowiCloudUri } from '~/states/global';
  7. import { aiEnabledAtom } from '~/states/server-configurations';
  8. import { useAiAssistantSidebarActions } from '../../states';
  9. import { useSWRxAiAssistants } from '../../stores/ai-assistant';
  10. import styles from './OpenDefaultAiAssistantButton.module.scss';
  11. const AiAssistantButton = ({
  12. onClick,
  13. }: {
  14. onClick?: () => void;
  15. }): JSX.Element => (
  16. <button
  17. type="button"
  18. className={`btn btn-search ${styles['btn-open-default-ai-assistant']}`}
  19. onClick={onClick}
  20. >
  21. <span className="growi-custom-icons fs-4 align-middle lh-1">
  22. ai_assistant
  23. </span>
  24. </button>
  25. );
  26. const OpenDefaultAiAssistantButtonSubstance = (): JSX.Element => {
  27. const { t } = useTranslation();
  28. const { data: aiAssistantData } = useSWRxAiAssistants();
  29. const { openChat } = useAiAssistantSidebarActions();
  30. const defaultAiAssistant = useMemo(() => {
  31. if (aiAssistantData == null) {
  32. return null;
  33. }
  34. const allAiAssistants = [
  35. ...aiAssistantData.myAiAssistants,
  36. ...aiAssistantData.teamAiAssistants,
  37. ];
  38. return allAiAssistants.find((aiAssistant) => aiAssistant.isDefault);
  39. }, [aiAssistantData]);
  40. const openDefaultAiAssistantButtonClickHandler = useCallback(() => {
  41. if (defaultAiAssistant == null) {
  42. return;
  43. }
  44. openChat(defaultAiAssistant);
  45. }, [defaultAiAssistant, openChat]);
  46. return (
  47. <NotAvailableForGuest>
  48. <NotAvailable
  49. isDisabled={defaultAiAssistant == null}
  50. title={t('default_ai_assistant.not_set')}
  51. >
  52. <AiAssistantButton onClick={openDefaultAiAssistantButtonClickHandler} />
  53. </NotAvailable>
  54. </NotAvailableForGuest>
  55. );
  56. };
  57. const OpenDefaultAiAssistantButton = (): JSX.Element => {
  58. const isAiEnabled = useAtomValue(aiEnabledAtom);
  59. const { t } = useTranslation();
  60. const growiCloudUri = useGrowiCloudUri();
  61. const growiAppIdForGrowiCloud = useGrowiAppIdForGrowiCloud();
  62. const isCloud = growiCloudUri != null && growiAppIdForGrowiCloud != null;
  63. if (!isAiEnabled) {
  64. if (!isCloud) return <></>;
  65. return (
  66. <NotAvailable
  67. isDisabled
  68. title={
  69. <>
  70. <p className="mb-2">
  71. {t('default_ai_assistant.open_cloud_settings_to_enable')}
  72. </p>
  73. <a href={`${growiCloudUri}/my/apps/${growiAppIdForGrowiCloud}`}>
  74. <span
  75. className="material-symbols-outlined me-1"
  76. style={{ fontSize: '1rem', verticalAlign: 'middle' }}
  77. >
  78. share
  79. </span>
  80. {t('default_ai_assistant.to_cloud_settings')}
  81. </a>
  82. </>
  83. }
  84. >
  85. <AiAssistantButton />
  86. </NotAvailable>
  87. );
  88. }
  89. return <OpenDefaultAiAssistantButtonSubstance />;
  90. };
  91. export default OpenDefaultAiAssistantButton;