7
7
H4 ,
8
8
H5 ,
9
9
Icon ,
10
- Tag ,
10
+ Tag
11
11
} from '@blueprintjs/core'
12
12
import { Tooltip2 } from '@blueprintjs/popover2'
13
13
@@ -16,15 +16,152 @@ import { handleCopyShortCode, handleDownloadJSON } from 'services/operation'
16
16
17
17
import { RelativeTime } from 'components/RelativeTime'
18
18
import { OperationRating } from 'components/viewer/OperationRating'
19
- import { OperationListItem } from 'models/operation'
19
+ import { OpDifficulty , OperationListItem } from 'models/operation'
20
20
21
21
import { useLevels } from '../apis/arknights'
22
22
import { CopilotDocV1 } from '../models/copilot.schema'
23
23
import { createCustomLevel , findLevelByStageName } from '../models/level'
24
24
import { Paragraphs } from './Paragraphs'
25
- import { EDifficultyLevel } from './entity/ELevel'
25
+ import { EDifficulty } from './entity/EDifficulty'
26
+ import { EDifficultyLevel , NeoELevel } from './entity/ELevel'
26
27
import { OperationViewer } from './viewer/OperationViewer'
27
28
29
+ export const NeoOperationCard = ( {
30
+ operation,
31
+ operationDoc,
32
+ } : {
33
+ operation : OperationListItem
34
+ operationDoc : CopilotDocV1 . Operation
35
+ } ) => {
36
+ const levels = useLevels ( ) ?. data ?. data || [ ]
37
+ const [ drawerOpen , setDrawerOpen ] = useState ( false )
38
+
39
+ return (
40
+ < >
41
+ < Drawer
42
+ size = { DrawerSize . LARGE }
43
+ isOpen = { drawerOpen }
44
+ onClose = { ( ) => setDrawerOpen ( false ) }
45
+ >
46
+ < OperationViewer
47
+ operationId = { operation . id }
48
+ onCloseDrawer = { ( ) => setDrawerOpen ( false ) }
49
+ />
50
+ </ Drawer >
51
+
52
+ < Card
53
+ interactive = { true }
54
+ elevation = { Elevation . TWO }
55
+ className = "flex flex-col gap-2"
56
+ onClick = { ( ) => setDrawerOpen ( true ) }
57
+ >
58
+
59
+ { /* title */ }
60
+ < div className = "flex gap-1" >
61
+ < Tooltip2 content = { operationDoc . doc . title } className = 'flex-1 whitespace-nowrap overflow-hidden text-ellipsis' >
62
+ < H4 className = "p-0 m-0 whitespace-nowrap overflow-hidden text-ellipsis" >
63
+ { operationDoc . doc . title }
64
+ </ H4 >
65
+ </ Tooltip2 >
66
+ < Tooltip2
67
+ placement = "bottom"
68
+ content = {
69
+ < div className = "max-w-sm dark:text-slate-900" >
70
+ 下载原 JSON
71
+ </ div >
72
+ }
73
+ >
74
+ < Button
75
+ small
76
+ icon = "download"
77
+ onClick = { ( e ) => {
78
+ e . stopPropagation ( )
79
+ handleDownloadJSON ( operationDoc )
80
+ } }
81
+ />
82
+ </ Tooltip2 >
83
+ < Tooltip2
84
+ placement = "bottom"
85
+ content = {
86
+ < div className = "max-w-sm dark:text-slate-900" >
87
+ 复制神秘代码
88
+ </ div >
89
+ }
90
+ >
91
+ < Button
92
+ small
93
+ icon = "clipboard"
94
+ onClick = { ( e ) => {
95
+ e . stopPropagation ( )
96
+ handleCopyShortCode ( operation )
97
+ } }
98
+ />
99
+ </ Tooltip2 >
100
+ </ div >
101
+ < div className = "flex items-center text-slate-900" >
102
+ < div className = "flex flex-wrap" >
103
+ < NeoELevel level = { findLevelByStageName ( levels , operationDoc . stageName ) ||
104
+ createCustomLevel ( operationDoc . stageName ) } />
105
+ < EDifficulty difficulty = { operationDoc . difficulty ?? OpDifficulty . UNKNOWN } />
106
+ </ div >
107
+ </ div >
108
+ < div className = 'flex-1 flex flex-col gap-2 justify-center' >
109
+ < div className = "text-gray-700 leading-normal" >
110
+ < Paragraphs
111
+ content = { operationDoc . doc . details }
112
+ limitHeight = { 21 * 13.5 } // 13 lines, 21px per line; the extra 0.5 line is intentional so the `mask` effect is obvious
113
+ />
114
+ </ div >
115
+ < div >
116
+ < div className = "text-sm text-zinc-600 mb-2 font-bold" >
117
+ 干员/干员组
118
+ </ div >
119
+ < OperatorTags operationDoc = { operationDoc } />
120
+ </ div >
121
+ </ div >
122
+
123
+ < div className = 'flex' >
124
+ < div className = "flex items-center gap-1.5" >
125
+ < Icon icon = "star" />
126
+ < OperationRating
127
+ className = "text-sm"
128
+ operation = { operation }
129
+ layout = "horizontal"
130
+ />
131
+ </ div >
132
+ < div className = 'flex-1' />
133
+
134
+ < Tooltip2 placement = "top" content = { `访问量:${ operation . views } ` } >
135
+ < div >
136
+ < Icon icon = "eye-open" className = "mr-1.5" />
137
+ < span > { operation . views } </ span >
138
+ </ div >
139
+ </ Tooltip2 >
140
+ </ div >
141
+
142
+ < div className = 'flex' >
143
+ < div >
144
+ < Icon icon = "time" className = "mr-1.5" />
145
+ < RelativeTime
146
+ Tooltip2Props = { { placement : 'top' } }
147
+ moment = { operation . uploadTime }
148
+ />
149
+ </ div >
150
+ < div className = 'flex-1' />
151
+ < div className = "text-zinc-500" >
152
+ < Tooltip2 placement = "top" content = { `作者:${ operation . uploader } ` } >
153
+ < div >
154
+ < Icon icon = "user" className = "mr-1.5" />
155
+ < span > { operation . uploader } </ span >
156
+ </ div >
157
+ </ Tooltip2 >
158
+ </ div >
159
+ </ div >
160
+ </ Card >
161
+ </ >
162
+ )
163
+ }
164
+
28
165
export const OperationCard = ( {
29
166
operation,
30
167
operationDoc,
0 commit comments