import type { FC } from 'react' import type { Theme } from '../theme/theme-context' import { cn } from '@langgenius/dify-ui/cn' import { Tooltip, TooltipContent, TooltipTrigger } from '@langgenius/dify-ui/tooltip' import { useSuspenseQuery } from '@tanstack/react-query' import * as React from 'react' import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import ActionButton from '@/app/components/base/action-button' import ViewFormDropdown from '@/app/components/base/chat/embedded-chatbot/inputs-form/view-form-dropdown' import Divider from '@/app/components/base/divider' import DifyLogo from '@/app/components/base/logo/dify-logo' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { isClient } from '@/utils/client' import { useEmbeddedChatbotContext } from '../context' import { CssTransform } from '../theme/utils' type IHeaderProps = { isMobile?: boolean allowResetChat?: boolean customerIcon?: React.ReactNode title: string theme?: Theme onCreateNewChat?: () => void } const Header: FC = ({ isMobile, allowResetChat, customerIcon, title, theme, onCreateNewChat, }) => { const { t } = useTranslation() const { appData, currentConversationId, inputsForms, allInputsHidden } = useEmbeddedChatbotContext() const isIframe = isClient ? window.self !== window.top : false const [parentOrigin, setParentOrigin] = useState('') const [showToggleExpandButton, setShowToggleExpandButton] = useState(false) const [expanded, setExpanded] = useState(false) const { data: systemFeatures } = useSuspenseQuery(systemFeaturesQueryOptions()) const handleMessageReceived = useCallback( (event: MessageEvent) => { let currentParentOrigin = parentOrigin if (!currentParentOrigin && event.data.type === 'dify-chatbot-config') { currentParentOrigin = event.origin setParentOrigin(event.origin) } if (event.origin !== currentParentOrigin) return if (event.data.type === 'dify-chatbot-config') setShowToggleExpandButton( event.data.payload.isToggledByButton && !event.data.payload.isDraggable, ) }, [parentOrigin], ) useEffect(() => { if (!isIframe) return const listener = (event: MessageEvent) => handleMessageReceived(event) window.addEventListener('message', listener) // Security: Use document.referrer to get parent origin const targetOrigin = document.referrer ? new URL(document.referrer).origin : '*' window.parent.postMessage({ type: 'dify-chatbot-iframe-ready' }, targetOrigin) return () => window.removeEventListener('message', listener) }, [isIframe, handleMessageReceived]) const handleToggleExpand = useCallback(() => { if (!isIframe || !showToggleExpandButton) return setExpanded(!expanded) window.parent.postMessage( { type: 'dify-chatbot-expand-change', }, parentOrigin, ) }, [isIframe, parentOrigin, showToggleExpandButton, expanded]) if (!isMobile) { return (
{/* powered by */}
{!appData?.custom_config?.remove_webapp_brand && (
{t(($) => $['chat.poweredBy'], { ns: 'share' })}
{systemFeatures.branding.enabled && systemFeatures.branding.workspace_logo ? ( logo ) : appData?.custom_config?.replace_webapp_logo ? ( logo ) : ( )}
)}
{currentConversationId && } {showToggleExpandButton && ( $['chat.collapse'], { ns: 'share' }) : t(($) => $['chat.expand'], { ns: 'share' }) } onClick={handleToggleExpand} > {expanded ? (