1
- import {
2
- Alert ,
3
- Button ,
4
- Divider ,
5
- H5 ,
6
- H6 ,
7
- InputGroup ,
8
- Intent ,
9
- } from '@blueprintjs/core'
1
+ import { Button , Divider , H6 , InputGroup , Intent } from '@blueprintjs/core'
10
2
11
- import { useAtom } from 'jotai'
3
+ import { useAtomValue } from 'jotai'
12
4
import { FC , useMemo , useState } from 'react'
13
5
14
6
import { AppToaster } from 'components/Toaster'
15
7
import { OPERATORS , PROFESSIONS } from 'models/operator'
16
8
import { favGroupAtom } from 'store/useFavGroups'
17
9
18
- import { Group } from '../EditorSheet'
19
- import { SheetContainerSkeleton } from './SheetContainerSkeleton'
10
+ import { Group , Operator } from '../EditorSheet'
11
+ import {
12
+ SheetContainerSkeleton ,
13
+ SheetContainerSkeletonProps ,
14
+ } from './SheetContainerSkeleton'
20
15
import { GroupNoData } from './SheetNoneData'
21
16
import { useSheet } from './SheetProvider'
22
- import { SheetGroupItem } from './sheetGroup/SheetGroupItem'
17
+ import { SheetGroupItem , SheetGroupItemProp } from './sheetGroup/SheetGroupItem'
23
18
24
19
export interface SheetGroupProps { }
25
20
@@ -73,46 +68,32 @@ const EditorGroupName: FC = () => {
73
68
const SheetGroup : FC < SheetGroupProps > = ( ) => {
74
69
const { existedGroups, existedOperators } = useSheet ( )
75
70
76
- const [ coverGroup , setCoverGroup ] = useState < Group > ( )
77
-
78
- const defaultGroup = useMemo < Group [ ] > ( ( ) => {
79
- const result : Group [ ] = [ ]
80
- PROFESSIONS . forEach ( ( proItem ) => {
81
- proItem . sub ?. forEach ( ( subProItem ) => {
82
- const operators = existedOperators . filter (
83
- ( opItem ) =>
84
- OPERATORS . find ( ( opInfoItem ) => opInfoItem . name === opItem . name )
85
- ?. subProf === subProItem . id ,
86
- )
87
- if ( operators . length ) {
88
- const groupName = proItem . name + '-' + subProItem . name
89
- if ( ! existedGroups . find ( ( { name } ) => name === groupName ) )
90
- result . push ( {
91
- name : groupName ,
92
- opers : operators ,
93
- } )
94
- }
95
- } )
96
- } )
97
- const otherOperators = existedOperators . filter (
98
- ( opItem ) =>
99
- ! OPERATORS . find ( ( opInfoItem ) => opInfoItem . name === opItem . name ) ,
100
- )
101
- if ( otherOperators . length )
102
- result . push ( {
103
- name : '其它' ,
104
- opers : otherOperators ,
105
- } )
106
- return result
107
- } , [ existedOperators , existedGroups ] )
108
-
109
- const updateFavGroup = ( value : Group ) =>
110
- setFavGroups ( [
111
- ...[ ...favGroups ] . filter ( ( { name } ) => name !== value . name ) ,
112
- { ...value } ,
113
- ] )
71
+ const defaultGroup = useMemo < Group [ ] > (
72
+ ( ) =>
73
+ Object . entries (
74
+ existedOperators . reduce (
75
+ ( acc , { name, ...rest } ) => {
76
+ const { prof = '' , subProf = '' } =
77
+ OPERATORS . find ( ( { name : OPERName } ) => OPERName === name ) || { }
78
+ const profInfo = PROFESSIONS . find ( ( { id } ) => id === prof )
79
+ const subProfName = profInfo ?. sub ?. find (
80
+ ( { id } ) => id === subProf ,
81
+ ) ?. name
82
+ const key = ( profInfo ?. name || '其它' ) + '-' + ( subProfName || '' )
83
+ if ( ! acc [ key ] ) acc [ key ] = [ ]
84
+ acc [ key ] . push ( { name, ...rest } )
85
+ return acc
86
+ } ,
87
+ { } as Record < string , Operator [ ] > ,
88
+ ) ,
89
+ ) . map ( ( [ key , value ] ) => ( {
90
+ name : key ,
91
+ opers : value ,
92
+ } ) ) ,
93
+ [ existedOperators ] ,
94
+ )
114
95
115
- const [ favGroups , setFavGroups ] = useAtom ( favGroupAtom )
96
+ const favGroups = useAtomValue ( favGroupAtom )
116
97
117
98
return (
118
99
< >
@@ -127,60 +108,38 @@ const SheetGroup: FC<SheetGroupProps> = () => {
127
108
>
128
109
< EditorGroupName />
129
110
</ SheetContainerSkeleton >
130
- < SheetContainerSkeleton title = "已设置的干员组" icon = "cog" mini >
131
- < div >
132
- { existedGroups . length ? (
133
- < >
134
- { existedGroups . map ( ( item ) => (
135
- < SheetGroupItem groupInfo = { item } itemType = "selected" />
136
- ) ) }
137
- < H6 className = "my-2 text-center" >
138
- 已显示全部 { existedGroups . length } 个干员组
139
- </ H6 >
140
- </ >
141
- ) : (
142
- GroupNoData
143
- ) }
144
- </ div >
145
- </ SheetContainerSkeleton >
111
+ < SheetGroupItemsWithSkeleton
112
+ title = "已设置的干员组"
113
+ icon = "cog"
114
+ mini
115
+ groups = { existedGroups }
116
+ itemType = "selected"
117
+ />
118
+ { ! ! existedGroups . length && (
119
+ < H6 className = "my-2 text-center" >
120
+ 已显示全部 { existedGroups . length } 个干员组
121
+ </ H6 >
122
+ ) }
146
123
</ div >
147
124
</ div >
148
125
< Divider />
149
126
< div className = "flex-1" >
150
- < SheetContainerSkeleton title = "推荐分组" icon = "thumbs-up" mini >
151
- < div >
152
- { defaultGroup . length
153
- ? defaultGroup . map ( ( item ) => (
154
- < SheetGroupItem groupInfo = { item } itemType = "recommend" />
155
- ) )
156
- : GroupNoData }
157
- </ div >
158
- </ SheetContainerSkeleton >
159
- < SheetContainerSkeleton title = "收藏分组" icon = "star" mini >
160
- < div >
161
- { favGroups . length
162
- ? favGroups . map ( ( item ) => (
163
- < SheetGroupItem groupInfo = { item } itemType = "fav" />
164
- ) )
165
- : GroupNoData }
166
- </ div >
167
- </ SheetContainerSkeleton >
127
+ < SheetGroupItemsWithSkeleton
128
+ title = "推荐分组"
129
+ icon = "thumbs-up"
130
+ mini
131
+ groups = { defaultGroup }
132
+ itemType = "recommend"
133
+ />
134
+ < SheetGroupItemsWithSkeleton
135
+ title = "收藏分组"
136
+ icon = "star"
137
+ mini
138
+ groups = { favGroups }
139
+ itemType = "fav"
140
+ />
168
141
</ div >
169
142
</ div >
170
- < Alert
171
- isOpen = { ! ! coverGroup }
172
- confirmButtonText = "是"
173
- cancelButtonText = "否"
174
- icon = "error"
175
- intent = { Intent . DANGER }
176
- onConfirm = { ( ) => updateFavGroup ( coverGroup as Group ) }
177
- onClose = { ( ) => setCoverGroup ( undefined ) }
178
- >
179
- < div >
180
- < H5 > 收藏干员组: </ H5 >
181
- < p > 检测到同名的已收藏干员组 { coverGroup ?. name } ,是否覆盖?</ p >
182
- </ div >
183
- </ Alert >
184
143
</ >
185
144
)
186
145
}
@@ -190,3 +149,20 @@ export const SheetGroupContainer: FC<SheetGroupProps> = () => (
190
149
< SheetGroup />
191
150
</ SheetContainerSkeleton >
192
151
)
152
+
153
+ const SheetGroupItemsWithSkeleton : FC <
154
+ SheetContainerSkeletonProps & {
155
+ groups : SheetGroupItemProp [ 'groupInfo' ] [ ]
156
+ itemType : SheetGroupItemProp [ 'itemType' ]
157
+ }
158
+ > = ( { groups, itemType, ...sheetContainerSkeletonProps } ) => (
159
+ < SheetContainerSkeleton { ...sheetContainerSkeletonProps } >
160
+ < div >
161
+ { groups . length
162
+ ? groups . map ( ( item ) => (
163
+ < SheetGroupItem groupInfo = { item } itemType = { itemType } />
164
+ ) )
165
+ : GroupNoData }
166
+ </ div >
167
+ </ SheetContainerSkeleton >
168
+ )
0 commit comments