@elementor/editor-current-user 0.2.1 → 0.3.0

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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @elementor/editor-current-user@0.2.1 build
2
+ > @elementor/editor-current-user@0.3.0 build
3
3
  > tsup --config=../../tsup.build.ts
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -10,13 +10,13 @@
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
12
  CJS Build start
13
- CJS dist/index.js 3.45 KB
14
- CJS dist/index.js.map 4.88 KB
15
- CJS ⚡️ Build success in 133ms
16
- ESM dist/index.mjs 2.34 KB
17
- ESM dist/index.mjs.map 4.85 KB
18
- ESM ⚡️ Build success in 140ms
13
+ ESM dist/index.mjs 2.54 KB
14
+ ESM dist/index.mjs.map 5.33 KB
15
+ ESM ⚡️ Build success in 72ms
16
+ CJS dist/index.js 3.74 KB
17
+ CJS dist/index.js.map 5.59 KB
18
+ CJS ⚡️ Build success in 75ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 12099ms
21
- DTS dist/index.d.mts 126.00 B
22
- DTS dist/index.d.ts 126.00 B
20
+ DTS ⚡️ Build success in 10444ms
21
+ DTS dist/index.d.mts 365.00 B
22
+ DTS dist/index.d.ts 365.00 B
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @elementor/editor-current-user
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 1e2dfa0: Added `useCurrentUserCapabilities` hook for user permission checks
8
+ - dcfcd9f: Move editor-current-user package to libs, added user capabilities usage in svg control
9
+
10
+ ## 0.2.2
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies [f6a4d4f]
15
+ - @elementor/http@0.1.4
16
+ - @elementor/editor@0.18.2
17
+
3
18
  ## 0.2.1
4
19
 
5
20
  ### Patch Changes
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
- export { useSuppressedMessage };
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
- export { useSuppressedMessage };
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
33
  var import_http = require("@elementor/http");
35
34
  var RESOURCE_URL = "/users/me";
35
+ var getUserPayload = { params: { context: "edit" } };
36
36
  var apiClient = {
37
- get: () => (0, import_http.httpService)().get("wp/v2" + RESOURCE_URL).then((res) => {
37
+ get: () => (0, import_http.httpService)().get("wp/v2" + RESOURCE_URL, getUserPayload).then((res) => {
38
38
  return responseToUser(res.data);
39
39
  }),
40
40
  update: (data) => (0, import_http.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.reduce(
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/index.ts
111
- init();
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/init.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"],"sourcesContent":["import { init } from './init';\n\nexport { useSuppressedMessage } from './use-suppressed-message';\n\ninit();\n","import { injectIntoLogic } from '@elementor/editor';\n\nimport { PrefetchUserData } from './components/prefetch-user-data';\n\nexport const init = () => {\n\tinjectIntoLogic( {\n\t\tid: 'current-user-data',\n\t\tcomponent: PrefetchUserData,\n\t} );\n};\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';\n\nimport { type User } from './types';\n\nconst RESOURCE_URL = '/users/me';\n\ntype UserModel = {\n\telementor_introduction: Record< string, boolean >;\n};\n\nexport const apiClient = {\n\tget: () =>\n\t\thttpService()\n\t\t\t.get< UserModel >( 'wp/v2' + RESOURCE_URL )\n\t\t\t.then( ( res ) => {\n\t\t\t\treturn responseToUser( res.data );\n\t\t\t} ),\n\tupdate: ( data: User ) => httpService().patch< 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};\n};\n\nconst userToRequest = ( user: User ): 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"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,oBAAgC;;;ACAhC,IAAAA,gBAA+B;;;ACA/B,kBAA4B;AAI5B,IAAM,eAAe;AAMd,IAAM,YAAY;AAAA,EACxB,KAAK,UACJ,yBAAY,EACV,IAAkB,UAAU,YAAa,EACzC,KAAM,CAAE,QAAS;AACjB,WAAO,eAAgB,IAAI,IAAK;AAAA,EACjC,CAAE;AAAA,EACJ,QAAQ,CAAE,aAAgB,yBAAY,EAAE,MAAoB,UAAU,cAAc,cAAe,IAAK,CAAE;AAC3G;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,EACnC;AACD;AAEA,IAAM,gBAAgB,CAAE,SAA2B;AAClD,SAAO;AAAA,IACN,wBAAwB,KAAK,mBAAmB;AAAA,MAC/C,CAAE,KAAK,YAAa;AACnB,YAAK,OAAQ,IAAI;AAEjB,eAAO;AAAA,MACR;AAAA,MACA,CAAC;AAAA,IACF;AAAA,EACD;AACD;;;ACvCA,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;;;ADVO,IAAM,OAAO,MAAM;AACzB,qCAAiB;AAAA,IAChB,IAAI;AAAA,IACJ,WAAW;AAAA,EACZ,CAAE;AACH;;;AITA,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;;;ANdA,KAAK;","names":["import_query","import_query"]}
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';\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,kBAA4B;AAI5B,IAAM,eAAe;AAWrB,IAAM,iBAAiC,EAAE,QAAQ,EAAE,SAAS,OAAO,EAAE;AAE9D,IAAM,YAAY;AAAA,EACxB,KAAK,UACJ,yBAAY,EACV,IAAkB,UAAU,cAAc,cAAe,EACzD,KAAM,CAAE,QAAS;AACjB,WAAO,eAAgB,IAAI,IAAK;AAAA,EACjC,CAAE;AAAA,EACJ,QAAQ,CAAE,aACT,yBAAY,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
5
  import { httpService } from "@elementor/http";
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.reduce(
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/index.ts
85
- init();
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
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/init.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/index.ts"],"sourcesContent":["import { injectIntoLogic } from '@elementor/editor';\n\nimport { PrefetchUserData } from './components/prefetch-user-data';\n\nexport const init = () => {\n\tinjectIntoLogic( {\n\t\tid: 'current-user-data',\n\t\tcomponent: PrefetchUserData,\n\t} );\n};\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';\n\nimport { type User } from './types';\n\nconst RESOURCE_URL = '/users/me';\n\ntype UserModel = {\n\telementor_introduction: Record< string, boolean >;\n};\n\nexport const apiClient = {\n\tget: () =>\n\t\thttpService()\n\t\t\t.get< UserModel >( 'wp/v2' + RESOURCE_URL )\n\t\t\t.then( ( res ) => {\n\t\t\t\treturn responseToUser( res.data );\n\t\t\t} ),\n\tupdate: ( data: User ) => httpService().patch< 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};\n};\n\nconst userToRequest = ( user: User ): 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 { init } from './init';\n\nexport { useSuppressedMessage } from './use-suppressed-message';\n\ninit();\n"],"mappings":";AAAA,SAAS,uBAAuB;;;ACAhC,SAAS,sBAAsB;;;ACA/B,SAAS,mBAAmB;AAI5B,IAAM,eAAe;AAMd,IAAM,YAAY;AAAA,EACxB,KAAK,MACJ,YAAY,EACV,IAAkB,UAAU,YAAa,EACzC,KAAM,CAAE,QAAS;AACjB,WAAO,eAAgB,IAAI,IAAK;AAAA,EACjC,CAAE;AAAA,EACJ,QAAQ,CAAE,SAAgB,YAAY,EAAE,MAAoB,UAAU,cAAc,cAAe,IAAK,CAAE;AAC3G;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,EACnC;AACD;AAEA,IAAM,gBAAgB,CAAE,SAA2B;AAClD,SAAO;AAAA,IACN,wBAAwB,KAAK,mBAAmB;AAAA,MAC/C,CAAE,KAAK,YAAa;AACnB,YAAK,OAAQ,IAAI;AAEjB,eAAO;AAAA,MACR;AAAA,MACA,CAAC;AAAA,IACF;AAAA,EACD;AACD;;;ACvCA,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;;;ADVO,IAAM,OAAO,MAAM;AACzB,kBAAiB;AAAA,IAChB,IAAI;AAAA,IACJ,WAAW;AAAA,EACZ,CAAE;AACH;;;AITA,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;;;ACdA,KAAK;","names":["useQueryClient","useQueryClient"]}
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';\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.2.1",
4
+ "version": "0.3.0",
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/core/editor-current-user"
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.1.3",
40
- "@elementor/editor": "0.18.1",
39
+ "@elementor/http": "0.1.4",
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
1
  import { httpService } from '@elementor/http';
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: User ) => httpService().patch< UserModel >( 'wp/v2' + RESOURCE_URL, userToRequest( 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.reduce(
40
+ elementor_introduction: user.suppressedMessages?.reduce(
32
41
  ( acc, message ) => {
33
42
  acc[ message ] = true;
34
43
 
package/src/index.ts CHANGED
@@ -1,5 +1,3 @@
1
- import { init } from './init';
2
-
1
+ export { PrefetchUserData } from './components/prefetch-user-data';
3
2
  export { useSuppressedMessage } from './use-suppressed-message';
4
-
5
- init();
3
+ export { useCurrentUserCapabilities } from './use-current-user-capabilities';
package/src/types.ts CHANGED
@@ -1,3 +1,6 @@
1
1
  export type User = {
2
2
  suppressedMessages: string[];
3
+ capabilities: UserCapability[];
3
4
  };
5
+
6
+ export type UserCapability = 'manage_options';
@@ -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
@@ -1,10 +0,0 @@
1
- import { injectIntoLogic } from '@elementor/editor';
2
-
3
- import { PrefetchUserData } from './components/prefetch-user-data';
4
-
5
- export const init = () => {
6
- injectIntoLogic( {
7
- id: 'current-user-data',
8
- component: PrefetchUserData,
9
- } );
10
- };