1
1
import { Button , Classes , MenuDivider , MenuItem } from '@blueprintjs/core'
2
+ import { getCreateNewItem } from '@blueprintjs/select'
2
3
3
4
import clsx from 'clsx'
4
5
import Fuse from 'fuse.js'
5
- import { FC , useMemo } from 'react'
6
+ import { FC , useEffect , useMemo , useState } from 'react'
6
7
7
8
import { useLevels } from '../apis/level'
8
- import { createCustomLevel , isHardMode } from '../models/level'
9
+ import { createCustomLevel , isCustomLevel , isHardMode } from '../models/level'
9
10
import { Level } from '../models/operation'
10
11
import { useDebouncedQuery } from '../utils/useDebouncedQuery'
11
12
import { Select } from './Select'
@@ -40,7 +41,17 @@ export const LevelSelect: FC<LevelSelectProps> = ({
40
41
)
41
42
42
43
const { query, debouncedQuery, updateQuery, onOptionMouseDown } =
43
- useDebouncedQuery ( )
44
+ useDebouncedQuery ( {
45
+ onDebouncedQueryChange : ( value ) => {
46
+ if ( value !== debouncedQuery ) {
47
+ // 清空 activeItem,之后会自动设置为第一项
48
+ setActiveItem ( null )
49
+ }
50
+ } ,
51
+ } )
52
+ const [ activeItem , setActiveItem ] = useState < Level | 'createNewItem' | null > (
53
+ null ,
54
+ )
44
55
45
56
const selectedLevel = useMemo ( ( ) => {
46
57
const level = levels . find ( ( el ) => el . stageId === value )
@@ -103,10 +114,26 @@ export const LevelSelect: FC<LevelSelectProps> = ({
103
114
: levels
104
115
} , [ debouncedQuery , selectedLevel , levels , fuse ] )
105
116
117
+ useEffect ( ( ) => {
118
+ if ( ! selectedLevel ) {
119
+ setActiveItem ( null )
120
+ } else if ( isCustomLevel ( selectedLevel ) ) {
121
+ setActiveItem ( 'createNewItem' )
122
+ } else {
123
+ setActiveItem ( selectedLevel )
124
+ }
125
+ } , [ selectedLevel ] )
126
+
106
127
return (
107
128
< Select < Level >
108
129
items = { levels }
109
130
itemListPredicate = { ( ) => filteredLevels }
131
+ activeItem = {
132
+ activeItem === 'createNewItem' ? getCreateNewItem ( ) : activeItem
133
+ }
134
+ onActiveItemChange = { ( item , isCreateNewItem ) => {
135
+ setActiveItem ( isCreateNewItem ? 'createNewItem' : item )
136
+ } }
110
137
query = { query }
111
138
onQueryChange = { ( query ) => updateQuery ( query , false ) }
112
139
onReset = { ( ) => onChange ( '' ) }
@@ -132,19 +159,22 @@ export const LevelSelect: FC<LevelSelectProps> = ({
132
159
}
133
160
selectedItem = { selectedLevel }
134
161
onItemSelect = { ( level ) => {
135
- // 重置 query 以显示同类关卡
136
- updateQuery ( '' , true )
162
+ if ( ! isCustomLevel ( level ) ) {
163
+ // 重置 query 以显示同类关卡
164
+ updateQuery ( '' , true )
165
+ }
137
166
onChange ( level . stageId )
138
167
} }
139
168
createNewItemFromQuery = { ( query ) => createCustomLevel ( query ) }
140
169
createNewItemRenderer = { ( query , active , handleClick ) => (
141
170
< MenuItem
142
171
key = "create-new-item"
143
172
roleStructure = "listoption"
144
- text = { `使用自定义关卡名 "${ query } "` }
173
+ className = { clsx ( active && Classes . ACTIVE ) }
174
+ text = { `直接搜索关卡 "${ query } "` }
145
175
icon = "text-highlight"
146
176
onClick = { handleClick }
147
- active = { active }
177
+ selected = { selectedLevel && isCustomLevel ( selectedLevel ) }
148
178
/>
149
179
) }
150
180
inputProps = { {
0 commit comments