Skip to content

Commit 7b952c7

Browse files
committed
Fix lotout doesn't reset resource registration
Closes #7527
1 parent 712c2f2 commit 7b952c7

6 files changed

+58
-18
lines changed

packages/ra-core/src/auth/useLogout.ts

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { useCallback, useEffect, useRef } from 'react';
2+
import { removeDoubleSlashes } from '../routing/useCreatePath';
3+
import { useLocation, useNavigate, Path } from 'react-router-dom';
24

35
import useAuthProvider, { defaultAuthParams } from './useAuthProvider';
46
import { useResetStore } from '../store';
57
import { useBasename } from '../routing';
6-
import { removeDoubleSlashes } from '../routing/useCreatePath';
7-
import { useLocation, useNavigate, Path } from 'react-router-dom';
8+
import { useResetResourceDefinitions } from '../core/useResetResourceDefinitions';
89

910
/**
1011
* Get a callback for calling the authProvider.logout() method,
@@ -27,6 +28,7 @@ import { useLocation, useNavigate, Path } from 'react-router-dom';
2728
const useLogout = (): Logout => {
2829
const authProvider = useAuthProvider();
2930
const resetStore = useResetStore();
31+
const resetResources = useResetResourceDefinitions();
3032
const navigate = useNavigate();
3133
// useNavigate forces rerenders on every navigation, even if we don't use the result
3234
// see https://github.com/remix-run/react-router/issues/7634
@@ -64,6 +66,7 @@ const useLogout = (): Logout => {
6466
authProvider.logout(params).then(redirectToFromProvider => {
6567
if (redirectToFromProvider === false) {
6668
resetStore();
69+
resetResources();
6770
// do not redirect
6871
return;
6972
}
@@ -94,10 +97,11 @@ const useLogout = (): Logout => {
9497
}
9598
navigateRef.current(newLocation, newLocationOptions);
9699
resetStore();
100+
resetResources();
97101

98102
return redirectToFromProvider;
99103
}),
100-
[authProvider, resetStore, loginUrl]
104+
[authProvider, resetStore, resetResources, loginUrl]
101105
);
102106

103107
const logoutWithoutProvider = useCallback(

packages/ra-core/src/core/ResourceDefinitionContext.tsx

+17-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as React from 'react';
2-
import { createContext, useCallback, useState } from 'react';
2+
import { createContext, useCallback, useState, useMemo } from 'react';
33
import isEqual from 'lodash/isEqual';
44

55
import { ResourceDefinition } from '../types';
@@ -8,14 +8,15 @@ export type ResourceDefinitions = {
88
[name: string]: ResourceDefinition;
99
};
1010

11-
export type ResourceDefinitionContextValue = [
12-
ResourceDefinitions,
13-
(config: ResourceDefinition) => void
14-
];
11+
export type ResourceDefinitionContextValue = {
12+
definitions: ResourceDefinitions;
13+
setDefinition: (config: ResourceDefinition) => void;
14+
reset: () => void;
15+
};
1516

1617
export const ResourceDefinitionContext = createContext<
1718
ResourceDefinitionContextValue
18-
>([{}, () => {}]);
19+
>({ definitions: {}, setDefinition: () => {}, reset: () => {} });
1920

2021
/**
2122
* Context to store the current resource Definition.
@@ -56,10 +57,17 @@ export const ResourceDefinitionContextProvider = ({
5657
);
5758
}, []);
5859

60+
const reset = useCallback(() => {
61+
setState(defaultDefinitions);
62+
}, [defaultDefinitions]);
63+
64+
const contextValue = useMemo(
65+
() => ({ definitions, setDefinition, reset }),
66+
[definitions] // eslint-disable-line react-hooks/exhaustive-deps
67+
);
68+
5969
return (
60-
<ResourceDefinitionContext.Provider
61-
value={[definitions, setDefinition]}
62-
>
70+
<ResourceDefinitionContext.Provider value={contextValue}>
6371
{children}
6472
</ResourceDefinitionContext.Provider>
6573
);

packages/ra-core/src/core/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export * from './ResourceContextProvider';
99
export * from './ResourceDefinitionContext';
1010
export * from './useGetResourceLabel';
1111
export * from './useRegisterResource';
12+
export * from './useResetResourceDefinitions';
1213
export * from './useResourceContext';
1314
export * from './useResourceDefinition';
1415
export * from './useResourceDefinitions';

packages/ra-core/src/core/useRegisterResource.ts

+24-5
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,36 @@ import { useCallback, useContext } from 'react';
33
import { ResourceDefinitionContext } from './ResourceDefinitionContext';
44
import { ResourceDefinition } from '../types';
55

6+
/**
7+
* Register one or more resources.
8+
*
9+
* @example // single parameter
10+
* const registerResource = useRegisterResource();
11+
* registerResource({
12+
* name: 'posts',
13+
* options: {},
14+
* hasList: true,
15+
* hasEdit: true,
16+
* hasShow: true,
17+
* hasCreate: true,
18+
* icon: <PostIcon />,
19+
* });
20+
*
21+
* @example // register several resources at once
22+
* const registerResource = useRegisterResource();
23+
* registerResource(resourceDef1, resourceDef2, resourceDef3);
24+
*/
625
export const useRegisterResource = () => {
7-
const [, setResourceConfiguration] = useContext(ResourceDefinitionContext);
26+
const { setDefinition } = useContext(ResourceDefinitionContext);
827

9-
const registerResource = useCallback(
28+
const registerResources = useCallback(
1029
(...resources: ResourceDefinition[]) => {
1130
resources.forEach(resource => {
12-
setResourceConfiguration(resource);
31+
setDefinition(resource);
1332
});
1433
},
15-
[setResourceConfiguration]
34+
[setDefinition]
1635
);
1736

18-
return registerResource;
37+
return registerResources;
1938
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { useContext } from 'react';
2+
3+
import { ResourceDefinitionContext } from './ResourceDefinitionContext';
4+
5+
export const useResetResourceDefinitions = () => {
6+
const { reset } = useContext(ResourceDefinitionContext);
7+
return reset;
8+
};

packages/ra-core/src/core/useResourceDefinitions.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@ import {
2323
* // }
2424
*/
2525
export const useResourceDefinitions = (): ResourceDefinitions =>
26-
useContext(ResourceDefinitionContext)[0];
26+
useContext(ResourceDefinitionContext).definitions;

0 commit comments

Comments
 (0)