diff --git a/web/src/pages/document-viewer/index.tsx b/web/src/pages/document-viewer/index.tsx
index 763c6ca3a..798e75c23 100644
--- a/web/src/pages/document-viewer/index.tsx
+++ b/web/src/pages/document-viewer/index.tsx
@@ -2,6 +2,8 @@ import { Images } from '@/constants/common';
import { api_host } from '@/utils/api';
import { Flex } from 'antd';
import { useParams, useSearchParams } from 'umi';
+import Md from './md';
+import Text from './text';
import Docx from './docx';
import Excel from './excel';
import Image from './image';
@@ -31,6 +33,9 @@ const DocumentViewer = () => {
)}
+ {ext === 'md' && }
+ {ext === 'txt' && }
+
{ext === 'pdf' && }
{(ext === 'xlsx' || ext === 'xls') && }
diff --git a/web/src/pages/document-viewer/md/index.tsx b/web/src/pages/document-viewer/md/index.tsx
new file mode 100644
index 000000000..f96cbafb3
--- /dev/null
+++ b/web/src/pages/document-viewer/md/index.tsx
@@ -0,0 +1,34 @@
+import React, { useEffect, useState } from 'react';
+import ReactMarkdown from 'react-markdown';
+import remarkGfm from 'remark-gfm';
+import FileError from '../file-error';
+
+interface MdProps {
+ filePath: string;
+}
+
+const Md: React.FC = ({ filePath }) => {
+ const [content, setContent] = useState('');
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ setError(null);
+ fetch(filePath)
+ .then((res) => {
+ if (!res.ok) throw new Error('Failed to fetch markdown file');
+ return res.text();
+ })
+ .then((text) => setContent(text))
+ .catch((err) => setError(err.message))
+ }, [filePath]);
+
+ if (error) return ({error});
+
+ return (
+
+ {content}
+
+ );
+};
+
+export default Md;
diff --git a/web/src/pages/document-viewer/text/index.tsx b/web/src/pages/document-viewer/text/index.tsx
new file mode 100644
index 000000000..750dfb189
--- /dev/null
+++ b/web/src/pages/document-viewer/text/index.tsx
@@ -0,0 +1,32 @@
+import React, { useEffect, useState } from 'react';
+import FileError from '../file-error';
+
+interface TxtProps {
+ filePath: string;
+}
+
+const Md: React.FC = ({ filePath }) => {
+ const [content, setContent] = useState('');
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ setError(null);
+ fetch(filePath)
+ .then((res) => {
+ if (!res.ok) throw new Error('Failed to fetch text file');
+ return res.text();
+ })
+ .then((text) => setContent(text))
+ .catch((err) => setError(err.message))
+ }, [filePath]);
+
+ if (error) return ({error});
+
+ return (
+
+ {content}
+
+ );
+};
+
+export default Md;