1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-26 07:22:34 +00:00

feat: optimize code

This commit is contained in:
杨国璇
2025-06-06 15:54:30 +08:00
parent 3f145fe7f1
commit ad7d47d408
3 changed files with 33 additions and 21 deletions

View File

@@ -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

View File

@@ -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 {

View File

@@ -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,38 +58,52 @@ 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">
<span {!isLoading && !errorMessage && (
className="longtext-header-tool-item d-flex align-items-center mr-1" <span
title={gettext('Save to description property')} className="longtext-header-tool-item d-flex align-items-center mr-1"
onClick={onSave} title={gettext('Save to description property')}
> onClick={onSave}
<Icon symbol="save" /> >
</span> <Icon symbol="save" />
</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} />
)} )}
</> </>
)} )}