'use client' import type { App } from '@/models/explore' import type { TryAppSelection } from '@/types/try-app' import { cn } from '@langgenius/dify-ui/cn' import * as React from 'react' import { useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useLearnDifyAppList } from '@/service/use-explore' import { useLearnDifyVisibleValue, useSetLearnDifyHidden } from './atoms' import LearnDifyItem from './item' type LearnDifyProps = { canCreate?: boolean className?: string dismissible?: boolean itemLimit?: number loadingFallback?: React.ReactNode onCreate?: (app: App) => void onTry?: (params: TryAppSelection) => void showDescription?: boolean title?: string } type LearnDifyContentProps = LearnDifyProps & { onHide?: () => void } const LearnDifyContent = ({ canCreate = false, className, itemLimit, loadingFallback = null, onHide, onCreate, onTry, showDescription = true, title, }: LearnDifyContentProps) => { const { t } = useTranslation() const [isClosing, setIsClosing] = useState(false) const [collapseTransform, setCollapseTransform] = useState() const hideTimerRef = useRef | null>(null) const sectionRef = useRef(null) const { data: learnDifyItems = [], isLoading } = useLearnDifyAppList() useEffect(() => { return () => { if (hideTimerRef.current) clearTimeout(hideTimerRef.current) } }, []) const handleHide = () => { const sectionRect = sectionRef.current?.getBoundingClientRect() const helpTargetRect = document.querySelector('[data-learn-dify-help-target]')?.getBoundingClientRect() if (sectionRect && helpTargetRect) { const sectionCenterX = sectionRect.left + sectionRect.width / 2 const sectionCenterY = sectionRect.top + sectionRect.height / 2 const helpCenterX = helpTargetRect.left + helpTargetRect.width / 2 const helpCenterY = helpTargetRect.top + helpTargetRect.height / 2 setCollapseTransform(`translate3d(${helpCenterX - sectionCenterX}px, ${helpCenterY - sectionCenterY}px, 0) scale(0.08)`) } else { setCollapseTransform('scale(0.08)') } setIsClosing(true) hideTimerRef.current = setTimeout(() => { onHide?.() setIsClosing(false) setCollapseTransform(undefined) }, 800) } const visibleItems = itemLimit ? learnDifyItems.slice(0, itemLimit) : learnDifyItems const sectionTitle = title ?? t('learnDify.title', { ns: 'explore' }) if (isLoading) return loadingFallback if (visibleItems.length === 0) return null return (

{sectionTitle}

{showDescription && (

{t('learnDify.description', { ns: 'explore' })}

)}
{onHide && ( )}
{visibleItems.map(item => ( ))}
) } const DismissibleLearnDify = (props: LearnDifyProps) => { const visible = useLearnDifyVisibleValue() const setHidden = useSetLearnDifyHidden() if (!visible) return null return setHidden(true)} /> } const LearnDify = (props: LearnDifyProps) => { if (props.dismissible === false) return return } export default React.memo(LearnDify)