'use client' import type { Placement } from '@floating-ui/react' import type { FC } from 'react' import type { SiteInfo } from '@/models/share' import { RiEqualizer2Line, } from '@remixicon/react' import { usePathname, useRouter } from 'next/navigation' import * as React from 'react' import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import ActionButton from '@/app/components/base/action-button' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger, } from '@/app/components/base/portal-to-follow-elem' import ThemeSwitcher from '@/app/components/base/theme-switcher' import { useWebAppStore } from '@/context/web-app-context' import { AccessMode } from '@/models/access-control' import { webAppLogout } from '@/service/webapp-auth' import { cn } from '@/utils/classnames' import Divider from '../../base/divider' 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, doSetOpen] = useState(false) const openRef = useRef(open) const setOpen = useCallback((v: boolean) => { doSetOpen(v) openRef.current = v }, [doSetOpen]) const handleTrigger = useCallback(() => { setOpen(!openRef.current) }, [setOpen]) const shareCode = useWebAppStore(s => s.shareCode) const handleLogout = useCallback(async () => { await webAppLogout(shareCode!) router.replace(`/webapp-signin?redirect_url=${pathname}`) }, [router, pathname, webAppLogout, shareCode]) const [show, setShow] = useState(false) useEffect(() => { if (forceClose) setOpen(false) }, [forceClose, setOpen]) return ( <>
{t('theme.theme', { ns: 'common' })}
{data?.privacy_policy && ( {t('chat.privacyPolicyMiddle', { ns: 'share' })} )}
{ handleTrigger() setShow(true) }} className="system-md-regular cursor-pointer rounded-lg px-3 py-1.5 text-text-secondary hover:bg-state-base-hover" > {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)