mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-10 03:11:07 +00:00
* fix: metadata tags lang * feat: optimize code --------- Co-authored-by: 杨国璇 <ygx@Hello-word.local>
102 lines
3.4 KiB
JavaScript
102 lines
3.4 KiB
JavaScript
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 [tagsLang, setTagsLang] = useState('en');
|
|
const [isBeingBuilt, setIsBeingBuilt] = 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, tags_lang: tagsLang } = res.data;
|
|
if (!enableMetadata) {
|
|
cancelMetadataURL();
|
|
}
|
|
setEnableTags(enableTags);
|
|
setTagsLang(tagsLang || 'en');
|
|
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);
|
|
}
|
|
setIsBeingBuilt(newValue);
|
|
setEnableMetadata(newValue);
|
|
}, [enableMetadata, cancelMetadataURL]);
|
|
|
|
const updateEnableTags = useCallback((newValue, lang = 'en') => {
|
|
if (newValue === enableTags && lang === tagsLang) return;
|
|
if (!newValue) {
|
|
cancelMetadataURL();
|
|
hideMetadataView && hideMetadataView();
|
|
}
|
|
setEnableTags(newValue);
|
|
setTagsLang(lang);
|
|
}, [enableTags, tagsLang, cancelMetadataURL, hideMetadataView]);
|
|
|
|
return (
|
|
<EnableMetadataContext.Provider
|
|
value={{
|
|
enableMetadataManagement,
|
|
enableMetadata,
|
|
isBeingBuilt,
|
|
updateEnableMetadata,
|
|
setIsBeingBuilt,
|
|
enableTags,
|
|
tagsLang,
|
|
updateEnableTags,
|
|
}}
|
|
>
|
|
{!isLoading && children}
|
|
</EnableMetadataContext.Provider>
|
|
);
|
|
};
|
|
|
|
export const useMetadataStatus = () => {
|
|
const context = useContext(EnableMetadataContext);
|
|
if (!context) {
|
|
throw new Error('\'EnableMetadataContext\' is null');
|
|
}
|
|
return context;
|
|
};
|