@elementor/editor-current-user 0.2.2 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +10 -10
- package/CHANGELOG.md +16 -1
- package/dist/index.d.mts +9 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +19 -18
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +16 -17
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -4
- package/src/__tests__/use-current-user-capabilities.test.ts +38 -0
- package/src/api.ts +15 -6
- package/src/index.ts +2 -4
- package/src/types.ts +3 -0
- package/src/use-current-user-capabilities.ts +12 -0
- package/src/init.ts +0 -10
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @elementor/editor-current-user@0.
|
|
2
|
+
> @elementor/editor-current-user@0.3.1 build
|
|
3
3
|
> tsup --config=../../tsup.build.ts
|
|
4
4
|
|
|
5
5
|
[34mCLI[39m Building entry: src/index.ts
|
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
[34mCLI[39m Cleaning output folder
|
|
11
11
|
[34mESM[39m Build start
|
|
12
12
|
[34mCJS[39m Build start
|
|
13
|
-
[32mESM[39m [1mdist/index.mjs [22m[32m2.
|
|
14
|
-
[32mESM[39m [1mdist/index.mjs.map [22m[
|
|
15
|
-
[32mESM[39m ⚡️ Build success in
|
|
16
|
-
[32mCJS[39m [1mdist/index.js [22m[32m3.
|
|
17
|
-
[32mCJS[39m [1mdist/index.js.map [22m[
|
|
18
|
-
[32mCJS[39m ⚡️ Build success in
|
|
13
|
+
[32mESM[39m [1mdist/index.mjs [22m[32m2.55 KB[39m
|
|
14
|
+
[32mESM[39m [1mdist/index.mjs.map [22m[32m5.33 KB[39m
|
|
15
|
+
[32mESM[39m ⚡️ Build success in 81ms
|
|
16
|
+
[32mCJS[39m [1mdist/index.js [22m[32m3.77 KB[39m
|
|
17
|
+
[32mCJS[39m [1mdist/index.js.map [22m[32m5.60 KB[39m
|
|
18
|
+
[32mCJS[39m ⚡️ Build success in 82ms
|
|
19
19
|
[34mDTS[39m Build start
|
|
20
|
-
[32mDTS[39m ⚡️ Build success in
|
|
21
|
-
[32mDTS[39m [1mdist/index.d.mts [22m[
|
|
22
|
-
[32mDTS[39m [1mdist/index.d.ts [22m[
|
|
20
|
+
[32mDTS[39m ⚡️ Build success in 11421ms
|
|
21
|
+
[32mDTS[39m [1mdist/index.d.mts [22m[32m365.00 B[39m
|
|
22
|
+
[32mDTS[39m [1mdist/index.d.ts [22m[32m365.00 B[39m
|
package/CHANGELOG.md
CHANGED
|
@@ -1,11 +1,26 @@
|
|
|
1
1
|
# @elementor/editor-current-user
|
|
2
2
|
|
|
3
|
+
## 0.3.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 7daaa99: Rename `http` package to `http-client`
|
|
8
|
+
- Updated dependencies [7daaa99]
|
|
9
|
+
- @elementor/http-client@0.2.0
|
|
10
|
+
|
|
11
|
+
## 0.3.0
|
|
12
|
+
|
|
13
|
+
### Minor Changes
|
|
14
|
+
|
|
15
|
+
- 1e2dfa0: Added `useCurrentUserCapabilities` hook for user permission checks
|
|
16
|
+
- dcfcd9f: Move editor-current-user package to libs, added user capabilities usage in svg control
|
|
17
|
+
|
|
3
18
|
## 0.2.2
|
|
4
19
|
|
|
5
20
|
### Patch Changes
|
|
6
21
|
|
|
7
22
|
- Updated dependencies [f6a4d4f]
|
|
8
|
-
- @elementor/http@0.1.4
|
|
23
|
+
- @elementor/http-client@0.1.4
|
|
9
24
|
- @elementor/editor@0.18.2
|
|
10
25
|
|
|
11
26
|
## 0.2.1
|
package/dist/index.d.mts
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
declare function PrefetchUserData(): null;
|
|
2
|
+
|
|
1
3
|
declare const useSuppressedMessage: (messageKey: string) => readonly [boolean, () => void];
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
type UserCapability = 'manage_options';
|
|
6
|
+
|
|
7
|
+
declare const useCurrentUserCapabilities: () => {
|
|
8
|
+
canUser: (capability: UserCapability) => boolean;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export { PrefetchUserData, useCurrentUserCapabilities, useSuppressedMessage };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
declare function PrefetchUserData(): null;
|
|
2
|
+
|
|
1
3
|
declare const useSuppressedMessage: (messageKey: string) => readonly [boolean, () => void];
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
type UserCapability = 'manage_options';
|
|
6
|
+
|
|
7
|
+
declare const useCurrentUserCapabilities: () => {
|
|
8
|
+
canUser: (capability: UserCapability) => boolean;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export { PrefetchUserData, useCurrentUserCapabilities, useSuppressedMessage };
|
package/dist/index.js
CHANGED
|
@@ -20,33 +20,34 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/index.ts
|
|
21
21
|
var index_exports = {};
|
|
22
22
|
__export(index_exports, {
|
|
23
|
+
PrefetchUserData: () => PrefetchUserData,
|
|
24
|
+
useCurrentUserCapabilities: () => useCurrentUserCapabilities,
|
|
23
25
|
useSuppressedMessage: () => useSuppressedMessage
|
|
24
26
|
});
|
|
25
27
|
module.exports = __toCommonJS(index_exports);
|
|
26
28
|
|
|
27
|
-
// src/init.ts
|
|
28
|
-
var import_editor = require("@elementor/editor");
|
|
29
|
-
|
|
30
29
|
// src/components/prefetch-user-data.tsx
|
|
31
30
|
var import_query2 = require("@elementor/query");
|
|
32
31
|
|
|
33
32
|
// src/api.ts
|
|
34
|
-
var
|
|
33
|
+
var import_http_client = require("@elementor/http-client");
|
|
35
34
|
var RESOURCE_URL = "/users/me";
|
|
35
|
+
var getUserPayload = { params: { context: "edit" } };
|
|
36
36
|
var apiClient = {
|
|
37
|
-
get: () => (0,
|
|
37
|
+
get: () => (0, import_http_client.httpService)().get("wp/v2" + RESOURCE_URL, getUserPayload).then((res) => {
|
|
38
38
|
return responseToUser(res.data);
|
|
39
39
|
}),
|
|
40
|
-
update: (data) => (0,
|
|
40
|
+
update: (data) => (0, import_http_client.httpService)().patch("wp/v2" + RESOURCE_URL, userToRequest(data))
|
|
41
41
|
};
|
|
42
42
|
var responseToUser = (response) => {
|
|
43
43
|
return {
|
|
44
|
-
suppressedMessages: Object.entries(response.elementor_introduction).filter(([, value]) => value).map(([message]) => message)
|
|
44
|
+
suppressedMessages: Object.entries(response.elementor_introduction).filter(([, value]) => value).map(([message]) => message),
|
|
45
|
+
capabilities: Object.keys(response.capabilities)
|
|
45
46
|
};
|
|
46
47
|
};
|
|
47
48
|
var userToRequest = (user) => {
|
|
48
49
|
return {
|
|
49
|
-
elementor_introduction: user.suppressedMessages
|
|
50
|
+
elementor_introduction: user.suppressedMessages?.reduce(
|
|
50
51
|
(acc, message) => {
|
|
51
52
|
acc[message] = true;
|
|
52
53
|
return acc;
|
|
@@ -74,14 +75,6 @@ function PrefetchUserData() {
|
|
|
74
75
|
return null;
|
|
75
76
|
}
|
|
76
77
|
|
|
77
|
-
// src/init.ts
|
|
78
|
-
var init = () => {
|
|
79
|
-
(0, import_editor.injectIntoLogic)({
|
|
80
|
-
id: "current-user-data",
|
|
81
|
-
component: PrefetchUserData
|
|
82
|
-
});
|
|
83
|
-
};
|
|
84
|
-
|
|
85
78
|
// src/use-update-current-user.ts
|
|
86
79
|
var import_query3 = require("@elementor/query");
|
|
87
80
|
var useUpdateCurrentUser = () => {
|
|
@@ -107,10 +100,18 @@ var useSuppressedMessage = (messageKey) => {
|
|
|
107
100
|
return [isMessageSuppressed, suppressMessage];
|
|
108
101
|
};
|
|
109
102
|
|
|
110
|
-
// src/
|
|
111
|
-
|
|
103
|
+
// src/use-current-user-capabilities.ts
|
|
104
|
+
var useCurrentUserCapabilities = () => {
|
|
105
|
+
const { data } = useCurrentUser();
|
|
106
|
+
const canUser = (capability) => {
|
|
107
|
+
return Boolean(data?.capabilities.includes(capability));
|
|
108
|
+
};
|
|
109
|
+
return { canUser };
|
|
110
|
+
};
|
|
112
111
|
// Annotate the CommonJS export names for ESM import in node:
|
|
113
112
|
0 && (module.exports = {
|
|
113
|
+
PrefetchUserData,
|
|
114
|
+
useCurrentUserCapabilities,
|
|
114
115
|
useSuppressedMessage
|
|
115
116
|
});
|
|
116
117
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/prefetch-user-data.tsx","../src/api.ts","../src/use-current-user.ts","../src/use-update-current-user.ts","../src/use-suppressed-message.ts","../src/use-current-user-capabilities.ts"],"sourcesContent":["export { PrefetchUserData } from './components/prefetch-user-data';\nexport { useSuppressedMessage } from './use-suppressed-message';\nexport { useCurrentUserCapabilities } from './use-current-user-capabilities';\n","import { useQueryClient } from '@elementor/query';\n\nimport { apiClient } from '../api';\nimport { EDITOR_CURRENT_USER_QUERY_KEY } from '../use-current-user';\n\nexport function PrefetchUserData() {\n\tconst queryClient = useQueryClient();\n\n\tqueryClient.prefetchQuery( {\n\t\tqueryKey: [ EDITOR_CURRENT_USER_QUERY_KEY ],\n\t\tqueryFn: apiClient.get,\n\t} );\n\n\treturn null;\n}\n","import { httpService } from '@elementor/http-client';\n\nimport { type User, type UserCapability } from './types';\n\nconst RESOURCE_URL = '/users/me';\n\ntype GetUserPayload = {\n\tparams: { context?: 'edit' };\n};\n\ntype UserModel = {\n\telementor_introduction: Record< string, boolean >;\n\tcapabilities: Partial< Record< UserCapability, true > >;\n};\n\nconst getUserPayload: GetUserPayload = { params: { context: 'edit' } };\n\nexport const apiClient = {\n\tget: () =>\n\t\thttpService()\n\t\t\t.get< UserModel >( 'wp/v2' + RESOURCE_URL, getUserPayload )\n\t\t\t.then( ( res ) => {\n\t\t\t\treturn responseToUser( res.data );\n\t\t\t} ),\n\tupdate: ( data: Partial< User > ) =>\n\t\thttpService().patch< Partial< UserModel > >( 'wp/v2' + RESOURCE_URL, userToRequest( data ) ),\n};\n\nconst responseToUser = ( response: UserModel ): User => {\n\treturn {\n\t\tsuppressedMessages: Object.entries( response.elementor_introduction )\n\t\t\t.filter( ( [ , value ] ) => value )\n\t\t\t.map( ( [ message ] ) => message ),\n\t\tcapabilities: Object.keys( response.capabilities ) as UserCapability[],\n\t};\n};\n\nconst userToRequest = ( user: Partial< User > ): Partial< UserModel > => {\n\treturn {\n\t\telementor_introduction: user.suppressedMessages?.reduce(\n\t\t\t( acc, message ) => {\n\t\t\t\tacc[ message ] = true;\n\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{} as Record< string, boolean >\n\t\t),\n\t};\n};\n","import { useQuery } from '@elementor/query';\n\nimport { apiClient } from './api';\n\nexport const EDITOR_CURRENT_USER_QUERY_KEY = 'editor-current-user';\n\nexport const useCurrentUser = () =>\n\tuseQuery( {\n\t\tqueryKey: [ EDITOR_CURRENT_USER_QUERY_KEY ],\n\t\tqueryFn: apiClient.get,\n\t} );\n","import { useMutation, useQueryClient } from '@elementor/query';\n\nimport { apiClient } from './api';\nimport { EDITOR_CURRENT_USER_QUERY_KEY } from './use-current-user';\n\nexport const useUpdateCurrentUser = () => {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation( {\n\t\tmutationFn: apiClient.update,\n\t\tonSuccess: () => queryClient.invalidateQueries( { queryKey: [ EDITOR_CURRENT_USER_QUERY_KEY ] } ),\n\t} );\n};\n","import { useCurrentUser } from './use-current-user';\nimport { useUpdateCurrentUser } from './use-update-current-user';\n\nexport const useSuppressedMessage = ( messageKey: string ) => {\n\tconst { data } = useCurrentUser();\n\tconst { mutate } = useUpdateCurrentUser();\n\n\tconst isMessageSuppressed = !! data?.suppressedMessages.includes( messageKey );\n\n\tconst suppressMessage = () => {\n\t\tif ( ! isMessageSuppressed ) {\n\t\t\tmutate( {\n\t\t\t\tsuppressedMessages: [ ...( data?.suppressedMessages ?? [] ), messageKey ],\n\t\t\t} );\n\t\t}\n\t};\n\n\treturn [ isMessageSuppressed, suppressMessage ] as const;\n};\n","import { type UserCapability } from './types';\nimport { useCurrentUser } from './use-current-user';\n\nexport const useCurrentUserCapabilities = () => {\n\tconst { data } = useCurrentUser();\n\n\tconst canUser = ( capability: UserCapability ) => {\n\t\treturn Boolean( data?.capabilities.includes( capability ) );\n\t};\n\n\treturn { canUser };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,gBAA+B;;;ACA/B,yBAA4B;AAI5B,IAAM,eAAe;AAWrB,IAAM,iBAAiC,EAAE,QAAQ,EAAE,SAAS,OAAO,EAAE;AAE9D,IAAM,YAAY;AAAA,EACxB,KAAK,UACJ,gCAAY,EACV,IAAkB,UAAU,cAAc,cAAe,EACzD,KAAM,CAAE,QAAS;AACjB,WAAO,eAAgB,IAAI,IAAK;AAAA,EACjC,CAAE;AAAA,EACJ,QAAQ,CAAE,aACT,gCAAY,EAAE,MAA+B,UAAU,cAAc,cAAe,IAAK,CAAE;AAC7F;AAEA,IAAM,iBAAiB,CAAE,aAA+B;AACvD,SAAO;AAAA,IACN,oBAAoB,OAAO,QAAS,SAAS,sBAAuB,EAClE,OAAQ,CAAE,CAAE,EAAE,KAAM,MAAO,KAAM,EACjC,IAAK,CAAE,CAAE,OAAQ,MAAO,OAAQ;AAAA,IAClC,cAAc,OAAO,KAAM,SAAS,YAAa;AAAA,EAClD;AACD;AAEA,IAAM,gBAAgB,CAAE,SAAiD;AACxE,SAAO;AAAA,IACN,wBAAwB,KAAK,oBAAoB;AAAA,MAChD,CAAE,KAAK,YAAa;AACnB,YAAK,OAAQ,IAAI;AAEjB,eAAO;AAAA,MACR;AAAA,MACA,CAAC;AAAA,IACF;AAAA,EACD;AACD;;;AChDA,mBAAyB;AAIlB,IAAM,gCAAgC;AAEtC,IAAM,iBAAiB,UAC7B,uBAAU;AAAA,EACT,UAAU,CAAE,6BAA8B;AAAA,EAC1C,SAAS,UAAU;AACpB,CAAE;;;AFLI,SAAS,mBAAmB;AAClC,QAAM,kBAAc,8BAAe;AAEnC,cAAY,cAAe;AAAA,IAC1B,UAAU,CAAE,6BAA8B;AAAA,IAC1C,SAAS,UAAU;AAAA,EACpB,CAAE;AAEF,SAAO;AACR;;;AGdA,IAAAC,gBAA4C;AAKrC,IAAM,uBAAuB,MAAM;AACzC,QAAM,kBAAc,8BAAe;AAEnC,aAAO,2BAAa;AAAA,IACnB,YAAY,UAAU;AAAA,IACtB,WAAW,MAAM,YAAY,kBAAmB,EAAE,UAAU,CAAE,6BAA8B,EAAE,CAAE;AAAA,EACjG,CAAE;AACH;;;ACTO,IAAM,uBAAuB,CAAE,eAAwB;AAC7D,QAAM,EAAE,KAAK,IAAI,eAAe;AAChC,QAAM,EAAE,OAAO,IAAI,qBAAqB;AAExC,QAAM,sBAAsB,CAAC,CAAE,MAAM,mBAAmB,SAAU,UAAW;AAE7E,QAAM,kBAAkB,MAAM;AAC7B,QAAK,CAAE,qBAAsB;AAC5B,aAAQ;AAAA,QACP,oBAAoB,CAAE,GAAK,MAAM,sBAAsB,CAAC,GAAK,UAAW;AAAA,MACzE,CAAE;AAAA,IACH;AAAA,EACD;AAEA,SAAO,CAAE,qBAAqB,eAAgB;AAC/C;;;ACfO,IAAM,6BAA6B,MAAM;AAC/C,QAAM,EAAE,KAAK,IAAI,eAAe;AAEhC,QAAM,UAAU,CAAE,eAAgC;AACjD,WAAO,QAAS,MAAM,aAAa,SAAU,UAAW,CAAE;AAAA,EAC3D;AAEA,SAAO,EAAE,QAAQ;AAClB;","names":["import_query","import_query"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,26 +1,25 @@
|
|
|
1
|
-
// src/init.ts
|
|
2
|
-
import { injectIntoLogic } from "@elementor/editor";
|
|
3
|
-
|
|
4
1
|
// src/components/prefetch-user-data.tsx
|
|
5
2
|
import { useQueryClient } from "@elementor/query";
|
|
6
3
|
|
|
7
4
|
// src/api.ts
|
|
8
|
-
import { httpService } from "@elementor/http";
|
|
5
|
+
import { httpService } from "@elementor/http-client";
|
|
9
6
|
var RESOURCE_URL = "/users/me";
|
|
7
|
+
var getUserPayload = { params: { context: "edit" } };
|
|
10
8
|
var apiClient = {
|
|
11
|
-
get: () => httpService().get("wp/v2" + RESOURCE_URL).then((res) => {
|
|
9
|
+
get: () => httpService().get("wp/v2" + RESOURCE_URL, getUserPayload).then((res) => {
|
|
12
10
|
return responseToUser(res.data);
|
|
13
11
|
}),
|
|
14
12
|
update: (data) => httpService().patch("wp/v2" + RESOURCE_URL, userToRequest(data))
|
|
15
13
|
};
|
|
16
14
|
var responseToUser = (response) => {
|
|
17
15
|
return {
|
|
18
|
-
suppressedMessages: Object.entries(response.elementor_introduction).filter(([, value]) => value).map(([message]) => message)
|
|
16
|
+
suppressedMessages: Object.entries(response.elementor_introduction).filter(([, value]) => value).map(([message]) => message),
|
|
17
|
+
capabilities: Object.keys(response.capabilities)
|
|
19
18
|
};
|
|
20
19
|
};
|
|
21
20
|
var userToRequest = (user) => {
|
|
22
21
|
return {
|
|
23
|
-
elementor_introduction: user.suppressedMessages
|
|
22
|
+
elementor_introduction: user.suppressedMessages?.reduce(
|
|
24
23
|
(acc, message) => {
|
|
25
24
|
acc[message] = true;
|
|
26
25
|
return acc;
|
|
@@ -48,14 +47,6 @@ function PrefetchUserData() {
|
|
|
48
47
|
return null;
|
|
49
48
|
}
|
|
50
49
|
|
|
51
|
-
// src/init.ts
|
|
52
|
-
var init = () => {
|
|
53
|
-
injectIntoLogic({
|
|
54
|
-
id: "current-user-data",
|
|
55
|
-
component: PrefetchUserData
|
|
56
|
-
});
|
|
57
|
-
};
|
|
58
|
-
|
|
59
50
|
// src/use-update-current-user.ts
|
|
60
51
|
import { useMutation, useQueryClient as useQueryClient2 } from "@elementor/query";
|
|
61
52
|
var useUpdateCurrentUser = () => {
|
|
@@ -81,9 +72,17 @@ var useSuppressedMessage = (messageKey) => {
|
|
|
81
72
|
return [isMessageSuppressed, suppressMessage];
|
|
82
73
|
};
|
|
83
74
|
|
|
84
|
-
// src/
|
|
85
|
-
|
|
75
|
+
// src/use-current-user-capabilities.ts
|
|
76
|
+
var useCurrentUserCapabilities = () => {
|
|
77
|
+
const { data } = useCurrentUser();
|
|
78
|
+
const canUser = (capability) => {
|
|
79
|
+
return Boolean(data?.capabilities.includes(capability));
|
|
80
|
+
};
|
|
81
|
+
return { canUser };
|
|
82
|
+
};
|
|
86
83
|
export {
|
|
84
|
+
PrefetchUserData,
|
|
85
|
+
useCurrentUserCapabilities,
|
|
87
86
|
useSuppressedMessage
|
|
88
87
|
};
|
|
89
88
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/
|
|
1
|
+
{"version":3,"sources":["../src/components/prefetch-user-data.tsx","../src/api.ts","../src/use-current-user.ts","../src/use-update-current-user.ts","../src/use-suppressed-message.ts","../src/use-current-user-capabilities.ts"],"sourcesContent":["import { useQueryClient } from '@elementor/query';\n\nimport { apiClient } from '../api';\nimport { EDITOR_CURRENT_USER_QUERY_KEY } from '../use-current-user';\n\nexport function PrefetchUserData() {\n\tconst queryClient = useQueryClient();\n\n\tqueryClient.prefetchQuery( {\n\t\tqueryKey: [ EDITOR_CURRENT_USER_QUERY_KEY ],\n\t\tqueryFn: apiClient.get,\n\t} );\n\n\treturn null;\n}\n","import { httpService } from '@elementor/http-client';\n\nimport { type User, type UserCapability } from './types';\n\nconst RESOURCE_URL = '/users/me';\n\ntype GetUserPayload = {\n\tparams: { context?: 'edit' };\n};\n\ntype UserModel = {\n\telementor_introduction: Record< string, boolean >;\n\tcapabilities: Partial< Record< UserCapability, true > >;\n};\n\nconst getUserPayload: GetUserPayload = { params: { context: 'edit' } };\n\nexport const apiClient = {\n\tget: () =>\n\t\thttpService()\n\t\t\t.get< UserModel >( 'wp/v2' + RESOURCE_URL, getUserPayload )\n\t\t\t.then( ( res ) => {\n\t\t\t\treturn responseToUser( res.data );\n\t\t\t} ),\n\tupdate: ( data: Partial< User > ) =>\n\t\thttpService().patch< Partial< UserModel > >( 'wp/v2' + RESOURCE_URL, userToRequest( data ) ),\n};\n\nconst responseToUser = ( response: UserModel ): User => {\n\treturn {\n\t\tsuppressedMessages: Object.entries( response.elementor_introduction )\n\t\t\t.filter( ( [ , value ] ) => value )\n\t\t\t.map( ( [ message ] ) => message ),\n\t\tcapabilities: Object.keys( response.capabilities ) as UserCapability[],\n\t};\n};\n\nconst userToRequest = ( user: Partial< User > ): Partial< UserModel > => {\n\treturn {\n\t\telementor_introduction: user.suppressedMessages?.reduce(\n\t\t\t( acc, message ) => {\n\t\t\t\tacc[ message ] = true;\n\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{} as Record< string, boolean >\n\t\t),\n\t};\n};\n","import { useQuery } from '@elementor/query';\n\nimport { apiClient } from './api';\n\nexport const EDITOR_CURRENT_USER_QUERY_KEY = 'editor-current-user';\n\nexport const useCurrentUser = () =>\n\tuseQuery( {\n\t\tqueryKey: [ EDITOR_CURRENT_USER_QUERY_KEY ],\n\t\tqueryFn: apiClient.get,\n\t} );\n","import { useMutation, useQueryClient } from '@elementor/query';\n\nimport { apiClient } from './api';\nimport { EDITOR_CURRENT_USER_QUERY_KEY } from './use-current-user';\n\nexport const useUpdateCurrentUser = () => {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation( {\n\t\tmutationFn: apiClient.update,\n\t\tonSuccess: () => queryClient.invalidateQueries( { queryKey: [ EDITOR_CURRENT_USER_QUERY_KEY ] } ),\n\t} );\n};\n","import { useCurrentUser } from './use-current-user';\nimport { useUpdateCurrentUser } from './use-update-current-user';\n\nexport const useSuppressedMessage = ( messageKey: string ) => {\n\tconst { data } = useCurrentUser();\n\tconst { mutate } = useUpdateCurrentUser();\n\n\tconst isMessageSuppressed = !! data?.suppressedMessages.includes( messageKey );\n\n\tconst suppressMessage = () => {\n\t\tif ( ! isMessageSuppressed ) {\n\t\t\tmutate( {\n\t\t\t\tsuppressedMessages: [ ...( data?.suppressedMessages ?? [] ), messageKey ],\n\t\t\t} );\n\t\t}\n\t};\n\n\treturn [ isMessageSuppressed, suppressMessage ] as const;\n};\n","import { type UserCapability } from './types';\nimport { useCurrentUser } from './use-current-user';\n\nexport const useCurrentUserCapabilities = () => {\n\tconst { data } = useCurrentUser();\n\n\tconst canUser = ( capability: UserCapability ) => {\n\t\treturn Boolean( data?.capabilities.includes( capability ) );\n\t};\n\n\treturn { canUser };\n};\n"],"mappings":";AAAA,SAAS,sBAAsB;;;ACA/B,SAAS,mBAAmB;AAI5B,IAAM,eAAe;AAWrB,IAAM,iBAAiC,EAAE,QAAQ,EAAE,SAAS,OAAO,EAAE;AAE9D,IAAM,YAAY;AAAA,EACxB,KAAK,MACJ,YAAY,EACV,IAAkB,UAAU,cAAc,cAAe,EACzD,KAAM,CAAE,QAAS;AACjB,WAAO,eAAgB,IAAI,IAAK;AAAA,EACjC,CAAE;AAAA,EACJ,QAAQ,CAAE,SACT,YAAY,EAAE,MAA+B,UAAU,cAAc,cAAe,IAAK,CAAE;AAC7F;AAEA,IAAM,iBAAiB,CAAE,aAA+B;AACvD,SAAO;AAAA,IACN,oBAAoB,OAAO,QAAS,SAAS,sBAAuB,EAClE,OAAQ,CAAE,CAAE,EAAE,KAAM,MAAO,KAAM,EACjC,IAAK,CAAE,CAAE,OAAQ,MAAO,OAAQ;AAAA,IAClC,cAAc,OAAO,KAAM,SAAS,YAAa;AAAA,EAClD;AACD;AAEA,IAAM,gBAAgB,CAAE,SAAiD;AACxE,SAAO;AAAA,IACN,wBAAwB,KAAK,oBAAoB;AAAA,MAChD,CAAE,KAAK,YAAa;AACnB,YAAK,OAAQ,IAAI;AAEjB,eAAO;AAAA,MACR;AAAA,MACA,CAAC;AAAA,IACF;AAAA,EACD;AACD;;;AChDA,SAAS,gBAAgB;AAIlB,IAAM,gCAAgC;AAEtC,IAAM,iBAAiB,MAC7B,SAAU;AAAA,EACT,UAAU,CAAE,6BAA8B;AAAA,EAC1C,SAAS,UAAU;AACpB,CAAE;;;AFLI,SAAS,mBAAmB;AAClC,QAAM,cAAc,eAAe;AAEnC,cAAY,cAAe;AAAA,IAC1B,UAAU,CAAE,6BAA8B;AAAA,IAC1C,SAAS,UAAU;AAAA,EACpB,CAAE;AAEF,SAAO;AACR;;;AGdA,SAAS,aAAa,kBAAAA,uBAAsB;AAKrC,IAAM,uBAAuB,MAAM;AACzC,QAAM,cAAcC,gBAAe;AAEnC,SAAO,YAAa;AAAA,IACnB,YAAY,UAAU;AAAA,IACtB,WAAW,MAAM,YAAY,kBAAmB,EAAE,UAAU,CAAE,6BAA8B,EAAE,CAAE;AAAA,EACjG,CAAE;AACH;;;ACTO,IAAM,uBAAuB,CAAE,eAAwB;AAC7D,QAAM,EAAE,KAAK,IAAI,eAAe;AAChC,QAAM,EAAE,OAAO,IAAI,qBAAqB;AAExC,QAAM,sBAAsB,CAAC,CAAE,MAAM,mBAAmB,SAAU,UAAW;AAE7E,QAAM,kBAAkB,MAAM;AAC7B,QAAK,CAAE,qBAAsB;AAC5B,aAAQ;AAAA,QACP,oBAAoB,CAAE,GAAK,MAAM,sBAAsB,CAAC,GAAK,UAAW;AAAA,MACzE,CAAE;AAAA,IACH;AAAA,EACD;AAEA,SAAO,CAAE,qBAAqB,eAAgB;AAC/C;;;ACfO,IAAM,6BAA6B,MAAM;AAC/C,QAAM,EAAE,KAAK,IAAI,eAAe;AAEhC,QAAM,UAAU,CAAE,eAAgC;AACjD,WAAO,QAAS,MAAM,aAAa,SAAU,UAAW,CAAE;AAAA,EAC3D;AAEA,SAAO,EAAE,QAAQ;AAClB;","names":["useQueryClient","useQueryClient"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/editor-current-user",
|
|
3
3
|
"description": "Elementor Editor Current User",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.3.1",
|
|
5
5
|
"private": false,
|
|
6
6
|
"author": "Elementor Team",
|
|
7
7
|
"homepage": "https://elementor.com/",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"repository": {
|
|
21
21
|
"type": "git",
|
|
22
22
|
"url": "https://github.com/elementor/elementor-packages.git",
|
|
23
|
-
"directory": "packages/
|
|
23
|
+
"directory": "packages/libs/editor-current-user"
|
|
24
24
|
},
|
|
25
25
|
"bugs": {
|
|
26
26
|
"url": "https://github.com/elementor/elementor-packages/issues"
|
|
@@ -36,8 +36,7 @@
|
|
|
36
36
|
"react": "^18.3.1"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@elementor/http": "0.
|
|
40
|
-
"@elementor/editor": "0.18.2",
|
|
39
|
+
"@elementor/http-client": "0.2.0",
|
|
41
40
|
"@elementor/query": "0.2.4"
|
|
42
41
|
},
|
|
43
42
|
"devDependencies": {
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type UseQueryResult } from '@elementor/query';
|
|
2
|
+
import { renderHook } from '@testing-library/react';
|
|
3
|
+
|
|
4
|
+
import { type User, type UserCapability } from '../types';
|
|
5
|
+
import { useCurrentUser } from '../use-current-user';
|
|
6
|
+
import { useCurrentUserCapabilities } from '../use-current-user-capabilities';
|
|
7
|
+
|
|
8
|
+
jest.mock( '../use-current-user' );
|
|
9
|
+
|
|
10
|
+
describe( 'useCurrentUserCapabilities', () => {
|
|
11
|
+
it( 'should return true if user has the capability', async () => {
|
|
12
|
+
jest.mocked( useCurrentUser ).mockReturnValue( {
|
|
13
|
+
data: { capabilities: [ 'manage_options' ] },
|
|
14
|
+
} as UseQueryResult< User, Error > );
|
|
15
|
+
|
|
16
|
+
const { result } = renderHook( () => useCurrentUserCapabilities() );
|
|
17
|
+
|
|
18
|
+
expect( result.current.canUser( 'manage_options' ) ).toBe( true );
|
|
19
|
+
} );
|
|
20
|
+
|
|
21
|
+
it( "should return false if user doesn't have the capability", async () => {
|
|
22
|
+
jest.mocked( useCurrentUser ).mockReturnValue( {
|
|
23
|
+
data: { capabilities: [] as UserCapability[] },
|
|
24
|
+
} as UseQueryResult< User, Error > );
|
|
25
|
+
|
|
26
|
+
const { result } = renderHook( () => useCurrentUserCapabilities() );
|
|
27
|
+
|
|
28
|
+
expect( result.current.canUser( 'manage_options' ) ).toBe( false );
|
|
29
|
+
} );
|
|
30
|
+
|
|
31
|
+
it( 'should return false if data is undefined', async () => {
|
|
32
|
+
jest.mocked( useCurrentUser ).mockReturnValue( {} as UseQueryResult< User, Error > );
|
|
33
|
+
|
|
34
|
+
const { result } = renderHook( () => useCurrentUserCapabilities() );
|
|
35
|
+
|
|
36
|
+
expect( result.current.canUser( 'manage_options' ) ).toBe( false );
|
|
37
|
+
} );
|
|
38
|
+
} );
|
package/src/api.ts
CHANGED
|
@@ -1,21 +1,29 @@
|
|
|
1
|
-
import { httpService } from '@elementor/http';
|
|
1
|
+
import { httpService } from '@elementor/http-client';
|
|
2
2
|
|
|
3
|
-
import { type User } from './types';
|
|
3
|
+
import { type User, type UserCapability } from './types';
|
|
4
4
|
|
|
5
5
|
const RESOURCE_URL = '/users/me';
|
|
6
6
|
|
|
7
|
+
type GetUserPayload = {
|
|
8
|
+
params: { context?: 'edit' };
|
|
9
|
+
};
|
|
10
|
+
|
|
7
11
|
type UserModel = {
|
|
8
12
|
elementor_introduction: Record< string, boolean >;
|
|
13
|
+
capabilities: Partial< Record< UserCapability, true > >;
|
|
9
14
|
};
|
|
10
15
|
|
|
16
|
+
const getUserPayload: GetUserPayload = { params: { context: 'edit' } };
|
|
17
|
+
|
|
11
18
|
export const apiClient = {
|
|
12
19
|
get: () =>
|
|
13
20
|
httpService()
|
|
14
|
-
.get< UserModel >( 'wp/v2' + RESOURCE_URL )
|
|
21
|
+
.get< UserModel >( 'wp/v2' + RESOURCE_URL, getUserPayload )
|
|
15
22
|
.then( ( res ) => {
|
|
16
23
|
return responseToUser( res.data );
|
|
17
24
|
} ),
|
|
18
|
-
update: ( data:
|
|
25
|
+
update: ( data: Partial< User > ) =>
|
|
26
|
+
httpService().patch< Partial< UserModel > >( 'wp/v2' + RESOURCE_URL, userToRequest( data ) ),
|
|
19
27
|
};
|
|
20
28
|
|
|
21
29
|
const responseToUser = ( response: UserModel ): User => {
|
|
@@ -23,12 +31,13 @@ const responseToUser = ( response: UserModel ): User => {
|
|
|
23
31
|
suppressedMessages: Object.entries( response.elementor_introduction )
|
|
24
32
|
.filter( ( [ , value ] ) => value )
|
|
25
33
|
.map( ( [ message ] ) => message ),
|
|
34
|
+
capabilities: Object.keys( response.capabilities ) as UserCapability[],
|
|
26
35
|
};
|
|
27
36
|
};
|
|
28
37
|
|
|
29
|
-
const userToRequest = ( user: User ): UserModel => {
|
|
38
|
+
const userToRequest = ( user: Partial< User > ): Partial< UserModel > => {
|
|
30
39
|
return {
|
|
31
|
-
elementor_introduction: user.suppressedMessages
|
|
40
|
+
elementor_introduction: user.suppressedMessages?.reduce(
|
|
32
41
|
( acc, message ) => {
|
|
33
42
|
acc[ message ] = true;
|
|
34
43
|
|
package/src/index.ts
CHANGED
package/src/types.ts
CHANGED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type UserCapability } from './types';
|
|
2
|
+
import { useCurrentUser } from './use-current-user';
|
|
3
|
+
|
|
4
|
+
export const useCurrentUserCapabilities = () => {
|
|
5
|
+
const { data } = useCurrentUser();
|
|
6
|
+
|
|
7
|
+
const canUser = ( capability: UserCapability ) => {
|
|
8
|
+
return Boolean( data?.capabilities.includes( capability ) );
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
return { canUser };
|
|
12
|
+
};
|
package/src/init.ts
DELETED