Skip to content

Commit 92c168e

Browse files
committed
feat: more accurate level suggestions
1 parent a07d6d3 commit 92c168e

File tree

1 file changed

+50
-31
lines changed

1 file changed

+50
-31
lines changed

src/components/LevelSelect.tsx

Lines changed: 50 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -38,52 +38,71 @@ export const LevelSelect: FC<LevelSelectProps> = ({
3838
}),
3939
[levels],
4040
)
41-
const fuseSimilar = useMemo(
42-
() =>
43-
new Fuse(levels, {
44-
keys: ['levelId'],
45-
threshold: 0,
46-
}),
47-
[levels],
48-
)
4941

5042
// value 可以由用户输入,所以可以是任何值,只有用 stageId 才能匹配到唯一的关卡
5143
const selectedLevel = useMemo(
5244
() => levels.find((el) => el.stageId === value) ?? null,
5345
[levels, value],
5446
)
5547

48+
const search = (query: string) => {
49+
// 如果 query 和当前关卡完全匹配(也就是唯一对应),就显示同类关卡
50+
if (selectedLevel && selectedLevel.stageId === query) {
51+
let similarLevels: Level[]
52+
let headerName: string
53+
54+
if (selectedLevel.catOne === '剿灭作战') {
55+
headerName = selectedLevel.catOne
56+
similarLevels = levels.filter(
57+
(el) => el.catOne === selectedLevel.catOne,
58+
)
59+
} else if (
60+
selectedLevel.stageId.includes('rune') ||
61+
selectedLevel.stageId.includes('crisis')
62+
) {
63+
// 危机合约分类非常混乱,直接全塞到一起
64+
headerName = '危机合约'
65+
similarLevels = levels.filter(
66+
(el) => el.stageId.includes('rune') || el.stageId.includes('crisis'),
67+
)
68+
} else if (selectedLevel.catTwo) {
69+
headerName = selectedLevel.catTwo
70+
similarLevels = levels.filter(
71+
(el) => el.catTwo === selectedLevel.catTwo,
72+
)
73+
} else {
74+
// catTwo 为空的时候用 levelId 来分类
75+
headerName = '相关关卡'
76+
const levelIdPrefix = selectedLevel.levelId
77+
.split('/')
78+
.slice(0, -1)
79+
.join('/')
80+
similarLevels = levelIdPrefix
81+
? levels.filter((el) => el.levelId.startsWith(levelIdPrefix))
82+
: []
83+
}
84+
85+
if (similarLevels.length > 1) {
86+
const header = createCustomLevel(headerName)
87+
header.stageId = 'header'
88+
return [header, ...similarLevels]
89+
}
90+
}
91+
92+
return query ? fuse.search(query).map((el) => el.item) : levels
93+
}
94+
5695
return (
5796
<Suggest<Level>
5897
updateQueryOnSelect
5998
items={levels}
60-
itemListPredicate={(query) => {
61-
// 如果 query 和当前关卡完全匹配(也就是唯一对应),就显示同类关卡
62-
if (selectedLevel && selectedLevel.stageId === query) {
63-
const levelIdPrefix = selectedLevel.levelId
64-
.split('/')
65-
.slice(0, -1)
66-
.join('/')
67-
const similarLevels = fuseSimilar
68-
.search(levelIdPrefix)
69-
.map((el) => el.item)
70-
71-
if (similarLevels.length > 0) {
72-
const header = createCustomLevel('header')
73-
// catTwo 一般是活动名,有时候是空的
74-
header.catTwo = selectedLevel.catTwo || '相关关卡'
75-
return [header, ...similarLevels]
76-
}
77-
}
78-
79-
return query ? fuse.search(query).map((el) => el.item) : levels
80-
}}
99+
itemListPredicate={search}
81100
onReset={() => onChange('')}
82101
className={clsx(className, selectedLevel && '[&_input]:italic')}
83102
itemRenderer={(item, { handleClick, handleFocus, modifiers }) =>
84-
item.name === 'header' ? (
103+
item.stageId === 'header' ? (
85104
<Fragment key="header">
86-
<div className="ml-2 text-zinc-500 text-xs">{item.catTwo}</div>
105+
<div className="ml-2 text-zinc-500 text-xs">{item.name}</div>
87106
<MenuDivider />
88107
</Fragment>
89108
) : (

0 commit comments

Comments
 (0)