refactor: pricing filters for dynamic counting & cleaner logic

This commit introduces a unified, maintainable solution for all model-pricing filter buttons and removes redundant code.

Key points
• Added `usePricingFilterCounts` hook
  - Centralises filtering logic and returns:
    - `quotaTypeModels`, `endpointTypeModels`, `dynamicCategoryCounts`, `groupCountModels`
  - Keeps internal helpers private (removed public `modelsAfterCategory`).

• Updated components to consume the new hook
  - `PricingSidebar.jsx`
  - `FilterModalContent.jsx`

• Improved button UI/UX
  - `SelectableButtonGroup.jsx` now respects `item.disabled` and auto-disables when `tagCount === 0`.
  - `PricingGroups.jsx` counts models per group (after all other filters) and disables groups with zero matches.
  - `PricingEndpointTypes.jsx` enumerates all endpoint types, computes filtered counts, and disables entries with zero matches.

• Removed obsolete / duplicate calculations and comments to keep components lean.

The result is consistent, real-time tag counts across all filter groups, automatic disabling of unavailable options, and a single source of truth for filter computations, making future extensions straightforward.
This commit is contained in:
t0ng7u
2025-07-26 18:38:18 +08:00
parent 9110611489
commit 75548c449b
6 changed files with 200 additions and 16 deletions

View File

@@ -23,6 +23,7 @@ import PricingCategories from '../../filter/PricingCategories';
import PricingGroups from '../../filter/PricingGroups';
import PricingQuotaTypes from '../../filter/PricingQuotaTypes';
import PricingEndpointTypes from '../../filter/PricingEndpointTypes';
import { usePricingFilterCounts } from '../../../../../hooks/model-pricing/usePricingFilterCounts';
const FilterModalContent = ({ sidebarProps, t }) => {
const {
@@ -48,6 +49,21 @@ const FilterModalContent = ({ sidebarProps, t }) => {
...categoryProps
} = sidebarProps;
const {
quotaTypeModels,
endpointTypeModels,
dynamicCategoryCounts,
groupCountModels,
} = usePricingFilterCounts({
models: categoryProps.models,
modelCategories: categoryProps.modelCategories,
activeKey: categoryProps.activeKey,
filterGroup,
filterQuotaType,
filterEndpointType,
searchValue: sidebarProps.searchValue,
});
return (
<div className="p-2">
<PricingDisplaySettings
@@ -65,14 +81,20 @@ const FilterModalContent = ({ sidebarProps, t }) => {
t={t}
/>
<PricingCategories {...categoryProps} setActiveKey={setActiveKey} loading={loading} t={t} />
<PricingCategories
{...categoryProps}
categoryCounts={dynamicCategoryCounts}
setActiveKey={setActiveKey}
loading={loading}
t={t}
/>
<PricingGroups
filterGroup={filterGroup}
setFilterGroup={setFilterGroup}
usableGroup={categoryProps.usableGroup}
groupRatio={categoryProps.groupRatio}
models={categoryProps.models}
models={groupCountModels}
loading={loading}
t={t}
/>
@@ -80,7 +102,7 @@ const FilterModalContent = ({ sidebarProps, t }) => {
<PricingQuotaTypes
filterQuotaType={filterQuotaType}
setFilterQuotaType={setFilterQuotaType}
models={categoryProps.models}
models={quotaTypeModels}
loading={loading}
t={t}
/>
@@ -88,7 +110,8 @@ const FilterModalContent = ({ sidebarProps, t }) => {
<PricingEndpointTypes
filterEndpointType={filterEndpointType}
setFilterEndpointType={setFilterEndpointType}
models={categoryProps.models}
models={endpointTypeModels}
allModels={categoryProps.models}
loading={loading}
t={t}
/>