mirror of
https://gitee.com/nocobase/nocobase.git
synced 2025-05-05 21:49:25 +08:00
fix: block refresh issue (#6233)
This commit is contained in:
parent
250efcd6ed
commit
05e107f4fa
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
import { Schema } from '@formily/json-schema';
|
import { Schema } from '@formily/json-schema';
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import React, { FC, useEffect, useMemo, useRef, useState } from 'react';
|
import React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||||
import {
|
import {
|
||||||
Location,
|
Location,
|
||||||
NavigateFunction,
|
NavigateFunction,
|
||||||
@ -62,11 +62,13 @@ const RouterBasenameContext = React.createContext<string>('');
|
|||||||
RouterBasenameContext.displayName = 'RouterBasenameContext';
|
RouterBasenameContext.displayName = 'RouterBasenameContext';
|
||||||
|
|
||||||
const IsSubPageClosedByPageMenuContext = React.createContext<{
|
const IsSubPageClosedByPageMenuContext = React.createContext<{
|
||||||
isSubPageClosedByPageMenu: boolean;
|
isSubPageClosedByPageMenu: () => boolean;
|
||||||
setFieldSchema: React.Dispatch<React.SetStateAction<Schema>>;
|
setFieldSchema: React.Dispatch<React.SetStateAction<Schema>>;
|
||||||
|
reset: () => void;
|
||||||
}>({
|
}>({
|
||||||
isSubPageClosedByPageMenu: false,
|
isSubPageClosedByPageMenu: () => false,
|
||||||
setFieldSchema: () => {},
|
setFieldSchema: () => { },
|
||||||
|
reset: () => { },
|
||||||
});
|
});
|
||||||
IsSubPageClosedByPageMenuContext.displayName = 'IsSubPageClosedByPageMenuContext';
|
IsSubPageClosedByPageMenuContext.displayName = 'IsSubPageClosedByPageMenuContext';
|
||||||
|
|
||||||
@ -75,7 +77,7 @@ export const IsSubPageClosedByPageMenuProvider: FC = ({ children }) => {
|
|||||||
const prevParamsRef = useRef<any>({});
|
const prevParamsRef = useRef<any>({});
|
||||||
const [fieldSchema, setFieldSchema] = useState<Schema>(null);
|
const [fieldSchema, setFieldSchema] = useState<Schema>(null);
|
||||||
|
|
||||||
const isSubPageClosedByPageMenu = useMemo(() => {
|
const isSubPageClosedByPageMenu = useCallback(() => {
|
||||||
const result =
|
const result =
|
||||||
_.isEmpty(params['*']) &&
|
_.isEmpty(params['*']) &&
|
||||||
fieldSchema?.['x-component-props']?.openMode === 'page' &&
|
fieldSchema?.['x-component-props']?.openMode === 'page' &&
|
||||||
@ -86,7 +88,11 @@ export const IsSubPageClosedByPageMenuProvider: FC = ({ children }) => {
|
|||||||
return result;
|
return result;
|
||||||
}, [fieldSchema, params]);
|
}, [fieldSchema, params]);
|
||||||
|
|
||||||
const value = useMemo(() => ({ isSubPageClosedByPageMenu, setFieldSchema }), [isSubPageClosedByPageMenu]);
|
const reset = useCallback(() => {
|
||||||
|
prevParamsRef.current = {};
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const value = useMemo(() => ({ isSubPageClosedByPageMenu, setFieldSchema, reset }), [isSubPageClosedByPageMenu, reset]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<IsSubPageClosedByPageMenuContext.Provider value={value}>{children}</IsSubPageClosedByPageMenuContext.Provider>
|
<IsSubPageClosedByPageMenuContext.Provider value={value}>{children}</IsSubPageClosedByPageMenuContext.Provider>
|
||||||
@ -242,13 +248,13 @@ export const useRouterBasename = () => {
|
|||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
export const useIsSubPageClosedByPageMenu = (fieldSchema: Schema) => {
|
export const useIsSubPageClosedByPageMenu = (fieldSchema: Schema) => {
|
||||||
const { isSubPageClosedByPageMenu, setFieldSchema } = React.useContext(IsSubPageClosedByPageMenuContext);
|
const { isSubPageClosedByPageMenu, setFieldSchema, reset } = React.useContext(IsSubPageClosedByPageMenuContext);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setFieldSchema(fieldSchema);
|
setFieldSchema(fieldSchema);
|
||||||
}, [fieldSchema, setFieldSchema]);
|
}, [fieldSchema, setFieldSchema]);
|
||||||
|
|
||||||
return isSubPageClosedByPageMenu;
|
return { isSubPageClosedByPageMenu, reset };
|
||||||
};
|
};
|
||||||
|
|
||||||
export const CustomRouterContextProvider: FC = ({ children }) => {
|
export const CustomRouterContextProvider: FC = ({ children }) => {
|
||||||
|
@ -25,11 +25,13 @@ export const ActionContextProvider: React.FC<ActionContextProps & { value?: Acti
|
|||||||
const { visible } = { ...props, ...props.value };
|
const { visible } = { ...props, ...props.value };
|
||||||
const { setSubmitted: setParentSubmitted } = { ...props, ...props.value };
|
const { setSubmitted: setParentSubmitted } = { ...props, ...props.value };
|
||||||
const service = useBlockServiceInActionButton();
|
const service = useBlockServiceInActionButton();
|
||||||
const isSubPageClosedByPageMenu = useIsSubPageClosedByPageMenu(useFieldSchema());
|
const { isSubPageClosedByPageMenu, reset } = useIsSubPageClosedByPageMenu(useFieldSchema());
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const run = async () => {
|
const run = async () => {
|
||||||
if (visible === false && service && !service.loading && (submitted || isSubPageClosedByPageMenu)) {
|
if (visible === false && service && !service.loading && (submitted || isSubPageClosedByPageMenu())) {
|
||||||
|
reset();
|
||||||
|
|
||||||
// Prevent multiple requests from being triggered
|
// Prevent multiple requests from being triggered
|
||||||
service.loading = true;
|
service.loading = true;
|
||||||
await service.refreshAsync();
|
await service.refreshAsync();
|
||||||
@ -41,7 +43,7 @@ export const ActionContextProvider: React.FC<ActionContextProps & { value?: Acti
|
|||||||
};
|
};
|
||||||
|
|
||||||
run();
|
run();
|
||||||
}, [visible, service?.refresh, setParentSubmitted, isSubPageClosedByPageMenu]);
|
}, [visible, service, setParentSubmitted, isSubPageClosedByPageMenu, submitted, reset]);
|
||||||
|
|
||||||
const value = useMemo(() => ({ ...props, ...props?.value, submitted, setSubmitted }), [props, submitted]);
|
const value = useMemo(() => ({ ...props, ...props?.value, submitted, setSubmitted }), [props, submitted]);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user