feat(web): package tabs

This commit is contained in:
zhaoying
2026-04-17 13:36:19 +08:00
parent e15e32cc7b
commit b659e2a6e1

View File

@@ -105,39 +105,54 @@ const Package: FC = () => {
}, []) }, [])
const [activeTab, setActiveTab] = useState('saas_personal'); const [activeTab, setActiveTab] = useState('saas_personal');
const categories = useMemo(() => {
const cats = [...new Set(data.map(p => p.category))]
return cats
}, [data])
const formatTabItems = useMemo(() => { const formatTabItems = useMemo(() => {
return ['saas_personal', 'commercial_deployment'].map(value => ({ return (['saas_personal', 'commercial_deployment'] as const)
value, .filter(v => categories.includes(v))
label: `${t(`package.${value}`)}`, .map(value => ({ value, label: t(`package.${value}`) }))
})) }, [t, categories])
}, [t, activeTab])
const showTabs = categories.length > 1
const handleChangeTab = (value: SegmentedProps['value']) => { const handleChangeTab = (value: SegmentedProps['value']) => {
setActiveTab(value as string); setActiveTab(value as string);
} }
const getList = () => { const getList = () => {
getPackageList({ category: activeTab as Package['category'] }) getPackageList({ status: true }).then(res => {
.then(res => { setData(res as Package[] || [])
setData(res as Package[] || []) })
})
} }
useEffect(() => { useEffect(() => {
getList() getList()
}, [activeTab]) }, [])
useEffect(() => {
if (categories.length > 0 && !categories.includes(activeTab as Package['category'])) {
setActiveTab(categories[0])
}
}, [categories])
const getKeyWithLanguage = (key: string) => { const getKeyWithLanguage = (key: string) => {
return (language === 'en' ? `${key}_en` : key) as keyof Package return (language === 'en' ? `${key}_en` : key) as keyof Package
} }
const filteredData = useMemo(() => data.filter(p => p.category === activeTab), [data, activeTab])
const [currentPage, setCurrentPage] = useState(0) const [currentPage, setCurrentPage] = useState(0)
const totalPages = visibleCount > 0 ? Math.ceil(data.length / visibleCount) : 1 const totalPages = visibleCount > 0 ? Math.ceil(filteredData.length / visibleCount) : 1
const showArrows = totalPages > 1 const showArrows = totalPages > 1
const pageData = data.slice(currentPage * visibleCount, (currentPage + 1) * visibleCount) const pageData = filteredData.slice(currentPage * visibleCount, (currentPage + 1) * visibleCount)
useEffect(() => { useEffect(() => {
setCurrentPage(0) setCurrentPage(0)
}, [activeTab, visibleCount]) }, [activeTab, visibleCount, filteredData])
const handleChoosePlan = () => { const handleChoosePlan = () => {
window.open(`https://docs.redbearai.com/s/${language || 'en'}-memorybear`, '_blank') window.open(`https://docs.redbearai.com/s/${language || 'en'}-memorybear`, '_blank')
@@ -145,14 +160,16 @@ const Package: FC = () => {
return ( return (
<> <>
<Flex justify="space-between" className="rb:mb-4!"> {showTabs && (
<PageTabs <Flex justify="space-between" className="rb:mb-4!">
value={activeTab} <PageTabs
options={formatTabItems} value={activeTab}
onChange={handleChangeTab} options={formatTabItems}
/> onChange={handleChangeTab}
</Flex> />
<BodyWrapper empty={data.length < 1}> </Flex>
)}
<BodyWrapper empty={filteredData.length < 1}>
<div ref={scrollRef} className="rb:relative rb:mx-9"> <div ref={scrollRef} className="rb:relative rb:mx-9">
{showArrows && ( {showArrows && (
<Flex <Flex
@@ -227,12 +244,18 @@ const Package: FC = () => {
<Divider className="rb:my-4" /> <Divider className="rb:my-4" />
{/* Features */} {/* Features */}
<Flex gap={12} vertical className="rb:space-y-3 rb:mb-4 rb:h-[calc(100vh-401px)]! rb:overflow-y-auto"> <Flex gap={12} vertical
className={clsx("rb:space-y-3 rb:mb-4 rb:overflow-y-auto", {
'rb:h-[calc(100vh-401px)]!': showTabs,
'rb:h-[calc(100vh-346px)]!': !showTabs
})}
>
{billingUnits.map(({ key, unit, icon }) => { {billingUnits.map(({ key, unit, icon }) => {
const value = pkg?.quotas?.[key as keyof Package['quotas']]; const value = pkg?.quotas?.[key as keyof Package['quotas']];
if (value === undefined || value === null) return null; if (value === undefined || value === null) return null;
return ( return (
<UnitWrapper <UnitWrapper
key={key}
titleKey={key} titleKey={key}
value={value} value={value}
unit={unit} unit={unit}