'use client' import { useTranslation } from 'react-i18next' import { useEffect, useRef, useState } from 'react' import cn from 'classnames' import { GoldCoin } from '../../base/icons/src/vender/solid/FinanceAndECommerce' import { GoldCoin as GoldCoinOutLine } from '../../base/icons/src/vender/line/financeAndECommerce' import AccountPage from './account-page' import MembersPage from './members-page' import IntegrationsPage from './Integrations-page' import LanguagePage from './language-page' import ApiBasedExtensionPage from './api-based-extension-page' import DataSourcePage from './data-source-page' import ModelProviderPage from './model-provider-page' import s from './index.module.css' import BillingPage from '@/app/components/billing/billing-page' import CustomPage from '@/app/components/custom/custom-page' import Modal from '@/app/components/base/modal' import { Database03, Webhooks, } from '@/app/components/base/icons/src/vender/line/development' import { Database03 as Database03Solid } from '@/app/components/base/icons/src/vender/solid/development' import { User01, Users01 } from '@/app/components/base/icons/src/vender/line/users' import { User01 as User01Solid, Users01 as Users01Solid } from '@/app/components/base/icons/src/vender/solid/users' import { Globe01 } from '@/app/components/base/icons/src/vender/line/mapsAndTravel' import { AtSign, XClose } from '@/app/components/base/icons/src/vender/line/general' import { CubeOutline } from '@/app/components/base/icons/src/vender/line/shapes' import { Colors } from '@/app/components/base/icons/src/vender/line/editor' import { Colors as ColorsSolid } from '@/app/components/base/icons/src/vender/solid/editor' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import { useProviderContext } from '@/context/provider-context' const iconClassName = ` w-4 h-4 ml-3 mr-2 ` const scrolledClassName = ` border-b shadow-xs bg-white/[.98] ` type IAccountSettingProps = { onCancel: () => void activeTab?: string } type GroupItem = { key: string name: string description?: string icon: JSX.Element activeIcon: JSX.Element } export default function AccountSetting({ onCancel, activeTab = 'account', }: IAccountSettingProps) { const [activeMenu, setActiveMenu] = useState(activeTab) const { t } = useTranslation() const { enableBilling, enableReplaceWebAppLogo } = useProviderContext() const workplaceGroupItems = (() => { return [ { key: 'provider', name: t('common.settings.provider'), icon: , activeIcon: , }, { key: 'members', name: t('common.settings.members'), icon: , activeIcon: , }, { // Use key false to hide this item key: enableBilling ? 'billing' : false, name: t('common.settings.billing'), description: t('billing.plansCommon.receiptInfo'), icon: , activeIcon: , }, { key: 'data-source', name: t('common.settings.dataSource'), icon: , activeIcon: , }, { key: 'api-based-extension', name: t('common.settings.apiBasedExtension'), icon: , activeIcon: , }, { key: (enableReplaceWebAppLogo || enableBilling) ? 'custom' : false, name: t('custom.custom'), icon: , activeIcon: , }, ].filter(item => !!item.key) as GroupItem[] })() const media = useBreakpoints() const isMobile = media === MediaType.mobile const menuItems = [ { key: 'workspace-group', name: t('common.settings.workplaceGroup'), items: workplaceGroupItems, }, { key: 'account-group', name: t('common.settings.accountGroup'), items: [ { key: 'account', name: t('common.settings.account'), icon: , activeIcon: , }, { key: 'integrations', name: t('common.settings.integrations'), icon: , activeIcon: , }, { key: 'language', name: t('common.settings.language'), icon: , activeIcon: , }, ], }, ] const scrollRef = useRef(null) const [scrolled, setScrolled] = useState(false) const scrollHandle = (e: Event) => { if ((e.target as HTMLDivElement).scrollTop > 0) setScrolled(true) else setScrolled(false) } useEffect(() => { const targetElement = scrollRef.current targetElement?.addEventListener('scroll', scrollHandle) return () => { targetElement?.removeEventListener('scroll', scrollHandle) } }, []) const activeItem = [...menuItems[0].items, ...menuItems[1].items].find(item => item.key === activeMenu) return ( { }} className={s.modal} wrapperClassName='!z-20 pt-[60px]' >
{t('common.userProfile.settings')}
{ menuItems.map(menuItem => (
{menuItem.name}
{ menuItem.items.map(item => (
setActiveMenu(item.key)} > {activeMenu === item.key ? item.activeIcon : item.icon} {!isMobile &&
{item.name}
}
)) }
)) }
{activeItem?.name}
{ activeItem?.description && (
{activeItem?.description}
) }
{activeMenu === 'account' && } {activeMenu === 'members' && } {activeMenu === 'billing' && } {activeMenu === 'integrations' && } {activeMenu === 'language' && } {activeMenu === 'provider' && } {activeMenu === 'data-source' && } {activeMenu === 'api-based-extension' && } {activeMenu === 'custom' && }
) }