import React, { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import copy from 'copy-to-clipboard' import style from './style.module.css' import cn from '@/utils/classnames' import Modal from '@/app/components/base/modal' import copyStyle from '@/app/components/base/copy-btn/style.module.css' import Tooltip from '@/app/components/base/tooltip' import { useAppContext } from '@/context/app-context' import { IS_CE_EDITION } from '@/config' import type { SiteInfo } from '@/models/share' import { useThemeContext } from '@/app/components/base/chat/embedded-chatbot/theme/theme-context' type Props = { siteInfo?: SiteInfo isShow: boolean onClose: () => void accessToken: string appBaseUrl: string className?: string } const OPTION_MAP = { iframe: { getContent: (url: string, token: string) => ` `, }, scripts: { getContent: (url: string, token: string, primaryColor: string, isTestEnv?: boolean) => ` `, }, chromePlugin: { getContent: (url: string, token: string) => `ChatBot URL: ${url}/chatbot/${token}`, }, } const prefixEmbedded = 'appOverview.overview.appInfo.embedded' type Option = keyof typeof OPTION_MAP type OptionStatus = { iframe: boolean scripts: boolean chromePlugin: boolean } const Embedded = ({ siteInfo, isShow, onClose, appBaseUrl, accessToken, className }: Props) => { const { t } = useTranslation() const [option, setOption] = useState('iframe') const [isCopied, setIsCopied] = useState({ iframe: false, scripts: false, chromePlugin: false }) const { langeniusVersionInfo } = useAppContext() const themeBuilder = useThemeContext() themeBuilder.buildTheme(siteInfo?.chat_color_theme ?? null, siteInfo?.chat_color_theme_inverted ?? false) const isTestEnv = langeniusVersionInfo.current_env === 'TESTING' || langeniusVersionInfo.current_env === 'DEVELOPMENT' const onClickCopy = () => { if (option === 'chromePlugin') { const splitUrl = OPTION_MAP[option].getContent(appBaseUrl, accessToken).split(': ') if (splitUrl.length > 1) copy(splitUrl[1]) } else { copy(OPTION_MAP[option].getContent(appBaseUrl, accessToken, themeBuilder.theme?.primaryColor ?? '#1C64F2', isTestEnv)) } setIsCopied({ ...isCopied, [option]: true }) } // when toggle option, reset then copy status const resetCopyStatus = () => { const cache = { ...isCopied } Object.keys(cache).forEach((key) => { cache[key as keyof OptionStatus] = false }) setIsCopied(cache) } const navigateToChromeUrl = () => { window.open('https://chrome.google.com/webstore/detail/dify-chatbot/ceehdapohffmjmkdcifjofadiaoeggaf', '_blank') } useEffect(() => { resetCopyStatus() }, [isShow]) return ( {t(`${prefixEmbedded}.explanation`)} {Object.keys(OPTION_MAP).map((v, index) => { return ( { setOption(v as Option) resetCopyStatus() }} > ) })} {option === 'chromePlugin' && ( {t(`${prefixEmbedded}.chromePlugin`)} )} {t(`${prefixEmbedded}.${option}`)} {OPTION_MAP[option].getContent(appBaseUrl, accessToken, themeBuilder.theme?.primaryColor ?? '#1C64F2', isTestEnv)} ) } export default Embedded
{OPTION_MAP[option].getContent(appBaseUrl, accessToken, themeBuilder.theme?.primaryColor ?? '#1C64F2', isTestEnv)}