diff --git a/src/components/MessagesList/MessagesGroup/Message/MessagePart/FilePreview.spec.js b/src/components/MessagesList/MessagesGroup/Message/MessagePart/FilePreview.spec.js
index 6bb5412264f..098107f0f14 100644
--- a/src/components/MessagesList/MessagesGroup/Message/MessagePart/FilePreview.spec.js
+++ b/src/components/MessagesList/MessagesGroup/Message/MessagePart/FilePreview.spec.js
@@ -23,7 +23,6 @@ describe('FilePreview.vue', () => {
let localVue
let testStoreConfig
let propsData
- let imageMock
let getUserIdMock
let oldPixelRatio
@@ -39,16 +38,6 @@ describe('FilePreview.vue', () => {
testStoreConfig.modules.actorStore.getters.getUserId = () => getUserIdMock
store = new Vuex.Store(testStoreConfig)
- imageMock = {
- onload: jest.fn(),
- onerror: jest.fn(),
- src: null,
- }
- jest.spyOn(global, 'Image')
- .mockImplementation(() => {
- return imageMock
- })
-
propsData = {
token: 'TOKEN',
file: {
@@ -84,7 +73,7 @@ describe('FilePreview.vue', () => {
propsData,
})
- await imageMock.onload()
+ await wrapper.find('img').trigger('load')
expect(wrapper.element.tagName).toBe('A')
const imageUrl = parseRelativeUrl(wrapper.find('img').attributes('src'))
@@ -107,7 +96,7 @@ describe('FilePreview.vue', () => {
propsData,
})
- await imageMock.onload()
+ await wrapper.find('img').trigger('load')
expect(wrapper.element.tagName).toBe('A')
const imageUrl = parseRelativeUrl(wrapper.find('img').attributes('src'))
@@ -129,7 +118,7 @@ describe('FilePreview.vue', () => {
propsData,
})
- await imageMock.onload()
+ await wrapper.find('img').trigger('load')
expect(wrapper.element.tagName).toBe('A')
const imageUrl = parseRelativeUrl(wrapper.find('img').attributes('src'))
@@ -145,7 +134,7 @@ describe('FilePreview.vue', () => {
propsData,
})
- await imageMock.onload()
+ await wrapper.find('img').trigger('load')
expect(wrapper.element.tagName).toBe('A')
const imageUrl = parseRelativeUrl(wrapper.find('img').attributes('src'))
@@ -185,7 +174,7 @@ describe('FilePreview.vue', () => {
propsData,
})
- await imageMock.onload()
+ await wrapper.find('img').trigger('load')
expect(wrapper.element.tagName).toBe('DIV')
expect(wrapper.find('img').attributes('src')).toBe('blob:XYZ')
@@ -206,8 +195,8 @@ describe('FilePreview.vue', () => {
})
expect(wrapper.element.tagName).toBe('A')
- expect(wrapper.find('img').exists()).toBe(false)
- expect(wrapper.find('.loading').exists()).toBe(true)
+ const spinner = wrapper.findComponent({ name: 'NcLoadingIcon' })
+ expect(spinner.exists()).toBe(true)
})
test('renders default mime icon on load error', async () => {
@@ -218,7 +207,7 @@ describe('FilePreview.vue', () => {
propsData,
})
- await imageMock.onerror()
+ await wrapper.find('img').trigger('error')
expect(wrapper.element.tagName).toBe('A')
const imageUrl = wrapper.find('img').attributes('src')
@@ -235,7 +224,7 @@ describe('FilePreview.vue', () => {
propsData,
})
- await imageMock.onload()
+ await wrapper.find('img').trigger('load')
expect(wrapper.element.tagName).toBe('A')
const imageUrl = wrapper.find('img').attributes('src')
@@ -259,7 +248,7 @@ describe('FilePreview.vue', () => {
propsData,
})
- await imageMock.onload()
+ await wrapper.find('img').trigger('load')
expect(wrapper.element.tagName).toBe('A')
expect(wrapper.find('img').attributes('src'))
@@ -276,7 +265,7 @@ describe('FilePreview.vue', () => {
propsData,
})
- await imageMock.onload()
+ await wrapper.find('img').trigger('load')
expect(wrapper.element.tagName).toBe('A')
expect(wrapper.find('img').attributes('src'))
@@ -294,7 +283,7 @@ describe('FilePreview.vue', () => {
propsData,
})
- await imageMock.onload()
+ await wrapper.find('img').trigger('load')
expect(wrapper.element.tagName).toBe('A')
expect(wrapper.find('img').attributes('src'))
@@ -311,7 +300,7 @@ describe('FilePreview.vue', () => {
propsData,
})
- await imageMock.onload()
+ await wrapper.find('img').trigger('load')
expect(wrapper.element.tagName).toBe('A')
const imageUrl = parseRelativeUrl(wrapper.find('img').attributes('src'))
@@ -370,7 +359,7 @@ describe('FilePreview.vue', () => {
propsData,
})
- await imageMock.onload()
+ await wrapper.find('img').trigger('load')
await wrapper.find('a').trigger('click')
@@ -404,7 +393,7 @@ describe('FilePreview.vue', () => {
propsData,
})
- await imageMock.onload()
+ await wrapper.find('img').trigger('load')
await wrapper.find('a').trigger('click')
@@ -419,7 +408,7 @@ describe('FilePreview.vue', () => {
propsData,
})
- await imageMock.onload()
+ await wrapper.find('img').trigger('load')
// no error
await wrapper.find('a').trigger('click')
@@ -450,7 +439,7 @@ describe('FilePreview.vue', () => {
propsData,
})
- await imageMock.onload()
+ await wrapper.find('img').trigger('load')
const buttonEl = wrapper.findComponent(PlayCircleOutline)
expect(buttonEl.exists()).toBe(visible)
@@ -491,7 +480,7 @@ describe('FilePreview.vue', () => {
propsData,
})
- await imageMock.onerror()
+ await wrapper.find('img').trigger('error')
const buttonEl = wrapper.findComponent(PlayCircleOutline)
expect(buttonEl.exists()).toBe(false)
@@ -524,7 +513,7 @@ describe('FilePreview.vue', () => {
propsData,
})
- await imageMock.onload()
+ await wrapper.find('img').trigger('load')
expect(wrapper.element.tagName).toBe('DIV')
await wrapper.findComponent(NcButton).trigger('click')
diff --git a/src/components/MessagesList/MessagesGroup/Message/MessagePart/FilePreview.vue b/src/components/MessagesList/MessagesGroup/Message/MessagePart/FilePreview.vue
index 8633d4fa2ec..7d8462eb5d7 100644
--- a/src/components/MessagesList/MessagesGroup/Message/MessagePart/FilePreview.vue
+++ b/src/components/MessagesList/MessagesGroup/Message/MessagePart/FilePreview.vue
@@ -15,40 +15,36 @@
v-bind="filePreviewBinding"
@click.exact="handleClick"
@keydown.enter="handleClick">
-
-
-
-
-
+
-
-
+ :alt="file.name"
+ :src="failed ? defaultIconUrl : previewUrl"
+ @load="onLoad"
+ @error="onError">
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
{
- this.isLoading = false
- this.failed = true
- }
- img.onload = () => {
- this.isLoading = false
- }
- img.src = this.previewUrl
},
beforeDestroy() {
@@ -495,6 +487,16 @@ export default {
methods: {
t,
+
+ onLoad() {
+ this.isLoading = false
+ },
+
+ onError() {
+ this.isLoading = false
+ this.failed = true
+ },
+
handleClick(event) {
if (this.isUploadEditor) {
this.$emit('remove-file', this.file.id)
@@ -574,12 +576,6 @@ export default {
transform: translate(100%, -50%);
}
- .loading {
- display: inline-block;
- min-width: 32px;
- background-color: var(--color-background-dark);
- }
-
.mimeicon {
min-height: 128px;
}
@@ -590,31 +586,39 @@ export default {
}
.preview {
- display: inline-block;
border-radius: var(--border-radius);
max-width: 100%;
max-height: 384px;
}
.preview-medium {
- display: inline-block;
border-radius: var(--border-radius);
max-width: 100%;
max-height: 192px;
}
.preview-small {
- display: inline-block;
border-radius: var(--border-radius);
max-width: 100%;
max-height: 32px;
}
+ .preview-loading {
+ position: absolute;
+ border-radius: var(--border-radius);
+ width: 100%;
+ height: 100%;
+ background-color: var(--color-background-dark);
+ }
+
.image-container {
position: relative;
- display: inline-block;
+ display: inline-flex;
width: 100%;
height: 100%;
+ max-width: 100%;
+ max-height: 100%;
+ border-radius: var(--border-radius);
&.playable {
.preview {