1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-10 03:11:07 +00:00

feat: tags (#7029)

* feat: tags

* feat: optimize code

* feat: optimize ui

* feat: update title

* feat: update title

* Feat: tags status management

* feat: optimize code

* feat: optimize code

* feat: optimize code

* feat: optimize rebase

---------

Co-authored-by: 杨国璇 <ygx@Hello-word.local>
Co-authored-by: 杨国璇 <ygx@192.168.1.2>
This commit is contained in:
杨国璇
2024-11-22 17:11:55 +08:00
committed by GitHub
parent 0f6911bf50
commit 25860d1ab8
140 changed files with 5047 additions and 664 deletions

View File

@@ -0,0 +1 @@
export { MetadataStatusProvider, useMetadataStatus } from './metadata-status';

View File

@@ -0,0 +1,93 @@
import React, { useContext, useEffect, useCallback, useState, useMemo } from 'react';
import metadataAPI from '../metadata/api';
import { Utils } from '../utils/utils';
import toaster from '../components/toast';
// This hook provides content related to seahub interaction, such as whether to enable extended attributes
const EnableMetadataContext = React.createContext(null);
export const MetadataStatusProvider = ({ repoID, currentRepoInfo, hideMetadataView, children }) => {
const enableMetadataManagement = useMemo(() => {
if (currentRepoInfo?.encrypted) return false;
return window.app.pageOptions.enableMetadataManagement;
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [window.app.pageOptions.enableMetadataManagement, currentRepoInfo]);
const [isLoading, setLoading] = useState(true);
const [enableMetadata, setEnableMetadata] = useState(false);
const [enableTags, setEnableTags] = useState(false);
const cancelMetadataURL = useCallback(() => {
// If attribute extension is turned off, unmark the URL
const { origin, pathname, search } = window.location;
const urlParams = new URLSearchParams(search);
const param = urlParams.get('view') || urlParams.get('tag');
if (param) {
const url = `${origin}${pathname}`;
window.history.pushState({ url: url, path: '' }, '', url);
}
}, []);
useEffect(() => {
if (!enableMetadataManagement) {
cancelMetadataURL();
setLoading(false);
return;
}
metadataAPI.getMetadataStatus(repoID).then(res => {
const { enabled: enableMetadata, tags_enabled: enableTags } = res.data;
if (!enableMetadata) {
cancelMetadataURL();
}
setEnableTags(enableTags);
setEnableMetadata(enableMetadata);
setLoading(false);
}).catch(error => {
const errorMsg = Utils.getErrorMsg(error, true);
toaster.danger(errorMsg);
setEnableMetadata(false);
setLoading(false);
});
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [repoID, enableMetadataManagement]);
const updateEnableMetadata = useCallback((newValue) => {
if (newValue === enableMetadata) return;
if (!newValue) {
cancelMetadataURL();
setEnableTags(false);
}
setEnableMetadata(newValue);
}, [enableMetadata, cancelMetadataURL]);
const updateEnableTags = useCallback((newValue) => {
if (newValue === enableTags) return;
if (!newValue) {
cancelMetadataURL();
hideMetadataView && hideMetadataView();
}
setEnableTags(newValue);
}, [enableTags, cancelMetadataURL, hideMetadataView]);
return (
<EnableMetadataContext.Provider
value={{
enableMetadataManagement,
enableMetadata,
updateEnableMetadata,
enableTags,
updateEnableTags,
}}
>
{!isLoading && children}
</EnableMetadataContext.Provider>
);
};
export const useMetadataStatus = () => {
const context = useContext(EnableMetadataContext);
if (!context) {
throw new Error('\'EnableMetadataContext\' is null');
}
return context;
};