2023-07-27 05:31:52 +00:00
|
|
|
<!--
|
|
|
|
SPDX-FileCopyrightText: syuilo and other misskey contributors
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
-->
|
|
|
|
|
2019-03-19 08:26:07 +00:00
|
|
|
<template>
|
2023-05-19 04:58:09 +00:00
|
|
|
<div ref="thumbnail" :class="$style.root">
|
2022-06-16 07:05:43 +00:00
|
|
|
<ImgWithBlurhash v-if="isThumbnailAvailable" :hash="file.blurhash" :src="file.thumbnailUrl" :alt="file.name" :title="file.name" :cover="fit !== 'contain'"/>
|
2023-09-30 19:53:52 +00:00
|
|
|
<i v-else-if="is === 'image'" class="ph-image-square ph-bold ph-lg" :class="$style.icon"></i>
|
|
|
|
<i v-else-if="is === 'video'" class="ph-video ph-bold ph-lg" :class="$style.icon"></i>
|
|
|
|
<i v-else-if="is === 'audio' || is === 'midi'" class="ph-file-audio ph-bold ph-lg" :class="$style.icon"></i>
|
|
|
|
<i v-else-if="is === 'csv'" class="ph-file-text ph-bold ph-lg" :class="$style.icon"></i>
|
|
|
|
<i v-else-if="is === 'pdf'" class="ph-file-text ph-bold ph-lg" :class="$style.icon"></i>
|
|
|
|
<i v-else-if="is === 'textfile'" class="ph-file-text ph-bold ph-lg" :class="$style.icon"></i>
|
|
|
|
<i v-else-if="is === 'archive'" class="ph-file-zip ph-bold ph-lg" :class="$style.icon"></i>
|
|
|
|
<i v-else class="ph-file ph-bold ph-lg" :class="$style.icon"></i>
|
2021-04-20 14:22:59 +00:00
|
|
|
|
2023-09-30 19:53:52 +00:00
|
|
|
<i v-if="isThumbnailAvailable && is === 'video'" class="ph-video ph-bold ph-lg" :class="$style.iconSub"></i>
|
2019-03-19 08:26:07 +00:00
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
2022-01-18 14:06:16 +00:00
|
|
|
<script lang="ts" setup>
|
|
|
|
import { computed } from 'vue';
|
|
|
|
import * as Misskey from 'misskey-js';
|
2022-08-30 15:24:33 +00:00
|
|
|
import ImgWithBlurhash from '@/components/MkImgWithBlurhash.vue';
|
2019-03-19 08:26:07 +00:00
|
|
|
|
2022-01-18 14:06:16 +00:00
|
|
|
const props = defineProps<{
|
|
|
|
file: Misskey.entities.DriveFile;
|
|
|
|
fit: string;
|
|
|
|
}>();
|
2019-03-19 08:26:07 +00:00
|
|
|
|
2022-01-18 14:06:16 +00:00
|
|
|
const is = computed(() => {
|
|
|
|
if (props.file.type.startsWith('image/')) return 'image';
|
|
|
|
if (props.file.type.startsWith('video/')) return 'video';
|
|
|
|
if (props.file.type === 'audio/midi') return 'midi';
|
|
|
|
if (props.file.type.startsWith('audio/')) return 'audio';
|
|
|
|
if (props.file.type.endsWith('/csv')) return 'csv';
|
|
|
|
if (props.file.type.endsWith('/pdf')) return 'pdf';
|
|
|
|
if (props.file.type.startsWith('text/')) return 'textfile';
|
|
|
|
if ([
|
2022-06-16 07:05:43 +00:00
|
|
|
'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(archiveType => archiveType === props.file.type)) return 'archive';
|
2022-01-18 14:06:16 +00:00
|
|
|
return 'unknown';
|
|
|
|
});
|
|
|
|
|
|
|
|
const isThumbnailAvailable = computed(() => {
|
|
|
|
return props.file.thumbnailUrl
|
|
|
|
? (is.value === 'image' as const || is.value === 'video')
|
|
|
|
: false;
|
2019-03-19 08:26:07 +00:00
|
|
|
});
|
|
|
|
</script>
|
|
|
|
|
2023-05-19 04:58:09 +00:00
|
|
|
<style lang="scss" module>
|
|
|
|
.root {
|
2020-02-07 11:25:49 +00:00
|
|
|
position: relative;
|
2021-12-10 01:46:29 +00:00
|
|
|
display: flex;
|
2022-06-20 08:38:49 +00:00
|
|
|
background: var(--panel);
|
2023-09-30 23:20:20 +00:00
|
|
|
border-radius: 5px;
|
2022-07-13 12:41:06 +00:00
|
|
|
overflow: clip;
|
2023-05-19 04:58:09 +00:00
|
|
|
}
|
2019-03-19 08:26:07 +00:00
|
|
|
|
2023-05-19 04:58:09 +00:00
|
|
|
.iconSub {
|
|
|
|
position: absolute;
|
|
|
|
width: 30%;
|
|
|
|
height: auto;
|
|
|
|
margin: 0;
|
|
|
|
right: 4%;
|
|
|
|
bottom: 4%;
|
|
|
|
}
|
2019-03-19 08:26:07 +00:00
|
|
|
|
2023-05-19 04:58:09 +00:00
|
|
|
.icon {
|
|
|
|
pointer-events: none;
|
|
|
|
margin: auto;
|
|
|
|
font-size: 32px;
|
|
|
|
color: #777;
|
2020-01-29 19:37:25 +00:00
|
|
|
}
|
2019-03-19 08:26:07 +00:00
|
|
|
</style>
|