diff --git a/packages/plugins/@nocobase/plugin-file-manager/src/client-v2/previewer/__tests__/filePreviewTypes.test.tsx b/packages/plugins/@nocobase/plugin-file-manager/src/client-v2/previewer/__tests__/filePreviewTypes.test.tsx
new file mode 100644
index 00000000000..3a9b808601f
--- /dev/null
+++ b/packages/plugins/@nocobase/plugin-file-manager/src/client-v2/previewer/__tests__/filePreviewTypes.test.tsx
@@ -0,0 +1,59 @@
+/**
+ * This file is part of the NocoBase (R) project.
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
+ * Authors: NocoBase Team.
+ *
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
+ * For more information, please refer to: https://www.nocobase.com/agreement.
+ */
+
+import { render } from '@testing-library/react';
+import React from 'react';
+import { describe, expect, it, vi } from 'vitest';
+import { FilePreviewRenderer } from '../filePreviewTypes';
+
+vi.mock('@emotion/css', () => ({ css: () => '' }));
+
+vi.mock('antd', () => ({
+ Alert: ({ description }: { description?: React.ReactNode }) =>
{description}
,
+ Image: () => null,
+ Modal: ({ children, open, title }: React.PropsWithChildren<{ open?: boolean; title?: React.ReactNode }>) =>
+ open ? (
+
+
{title}
+ {children}
+
+ ) : null,
+ Space: ({ children }: React.PropsWithChildren) => {children}
,
+ Spin: () => null,
+}));
+
+vi.mock('react-i18next', () => ({
+ Trans: ({ children }: React.PropsWithChildren) => <>{children}>,
+ useTranslation: () => ({ t: (key: string) => key }),
+}));
+
+describe('FilePreviewRenderer', () => {
+ it('reloads the video element when switching files', () => {
+ const files = [
+ { filename: 'first.mp4', mimetype: 'video/mp4', url: '/files/first.mp4' },
+ { filename: 'second.mp4', mimetype: 'video/mp4', url: '/files/second.mp4' },
+ ];
+ const commonProps = {
+ list: files,
+ open: true,
+ onDownload: () => undefined,
+ };
+
+ const { container, rerender } = render();
+ const firstVideo = container.querySelector('video');
+
+ expect(firstVideo?.querySelector('source')?.getAttribute('src')).toBe('/files/first.mp4');
+
+ rerender();
+
+ const secondVideo = container.querySelector('video');
+ expect(secondVideo?.querySelector('source')?.getAttribute('src')).toBe('/files/second.mp4');
+ expect(secondVideo).not.toBe(firstVideo);
+ });
+});
diff --git a/packages/plugins/@nocobase/plugin-file-manager/src/client-v2/previewer/filePreviewTypes.tsx b/packages/plugins/@nocobase/plugin-file-manager/src/client-v2/previewer/filePreviewTypes.tsx
index c32d2d9f64f..70222871e56 100644
--- a/packages/plugins/@nocobase/plugin-file-manager/src/client-v2/previewer/filePreviewTypes.tsx
+++ b/packages/plugins/@nocobase/plugin-file-manager/src/client-v2/previewer/filePreviewTypes.tsx
@@ -1331,7 +1331,7 @@ const VideoPreviewer = ({ file }: FilePreviewerProps) => {
return null;
}
return (
-