-
+
+
+
+
+
{isInHeader && type === Plan.sandbox && (
+export type UsagePlanInfo = Pick
export enum DocumentProcessingPriority {
standard = 'standard',
@@ -59,6 +59,10 @@ export type CurrentPlanInfoBackend = {
size: number
limit: number // total. 0 means unlimited
}
+ documents_upload_quota: {
+ size: number
+ limit: number // total. 0 means unlimited
+ }
docs_processing: DocumentProcessingPriority
can_replace_logo: boolean
}
diff --git a/web/app/components/billing/utils/index.ts b/web/app/components/billing/utils/index.ts
index 3e689e2544..111f02e3cf 100644
--- a/web/app/components/billing/utils/index.ts
+++ b/web/app/components/billing/utils/index.ts
@@ -16,12 +16,14 @@ export const parseCurrentPlan = (data: CurrentPlanInfoBackend) => {
buildApps: data.apps?.size || 0,
teamMembers: data.members.size,
annotatedResponse: data.annotation_quota_limit.size,
+ documentsUploadQuota: data.documents_upload_quota.size,
},
total: {
vectorSpace: parseLimit(data.vector_space.limit),
buildApps: parseLimit(data.apps?.limit) || 0,
teamMembers: parseLimit(data.members.limit),
annotatedResponse: parseLimit(data.annotation_quota_limit.limit),
+ documentsUploadQuota: parseLimit(data.documents_upload_quota.limit),
},
}
}
diff --git a/web/app/components/header/index.tsx b/web/app/components/header/index.tsx
index 957b1a442f..8091814cc6 100644
--- a/web/app/components/header/index.tsx
+++ b/web/app/components/header/index.tsx
@@ -1,7 +1,7 @@
'use client'
-import { useEffect, useRef, useState } from 'react'
+import { useCallback, useEffect } from 'react'
import Link from 'next/link'
-import { useBoolean, useClickAway } from 'ahooks'
+import { useBoolean } from 'ahooks'
import { useSelectedLayoutSegment } from 'next/navigation'
import { Bars3Icon } from '@heroicons/react/20/solid'
import HeaderBillingBtn from '../billing/header-billing-btn'
@@ -15,9 +15,9 @@ import GithubStar from './github-star'
import { WorkspaceProvider } from '@/context/workspace-context'
import { useAppContext } from '@/context/app-context'
import LogoSite from '@/app/components/base/logo/logo-site'
-import PlanComp from '@/app/components/billing/plan'
import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
import { useProviderContext } from '@/context/provider-context'
+import { useModalContext } from '@/context/modal-context'
const navClassName = `
flex items-center relative mr-0 sm:mr-3 px-3 h-8 rounded-xl
@@ -26,18 +26,21 @@ const navClassName = `
`
const Header = () => {
- const { isCurrentWorkspaceManager, langeniusVersionInfo } = useAppContext()
- const [showUpgradePanel, setShowUpgradePanel] = useState(false)
- const upgradeBtnRef = useRef(null)
- useClickAway(() => {
- setShowUpgradePanel(false)
- }, upgradeBtnRef)
+ const { isCurrentWorkspaceManager } = useAppContext()
const selectedSegment = useSelectedLayoutSegment()
const media = useBreakpoints()
const isMobile = media === MediaType.mobile
const [isShowNavMenu, { toggle, setFalse: hideNavMenu }] = useBoolean(false)
- const { enableBilling } = useProviderContext()
+ const { enableBilling, plan } = useProviderContext()
+ const { setShowPricingModal, setShowAccountSettingModal } = useModalContext()
+ const isFreePlan = plan.type === 'sandbox'
+ const handlePlanClick = useCallback(() => {
+ if (isFreePlan)
+ setShowPricingModal()
+ else
+ setShowAccountSettingModal({ payload: 'billing' })
+ }, [isFreePlan, setShowAccountSettingModal, setShowPricingModal])
useEffect(() => {
hideNavMenu()
@@ -79,15 +82,7 @@ const Header = () => {
{enableBilling && (
-
setShowUpgradePanel(true)} />
- {showUpgradePanel && (
-
- )}
+
)}
diff --git a/web/context/modal-context.tsx b/web/context/modal-context.tsx
index a6c5cb6117..17a8138b4d 100644
--- a/web/context/modal-context.tsx
+++ b/web/context/modal-context.tsx
@@ -40,7 +40,7 @@ const ModalContext = createContext<{
setShowApiBasedExtensionModal: Dispatch | null>>
setShowModerationSettingModal: Dispatch | null>>
setShowExternalDataToolModal: Dispatch | null>>
- setShowPricingModal: Dispatch>
+ setShowPricingModal: () => void
setShowAnnotationFullModal: () => void
setShowModelModal: Dispatch | null>>
}>({
@@ -50,7 +50,7 @@ const ModalContext = createContext<{
setShowExternalDataToolModal: () => { },
setShowPricingModal: () => { },
setShowAnnotationFullModal: () => { },
- setShowModelModal: () => {},
+ setShowModelModal: () => { },
})
export const useModalContext = () => useContext(ModalContext)
diff --git a/web/i18n/en-US/billing.ts b/web/i18n/en-US/billing.ts
index 291f3073a9..6e3a63998a 100644
--- a/web/i18n/en-US/billing.ts
+++ b/web/i18n/en-US/billing.ts
@@ -28,6 +28,7 @@ const translation = {
talkToSales: 'Talk to Sales',
modelProviders: 'Model Providers',
teamMembers: 'Team Members',
+ annotationQuota: 'Annotation Quota',
buildApps: 'Build Apps',
vectorSpace: 'Vector Space',
vectorSpaceBillingTooltip: 'Each 1MB can store about 1.2million characters of vectorized data(estimated using OpenAI Embeddings, varies across models).',
diff --git a/web/i18n/zh-Hans/billing.ts b/web/i18n/zh-Hans/billing.ts
index 30f2a95676..9e74216b7f 100644
--- a/web/i18n/zh-Hans/billing.ts
+++ b/web/i18n/zh-Hans/billing.ts
@@ -29,6 +29,7 @@ const translation = {
modelProviders: '支持的模型提供商',
teamMembers: '团队成员',
buildApps: '构建应用程序数',
+ annotationQuota: '标注回复数',
vectorSpace: '向量空间',
vectorSpaceTooltip: '向量空间是 LLMs 理解您的数据所需的长期记忆系统。',
vectorSpaceBillingTooltip: '向量存储是将知识库向量化处理后为让 LLMs 理解数据而使用的长期记忆存储,1MB 大约能满足1.2 million character 的向量化后数据存储(以 OpenAI Embedding 模型估算,不同模型计算方式有差异)。在向量化过程中,实际的压缩或尺寸减小取决于内容的复杂性和冗余性。',