chore(front): add file-type and heic-to dependencies, and update FileIcon component to support file type detection

This commit is contained in:
keven1024
2026-04-11 11:54:39 +08:00
parent 018d13ea78
commit 35654372a6
3 changed files with 86 additions and 2 deletions

View File

@@ -3,6 +3,8 @@ import { cx } from 'class-variance-authority'
import FileIcon from './File.vue'
import ImageIcon from './Image.vue'
import VideoIcon from './Video.vue'
import { fileTypeFromBuffer } from 'file-type'
export type filePreview = {
type: string
name: string
@@ -20,8 +22,19 @@ const props = withDefaults(
}
)
const isFile = computed(() => props?.file instanceof File)
const isImage = computed(() => isFile.value && props?.file?.type?.startsWith('image/'))
const isVideo = computed(() => isFile.value && props?.file?.type?.startsWith('video/'))
const { state: fileType } = useAsyncState(async () => {
if (!isFile.value) {
return null
}
if (!!props?.file?.type) {
return props?.file?.type
}
const { mime } = (await fileTypeFromBuffer(await (props?.file as File)?.arrayBuffer())) || {}
return mime
}, null)
const isImage = computed(() => isFile.value && fileType.value?.startsWith('image/'))
const isVideo = computed(() => isFile.value && fileType.value?.startsWith('video/'))
</script>
<template>

View File

@@ -36,8 +36,10 @@
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"dayjs": "^1.11.20",
"file-type": "^22.0.1",
"filesize": "^10.1.6",
"hash-wasm": "^4.12.0",
"heic-to": "^1.4.2",
"lodash-es": "^4.18.1",
"lucide-vue-next": "^0.542.0",
"markdown-it": "^14.1.1",

69
pnpm-lock.yaml generated
View File

@@ -101,12 +101,18 @@ importers:
dayjs:
specifier: ^1.11.20
version: 1.11.20
file-type:
specifier: ^22.0.1
version: 22.0.1
filesize:
specifier: ^10.1.6
version: 10.1.6
hash-wasm:
specifier: ^4.12.0
version: 4.12.0
heic-to:
specifier: ^1.4.2
version: 1.4.2
lodash-es:
specifier: ^4.18.1
version: 4.18.1
@@ -344,6 +350,9 @@ packages:
commander:
optional: true
'@borewit/text-codec@0.2.2':
resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==}
'@clack/core@1.2.0':
resolution: {integrity: sha512-qfxof/3T3t9DPU/Rj3OmcFyZInceqj/NVtO9rwIuJqCUgh32gwPjpFQQp/ben07qKlhpwq7GzfWpST4qdJ5Drg==}
@@ -2517,6 +2526,13 @@ packages:
'@tiptap/pm': ^3.22.2
vue: ^3.0.0
'@tokenizer/inflate@0.4.1':
resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==}
engines: {node: '>=18'}
'@tokenizer/token@0.3.0':
resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==}
'@tybys/wasm-util@0.10.1':
resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
@@ -3994,6 +4010,10 @@ packages:
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
engines: {node: '>=16.0.0'}
file-type@22.0.1:
resolution: {integrity: sha512-ww5Mhre0EE+jmBvOXTmXAbEMuZE7uX4a3+oRCQFNj8w++g3ev913N6tXQz0XTXbueQ5TWQfm6BdaViEHHn8bhA==}
engines: {node: '>=22'}
file-uri-to-path@1.0.0:
resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
@@ -4198,6 +4218,9 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
heic-to@1.4.2:
resolution: {integrity: sha512-y69thwxfNcEm2Vk8lbOD/cMabnvMJyOREfJYiCHcXCDqlfcPyJoBhyRc8+iDe1B95LRfpbTOpzxzY1xbRkdwBA==}
hey-listen@1.0.8:
resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==}
@@ -5731,6 +5754,10 @@ packages:
striptags@3.2.0:
resolution: {integrity: sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==}
strtok3@10.3.5:
resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==}
engines: {node: '>=18'}
structured-clone-es@2.0.0:
resolution: {integrity: sha512-5UuAHmBLXYPCl22xWJrFuGmIhBKQzxISPVz6E7nmTmTcAOpUzlbjKJsRrCE4vADmMQ0dzeCnlWn9XufnAGf76Q==}
@@ -5852,6 +5879,10 @@ packages:
resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
engines: {node: '>=0.6'}
token-types@6.1.2:
resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==}
engines: {node: '>=14.16'}
topojson-client@3.1.0:
resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==}
hasBin: true
@@ -5919,6 +5950,10 @@ packages:
ufo@1.6.3:
resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==}
uint8array-extras@1.5.0:
resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==}
engines: {node: '>=18'}
ultrahtml@1.6.0:
resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==}
@@ -6626,6 +6661,8 @@ snapshots:
citty: 0.2.2
commander: 13.1.0
'@borewit/text-codec@0.2.2': {}
'@clack/core@1.2.0':
dependencies:
fast-wrap-ansi: 0.1.6
@@ -8547,6 +8584,15 @@ snapshots:
'@tiptap/extension-bubble-menu': 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)
'@tiptap/extension-floating-menu': 3.22.2(@floating-ui/dom@1.7.6)(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)
'@tokenizer/inflate@0.4.1':
dependencies:
debug: 4.4.3
token-types: 6.1.2
transitivePeerDependencies:
- supports-color
'@tokenizer/token@0.3.0': {}
'@tybys/wasm-util@0.10.1':
dependencies:
tslib: 2.8.1
@@ -10293,6 +10339,15 @@ snapshots:
dependencies:
flat-cache: 4.0.1
file-type@22.0.1:
dependencies:
'@tokenizer/inflate': 0.4.1
strtok3: 10.3.5
token-types: 6.1.2
uint8array-extras: 1.5.0
transitivePeerDependencies:
- supports-color
file-uri-to-path@1.0.0: {}
filesize@10.1.6: {}
@@ -10486,6 +10541,8 @@ snapshots:
dependencies:
function-bind: 1.1.2
heic-to@1.4.2: {}
hey-listen@1.0.8: {}
hookable@5.5.3: {}
@@ -12434,6 +12491,10 @@ snapshots:
striptags@3.2.0: {}
strtok3@10.3.5:
dependencies:
'@tokenizer/token': 0.3.0
structured-clone-es@2.0.0: {}
stylehacks@7.0.8(postcss@8.5.8):
@@ -12558,6 +12619,12 @@ snapshots:
toidentifier@1.0.1: {}
token-types@6.1.2:
dependencies:
'@borewit/text-codec': 0.2.2
'@tokenizer/token': 0.3.0
ieee754: 1.2.1
topojson-client@3.1.0:
dependencies:
commander: 2.20.3
@@ -12600,6 +12667,8 @@ snapshots:
ufo@1.6.3: {}
uint8array-extras@1.5.0: {}
ultrahtml@1.6.0: {}
uncrypto@0.1.3: {}