'use client' import type { Placement } from '@langgenius/dify-ui/dropdown-menu' import type { FC } from 'react' import type { SiteInfo } from '@/models/share' import { cn } from '@langgenius/dify-ui/cn' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLinkItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@langgenius/dify-ui/dropdown-menu' 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 ThemeSwitcher from '@/app/components/base/theme-switcher' import { useWebAppStore } from '@/context/web-app-context' import { AccessMode } from '@/models/access-control' import { usePathname, useRouter } from '@/next/navigation' import { webAppLogout } from '@/service/webapp-auth' import InfoModal from './info-modal' type Props = { data?: SiteInfo placement?: Placement hideLogout?: boolean forceClose?: boolean } const MenuDropdown: FC = ({ data, placement, hideLogout, forceClose, }) => { const webAppAccessMode = useWebAppStore(s => s.webAppAccessMode) const router = useRouter() const pathname = usePathname() const { t } = useTranslation() const [open, setOpen] = useState(false) const shareCode = useWebAppStore(s => s.shareCode) const handleLogout = useCallback(async () => { setOpen(false) await webAppLogout(shareCode!) router.replace(`/webapp-signin?redirect_url=${pathname}`) }, [pathname, router, setOpen, shareCode]) const [show, setShow] = useState(false) const handleOpenInfoModal = useCallback(() => { setOpen(false) queueMicrotask(() => { setShow(true) }) }, []) useEffect(() => { if (forceClose) setOpen(false) }, [forceClose, setOpen]) return ( <> } aria-label={t('operation.more', { ns: 'common' })} >
{t('theme.theme', { ns: 'common' })}
{data?.privacy_policy && ( {t('chat.privacyPolicyMiddle', { ns: 'share' })} )} {t('userProfile.about', { ns: 'common' })} {!(hideLogout || webAppAccessMode === AccessMode.EXTERNAL_MEMBERS || webAppAccessMode === AccessMode.PUBLIC) && ( {t('userProfile.logout', { ns: 'common' })} )}
{show && ( { setShow(false) }} data={data} /> )} ) } export default React.memo(MenuDropdown)