1
1
import { Alert , Button , Divider , H4 , H5 , H6 , Intent } from '@blueprintjs/core'
2
+ import { Popover2 } from '@blueprintjs/popover2'
3
+ import { POPOVER2_DISMISS } from '@blueprintjs/popover2/lib/esm/classes'
2
4
3
5
import clsx from 'clsx'
4
6
import { useAtom } from 'jotai'
@@ -61,6 +63,9 @@ const formattedProfessions = [
61
63
]
62
64
63
65
const paginationSize = 60
66
+ const defaultRarityFilter = Array . from (
67
+ new Array ( Math . max ( ...OPERATORS . map ( ( { rarity } ) => rarity ) ) + 1 ) . keys ( ) ,
68
+ ) . slice ( Math . min ( ...OPERATORS . map ( ( { rarity } ) => rarity ) ) )
64
69
65
70
const SheetOperator = ( {
66
71
submitOperator,
@@ -72,6 +77,8 @@ const SheetOperator = ({
72
77
73
78
const [ selectedProf , setSelectedProf ] = useState ( formattedProfessions [ 0 ] )
74
79
const [ selectedSubProf , setSelectedSubProf ] = useState ( defaultSubProf [ 0 ] )
80
+ const [ operatorRarity , setOperatorRarity ] = useState ( defaultRarityFilter )
81
+ const [ rarityReverse , setRarityReverse ] = useState ( false )
75
82
const [ favOperators , setFavOperators ] = useAtom ( favOperatorAtom )
76
83
const [ coverOperator , setCoverOperator ] = useState < Operator > ( )
77
84
@@ -90,6 +97,7 @@ const SheetOperator = ({
90
97
return {
91
98
name,
92
99
subProf : '' ,
100
+ rarity : 0 ,
93
101
}
94
102
} ) ,
95
103
...OPERATORS ,
@@ -157,17 +165,43 @@ const SheetOperator = ({
157
165
}
158
166
}
159
167
168
+ const getOperatorRarity = ( target : string ) =>
169
+ operatorsGroupedByProf . find ( ( item ) => item . name === target ) ! . rarity
170
+
160
171
const operatorsGroupedBySubProf = useMemo ( ( ) => {
161
- if ( selectedSubProf . id === 'all' ) return operatorsGroupedByProf
172
+ let result : Operator [ ] = [ ]
173
+ if ( selectedSubProf . id === 'all' ) result = operatorsGroupedByProf
162
174
else if ( selectedSubProf . id === 'selected' )
163
- return operatorsGroupedByProf . filter ( ( item ) =>
175
+ result = operatorsGroupedByProf . filter ( ( item ) =>
164
176
checkOperatorSelected ( item . name ) ,
165
177
)
166
178
else
167
- return operatorsGroupedByProf . filter (
179
+ result = operatorsGroupedByProf . filter (
168
180
( item ) => item . subProf === selectedSubProf . id ,
169
181
)
170
- } , [ selectedSubProf , operatorsGroupedByProf , checkOperatorSelected ] )
182
+
183
+ result = result
184
+ . filter ( ( { name } ) => {
185
+ return (
186
+ operatorRarity . findIndex (
187
+ ( rarity ) => getOperatorRarity ( name ) === rarity ,
188
+ ) !== - 1
189
+ )
190
+ } )
191
+ . sort (
192
+ ( { name : aName } , { name : bName } ) =>
193
+ getOperatorRarity ( bName ) - getOperatorRarity ( aName ) ,
194
+ )
195
+
196
+ return rarityReverse ? result . reverse ( ) : result
197
+ } , [
198
+ selectedSubProf ,
199
+ operatorsGroupedByProf ,
200
+ checkOperatorSelected ,
201
+ operatorRarity ,
202
+ rarityReverse ,
203
+ getOperatorRarity ,
204
+ ] )
171
205
172
206
const operatorSelectHandle : OperatorModifyProps [ 'operatorSelectHandle' ] = (
173
207
operatorName ,
@@ -227,6 +261,20 @@ const SheetOperator = ({
227
261
228
262
const ActionList = (
229
263
< div className = "absolute bottom-0" >
264
+ < Popover2
265
+ content = {
266
+ < RaritySelector
267
+ { ...{
268
+ operatorRarity,
269
+ setOperatorRarity,
270
+ rarityReverse,
271
+ setRarityReverse,
272
+ } }
273
+ />
274
+ }
275
+ >
276
+ < Button minimal icon = "filter-list" />
277
+ </ Popover2 >
230
278
< Button
231
279
minimal
232
280
icon = "circle"
@@ -321,6 +369,7 @@ const SheetOperator = ({
321
369
className = { clsx (
322
370
'truncate cursor-pointer my-3 opacity-50 hover:underline hover:opacity-90' ,
323
371
subProf . id === selectedSubProf . id && '!opacity-100 underline' ,
372
+ subProf . name . length > 3 && '!text-base' ,
324
373
) }
325
374
onClick = { ( ) => setSelectedSubProf ( subProf ) }
326
375
>
@@ -351,7 +400,7 @@ const SheetOperator = ({
351
400
)
352
401
return (
353
402
< div
354
- className = "flex items-center w-32 h-32 flex-0 "
403
+ className = "flex items-center flex-0 w-32 h-32"
355
404
key = { index }
356
405
>
357
406
< OperatorItem
@@ -401,6 +450,81 @@ const SheetOperator = ({
401
450
)
402
451
}
403
452
453
+ const RaritySelector = ( {
454
+ operatorRarity,
455
+ setOperatorRarity,
456
+ rarityReverse,
457
+ setRarityReverse,
458
+ } : {
459
+ operatorRarity : number [ ]
460
+ setOperatorRarity : ( target : number [ ] ) => void
461
+ rarityReverse : boolean
462
+ setRarityReverse : ( target : boolean ) => void
463
+ } ) => {
464
+ const selectClass = 'scale-90'
465
+ const [ rarity , setRarity ] = useState < number [ ] > ( operatorRarity )
466
+ const [ reverse , setReverse ] = useState < boolean > ( rarityReverse )
467
+
468
+ const resetFilter = ( ) => {
469
+ setRarity ( defaultRarityFilter )
470
+ setReverse ( false )
471
+ }
472
+ const submitFilter = ( ) => {
473
+ setOperatorRarity ( rarity )
474
+ setRarityReverse ( reverse )
475
+ }
476
+
477
+ return (
478
+ < div >
479
+ < div className = "flex items-center" >
480
+ < H5 className = "m-0 mr-1" > 按干员稀有度展示</ H5 >
481
+ < Button icon = "reset" minimal title = "重置选择" onClick = { resetFilter } />
482
+ </ div >
483
+ < div className = "flex my-1" >
484
+ { Array ( 7 )
485
+ . fill ( 0 )
486
+ . map ( ( _ , index ) => {
487
+ const isSelect = rarity . findIndex ( ( item ) => item === index ) !== - 1
488
+ return (
489
+ < Button
490
+ key = { index }
491
+ active = { isSelect }
492
+ text = { index }
493
+ minimal
494
+ className = { clsx ( isSelect && selectClass ) }
495
+ onClick = { ( ) =>
496
+ isSelect
497
+ ? setRarity ( [ ...rarity ] . filter ( ( item ) => item !== index ) )
498
+ : setRarity ( [ ...rarity , index ] )
499
+ }
500
+ />
501
+ )
502
+ } ) }
503
+ </ div >
504
+ < div className = "flex" >
505
+ < Button
506
+ minimal
507
+ icon = "arrow-up"
508
+ className = { clsx ( ! reverse && selectClass ) }
509
+ active = { ! reverse }
510
+ onClick = { ( ) => setReverse ( false ) }
511
+ title = "按从下至上升序排列"
512
+ />
513
+ < Button
514
+ minimal
515
+ icon = "arrow-down"
516
+ className = { clsx ( reverse && selectClass ) }
517
+ active = { reverse }
518
+ onClick = { ( ) => setReverse ( true ) }
519
+ title = "按从下至上降序排列"
520
+ />
521
+ </ div >
522
+ < Divider />
523
+ < Button text = "确认" className = { POPOVER2_DISMISS } onClick = { submitFilter } />
524
+ </ div >
525
+ )
526
+ }
527
+
404
528
export const SheetOperatorContainer = (
405
529
sheetOperatorProp : SheetOperatorProps ,
406
530
) => (
0 commit comments