-
Notifications
You must be signed in to change notification settings - Fork 4.4k
/
Copy pathuse-is-dirty.js
79 lines (70 loc) · 1.97 KB
/
use-is-dirty.js
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
/**
* WordPress dependencies
*/
import { useSelect } from '@wordpress/data';
import { store as coreStore } from '@wordpress/core-data';
import { useMemo, useState } from '@wordpress/element';
export const useIsDirty = () => {
const { editedEntities, siteEdits, siteEntityConfig } = useSelect(
( select ) => {
const {
__experimentalGetDirtyEntityRecords,
getEntityRecordEdits,
getEntityConfig,
} = select( coreStore );
return {
editedEntities: __experimentalGetDirtyEntityRecords(),
siteEdits: getEntityRecordEdits( 'root', 'site' ),
siteEntityConfig: getEntityConfig( 'root', 'site' ),
};
},
[]
);
const dirtyEntityRecords = useMemo( () => {
// Remove site object and decouple into its edited pieces.
const editedEntitiesWithoutSite = editedEntities.filter(
( record ) => ! ( record.kind === 'root' && record.name === 'site' )
);
const siteEntityLabels = siteEntityConfig?.meta?.labels ?? {};
const editedSiteEntities = [];
for ( const property in siteEdits ) {
editedSiteEntities.push( {
kind: 'root',
name: 'site',
title: siteEntityLabels[ property ] || property,
property,
} );
}
return [ ...editedEntitiesWithoutSite, ...editedSiteEntities ];
}, [ editedEntities, siteEdits, siteEntityConfig ] );
// Unchecked entities to be ignored by save function.
const [ unselectedEntities, _setUnselectedEntities ] = useState( [] );
const setUnselectedEntities = (
{ kind, name, key, property },
checked
) => {
if ( checked ) {
_setUnselectedEntities(
unselectedEntities.filter(
( elt ) =>
elt.kind !== kind ||
elt.name !== name ||
elt.key !== key ||
elt.property !== property
)
);
} else {
_setUnselectedEntities( [
...unselectedEntities,
{ kind, name, key, property },
] );
}
};
const isDirty = dirtyEntityRecords.length - unselectedEntities.length > 0;
return {
dirtyEntityRecords,
isDirty,
setUnselectedEntities,
unselectedEntities,
};
};