2019-03-19 17:26:07 +09:00
< template >
2020-07-19 00:24:07 +09:00
< div class = "zdjebgpv" ref = "thumbnail" >
2020-10-17 20:12:00 +09:00
< ImgWithBlurhash v -if = " isThumbnailAvailable " :hash ="file.blurhash" :src ="file.thumbnailUrl" :alt ="file.name" :title ="file.name" : style = "`object-fit: ${ fit }`" / >
< Fa :icon ="faFileImage" class = "icon" v -else -if = " is = = = ' image ' " / >
< Fa :icon ="faFileVideo" class = "icon" v -else -if = " is = = = ' video ' " / >
< Fa :icon ="faMusic" class = "icon" v -else -if = " is = = = ' audio ' | | is = = = ' midi ' " / >
< Fa :icon ="faFileCsv" class = "icon" v -else -if = " is = = = ' csv ' " / >
< Fa :icon ="faFilePdf" class = "icon" v -else -if = " is = = = ' pdf ' " / >
< Fa :icon ="faFileAlt" class = "icon" v -else -if = " is = = = ' textfile ' " / >
< Fa :icon ="faFileArchive" class = "icon" v -else -if = " is = = = ' archive ' " / >
< Fa :icon ="faFile" class = "icon" v -else / >
< Fa :icon ="faFilm" class = "icon-sub" v -if = " isThumbnailAvailable & & is = = = ' video ' " / >
2019-03-19 17:26:07 +09:00
< / div >
< / template >
< script lang = "ts" >
2020-10-17 20:12:00 +09:00
import { defineComponent } from 'vue' ;
2019-03-19 17:26:07 +09:00
import {
faFile ,
faFileAlt ,
faFileImage ,
faMusic ,
faFileVideo ,
faFileCsv ,
faFilePdf ,
faFileArchive ,
faFilm
} from '@fortawesome/free-solid-svg-icons' ;
2021-04-16 12:06:54 +09:00
import ImgWithBlurhash from '@client/components/img-with-blurhash.vue' ;
2021-03-23 17:30:14 +09:00
import { ColdDeviceStorage } from '@client/store' ;
2019-03-19 17:26:07 +09:00
2020-10-17 20:12:00 +09:00
export default defineComponent ( {
2020-07-19 00:24:07 +09:00
components : {
ImgWithBlurhash
} ,
2019-03-19 17:26:07 +09:00
props : {
file : {
type : Object ,
required : true
} ,
fit : {
type : String ,
2019-09-02 05:42:30 +09:00
required : false ,
default : 'cover'
2019-03-19 17:26:07 +09:00
} ,
} ,
data ( ) {
return {
isContextmenuShowing : false ,
isDragging : false ,
faFile ,
faFileAlt ,
faFileImage ,
faMusic ,
faFileVideo ,
faFileCsv ,
faFilePdf ,
faFileArchive ,
faFilm
} ;
} ,
computed : {
is ( ) : 'image' | 'video' | 'midi' | 'audio' | 'csv' | 'pdf' | 'textfile' | 'archive' | 'unknown' {
if ( this . file . type . startsWith ( 'image/' ) ) return 'image' ;
if ( this . file . type . startsWith ( 'video/' ) ) return 'video' ;
if ( this . file . type === 'audio/midi' ) return 'midi' ;
if ( this . file . type . startsWith ( 'audio/' ) ) return 'audio' ;
if ( this . file . type . endsWith ( '/csv' ) ) return 'csv' ;
if ( this . file . type . endsWith ( '/pdf' ) ) return 'pdf' ;
if ( this . file . type . startsWith ( 'text/' ) ) return 'textfile' ;
if ( [
"application/zip" ,
"application/x-cpio" ,
"application/x-bzip" ,
"application/x-bzip2" ,
"application/java-archive" ,
"application/x-rar-compressed" ,
"application/x-tar" ,
"application/gzip" ,
"application/x-7z-compressed"
] . some ( e => e === this . file . type ) ) return 'archive' ;
return 'unknown' ;
} ,
isThumbnailAvailable ( ) : boolean {
2019-03-19 23:35:22 +09:00
return this . file . thumbnailUrl
2019-04-14 17:12:04 +09:00
? ( this . is === 'image' || this . is === 'video' )
2019-03-19 23:35:22 +09:00
: false ;
2019-03-19 17:26:07 +09:00
} ,
} ,
mounted ( ) {
const audioTag = this . $refs . volumectrl as HTMLAudioElement ;
2020-12-19 10:55:52 +09:00
if ( audioTag ) audioTag . volume = ColdDeviceStorage . get ( 'mediaVolume' ) ;
2019-03-19 17:26:07 +09:00
} ,
methods : {
volumechange ( ) {
const audioTag = this . $refs . volumectrl as HTMLAudioElement ;
2020-12-19 10:55:52 +09:00
ColdDeviceStorage . set ( 'mediaVolume' , audioTag . volume ) ;
2019-03-19 17:26:07 +09:00
}
}
} ) ;
< / script >
2020-01-30 04:37:25 +09:00
< style lang = "scss" scoped >
. zdjebgpv {
2020-02-07 20:25:49 +09:00
position : relative ;
2019-03-19 17:26:07 +09:00
2020-01-30 04:37:25 +09:00
> . icon - sub {
position : absolute ;
width : 30 % ;
height : auto ;
margin : 0 ;
right : 4 % ;
bottom : 4 % ;
}
2019-03-19 17:26:07 +09:00
2020-01-30 04:37:25 +09:00
> * {
margin : auto ;
}
2019-04-06 00:51:31 +09:00
2020-07-19 00:24:07 +09:00
> . icon {
pointer - events : none ;
height : 65 % ;
width : 65 % ;
2020-01-30 04:37:25 +09:00
}
}
2019-03-19 17:26:07 +09:00
< / style >