Skip to content

Commit 2908ce4

Browse files
committed
fix: 修复平台筛选功能,将多选改回单选模式
1 parent b65046b commit 2908ce4

File tree

4 files changed

+87
-51
lines changed

4 files changed

+87
-51
lines changed

docs/challenges/meta.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,4 @@ challenges:
101101

102102
# 是否忽略该挑战
103103
# 设置为true时,该挑战不会在列表中显示,并且编译构建时也会忽略不会被打包
104-
ignored: true
104+
ignored: false

src/components/ChallengeListPage/ChallengeControls.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,8 @@ const ChallengeControls: React.FC<ChallengeControlsProps> = ({
156156
const platformMenu = (
157157
<Menu
158158
selectedKeys={[selectedPlatform]}
159-
onClick={({ key }) => onPlatformChange(key)}
159+
onClick={({ key }) => onPlatformChange(key.toString())}
160+
multiple={false}
160161
>
161162
<Menu.Item key="all">{t('challenges.filters.allPlatforms')}</Menu.Item>
162163
{/* 使用固定的平台枚举列表,而不是从挑战中提取的 */}

src/components/ChallengeListPage/index.tsx

Lines changed: 83 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ const ChallengeListPage = () => {
4242

4343
// 过滤掉被标记为忽略的挑战
4444
const visibleChallenges = useMemo(() => {
45-
return challenges.filter(challenge => !challenge.ignored);
45+
console.log(`总挑战数量: ${challenges.length}`);
46+
const visible = challenges.filter(challenge => challenge.ignored !== true);
47+
console.log(`可见挑战数量(排除ignored=true): ${visible.length}`);
48+
return visible;
4649
}, [challenges]);
4750

4851
// 初始化搜索服务
@@ -71,8 +74,10 @@ const ChallengeListPage = () => {
7174
}
7275

7376
// 设置平台
74-
if (parsedFilters.platform && parsedFilters.platform !== 'all') {
75-
newSearchParams.set('platform', parsedFilters.platform);
77+
if (parsedFilters.platform && parsedFilters.platform.length > 0) {
78+
parsedFilters.platform.forEach((platform: string) => {
79+
newSearchParams.append('platform', platform);
80+
});
7681
}
7782

7883
// 设置标签
@@ -151,10 +156,54 @@ const ChallengeListPage = () => {
151156
saveFilterPreferences({ ...filters, difficulty: filters.difficulty });
152157
};
153158

159+
// 从URL同步过滤器状态
160+
useEffect(() => {
161+
const tags = searchParams.getAll('tags');
162+
let difficultyParams = searchParams.getAll('difficulty');
163+
const platformParam = searchParams.get('platform') || 'all';
164+
165+
console.log('URL平台参数:', platformParam);
166+
167+
// 处理特殊难度字符串转换
168+
if (difficultyParams.length === 1) {
169+
const diffParam = difficultyParams[0];
170+
if (diffParam === 'easy') {
171+
difficultyParams = ['1'];
172+
} else if (diffParam === 'medium') {
173+
difficultyParams = ['2', '3'];
174+
} else if (diffParam === 'hard') {
175+
difficultyParams = ['4', '5'];
176+
}
177+
}
178+
179+
const newFilters = {
180+
tags,
181+
difficulty: difficultyParams,
182+
platform: platformParam
183+
};
184+
185+
console.log('设置新筛选条件:', newFilters);
186+
setFilters(newFilters);
187+
188+
// 当URL发生变化时,同步到本地存储
189+
if (searchParams.toString()) {
190+
saveFilterPreferences(newFilters);
191+
}
192+
}, [searchParams]);
193+
154194
// 处理平台筛选
155195
const handlePlatformChange = (platform: string) => {
196+
console.log('处理平台筛选变化:', platform);
197+
156198
const newSearchParams = new URLSearchParams(searchParams);
157-
newSearchParams.set('platform', platform);
199+
newSearchParams.delete('platform');
200+
201+
// 如果选择的不是"all",则添加平台参数
202+
if (platform !== 'all') {
203+
newSearchParams.append('platform', platform);
204+
}
205+
206+
console.log('新URL参数:', newSearchParams.toString());
158207
navigate(`/challenges?${newSearchParams.toString()}`);
159208

160209
// 保存筛选设置到本地存储
@@ -204,33 +253,6 @@ const ChallengeListPage = () => {
204253
setDrawerVisible(false);
205254
};
206255

207-
// 从URL同步过滤器状态
208-
useEffect(() => {
209-
const tags = searchParams.getAll('tags');
210-
let difficultyParams = searchParams.getAll('difficulty');
211-
const platform = searchParams.get('platform') || 'all';
212-
213-
// 处理特殊难度字符串转换
214-
if (difficultyParams.length === 1) {
215-
const diffParam = difficultyParams[0];
216-
if (diffParam === 'easy') {
217-
difficultyParams = ['1'];
218-
} else if (diffParam === 'medium') {
219-
difficultyParams = ['2', '3'];
220-
} else if (diffParam === 'hard') {
221-
difficultyParams = ['4', '5'];
222-
}
223-
}
224-
225-
const newFilters = { tags, difficulty: difficultyParams, platform };
226-
setFilters(newFilters);
227-
228-
// 当URL发生变化时,同步到本地存储
229-
if (searchParams.toString()) {
230-
saveFilterPreferences(newFilters);
231-
}
232-
}, [searchParams]);
233-
234256
// 获取所有可用标签
235257
const allTags = useMemo(() => {
236258
const tags = new Set<string>();
@@ -252,12 +274,22 @@ const ChallengeListPage = () => {
252274
// 使用Fuse.js过滤和排序挑战
253275
const filteredChallenges = useMemo(() => {
254276
// 使用搜索服务过滤
277+
console.log(`过滤前挑战数量: ${visibleChallenges.length}`);
278+
console.log(`过滤条件:`, {
279+
tags: filters.tags,
280+
difficulty: filters.difficulty.join(','),
281+
platform: filters.platform,
282+
query: searchQuery
283+
});
284+
255285
const filtered = searchService.filterChallenges(visibleChallenges, {
256286
tags: filters.tags,
257287
difficulty: filters.difficulty.join(','),
258288
platform: filters.platform,
259289
query: searchQuery
260290
});
291+
292+
console.log(`过滤后挑战数量: ${filtered.length}`);
261293

262294
// 排序
263295
return filtered.sort((a: Challenge, b: Challenge) => {
@@ -347,22 +379,25 @@ const ChallengeListPage = () => {
347379
};
348380

349381
// 渲染控制面板(桌面或移动)
350-
const renderControls = () => (
351-
<ChallengeControls
352-
allTags={allTags}
353-
allPlatforms={allPlatforms}
354-
selectedTags={filters.tags}
355-
selectedDifficulty={filters.difficulty}
356-
selectedPlatform={filters.platform}
357-
sortBy={sortBy}
358-
sortOrder={sortOrder}
359-
onTagsChange={handleTagsChange}
360-
onDifficultyChange={handleDifficultyClick}
361-
onPlatformChange={handlePlatformChange}
362-
onSortByChange={handleSortByChange}
363-
onSortOrderChange={handleSortOrderChange}
364-
/>
365-
);
382+
const renderControls = () => {
383+
console.log('渲染控制面板,当前平台选择:', filters.platform);
384+
return (
385+
<ChallengeControls
386+
allTags={allTags}
387+
allPlatforms={allPlatforms}
388+
selectedTags={filters.tags}
389+
selectedDifficulty={filters.difficulty}
390+
selectedPlatform={filters.platform}
391+
sortBy={sortBy}
392+
sortOrder={sortOrder}
393+
onTagsChange={handleTagsChange}
394+
onDifficultyChange={handleDifficultyClick}
395+
onPlatformChange={handlePlatformChange}
396+
onSortByChange={handleSortByChange}
397+
onSortOrderChange={handleSortOrderChange}
398+
/>
399+
);
400+
};
366401

367402
// 渲染过滤器(适用于桌面和移动视图)
368403
const renderFilters = () => (
@@ -425,7 +460,7 @@ const ChallengeListPage = () => {
425460
onPaginationChange={handlePaginationChange}
426461
onTagClick={handleTagClick}
427462
onDifficultyClick={(difficulty) => handleDifficultyClick(difficulty.toString())}
428-
onPlatformClick={handlePlatformChange}
463+
onPlatformClick={(platform) => handlePlatformChange(platform)}
429464
onChallengeClick={(id) => navigate(`/challenge/${id}`)}
430465
hidePagination={false}
431466
/>

src/services/SearchService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ class SearchService {
108108
}
109109

110110
// 平台过滤
111-
const matchesPlatform = !filters.platform || filters.platform === 'all' ||
111+
const matchesPlatform = !filters.platform || filters.platform === 'all' ||
112112
challenge.platform === filters.platform;
113113

114114
return matchesTags && matchesDifficulty && matchesPlatform;

0 commit comments

Comments
 (0)