mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-26 15:26:19 +00:00
feat: optimize code
This commit is contained in:
@@ -10,7 +10,7 @@ export const MetadataMiddlewareProvider = ({ repoID, currentPath, repoInfo, onTr
|
|||||||
const { enableMetadata, enableOCR, enableTags, tagsLang } = useMetadataStatus();
|
const { enableMetadata, enableOCR, enableTags, tagsLang } = useMetadataStatus();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<MetadataMiddlewareContext.Provider>
|
<MetadataMiddlewareContext.Provider value={{}}>
|
||||||
<CollaboratorsProvider repoID={repoID}>
|
<CollaboratorsProvider repoID={repoID}>
|
||||||
<TagsProvider repoID={repoID} currentPath={currentPath} repoInfo={repoInfo} selectTagsView={onTreeNodeClick} tagsChangedCallback={tagsChangedCallback}>
|
<TagsProvider repoID={repoID} currentPath={currentPath} repoInfo={repoInfo} selectTagsView={onTreeNodeClick} tagsChangedCallback={tagsChangedCallback}>
|
||||||
<MetadataAIOperationsProvider
|
<MetadataAIOperationsProvider
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
.sf-metadata-ocr-file-dialog .sf-centered-loading {
|
.sf-metadata-ocr-file-dialog .longtext-header-divider {
|
||||||
border-top: 1px solid #e9ecef;
|
border-bottom: 1px solid #e9ecef;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sf-metadata-ocr-file-dialog .seafile-multicolor-icon-save {
|
.sf-metadata-ocr-file-dialog .seafile-multicolor-icon-save {
|
||||||
|
@@ -3,8 +3,6 @@ import PropTypes from 'prop-types';
|
|||||||
import classnames from 'classnames';
|
import classnames from 'classnames';
|
||||||
import { I18nextProvider } from 'react-i18next';
|
import { I18nextProvider } from 'react-i18next';
|
||||||
import { SimpleEditor, getBrowserInfo, LongTextModal, BrowserTip, slateToMdString, MarkdownPreview } from '@seafile/seafile-editor';
|
import { SimpleEditor, getBrowserInfo, LongTextModal, BrowserTip, slateToMdString, MarkdownPreview } from '@seafile/seafile-editor';
|
||||||
import CenteredLoading from '../../../../components/centered-loading';
|
|
||||||
import toaster from '../../../../components/toast';
|
|
||||||
import { gettext, lang } from '../../../../utils/constants';
|
import { gettext, lang } from '../../../../utils/constants';
|
||||||
import { getFileNameFromRecord, getParentDirFromRecord } from '../../../utils/cell';
|
import { getFileNameFromRecord, getParentDirFromRecord } from '../../../utils/cell';
|
||||||
import { Utils } from '../../../../utils/utils';
|
import { Utils } from '../../../../utils/utils';
|
||||||
@@ -15,6 +13,7 @@ import './index.css';
|
|||||||
|
|
||||||
const OCRResultDialog = ({ record, onToggle, saveToDescription }) => {
|
const OCRResultDialog = ({ record, onToggle, saveToDescription }) => {
|
||||||
const [isLoading, setLoading] = useState(true);
|
const [isLoading, setLoading] = useState(true);
|
||||||
|
const [errorMessage, setErrorMessage] = useState('');
|
||||||
const [isFullScreen, setIsFullScreen] = useState(false);
|
const [isFullScreen, setIsFullScreen] = useState(false);
|
||||||
const [dialogStyle, setDialogStyle] = useState({});
|
const [dialogStyle, setDialogStyle] = useState({});
|
||||||
|
|
||||||
@@ -46,7 +45,6 @@ const OCRResultDialog = ({ record, onToggle, saveToDescription }) => {
|
|||||||
const onContainerKeyDown = useCallback((event) => {
|
const onContainerKeyDown = useCallback((event) => {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
if (event.keyCode === 27) {
|
if (event.keyCode === 27) {
|
||||||
event.stopPropagation();
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
onToggle();
|
onToggle();
|
||||||
}
|
}
|
||||||
@@ -60,31 +58,44 @@ const OCRResultDialog = ({ record, onToggle, saveToDescription }) => {
|
|||||||
}, [saveToDescription, onToggle]);
|
}, [saveToDescription, onToggle]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const path = window.sfMetadataContext.canModifyRow(record) ? Utils.joinPath(parentDir, fileName) : '';
|
if (!window.sfMetadataContext.canModifyRow(record)) {
|
||||||
if (path === '') {
|
setErrorMessage(gettext('Permission denied'));
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const path = Utils.joinPath(parentDir, fileName);
|
||||||
window.sfMetadataContext.ocr(path).then(res => {
|
window.sfMetadataContext.ocr(path).then(res => {
|
||||||
const result = res.data?.ocr_result || '';
|
const result = res.data?.ocr_result || '';
|
||||||
ocrResult.current = result.replaceAll('\n\n', '\n').replaceAll('\n', '\n\n');
|
ocrResult.current = result.replaceAll('\f', '\n').replaceAll('\n\n', '\n').replaceAll('\n', '\n\n');
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
const errorMessage = gettext('Failed to extract text');
|
const errorMessage = gettext('Failed to extract text');
|
||||||
toaster.danger(errorMessage);
|
setErrorMessage(errorMessage);
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
});
|
});
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
document.addEventListener('keydown', onContainerKeyDown);
|
||||||
|
return () => {
|
||||||
|
document.removeEventListener('keydown', onContainerKeyDown);
|
||||||
|
};
|
||||||
|
}, [onContainerKeyDown]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<I18nextProvider i18n={ i18n }>
|
<I18nextProvider i18n={ i18n }>
|
||||||
<LongTextModal onModalClick={onToggle} containerClass="sf-metadata-ocr-file-dialog">
|
<LongTextModal onModalClick={onToggle} containerClass="sf-metadata-ocr-file-dialog">
|
||||||
<div style={dialogStyle} className="longtext-dialog-container">
|
<div style={dialogStyle} className="longtext-dialog-container">
|
||||||
<div className={classnames('longtext-header-container', { 'longtext-header-container-border': isWindowsWechat })}>
|
<div className={classnames('longtext-header-container', {
|
||||||
|
'longtext-header-container-border': isWindowsWechat,
|
||||||
|
'longtext-header-divider': isLoading || errorMessage
|
||||||
|
})}>
|
||||||
<div className="longtext-header">
|
<div className="longtext-header">
|
||||||
<span className="longtext-header-name">{gettext('OCR result')}</span>
|
<span className="longtext-header-name">{gettext('OCR result')}</span>
|
||||||
<div className="longtext-header-tool">
|
<div className="longtext-header-tool">
|
||||||
|
{!isLoading && !errorMessage && (
|
||||||
<span
|
<span
|
||||||
className="longtext-header-tool-item d-flex align-items-center mr-1"
|
className="longtext-header-tool-item d-flex align-items-center mr-1"
|
||||||
title={gettext('Save to description property')}
|
title={gettext('Save to description property')}
|
||||||
@@ -92,6 +103,7 @@ const OCRResultDialog = ({ record, onToggle, saveToDescription }) => {
|
|||||||
>
|
>
|
||||||
<Icon symbol="save" />
|
<Icon symbol="save" />
|
||||||
</span>
|
</span>
|
||||||
|
)}
|
||||||
<span
|
<span
|
||||||
className={classnames('longtext-header-tool-item mr-1 iconfont icon-full-screen', { 'long-text-full-screen': isFullScreen })}
|
className={classnames('longtext-header-tool-item mr-1 iconfont icon-full-screen', { 'long-text-full-screen': isFullScreen })}
|
||||||
onClick={onFullScreenToggle}
|
onClick={onFullScreenToggle}
|
||||||
@@ -112,14 +124,14 @@ const OCRResultDialog = ({ record, onToggle, saveToDescription }) => {
|
|||||||
onKeyDown={onContainerKeyDown}
|
onKeyDown={onContainerKeyDown}
|
||||||
className={classnames('longtext-content-container', { 'longtext-container-scroll': isWindowsWechat })}
|
className={classnames('longtext-content-container', { 'longtext-container-scroll': isWindowsWechat })}
|
||||||
>
|
>
|
||||||
{isLoading ? (
|
{errorMessage ? (
|
||||||
<CenteredLoading />
|
<div className="w-100 h-100 d-flex align-items-center justify-content-center error">{errorMessage}</div>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
{isWindowsWechat ? (
|
{isWindowsWechat ? (
|
||||||
<MarkdownPreview isWindowsWechat={isWindowsWechat} value={ocrResult.current} isShowOutline={false} />
|
<MarkdownPreview isWindowsWechat={isWindowsWechat} value={ocrResult.current} isShowOutline={false} />
|
||||||
) : (
|
) : (
|
||||||
<SimpleEditor ref={editorRef} focusEnd={false} value={ocrResult.current} />
|
<SimpleEditor ref={editorRef} isFetching={isLoading} focusEnd={false} value={ocrResult.current} />
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
Reference in New Issue
Block a user