@@ -8,6 +8,7 @@ import Global from '../../util/global';
88import downloadsIcon from '../navbar/downloads/downloads.png' ;
99import Spinner from '../spinner/spinner' ;
1010import ToastManager from '../../manager/toastManager' ;
11+ import FluentHover from '../../util/fluentHover' ;
1112
1213const BG = styled . div `
1314 margin-top: 4px;
@@ -23,7 +24,7 @@ const BG = styled.div`
2324 position: relative;
2425 overflow: hidden;
2526 flex-shrink: 0;
26- transition: transform 150ms;
27+ transition: 150ms;
2728 ${ props =>
2829 ! props . disableHover &&
2930 css `
@@ -167,156 +168,162 @@ const AssetCard = ({
167168 copyToClick,
168169 moveToClick,
169170 compact
170- } ) => (
171- < >
172- < ContextMenuTrigger holdToDisplay = { - 1 } id = { `assetcard${ asset . id } ` } >
173- < BG
174- disableHover = { disableHover }
175- tabIndex = { disableHover ? - 1 : 0 }
176- data-cachedid = { asset . cachedID }
177- data-assetid = { asset . id }
178- onClick = { onClick }
179- onKeyDown = { e => {
180- if ( e . keyCode === 13 || e . keyCode === 32 ) {
181- onClick ( e ) ;
182- }
183- } }
184- role = "button"
185- aria-pressed = "false"
186- compact = { compact }
187- >
188- { asset . iconPath && (
189- < Image
190- src = { `${ asset . iconPath . substring ( 0 , 1 ) === '/' ? 'file:///' : '' } ${ asset . iconPath } ` }
191- compact = { compact }
192- />
193- ) }
194- < Details >
195- { ! installed && asset . hosts && asset . hosts . curse && (
196- < ExtraInfo >
197- < img alt = "Downloads" src = { downloadsIcon } />
198- < p > { Global . abbreviateNumber ( asset . hosts . curse . downloadCount ) } </ p >
199- </ ExtraInfo >
171+ } ) => {
172+ const ref = React . createRef ( ) ;
173+ return (
174+ < >
175+ < ContextMenuTrigger holdToDisplay = { - 1 } id = { `assetcard${ asset . id } ` } >
176+ < BG
177+ disableHover = { disableHover }
178+ tabIndex = { disableHover ? - 1 : 0 }
179+ data-cachedid = { asset . cachedID }
180+ data-assetid = { asset . id }
181+ onClick = { onClick }
182+ onKeyDown = { e => {
183+ if ( e . keyCode === 13 || e . keyCode === 32 ) {
184+ onClick ( e ) ;
185+ }
186+ } }
187+ role = "button"
188+ aria-pressed = "false"
189+ compact = { compact }
190+ ref = { ref }
191+ onMouseMove = { e => ! disableHover && FluentHover . mouseMove ( e , ref , '#414141' , true , true ) }
192+ onMouseLeave = { ( ) => ! disableHover && FluentHover . mouseLeave ( ref , '#313131' ) }
193+ >
194+ { asset . iconPath && (
195+ < Image
196+ src = { `${ asset . iconPath . substring ( 0 , 1 ) === '/' ? 'file:///' : '' } ${ asset . iconPath } ` }
197+ compact = { compact }
198+ />
200199 ) }
201- < Title compact = { compact } > { asset . name } </ Title >
202- < Version buttonShown = { showInstall || showDelete } >
203- { ! showBlurb && asset . version && Global . cleanVersionName ( asset . version . displayName , asset ) }
204- { showBlurb && asset . blurb }
205- </ Version >
206- </ Details >
207- < Buttons >
200+ < Details >
201+ { ! installed && asset . hosts && asset . hosts . curse && (
202+ < ExtraInfo >
203+ < img alt = "Downloads" src = { downloadsIcon } />
204+ < p > { Global . abbreviateNumber ( asset . hosts . curse . downloadCount ) } </ p >
205+ </ ExtraInfo >
206+ ) }
207+ < Title compact = { compact } > { asset . name } </ Title >
208+ < Version buttonShown = { showInstall || showDelete } >
209+ { ! showBlurb && asset . version && Global . cleanVersionName ( asset . version . displayName , asset ) }
210+ { showBlurb && asset . blurb }
211+ </ Version >
212+ </ Details >
213+ < Buttons >
214+ { showDelete && (
215+ < Button
216+ onClick = { e => {
217+ e . stopPropagation ( ) ;
218+ deleteClick ( asset . id ) ;
219+ } }
220+ color = "red"
221+ >
222+ delete
223+ </ Button >
224+ ) }
225+
226+ { showInstall && ( installed || progressState . progress === 'installed' ) && (
227+ < Button disabled color = "green" >
228+ installed
229+ </ Button >
230+ ) }
231+
232+ { showInstall && ! installed && ! progressState . progress && (
233+ < Button color = "green" onClick = { installClick } >
234+ install
235+ </ Button >
236+ ) }
237+
238+ { showInstall && ! installed && progressState . progress === 'notavailable' && (
239+ < Button color = "green" disabled >
240+ not available
241+ </ Button >
242+ ) }
243+
244+ { progressState . progress === 'installing' && ! installed && showInstall && (
245+ < Button color = "green" disabled >
246+ < Spinner />
247+ </ Button >
248+ ) }
249+ </ Buttons >
250+ </ BG >
251+ </ ContextMenuTrigger >
252+ < ContextMenu holdToDisplay = { - 1 } id = { `assetcard${ asset . id } ` } >
253+ < >
208254 { showDelete && (
209- < Button
255+ < MenuItem
210256 onClick = { e => {
211257 e . stopPropagation ( ) ;
212258 deleteClick ( asset . id ) ;
213259 } }
214- color = "red"
215260 >
216- delete
217- </ Button >
218- ) }
219-
220- { showInstall && ( installed || progressState . progress === 'installed' ) && (
221- < Button disabled color = "green" >
222- installed
223- </ Button >
261+ Delete
262+ </ MenuItem >
224263 ) }
225-
226- { showInstall && ! installed && ! progressState . progress && (
227- < Button color = "green" onClick = { installClick } >
228- install
229- </ Button >
264+ { installed && (
265+ < MenuItem
266+ disabled = { asset . type === 'datapack' }
267+ onClick = { e => {
268+ e . stopPropagation ( ) ;
269+ copyToClick ( asset . id ) ;
270+ } }
271+ >
272+ Copy to...
273+ </ MenuItem >
230274 ) }
231-
232- { showInstall && ! installed && progressState . progress === 'notavailable' && (
233- < Button color = "green" disabled >
234- not available
235- </ Button >
275+ { installed && (
276+ < MenuItem
277+ disabled = { asset . type === 'datapack' }
278+ onClick = { e => {
279+ e . stopPropagation ( ) ;
280+ moveToClick ( asset . id ) ;
281+ } }
282+ >
283+ Move to...
284+ </ MenuItem >
236285 ) }
237-
238- { progressState . progress === 'installing' && ! installed && showInstall && (
239- < Button color = "green" disabled >
240- < Spinner />
241- </ Button >
286+ { showInstall && ! installed && ! progressState . progress && < MenuItem onClick = { installClick } > Install</ MenuItem > }
287+ { showInstall && ( installed || progressState . progress === 'installed' ) && (
288+ < MenuItem disabled > Installed</ MenuItem >
242289 ) }
243- </ Buttons >
244- </ BG >
245- </ ContextMenuTrigger >
246- < ContextMenu holdToDisplay = { - 1 } id = { `assetcard${ asset . id } ` } >
247- < >
248- { showDelete && (
249- < MenuItem
250- onClick = { e => {
251- e . stopPropagation ( ) ;
252- deleteClick ( asset . id ) ;
253- } }
254- >
255- Delete
256- </ MenuItem >
257- ) }
258- { installed && (
259- < MenuItem
260- disabled = { asset . type === 'datapack' }
261- onClick = { e => {
262- e . stopPropagation ( ) ;
263- copyToClick ( asset . id ) ;
264- } }
265- >
266- Copy to...
267- </ MenuItem >
268- ) }
269- { installed && (
270- < MenuItem
271- disabled = { asset . type === 'datapack' }
272- onClick = { e => {
273- e . stopPropagation ( ) ;
274- moveToClick ( asset . id ) ;
275- } }
276- >
277- Move to...
278- </ MenuItem >
279- ) }
280- { showInstall && ! installed && ! progressState . progress && < MenuItem onClick = { installClick } > Install</ MenuItem > }
281- { showInstall && ( installed || progressState . progress === 'installed' ) && (
282- < MenuItem disabled > Installed</ MenuItem >
283- ) }
284- { asset . hosts && asset . hosts . curse && (
285- < >
286- < SubMenu hoverDelay = { 0 } title = "CurseForge" >
287- < MenuItem
288- onClick = { ( ) => {
289- clipboard . writeText (
290- `${ asset . name } on CurseForge:\n${ asset . blurb } \nhttps://minecraft.curseforge.com/projects/${ asset . hosts . curse . id } \n\nTry it with Minecraft Manager, the easiest way to manage Minecraft Mods and Modpacks (is.gd/mcmtet)`
291- ) ;
290+ { asset . hosts && asset . hosts . curse && (
291+ < >
292+ < SubMenu hoverDelay = { 0 } title = "CurseForge" >
293+ < MenuItem
294+ onClick = { ( ) => {
295+ clipboard . writeText (
296+ `${ asset . name } on CurseForge:\n${ asset . blurb } \nhttps://minecraft.curseforge.com/projects/${ asset . hosts . curse . id } \n\nTry it with Minecraft Manager, the easiest way to manage Minecraft Mods and Modpacks (is.gd/mcmtet)`
297+ ) ;
292298
293- ToastManager . noticeToast ( 'Copied!' ) ;
294- } }
295- >
296- Copy with Info
297- </ MenuItem >
298- < MenuItem
299- onClick = { ( ) => shell . openExternal ( `https://minecraft.curseforge.com/projects/${ asset . hosts . curse . id } ` ) }
300- >
301- View
302- </ MenuItem >
299+ ToastManager . noticeToast ( 'Copied!' ) ;
300+ } }
301+ >
302+ Copy with Info
303+ </ MenuItem >
304+ < MenuItem
305+ onClick = { ( ) => shell . openExternal ( `https://minecraft.curseforge.com/projects/${ asset . hosts . curse . id } ` ) }
306+ >
307+ View
308+ </ MenuItem >
303309
304- < MenuItem
305- onClick = { ( ) => {
306- clipboard . writeText ( `https://minecraft.curseforge.com/projects/${ asset . hosts . curse . id } ` ) ;
310+ < MenuItem
311+ onClick = { ( ) => {
312+ clipboard . writeText ( `https://minecraft.curseforge.com/projects/${ asset . hosts . curse . id } ` ) ;
307313
308- ToastManager . noticeToast ( 'Copied!' ) ;
309- } }
310- >
311- Copy Link
312- </ MenuItem >
313- </ SubMenu >
314- </ >
315- ) }
316- </ >
317- </ ContextMenu >
318- </ >
319- ) ;
314+ ToastManager . noticeToast ( 'Copied!' ) ;
315+ } }
316+ >
317+ Copy Link
318+ </ MenuItem >
319+ </ SubMenu >
320+ </ >
321+ ) }
322+ </ >
323+ </ ContextMenu >
324+ </ >
325+ ) ;
326+ } ;
320327
321328AssetCard . propTypes = {
322329 asset : PropTypes . object ,
0 commit comments