Skip to content

Commit 22600d8

Browse files
committed
feat(accounts): surface prolite as its own plan filter and label
Add a ProLite chip to the plan filter row and render the raw prolite value as "ProLite" in the plan column so operators can spot and slice the $100 Pro tier distinctly from full Pro. Filter comparison switches to the raw plan_type so Pro and ProLite become independent buckets; behavioral paths (usage bars, score bias) still normalize prolite into pro, unchanged.
1 parent 98e8bea commit 22600d8

1 file changed

Lines changed: 18 additions & 6 deletions

File tree

frontend/src/pages/Accounts.tsx

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export default function Accounts() {
3838
const [pageSize, setPageSize] = useState(20)
3939
const [statusFilter, setStatusFilter] = useState<'all' | 'normal' | 'rate_limited' | 'banned' | 'error' | 'disabled' | 'locked'>('all')
4040
const [searchQuery, setSearchQuery] = useState('')
41-
const [planFilter, setPlanFilter] = useState<'all' | 'pro' | 'plus' | 'team' | 'free'>('all')
41+
const [planFilter, setPlanFilter] = useState<'all' | 'pro' | 'prolite' | 'plus' | 'team' | 'free'>('all')
4242
const [sortKey, setSortKey] = useState<'requests' | 'usage' | 'importTime' | null>(null)
4343
const [sortDir, setSortDir] = useState<'asc' | 'desc'>('desc')
4444
const [addForm, setAddForm] = useState<AddAccountRequest>({
@@ -189,9 +189,9 @@ export default function Accounts() {
189189
if (!account.locked) return false
190190
break
191191
}
192-
// 套餐过滤
192+
// 套餐过滤:按原始 plan_type 匹配,使 pro 与 prolite 成为独立过滤项
193193
if (planFilter !== 'all') {
194-
const plan = normalizePlanType(account.plan_type)
194+
const plan = (account.plan_type || '').toLowerCase().trim()
195195
if (plan !== planFilter) return false
196196
}
197197
// 搜索过滤
@@ -1133,7 +1133,7 @@ export default function Accounts() {
11331133
/>
11341134
</div>
11351135
<div className="flex items-center gap-1 rounded-lg border border-border bg-muted/30 p-0.5">
1136-
{(['all', 'pro', 'plus', 'team', 'free'] as const).map((key) => (
1136+
{(['all', 'pro', 'prolite', 'plus', 'team', 'free'] as const).map((key) => (
11371137
<button
11381138
key={key}
11391139
onClick={() => { setPlanFilter(key); setPage(1) }}
@@ -1143,7 +1143,11 @@ export default function Accounts() {
11431143
: 'text-muted-foreground hover:text-foreground'
11441144
}`}
11451145
>
1146-
{key === 'all' ? t('accounts.filterAll') : key.charAt(0).toUpperCase() + key.slice(1)}
1146+
{key === 'all'
1147+
? t('accounts.filterAll')
1148+
: key === 'prolite'
1149+
? 'ProLite'
1150+
: key.charAt(0).toUpperCase() + key.slice(1)}
11471151
</button>
11481152
))}
11491153
</div>
@@ -1263,7 +1267,7 @@ export default function Accounts() {
12631267
<TableCell
12641268
className="text-[13px] font-medium"
12651269
>
1266-
{account.plan_type || '-'}
1270+
{formatPlanLabel(account.plan_type)}
12671271
</TableCell>
12681272
<TableCell>
12691273
<div className="space-y-1.5">
@@ -2252,6 +2256,14 @@ function normalizePlanType(planType?: string): string {
22522256
return raw
22532257
}
22542258

2259+
function formatPlanLabel(planType?: string): string {
2260+
const raw = (planType || '').trim()
2261+
if (!raw) return '-'
2262+
const lower = raw.toLowerCase()
2263+
if (lower === 'prolite' || lower === 'pro_lite' || lower === 'pro-lite') return 'ProLite'
2264+
return raw
2265+
}
2266+
22552267
function getDefaultScoreBias(planType?: string): number {
22562268
switch (normalizePlanType(planType)) {
22572269
case 'pro':

0 commit comments

Comments
 (0)