-
-
Notifications
You must be signed in to change notification settings - Fork 5.3k
/
Copy pathuseCreateContext.tsx
70 lines (67 loc) · 1.83 KB
/
useCreateContext.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import { useContext, useMemo } from 'react';
import defaults from 'lodash/defaults';
import { RaRecord } from '../../types';
import { CreateContext } from './CreateContext';
import { CreateControllerResult } from './useCreateController';
/**
* Hook to read the create controller props from the CreateContext.
*
* Mostly used within a <CreateContext.Provider> (e.g. as a descendent of <Create>).
*
* But you can also use it without a <CreateContext.Provider>. In this case, it is up to you
* to pass all the necessary props.
*
* The given props will take precedence over context values.
*
* @typedef {Object} CreateControllerProps
*
* @returns {CreateControllerResult} create controller props
*
* @see useCreateController for how it is filled
*
*/
export const useCreateContext = <RecordType extends RaRecord = RaRecord>(
props?: Partial<CreateControllerResult<RecordType>>
): CreateControllerResult<RecordType> => {
const context = useContext<CreateControllerResult<RecordType>>(
// Can't find a way to specify the RecordType when CreateContext is declared
// @ts-ignore
CreateContext
);
// Props take precedence over the context
return useMemo(
() =>
defaults(
{},
props != null ? extractCreateContextProps(props) : {},
context
),
[context, props]
);
};
/**
* Extract only the create controller props
*
* @param {Object} props props passed to the useCreateContext hook
*
* @returns {CreateControllerResult} create controller props
*/
const extractCreateContextProps = ({
record,
defaultTitle,
isFetching,
isLoading,
redirect,
resource,
save,
saving,
}: any) => ({
record,
defaultTitle,
isFetching,
isLoading,
redirect,
resource,
save,
saving,
});