@@ -38,52 +38,71 @@ export const LevelSelect: FC<LevelSelectProps> = ({
38
38
} ) ,
39
39
[ levels ] ,
40
40
)
41
- const fuseSimilar = useMemo (
42
- ( ) =>
43
- new Fuse ( levels , {
44
- keys : [ 'levelId' ] ,
45
- threshold : 0 ,
46
- } ) ,
47
- [ levels ] ,
48
- )
49
41
50
42
// value 可以由用户输入,所以可以是任何值,只有用 stageId 才能匹配到唯一的关卡
51
43
const selectedLevel = useMemo (
52
44
( ) => levels . find ( ( el ) => el . stageId === value ) ?? null ,
53
45
[ levels , value ] ,
54
46
)
55
47
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
+
56
95
return (
57
96
< Suggest < Level >
58
97
updateQueryOnSelect
59
98
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 }
81
100
onReset = { ( ) => onChange ( '' ) }
82
101
className = { clsx ( className , selectedLevel && '[&_input]:italic' ) }
83
102
itemRenderer = { ( item , { handleClick, handleFocus, modifiers } ) =>
84
- item . name === 'header' ? (
103
+ item . stageId === 'header' ? (
85
104
< 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 >
87
106
< MenuDivider />
88
107
</ Fragment >
89
108
) : (
0 commit comments