From 4d827204bb7d1874c5eed22076aa0e8de1769eff Mon Sep 17 00:00:00 2001 From: yun-zhi-ztl <15071461069@163.com> Date: Thu, 19 Mar 2026 17:10:09 +0800 Subject: [PATCH] fix: refine my skills empty states --- web/src/i18n/locales/en.json | 8 ++++++++ web/src/i18n/locales/zh.json | 8 ++++++++ web/src/pages/dashboard/my-skill-filters.test.ts | 16 +++++++++++++++- web/src/pages/dashboard/my-skill-filters.ts | 13 +++++++++++++ web/src/pages/dashboard/my-skills.tsx | 7 ++++--- 5 files changed, 48 insertions(+), 4 deletions(-) diff --git a/web/src/i18n/locales/en.json b/web/src/i18n/locales/en.json index c39890b3..11daf94b 100644 --- a/web/src/i18n/locales/en.json +++ b/web/src/i18n/locales/en.json @@ -339,6 +339,14 @@ "promotionErrorTitle": "Failed to submit promotion request", "emptyTitle": "No skills yet", "emptyDescription": "Start publishing your first skill", + "emptyFilteredTitle": "No skills match this filter", + "emptyFilteredDescription": { + "PENDING_REVIEW": "There are no skills waiting for review right now.", + "PUBLISHED": "There are no published skills right now.", + "REJECTED": "There are no rejected skills right now.", + "ARCHIVED": "There are no archived skills right now.", + "HIDDEN": "There are no hidden skills right now." + }, "publishSkill": "Publish Skill" }, "myNamespaces": { diff --git a/web/src/i18n/locales/zh.json b/web/src/i18n/locales/zh.json index 28704701..c26f81ae 100644 --- a/web/src/i18n/locales/zh.json +++ b/web/src/i18n/locales/zh.json @@ -339,6 +339,14 @@ "promotionErrorTitle": "提交提升申请失败", "emptyTitle": "还没有技能", "emptyDescription": "开始发布你的第一个技能吧", + "emptyFilteredTitle": "当前筛选下没有技能", + "emptyFilteredDescription": { + "PENDING_REVIEW": "当前没有处于待审核状态的技能。", + "PUBLISHED": "当前没有已发布的技能。", + "REJECTED": "当前没有已拒绝的技能。", + "ARCHIVED": "当前没有已归档的技能。", + "HIDDEN": "当前没有已隐藏的技能。" + }, "publishSkill": "发布技能" }, "myNamespaces": { diff --git a/web/src/pages/dashboard/my-skill-filters.test.ts b/web/src/pages/dashboard/my-skill-filters.test.ts index 0d830998..c2e07f9a 100644 --- a/web/src/pages/dashboard/my-skill-filters.test.ts +++ b/web/src/pages/dashboard/my-skill-filters.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { getMySkillFilters } from './my-skill-filters' +import { getMySkillEmptyStateKey, getMySkillFilters } from './my-skill-filters' describe('getMySkillFilters', () => { it('returns lifecycle filters for regular users', () => { @@ -9,4 +9,18 @@ describe('getMySkillFilters', () => { it('adds hidden filter for super admins', () => { expect(getMySkillFilters(true)).toEqual(['ALL', 'PUBLISHED', 'HIDDEN', 'ARCHIVED']) }) + + it('returns default empty-state copy for all skills', () => { + expect(getMySkillEmptyStateKey('ALL')).toEqual({ + title: 'mySkills.emptyTitle', + description: 'mySkills.emptyDescription', + }) + }) + + it('returns filter-specific empty-state copy for scoped filters', () => { + expect(getMySkillEmptyStateKey('PENDING_REVIEW')).toEqual({ + title: 'mySkills.emptyFilteredTitle', + description: 'mySkills.emptyFilteredDescription.PENDING_REVIEW', + }) + }) }) diff --git a/web/src/pages/dashboard/my-skill-filters.ts b/web/src/pages/dashboard/my-skill-filters.ts index 2f38a05c..8f615756 100644 --- a/web/src/pages/dashboard/my-skill-filters.ts +++ b/web/src/pages/dashboard/my-skill-filters.ts @@ -7,3 +7,16 @@ export function getMySkillFilters(isSuperAdmin: boolean): MySkillFilter[] { return ['ALL', 'PENDING_REVIEW', 'PUBLISHED', 'REJECTED', 'ARCHIVED'] } +export function getMySkillEmptyStateKey(filter: MySkillFilter): { title: string; description: string } { + if (filter === 'ALL') { + return { + title: 'mySkills.emptyTitle', + description: 'mySkills.emptyDescription', + } + } + + return { + title: 'mySkills.emptyFilteredTitle', + description: `mySkills.emptyFilteredDescription.${filter}`, + } +} diff --git a/web/src/pages/dashboard/my-skills.tsx b/web/src/pages/dashboard/my-skills.tsx index 0aa4f2d2..1c982125 100644 --- a/web/src/pages/dashboard/my-skills.tsx +++ b/web/src/pages/dashboard/my-skills.tsx @@ -13,7 +13,7 @@ import { getHeadlineVersion, getPublishedVersion, getOwnerPreviewVersion, hasPen import { formatCompactCount } from '@/shared/lib/number-format' import { toast } from '@/shared/lib/toast' import { ApiError } from '@/api/client' -import { getMySkillFilters, type MySkillFilter } from './my-skill-filters' +import { getMySkillEmptyStateKey, getMySkillFilters, type MySkillFilter } from './my-skill-filters' const PAGE_SIZE = 10 @@ -47,6 +47,7 @@ export function MySkillsPage() { const skills = skillPage?.items ?? [] const totalPages = skillPage ? Math.max(Math.ceil(skillPage.total / skillPage.size), 1) : 1 const availableFilters = getMySkillFilters(hasRole('SUPER_ADMIN')) + const emptyStateKey = getMySkillEmptyStateKey(filter) const archiveMutation = useArchiveSkill() const unarchiveMutation = useUnarchiveSkill() const withdrawMutation = useWithdrawSkillReview() @@ -366,8 +367,8 @@ export function MySkillsPage() { ) : ( navigate({ to: '/dashboard/publish' })}> {t('mySkills.publishSkill')}