-
-
Notifications
You must be signed in to change notification settings - Fork 5.3k
/
Copy pathuseEditContext.tsx
91 lines (87 loc) · 2.23 KB
/
useEditContext.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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import { useContext, useMemo } from 'react';
import defaults from 'lodash/defaults';
import { Record } from '../../types';
import { EditContext } from './EditContext';
import { EditControllerProps } from './useEditController';
/**
* Hook to read the edit controller props from the CreateContext.
*
* Mostly used within a <EditContext.Provider> (e.g. as a descendent of <Edit>).
*
* But you can also use it without a <EditContext.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} EditControllerProps
*
* @returns {EditControllerProps} edit controller props
*
* @see useEditController for how it is filled
*
*/
export const useEditContext = <RecordType extends Record = Record>(
props?: Partial<EditControllerProps<RecordType>>
): Partial<EditControllerProps<RecordType>> => {
// Can't find a way to specify the RecordType when EditContext is declared
// @ts-ignore
const context = useContext<EditControllerProps<RecordType>>(EditContext);
// Props take precedence over the context
return useMemo(
() =>
defaults(
{},
props != null ? extractEditContextProps(props) : {},
context
),
[context, props]
);
};
/**
* Extract only the edit controller props
*
* @param {Object} props props passed to the useEditContext hook
*
* @returns {EditControllerProps} edit controller props
*/
const extractEditContextProps = ({
basePath,
data,
record,
defaultTitle,
onFailureRef,
onSuccessRef,
transformRef,
loaded,
loading,
redirect,
setOnFailure,
setOnSuccess,
setTransform,
resource,
save,
saving,
successMessage,
version,
}: any) => ({
basePath,
// Necessary for actions (EditActions) which expect a data prop containing the record
// @deprecated - to be removed in 4.0d
data: record || data,
record: record || data,
defaultTitle,
onFailureRef,
onSuccessRef,
transformRef,
loaded,
loading,
redirect,
setOnFailure,
setOnSuccess,
setTransform,
resource,
save,
saving,
successMessage,
version,
});