Co-authored-by: zxhlyh <jasonapring2015@outlook.com>tags/1.4.2
| import Avatar from './avatar' | import Avatar from './avatar' | ||||
| import DifyLogo from '@/app/components/base/logo/dify-logo' | import DifyLogo from '@/app/components/base/logo/dify-logo' | ||||
| import { useCallback } from 'react' | import { useCallback } from 'react' | ||||
| import { useGlobalPublicStore } from '@/context/global-public-context' | |||||
| const Header = () => { | const Header = () => { | ||||
| const { t } = useTranslation() | const { t } = useTranslation() | ||||
| const router = useRouter() | const router = useRouter() | ||||
| const systemFeatures = useGlobalPublicStore(s => s.systemFeatures) | |||||
| const back = useCallback(() => { | const back = useCallback(() => { | ||||
| router.back() | router.back() | ||||
| <div className='flex flex-1 items-center justify-between px-4'> | <div className='flex flex-1 items-center justify-between px-4'> | ||||
| <div className='flex items-center gap-3'> | <div className='flex items-center gap-3'> | ||||
| <div className='flex cursor-pointer items-center' onClick={back}> | <div className='flex cursor-pointer items-center' onClick={back}> | ||||
| <DifyLogo /> | |||||
| {systemFeatures.branding.enabled && systemFeatures.branding.login_page_logo | |||||
| ? <img | |||||
| src={systemFeatures.branding.login_page_logo} | |||||
| className='block h-[22px] w-auto object-contain' | |||||
| alt='Dify logo' | |||||
| /> | |||||
| : <DifyLogo />} | |||||
| </div> | </div> | ||||
| <div className='h-4 w-[1px] origin-center rotate-[11.31deg] bg-divider-regular' /> | <div className='h-4 w-[1px] origin-center rotate-[11.31deg] bg-divider-regular' /> | ||||
| <p className='title-3xl-semi-bold relative mt-[-2px] text-text-primary'>{t('common.account.account')}</p> | <p className='title-3xl-semi-bold relative mt-[-2px] text-text-primary'>{t('common.account.account')}</p> |
| 'flex shrink-0 items-center gap-1.5 px-1', | 'flex shrink-0 items-center gap-1.5 px-1', | ||||
| )}> | )}> | ||||
| <div className='system-2xs-medium-uppercase text-text-tertiary'>{t('share.chat.poweredBy')}</div> | <div className='system-2xs-medium-uppercase text-text-tertiary'>{t('share.chat.poweredBy')}</div> | ||||
| {systemFeatures.branding.enabled ? ( | |||||
| <img src={systemFeatures.branding.login_page_logo} alt='logo' className='block h-5 w-auto' /> | |||||
| ) : ( | |||||
| <DifyLogo size='small' />) | |||||
| { | |||||
| systemFeatures.branding.enabled && systemFeatures.branding.workspace_logo | |||||
| ? <img src={systemFeatures.branding.workspace_logo} alt='logo' className='block h-5 w-auto' /> | |||||
| : appData?.custom_config?.replace_webapp_logo | |||||
| ? <img src={`${appData?.custom_config?.replace_webapp_logo}`} alt='logo' className='block h-5 w-auto' /> | |||||
| : <DifyLogo size='small' /> | |||||
| } | } | ||||
| </div> | </div> | ||||
| )} | )} |
| import ViewFormDropdown from '@/app/components/base/chat/embedded-chatbot/inputs-form/view-form-dropdown' | import ViewFormDropdown from '@/app/components/base/chat/embedded-chatbot/inputs-form/view-form-dropdown' | ||||
| import DifyLogo from '@/app/components/base/logo/dify-logo' | import DifyLogo from '@/app/components/base/logo/dify-logo' | ||||
| import cn from '@/utils/classnames' | import cn from '@/utils/classnames' | ||||
| import { useGlobalPublicStore } from '@/context/global-public-context' | |||||
| export type IHeaderProps = { | export type IHeaderProps = { | ||||
| isMobile?: boolean | isMobile?: boolean | ||||
| const [parentOrigin, setParentOrigin] = useState('') | const [parentOrigin, setParentOrigin] = useState('') | ||||
| const [showToggleExpandButton, setShowToggleExpandButton] = useState(false) | const [showToggleExpandButton, setShowToggleExpandButton] = useState(false) | ||||
| const [expanded, setExpanded] = useState(false) | const [expanded, setExpanded] = useState(false) | ||||
| const systemFeatures = useGlobalPublicStore(s => s.systemFeatures) | |||||
| const handleMessageReceived = useCallback((event: MessageEvent) => { | const handleMessageReceived = useCallback((event: MessageEvent) => { | ||||
| let currentParentOrigin = parentOrigin | let currentParentOrigin = parentOrigin | ||||
| 'flex shrink-0 items-center gap-1.5 px-2', | 'flex shrink-0 items-center gap-1.5 px-2', | ||||
| )}> | )}> | ||||
| <div className='system-2xs-medium-uppercase text-text-tertiary'>{t('share.chat.poweredBy')}</div> | <div className='system-2xs-medium-uppercase text-text-tertiary'>{t('share.chat.poweredBy')}</div> | ||||
| {appData?.custom_config?.replace_webapp_logo && ( | |||||
| <img src={appData?.custom_config?.replace_webapp_logo} alt='logo' className='block h-5 w-auto' /> | |||||
| )} | |||||
| {!appData?.custom_config?.replace_webapp_logo && ( | |||||
| <DifyLogo size='small' /> | |||||
| )} | |||||
| { | |||||
| systemFeatures.branding.enabled && systemFeatures.branding.workspace_logo | |||||
| ? <img src={systemFeatures.branding.workspace_logo} alt='logo' className='block h-5 w-auto' /> | |||||
| : appData?.custom_config?.replace_webapp_logo | |||||
| ? <img src={`${appData?.custom_config?.replace_webapp_logo}`} alt='logo' className='block h-5 w-auto' /> | |||||
| : <DifyLogo size='small' /> | |||||
| } | |||||
| </div> | </div> | ||||
| )} | )} | ||||
| </div> | </div> |
| import DifyLogo from '@/app/components/base/logo/dify-logo' | import DifyLogo from '@/app/components/base/logo/dify-logo' | ||||
| import cn from '@/utils/classnames' | import cn from '@/utils/classnames' | ||||
| import useDocumentTitle from '@/hooks/use-document-title' | import useDocumentTitle from '@/hooks/use-document-title' | ||||
| import { useGlobalPublicStore } from '@/context/global-public-context' | |||||
| const Chatbot = () => { | const Chatbot = () => { | ||||
| const { | const { | ||||
| themeBuilder, | themeBuilder, | ||||
| } = useEmbeddedChatbotContext() | } = useEmbeddedChatbotContext() | ||||
| const { t } = useTranslation() | const { t } = useTranslation() | ||||
| const systemFeatures = useGlobalPublicStore(s => s.systemFeatures) | |||||
| const customConfig = appData?.custom_config | const customConfig = appData?.custom_config | ||||
| const site = appData?.site | const site = appData?.site | ||||
| 'flex shrink-0 items-center gap-1.5 px-2', | 'flex shrink-0 items-center gap-1.5 px-2', | ||||
| )}> | )}> | ||||
| <div className='system-2xs-medium-uppercase text-text-tertiary'>{t('share.chat.poweredBy')}</div> | <div className='system-2xs-medium-uppercase text-text-tertiary'>{t('share.chat.poweredBy')}</div> | ||||
| {appData?.custom_config?.replace_webapp_logo && ( | |||||
| <img src={appData?.custom_config?.replace_webapp_logo} alt='logo' className='block h-5 w-auto' /> | |||||
| )} | |||||
| {!appData?.custom_config?.replace_webapp_logo && ( | |||||
| <DifyLogo size='small' /> | |||||
| )} | |||||
| { | |||||
| systemFeatures.branding.enabled && systemFeatures.branding.workspace_logo | |||||
| ? <img src={systemFeatures.branding.workspace_logo} alt='logo' className='block h-5 w-auto' /> | |||||
| : appData?.custom_config?.replace_webapp_logo | |||||
| ? <img src={`${appData?.custom_config?.replace_webapp_logo}`} alt='logo' className='block h-5 w-auto' /> | |||||
| : <DifyLogo size='small' /> | |||||
| } | |||||
| </div> | </div> | ||||
| )} | )} | ||||
| </div> | </div> |
| import classNames from '@/utils/classnames' | import classNames from '@/utils/classnames' | ||||
| import useTheme from '@/hooks/use-theme' | import useTheme from '@/hooks/use-theme' | ||||
| import { basePath } from '@/utils/var' | import { basePath } from '@/utils/var' | ||||
| import { useGlobalPublicStore } from '@/context/global-public-context' | |||||
| export type LogoStyle = 'default' | 'monochromeWhite' | export type LogoStyle = 'default' | 'monochromeWhite' | ||||
| export const logoPathMap: Record<LogoStyle, string> = { | export const logoPathMap: Record<LogoStyle, string> = { | ||||
| }) => { | }) => { | ||||
| const { theme } = useTheme() | const { theme } = useTheme() | ||||
| const themedStyle = (theme === 'dark' && style === 'default') ? 'monochromeWhite' : style | const themedStyle = (theme === 'dark' && style === 'default') ? 'monochromeWhite' : style | ||||
| const { systemFeatures } = useGlobalPublicStore() | |||||
| const hasBrandingLogo = Boolean(systemFeatures.branding.enabled && systemFeatures.branding.workspace_logo) | |||||
| let src = `${basePath}${logoPathMap[themedStyle]}` | |||||
| if (hasBrandingLogo) | |||||
| src = systemFeatures.branding.workspace_logo | |||||
| return ( | return ( | ||||
| <img | <img | ||||
| src={src} | |||||
| className={classNames('block object-contain', logoSizeMap[size], hasBrandingLogo && 'w-auto', className)} | |||||
| alt={hasBrandingLogo ? 'Logo' : 'Dify logo'} | |||||
| src={`${basePath}${logoPathMap[themedStyle]}`} | |||||
| className={classNames('block object-contain', logoSizeMap[size], className)} | |||||
| alt='Dify logo' | |||||
| /> | /> | ||||
| ) | ) | ||||
| } | } |
| } from '@/service/common' | } from '@/service/common' | ||||
| import { useAppContext } from '@/context/app-context' | import { useAppContext } from '@/context/app-context' | ||||
| import cn from '@/utils/classnames' | import cn from '@/utils/classnames' | ||||
| import { useGlobalPublicStore } from '@/context/global-public-context' | |||||
| const ALLOW_FILE_EXTENSIONS = ['svg', 'png'] | const ALLOW_FILE_EXTENSIONS = ['svg', 'png'] | ||||
| const [fileId, setFileId] = useState('') | const [fileId, setFileId] = useState('') | ||||
| const [imgKey, setImgKey] = useState(Date.now()) | const [imgKey, setImgKey] = useState(Date.now()) | ||||
| const [uploadProgress, setUploadProgress] = useState(0) | const [uploadProgress, setUploadProgress] = useState(0) | ||||
| const systemFeatures = useGlobalPublicStore(s => s.systemFeatures) | |||||
| const isSandbox = enableBilling && plan.type === Plan.sandbox | const isSandbox = enableBilling && plan.type === Plan.sandbox | ||||
| const uploading = uploadProgress > 0 && uploadProgress < 100 | const uploading = uploadProgress > 0 && uploadProgress < 100 | ||||
| const webappLogo = currentWorkspace.custom_config?.replace_webapp_logo || '' | const webappLogo = currentWorkspace.custom_config?.replace_webapp_logo || '' | ||||
| {!webappBrandRemoved && ( | {!webappBrandRemoved && ( | ||||
| <> | <> | ||||
| <div className='system-2xs-medium-uppercase text-text-tertiary'>POWERED BY</div> | <div className='system-2xs-medium-uppercase text-text-tertiary'>POWERED BY</div> | ||||
| {webappLogo | |||||
| ? <img src={`${webappLogo}?hash=${imgKey}`} alt='logo' className='block h-5 w-auto' /> | |||||
| : <DifyLogo size='small' /> | |||||
| { | |||||
| systemFeatures.branding.enabled && systemFeatures.branding.workspace_logo | |||||
| ? <img src={systemFeatures.branding.workspace_logo} alt='logo' className='block h-5 w-auto' /> | |||||
| : webappLogo | |||||
| ? <img src={`${webappLogo}?hash=${imgKey}`} alt='logo' className='block h-5 w-auto' /> | |||||
| : <DifyLogo size='small' /> | |||||
| } | } | ||||
| </> | </> | ||||
| )} | )} | ||||
| {!webappBrandRemoved && ( | {!webappBrandRemoved && ( | ||||
| <> | <> | ||||
| <div className='system-2xs-medium-uppercase text-text-tertiary'>POWERED BY</div> | <div className='system-2xs-medium-uppercase text-text-tertiary'>POWERED BY</div> | ||||
| {webappLogo | |||||
| ? <img src={`${webappLogo}?hash=${imgKey}`} alt='logo' className='block h-5 w-auto' /> | |||||
| : <DifyLogo size='small' /> | |||||
| { | |||||
| systemFeatures.branding.enabled && systemFeatures.branding.workspace_logo | |||||
| ? <img src={systemFeatures.branding.workspace_logo} alt='logo' className='block h-5 w-auto' /> | |||||
| : webappLogo | |||||
| ? <img src={`${webappLogo}?hash=${imgKey}`} alt='logo' className='block h-5 w-auto' /> | |||||
| : <DifyLogo size='small' /> | |||||
| } | } | ||||
| </> | </> | ||||
| )} | )} |
| import { IS_CE_EDITION } from '@/config' | import { IS_CE_EDITION } from '@/config' | ||||
| import DifyLogo from '@/app/components/base/logo/dify-logo' | import DifyLogo from '@/app/components/base/logo/dify-logo' | ||||
| import { noop } from 'lodash-es' | import { noop } from 'lodash-es' | ||||
| import { useGlobalPublicStore } from '@/context/global-public-context' | |||||
| type IAccountSettingProps = { | type IAccountSettingProps = { | ||||
| langeniusVersionInfo: LangGeniusVersionResponse | langeniusVersionInfo: LangGeniusVersionResponse | ||||
| }: IAccountSettingProps) { | }: IAccountSettingProps) { | ||||
| const { t } = useTranslation() | const { t } = useTranslation() | ||||
| const isLatest = langeniusVersionInfo.current_version === langeniusVersionInfo.latest_version | const isLatest = langeniusVersionInfo.current_version === langeniusVersionInfo.latest_version | ||||
| const systemFeatures = useGlobalPublicStore(s => s.systemFeatures) | |||||
| return ( | return ( | ||||
| <Modal | <Modal | ||||
| <RiCloseLine className='h-4 w-4 text-text-tertiary' /> | <RiCloseLine className='h-4 w-4 text-text-tertiary' /> | ||||
| </div> | </div> | ||||
| <div className='flex flex-col items-center gap-4 py-8'> | <div className='flex flex-col items-center gap-4 py-8'> | ||||
| <DifyLogo size='large' className='mx-auto' /> | |||||
| {systemFeatures.branding.enabled && systemFeatures.branding.workspace_logo | |||||
| ? <img | |||||
| src={systemFeatures.branding.workspace_logo} | |||||
| className='block h-7 w-auto object-contain' | |||||
| alt='logo' | |||||
| /> | |||||
| : <DifyLogo size='large' className='mx-auto' />} | |||||
| <div className='text-center text-xs font-normal text-text-tertiary'>Version {langeniusVersionInfo?.current_version}</div> | <div className='text-center text-xs font-normal text-text-tertiary'>Version {langeniusVersionInfo?.current_version}</div> | ||||
| <div className='flex flex-col items-center gap-2 text-center text-xs font-normal text-text-secondary'> | <div className='flex flex-col items-center gap-2 text-center text-xs font-normal text-text-secondary'> | ||||
| <div>© {dayjs().year()} LangGenius, Inc., Contributors.</div> | <div>© {dayjs().year()} LangGenius, Inc., Contributors.</div> |
| import PlanBadge from './plan-badge' | import PlanBadge from './plan-badge' | ||||
| import LicenseNav from './license-env' | import LicenseNav from './license-env' | ||||
| import { Plan } from '../billing/type' | import { Plan } from '../billing/type' | ||||
| import { useGlobalPublicStore } from '@/context/global-public-context' | |||||
| const navClassName = ` | const navClassName = ` | ||||
| flex items-center relative mr-0 sm:mr-3 px-3 h-8 rounded-xl | flex items-center relative mr-0 sm:mr-3 px-3 h-8 rounded-xl | ||||
| const [isShowNavMenu, { toggle, setFalse: hideNavMenu }] = useBoolean(false) | const [isShowNavMenu, { toggle, setFalse: hideNavMenu }] = useBoolean(false) | ||||
| const { enableBilling, plan } = useProviderContext() | const { enableBilling, plan } = useProviderContext() | ||||
| const { setShowPricingModal, setShowAccountSettingModal } = useModalContext() | const { setShowPricingModal, setShowAccountSettingModal } = useModalContext() | ||||
| const systemFeatures = useGlobalPublicStore(s => s.systemFeatures) | |||||
| const isFreePlan = plan.type === Plan.sandbox | const isFreePlan = plan.type === Plan.sandbox | ||||
| const handlePlanClick = useCallback(() => { | const handlePlanClick = useCallback(() => { | ||||
| if (isFreePlan) | if (isFreePlan) | ||||
| !isMobile | !isMobile | ||||
| && <div className='flex shrink-0 items-center gap-1.5 self-stretch pl-3'> | && <div className='flex shrink-0 items-center gap-1.5 self-stretch pl-3'> | ||||
| <Link href="/apps" className='flex h-8 shrink-0 items-center justify-center gap-2 px-0.5'> | <Link href="/apps" className='flex h-8 shrink-0 items-center justify-center gap-2 px-0.5'> | ||||
| <DifyLogo /> | |||||
| {systemFeatures.branding.enabled && systemFeatures.branding.workspace_logo | |||||
| ? <img | |||||
| src={systemFeatures.branding.workspace_logo} | |||||
| className='block h-[22px] w-auto object-contain' | |||||
| alt='logo' | |||||
| /> | |||||
| : <DifyLogo />} | |||||
| </Link> | </Link> | ||||
| <div className='font-light text-divider-deep'>/</div> | <div className='font-light text-divider-deep'>/</div> | ||||
| <div className='flex items-center gap-0.5'> | <div className='flex items-center gap-0.5'> | ||||
| {isMobile && ( | {isMobile && ( | ||||
| <div className='flex'> | <div className='flex'> | ||||
| <Link href="/apps" className='mr-4 flex items-center'> | <Link href="/apps" className='mr-4 flex items-center'> | ||||
| <DifyLogo /> | |||||
| {systemFeatures.branding.enabled && systemFeatures.branding.workspace_logo | |||||
| ? <img | |||||
| src={systemFeatures.branding.workspace_logo} | |||||
| className='block h-[22px] w-auto object-contain' | |||||
| alt='logo' | |||||
| /> | |||||
| : <DifyLogo />} | |||||
| </Link> | </Link> | ||||
| <div className='font-light text-divider-deep'>/</div> | <div className='font-light text-divider-deep'>/</div> | ||||
| {enableBilling ? <PlanBadge allowHover sandboxAsUpgrade plan={plan.type} onClick={handlePlanClick} /> : <LicenseNav />} | {enableBilling ? <PlanBadge allowHover sandboxAsUpgrade plan={plan.type} onClick={handlePlanClick} /> : <LicenseNav />} |
| !isPC && resultExisted && 'rounded-b-2xl border-b-[0.5px] border-divider-regular', | !isPC && resultExisted && 'rounded-b-2xl border-b-[0.5px] border-divider-regular', | ||||
| )}> | )}> | ||||
| <div className='system-2xs-medium-uppercase text-text-tertiary'>{t('share.chat.poweredBy')}</div> | <div className='system-2xs-medium-uppercase text-text-tertiary'>{t('share.chat.poweredBy')}</div> | ||||
| {systemFeatures.branding.enabled ? ( | |||||
| <img src={systemFeatures.branding.login_page_logo} alt='logo' className='block h-5 w-auto' /> | |||||
| ) : ( | |||||
| <DifyLogo size='small' /> | |||||
| )} | |||||
| { | |||||
| systemFeatures.branding.enabled && systemFeatures.branding.workspace_logo | |||||
| ? <img src={systemFeatures.branding.workspace_logo} alt='logo' className='block h-5 w-auto' /> | |||||
| : customConfig?.replace_webapp_logo | |||||
| ? <img src={`${customConfig?.replace_webapp_logo}`} alt='logo' className='block h-5 w-auto' /> | |||||
| : <DifyLogo size='small' /> | |||||
| } | |||||
| </div> | </div> | ||||
| )} | )} | ||||
| </div> | </div> |
| import type { Locale } from '@/i18n' | import type { Locale } from '@/i18n' | ||||
| import I18n from '@/context/i18n' | import I18n from '@/context/i18n' | ||||
| import dynamic from 'next/dynamic' | import dynamic from 'next/dynamic' | ||||
| import { useGlobalPublicStore } from '@/context/global-public-context' | |||||
| // Avoid rendering the logo and theme selector on the server | // Avoid rendering the logo and theme selector on the server | ||||
| const DifyLogo = dynamic(() => import('@/app/components/base/logo/dify-logo'), { | const DifyLogo = dynamic(() => import('@/app/components/base/logo/dify-logo'), { | ||||
| const Header = () => { | const Header = () => { | ||||
| const { locale, setLocaleOnClient } = useContext(I18n) | const { locale, setLocaleOnClient } = useContext(I18n) | ||||
| const systemFeatures = useGlobalPublicStore(s => s.systemFeatures) | |||||
| return ( | return ( | ||||
| <div className='flex w-full items-center justify-between p-6'> | <div className='flex w-full items-center justify-between p-6'> | ||||
| <DifyLogo size='large' /> | |||||
| {systemFeatures.branding.enabled && systemFeatures.branding.login_page_logo | |||||
| ? <img | |||||
| src={systemFeatures.branding.login_page_logo} | |||||
| className='block h-7 w-auto object-contain' | |||||
| alt='logo' | |||||
| /> | |||||
| : <DifyLogo size='large' />} | |||||
| <div className='flex items-center gap-1'> | <div className='flex items-center gap-1'> | ||||
| <Select | <Select | ||||
| value={locale} | value={locale} |