@weavix/sdk-react 0.0.21 → 0.0.23

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.
@@ -0,0 +1,13 @@
1
+ import { HostApi, HostInitOptions, Theme } from '@weavix/sdk-core';
2
+ export type PluginBootstrapState<TContext> = {
3
+ host: HostApi<TContext>;
4
+ loading: boolean;
5
+ error: string | null;
6
+ theme?: Theme;
7
+ language?: string;
8
+ context?: TContext;
9
+ userId?: string;
10
+ isYateam?: boolean;
11
+ };
12
+ export declare function usePluginBootstrap<TContext>(options?: HostInitOptions): PluginBootstrapState<TContext>;
13
+ //# sourceMappingURL=usePluginBootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePluginBootstrap.d.ts","sourceRoot":"","sources":["../../src/hooks/usePluginBootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,OAAO,EACP,KAAK,eAAe,EACpB,KAAK,KAAK,EAIb,MAAM,kBAAkB,CAAC;AAG1B,MAAM,MAAM,oBAAoB,CAAC,QAAQ,IAAI;IACzC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAqBF,wBAAgB,kBAAkB,CAAC,QAAQ,EACvC,OAAO,GAAE,eAAoB,GAC9B,oBAAoB,CAAC,QAAQ,CAAC,CAiHhC"}
package/dist/index.d.ts CHANGED
@@ -8,9 +8,11 @@ export { useConfirm } from './hooks/useConfirm';
8
8
  export { useIsYateam } from './hooks/useIsYateam';
9
9
  export { useLanguage } from './hooks/useLanguage';
10
10
  export { useLocalizedString } from './hooks/useLocalizedString';
11
+ export { usePluginBootstrap } from './hooks/usePluginBootstrap';
11
12
  export { useTheme } from './hooks/useTheme';
12
13
  export { useToaster } from './hooks/useToaster';
13
14
  export { useUserId } from './hooks/useUserId';
14
- export { getField, getLocalizedString, hostApi, METHOD_NOT_SUPPORTED, MISSING_REQUIRED_SCOPE, PLUGIN_ID_IS_NOT_CORRECT, PLUGIN_ID_OR_SLOT_NOT_PROVIDED, PluginActionError, uiApi, UNKNOWN_ERROR, VALIDATION_ERROR, on, dispatchHostEvent, } from '@weavix/sdk-core';
15
- export type { BasicContext, ConfirmOptions, ConfirmResult, ContextLevel, ContentSizeUpdateRequest, HostEventCallback, HostEventContract, HostEventMethod, LocalizedString, Theme, ToastAction, ToastOptions, Unsubscribe, } from '@weavix/sdk-core';
15
+ export type { PluginBootstrapState } from './hooks/usePluginBootstrap';
16
+ export { getField, getLocalizedString, hostApi, HostApi, METHOD_NOT_SUPPORTED, MISSING_REQUIRED_SCOPE, PLUGIN_ID_IS_NOT_CORRECT, PLUGIN_ID_OR_SLOT_NOT_PROVIDED, PluginActionError, uiApi, UNKNOWN_ERROR, VALIDATION_ERROR, on, dispatchHostEvent, } from '@weavix/sdk-core';
17
+ export type { BasicContext, ConfirmOptions, ConfirmResult, ContextLevel, ContentSizeUpdateRequest, HostApi as HostApiType, HostEventCallback, HostEventContract, HostEventMethod, LocalizedString, Theme, ToastAction, ToastOptions, Unsubscribe, } from '@weavix/sdk-core';
16
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC9F,YAAY,EACR,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,GAC1B,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,OAAO,EACH,QAAQ,EACR,kBAAkB,EAClB,OAAO,EACP,oBAAoB,EACpB,sBAAsB,EACtB,wBAAwB,EACxB,8BAA8B,EAC9B,iBAAiB,EACjB,KAAK,EACL,aAAa,EACb,gBAAgB,EAChB,EAAE,EACF,iBAAiB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACR,YAAY,EACZ,cAAc,EACd,aAAa,EACb,YAAY,EACZ,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,KAAK,EACL,WAAW,EACX,YAAY,EACZ,WAAW,GACd,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC9F,YAAY,EACR,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,GAC1B,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,YAAY,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAGvE,OAAO,EACH,QAAQ,EACR,kBAAkB,EAClB,OAAO,EACP,OAAO,EACP,oBAAoB,EACpB,sBAAsB,EACtB,wBAAwB,EACxB,8BAA8B,EAC9B,iBAAiB,EACjB,KAAK,EACL,aAAa,EACb,gBAAgB,EAChB,EAAE,EACF,iBAAiB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACR,YAAY,EACZ,cAAc,EACd,aAAa,EACb,YAAY,EACZ,wBAAwB,EACxB,OAAO,IAAI,WAAW,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,KAAK,EACL,WAAW,EACX,YAAY,EACZ,WAAW,GACd,MAAM,kBAAkB,CAAC"}
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  import { Component as e, createContext as t, useCallback as n, useContext as r, useEffect as i, useMemo as a, useRef as o, useState as s } from "react";
2
2
  import { Fragment as c, jsx as l, jsxs as u } from "react/jsx-runtime";
3
- import { METHOD_NOT_SUPPORTED as d, MISSING_REQUIRED_SCOPE as f, PLUGIN_ID_IS_NOT_CORRECT as p, PLUGIN_ID_OR_SLOT_NOT_PROVIDED as m, PluginActionError as h, UNKNOWN_ERROR as g, VALIDATION_ERROR as _, dispatchHostEvent as v, dispatchHostEvent as y, getField as b, getLocalizedString as x, getLocalizedString as S, hostApi as C, hostApi as w, on as T, on as E, setHandler as D, uiApi as O, uiApi as k } from "@weavix/sdk-core";
3
+ import { HostApi as d, HostApi as f, METHOD_NOT_SUPPORTED as p, MISSING_REQUIRED_SCOPE as m, PLUGIN_ID_IS_NOT_CORRECT as h, PLUGIN_ID_OR_SLOT_NOT_PROVIDED as g, PluginActionError as _, UNKNOWN_ERROR as v, VALIDATION_ERROR as y, dispatchHostEvent as b, dispatchHostEvent as x, getField as S, getLocalizedString as C, getLocalizedString as w, hostApi as T, hostApi as E, on as D, on as O, setHandler as k, uiApi as A, uiApi as j } from "@weavix/sdk-core";
4
4
  //#region src/components/ErrorBoundary.tsx
5
- var A = class extends e {
5
+ var M = class extends e {
6
6
  static getDerivedStateFromError(e) {
7
7
  return {
8
8
  hasError: !0,
@@ -21,7 +21,7 @@ var A = class extends e {
21
21
  render() {
22
22
  return this.state.hasError && this.state.error ? this.props.fallback(this.state.error) : this.props.children;
23
23
  }
24
- }, j = ({ error: e }) => /* @__PURE__ */ l("div", {
24
+ }, N = ({ error: e }) => /* @__PURE__ */ l("div", {
25
25
  className: "plugin-error",
26
26
  children: /* @__PURE__ */ u("div", {
27
27
  className: "plugin-error__container",
@@ -66,7 +66,7 @@ var A = class extends e {
66
66
  })
67
67
  ]
68
68
  })
69
- }), M = () => /* @__PURE__ */ l("div", {
69
+ }), P = () => /* @__PURE__ */ l("div", {
70
70
  className: "plugin-loader",
71
71
  children: /* @__PURE__ */ u("div", {
72
72
  className: "plugin-loader__content",
@@ -78,73 +78,73 @@ var A = class extends e {
78
78
  });
79
79
  //#endregion
80
80
  //#region src/hooks/useContext.ts
81
- function N() {
81
+ function F() {
82
82
  let [e, t] = s(() => {
83
83
  let e;
84
- return E("context.changed", (t) => {
84
+ return O("context.changed", (t) => {
85
85
  e = t;
86
86
  })(), e;
87
87
  });
88
- return i(() => E("context.changed", (e) => {
88
+ return i(() => O("context.changed", (e) => {
89
89
  t(e);
90
90
  }), []), e;
91
91
  }
92
92
  //#endregion
93
93
  //#region src/hooks/useIsYateam.ts
94
- function P() {
94
+ function I() {
95
95
  let [e, t] = s(void 0);
96
96
  return i(() => {
97
97
  (async () => {
98
- t(await w.getIsYateam());
98
+ t(await E.getIsYateam());
99
99
  })();
100
100
  }, []), e;
101
101
  }
102
102
  //#endregion
103
103
  //#region src/hooks/useLanguage.ts
104
- function F() {
104
+ function L() {
105
105
  let [e, t] = s(() => {
106
106
  let e;
107
- return E("language.changed", (t) => {
107
+ return O("language.changed", (t) => {
108
108
  e = t;
109
109
  })(), e;
110
110
  });
111
- return i(() => E("language.changed", (e) => {
111
+ return i(() => O("language.changed", (e) => {
112
112
  t(e);
113
113
  }), []), e;
114
114
  }
115
115
  //#endregion
116
116
  //#region src/hooks/useTheme.ts
117
- function I() {
117
+ function R() {
118
118
  let [e, t] = s(() => {
119
119
  let e;
120
- return E("theme.changed", (t) => {
120
+ return O("theme.changed", (t) => {
121
121
  e = t;
122
122
  })(), e;
123
123
  });
124
- return i(() => E("theme.changed", (e) => {
124
+ return i(() => O("theme.changed", (e) => {
125
125
  t(e);
126
126
  }), []), e;
127
127
  }
128
128
  //#endregion
129
129
  //#region src/hooks/useUserId.ts
130
- function L() {
130
+ function z() {
131
131
  let [e, t] = s(void 0);
132
132
  return i(() => {
133
133
  (async () => {
134
- t(await w.getUserId());
134
+ t(await E.getUserId());
135
135
  })();
136
136
  }, []), e;
137
137
  }
138
138
  //#endregion
139
139
  //#region src/components/PluginProvider.tsx
140
- var R = t(null);
141
- function z(e = "basic") {
142
- let t = r(R);
140
+ var B = t(null);
141
+ function V(e = "basic") {
142
+ let t = r(B);
143
143
  if (!t) throw Error("usePluginContext must be used within PluginProvider");
144
144
  if (e === "full" && t.contextLevel !== "full") throw Error("🛑 [Security] Code requests 'full' context, but manifest declares 'basic'. Change the contextLevel in your manifest to get full access.");
145
- let n = I(), i = F(), a = P(), o = L(), s = N(), c = {
146
- service: w.getService(),
147
- origin: w.getOrigin(),
145
+ let n = R(), i = L(), a = I(), o = z(), s = F(), c = {
146
+ service: E.getService(),
147
+ origin: E.getOrigin(),
148
148
  slot: t.slot,
149
149
  innerUrl: t.innerUrl,
150
150
  queryParams: t.queryParams,
@@ -171,24 +171,24 @@ function z(e = "basic") {
171
171
  slotContext: s
172
172
  };
173
173
  }
174
- var B = (e) => {
174
+ var H = (e) => {
175
175
  try {
176
176
  return new URL(e, window.location.href).origin === window.location.origin;
177
177
  } catch {
178
178
  return !0;
179
179
  }
180
180
  };
181
- function V({ children: e, autoResize: t = !0, fallback: n, errorFallback: r, autoNotifyReady: u = !0 }) {
182
- let d = o(!1), [f, p] = s(!1), [m, h] = s(null), [g, _] = s(null), v = a(() => (e, t) => D(e, t), []);
181
+ function U({ children: e, autoResize: t = !0, fallback: n, errorFallback: r, autoNotifyReady: u = !0 }) {
182
+ let d = o(!1), [f, p] = s(!1), [m, h] = s(null), [g, _] = s(null), v = a(() => (e, t) => k(e, t), []);
183
183
  return i(() => {
184
184
  let e = (e) => {
185
185
  let t = e.target.closest("[href], [data-href]");
186
186
  if (!t) return;
187
187
  let n = t.getAttribute("href") || t.getAttribute("data-href");
188
- if (!n || B(n)) return;
188
+ if (!n || H(n)) return;
189
189
  e.preventDefault();
190
190
  let r = t.getAttribute("target") === "_blank";
191
- k.navigate({
191
+ j.navigate({
192
192
  path: n,
193
193
  options: { newTab: r }
194
194
  }).then(() => {
@@ -203,45 +203,45 @@ function V({ children: e, autoResize: t = !0, fallback: n, errorFallback: r, aut
203
203
  }, []), i(() => {
204
204
  d.current || (async () => {
205
205
  try {
206
- w.init({ autoResize: t }), d.current = !0;
207
- let e = w.getContextLevel(), n = w.getEntityId(), r = w.getEntityMeta();
206
+ E.init({ autoResize: t }), d.current = !0;
207
+ let e = E.getContextLevel(), n = E.getEntityId(), r = E.getEntityMeta();
208
208
  _({
209
- slot: w.getSlot(),
210
- innerUrl: w.getInnerUrl(),
211
- queryParams: w.getQueryParams(),
209
+ slot: E.getSlot(),
210
+ innerUrl: E.getInnerUrl(),
211
+ queryParams: E.getQueryParams(),
212
212
  contextLevel: e,
213
213
  entityId: n,
214
214
  entityMeta: r,
215
215
  registerHandler: v
216
- }), u && await w.notifyReady();
216
+ }), u && await E.notifyReady();
217
217
  let [i, a, o, s, c] = await Promise.allSettled([
218
- w.getTheme(),
219
- w.getLanguage(),
220
- e === "full" ? w.getContext() : Promise.resolve(null),
221
- w.getIsYateam(),
222
- w.getUserId()
218
+ E.getTheme(),
219
+ E.getLanguage(),
220
+ e === "full" ? E.getContext() : Promise.resolve(null),
221
+ E.getIsYateam(),
222
+ E.getUserId()
223
223
  ]);
224
- i.status === "fulfilled" && i.value && y({
224
+ i.status === "fulfilled" && i.value && x({
225
225
  messageId: "",
226
226
  type: "event",
227
227
  method: "theme.changed",
228
228
  result: i.value
229
- }), a.status === "fulfilled" && a.value && y({
229
+ }), a.status === "fulfilled" && a.value && x({
230
230
  messageId: "",
231
231
  type: "event",
232
232
  method: "language.changed",
233
233
  result: a.value
234
- }), s.status === "fulfilled" && s.value && y({
234
+ }), s.status === "fulfilled" && s.value && x({
235
235
  messageId: "",
236
236
  type: "event",
237
237
  method: "isYateam.changed",
238
238
  result: s.value
239
- }), c.status === "fulfilled" && c.value && y({
239
+ }), c.status === "fulfilled" && c.value && x({
240
240
  messageId: "",
241
241
  type: "event",
242
242
  method: "userId.changed",
243
243
  result: c.value
244
- }), e === "basic" ? n && y({
244
+ }), e === "basic" ? n && x({
245
245
  messageId: "",
246
246
  type: "event",
247
247
  method: "context.changed",
@@ -249,7 +249,7 @@ function V({ children: e, autoResize: t = !0, fallback: n, errorFallback: r, aut
249
249
  entityId: n,
250
250
  ...r ? { entityMeta: r } : {}
251
251
  }
252
- }) : o.status === "fulfilled" && o.value && y({
252
+ }) : o.status === "fulfilled" && o.value && x({
253
253
  messageId: "",
254
254
  type: "event",
255
255
  method: "context.changed",
@@ -263,19 +263,77 @@ function V({ children: e, autoResize: t = !0, fallback: n, errorFallback: r, aut
263
263
  t,
264
264
  v,
265
265
  u
266
- ]), m ? r ? /* @__PURE__ */ l(c, { children: r(m) }) : /* @__PURE__ */ l(j, { error: m }) : !f || !g ? /* @__PURE__ */ l(c, { children: n }) : /* @__PURE__ */ l(A, {
267
- fallback: r || ((e) => /* @__PURE__ */ l(j, { error: e })),
268
- children: /* @__PURE__ */ l(R.Provider, {
266
+ ]), m ? r ? /* @__PURE__ */ l(c, { children: r(m) }) : /* @__PURE__ */ l(N, { error: m }) : !f || !g ? /* @__PURE__ */ l(c, { children: n }) : /* @__PURE__ */ l(M, {
267
+ fallback: r || ((e) => /* @__PURE__ */ l(N, { error: e })),
268
+ children: /* @__PURE__ */ l(B.Provider, {
269
269
  value: g,
270
270
  children: e
271
271
  })
272
272
  });
273
273
  }
274
- var H = () => ({ show: n((e) => k.confirm.show(e), []) }), U = (e = "ru") => {
275
- let t = F();
276
- return (n) => S(n, t, e);
277
- }, W = () => ({ add: n((e) => k.toaster.add(e), []) });
274
+ var W = () => ({ show: n((e) => j.confirm.show(e), []) }), G = (e = "ru") => {
275
+ let t = L();
276
+ return (n) => w(n, t, e);
277
+ };
278
+ //#endregion
279
+ //#region src/hooks/usePluginBootstrap.ts
280
+ function K(e) {
281
+ return e instanceof Error ? e.message : "Unknown plugin bootstrap error";
282
+ }
283
+ function q(e, t) {
284
+ t != null && x({
285
+ messageId: "",
286
+ type: "event",
287
+ method: e,
288
+ result: t
289
+ });
290
+ }
291
+ function J(e = {}) {
292
+ let { autoResize: t = !0 } = e, n = o(null);
293
+ n.current ||= new f();
294
+ let r = n.current, [a, c] = s(!0), [l, u] = s(null), [d, p] = s(), [m, h] = s(), [g, _] = s(), [v, y] = s(), [b, x] = s();
295
+ return i(() => {
296
+ let e = !1, n = [], i = (e, t) => {
297
+ n.push(O(e, t));
298
+ };
299
+ try {
300
+ r.init({ autoResize: t }), i("context.changed", (e) => _(e)), i("theme.changed", (e) => p(e)), i("language.changed", (e) => h(e)), i("userId.changed", (e) => y(e)), i("isYateam.changed", (e) => x(e));
301
+ } catch (e) {
302
+ return u(K(e)), c(!1), () => {
303
+ n.forEach((e) => e()), r.destroy();
304
+ };
305
+ }
306
+ return (async () => {
307
+ try {
308
+ let t = r.getContextLevel() === "full" ? r.getContext() : Promise.resolve(void 0), [n, i, a, o, s] = await Promise.all([
309
+ t,
310
+ r.getTheme(),
311
+ r.getLanguage(),
312
+ r.getUserId(),
313
+ r.getIsYateam()
314
+ ]);
315
+ if (e) return;
316
+ _(n), p(i), h(a), y(o), x(s), q("context.changed", n), q("theme.changed", i), q("language.changed", a), q("userId.changed", o), q("isYateam.changed", s), c(!1), await r.notifyReady();
317
+ } catch (t) {
318
+ if (e) return;
319
+ u(K(t)), c(!1);
320
+ }
321
+ })(), () => {
322
+ e = !0, n.forEach((e) => e()), r.destroy();
323
+ };
324
+ }, [t, r]), {
325
+ host: r,
326
+ loading: a,
327
+ error: l,
328
+ theme: d,
329
+ language: m,
330
+ context: g,
331
+ userId: v,
332
+ isYateam: b
333
+ };
334
+ }
335
+ var Y = () => ({ add: n((e) => j.toaster.add(e), []) });
278
336
  //#endregion
279
- export { A as ErrorBoundary, d as METHOD_NOT_SUPPORTED, f as MISSING_REQUIRED_SCOPE, p as PLUGIN_ID_IS_NOT_CORRECT, m as PLUGIN_ID_OR_SLOT_NOT_PROVIDED, h as PluginActionError, j as PluginError, M as PluginLoader, V as PluginProvider, g as UNKNOWN_ERROR, _ as VALIDATION_ERROR, v as dispatchHostEvent, b as getField, x as getLocalizedString, C as hostApi, B as isInternalUrl, T as on, O as uiApi, H as useConfirm, P as useIsYateam, F as useLanguage, U as useLocalizedString, z as usePluginContext, I as useTheme, W as useToaster, L as useUserId };
337
+ export { M as ErrorBoundary, d as HostApi, p as METHOD_NOT_SUPPORTED, m as MISSING_REQUIRED_SCOPE, h as PLUGIN_ID_IS_NOT_CORRECT, g as PLUGIN_ID_OR_SLOT_NOT_PROVIDED, _ as PluginActionError, N as PluginError, P as PluginLoader, U as PluginProvider, v as UNKNOWN_ERROR, y as VALIDATION_ERROR, b as dispatchHostEvent, S as getField, C as getLocalizedString, T as hostApi, H as isInternalUrl, D as on, A as uiApi, W as useConfirm, I as useIsYateam, L as useLanguage, G as useLocalizedString, J as usePluginBootstrap, V as usePluginContext, R as useTheme, Y as useToaster, z as useUserId };
280
338
 
281
339
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/components/ErrorBoundary.tsx","../src/components/PluginError.tsx","../src/components/PluginLoader.tsx","../src/hooks/useContext.ts","../src/hooks/useIsYateam.ts","../src/hooks/useLanguage.ts","../src/hooks/useTheme.ts","../src/hooks/useUserId.ts","../src/components/PluginProvider.tsx","../src/hooks/useConfirm.ts","../src/hooks/useLocalizedString.ts","../src/hooks/useToaster.ts"],"sourcesContent":["import { Component, ReactNode } from 'react';\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n fallback: (error: Error) => ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error('ErrorBoundary caught an error:', error, errorInfo);\n }\n\n render() {\n if (this.state.hasError && this.state.error) {\n return this.props.fallback(this.state.error);\n }\n\n return this.props.children;\n }\n}\n","import type { FC } from 'react';\nimport './PluginError.scss';\n\nexport interface PluginErrorProps {\n error: Error;\n}\n\nconst PluginErrorImpl = ({ error }: PluginErrorProps) => (\n <div className=\"plugin-error\">\n <div className=\"plugin-error__container\">\n <div className=\"plugin-error__header\">\n <svg\n className=\"plugin-error__icon\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#f44336\" />\n <path\n d=\"M12 7v6m0 4h.01\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n <h3 className=\"plugin-error__title\">Ошибка инициализации плагина</h3>\n </div>\n <div className=\"plugin-error__message\">\n Не удалось инициализировать плагин. Проверьте параметры запуска и попробуйте\n перезагрузить страницу.\n </div>\n <details className=\"plugin-error__details\">\n <summary className=\"plugin-error__summary\">Детали ошибки</summary>\n <pre className=\"plugin-error__stack\">\n {error.message}\n {error.stack && `\\n\\n${error.stack}`}\n </pre>\n </details>\n </div>\n </div>\n);\n\n/**\n * Дефолтный компонент для отображения ошибки инициализации плагина\n */\nexport const PluginError = PluginErrorImpl as FC<PluginErrorProps>;\n","import type { FC } from 'react';\nimport './PluginLoader.scss';\n\nconst PluginLoaderImpl = () => (\n <div className=\"plugin-loader\">\n <div className=\"plugin-loader__content\">\n <div className=\"plugin-loader__spinner\" />\n <div className=\"plugin-loader__text\">Загрузка плагина...</div>\n </div>\n </div>\n);\n\n/**\n * Простой лоадер для отображения во время инициализации плагина\n */\nexport const PluginLoader = PluginLoaderImpl as FC;\n","import { on } from '@weavix/sdk-core';\nimport { useEffect, useState } from 'react';\n\n/**\n * Reactive hook for receiving the current slot context pushed by the host.\n * @template T - Type of the context object (defaults to `unknown`)\n * @returns Current context, or `undefined` until the first event arrives from the host.\n * @example\n * ```tsx\n * interface IssueContext {\n * key: string;\n * summary: string;\n * }\n *\n * function App() {\n * const context = useContext<IssueContext>();\n * if (!context) return <Loader />;\n * return <div>{context.summary}</div>;\n * }\n * ```\n */\nexport function useContext<T = unknown>(): T | undefined {\n const [context, setContext] = useState<T | undefined>(() => {\n let initial: T | undefined;\n const unsubscribe = on('context.changed', (value) => {\n initial = value as T;\n });\n unsubscribe();\n return initial;\n });\n\n useEffect(() => {\n const unsubscribe = on('context.changed', (value) => {\n setContext(value as T);\n });\n\n return unsubscribe;\n }, []);\n\n return context;\n}\n","import { hostApi } from '@weavix/sdk-core';\nimport { useEffect, useState } from 'react';\n\n/**\n * Реактивный хук для получения текущей сборки приложения.\n * @returns Является ли ятимом приложение (например, 'true'), или `undefined` до получения первого события.\n * @example\n * ```tsx\n * function App() {\n * const isYateam = useIsYateam();\n * return <span>Ятим ли сейчас?: {isYateam}</span>;\n * }\n * ```\n */\nexport function useIsYateam(): boolean | undefined {\n const [isYateam, setIsYateam] = useState<boolean | undefined>(undefined);\n\n useEffect(() => {\n const init = async () => {\n const yateam = (await hostApi.getIsYateam()) as boolean | undefined;\n setIsYateam(yateam);\n };\n\n init();\n }, []);\n\n return isYateam;\n}\n","import { on } from '@weavix/sdk-core';\nimport { useEffect, useState } from 'react';\n\n/**\n * Реактивный хук для получения текущего языка хоста.\n * @returns Код текущего языка (например, `'ru'`, `'en'`), или `undefined` до получения первого события.\n * @example\n * ```tsx\n * function App() {\n * const language = useLanguage();\n * return <span>Текущий язык: {language}</span>;\n * }\n * ```\n */\nexport function useLanguage(): string | undefined {\n const [language, setLanguage] = useState<string | undefined>(() => {\n let initial: string | undefined;\n const unsubscribe = on('language.changed', (value) => {\n initial = value;\n });\n unsubscribe();\n return initial;\n });\n\n useEffect(() => {\n const unsubscribe = on('language.changed', (value) => {\n setLanguage(value);\n });\n\n return unsubscribe;\n }, []);\n\n return language;\n}\n","import { type Theme, on } from '@weavix/sdk-core';\nimport { useEffect, useState } from 'react';\n\n/**\n * Реактивный хук для получения текущей темы хоста.\n * @returns Текущая тема (`'light'` | `'dark'` и т.д.), или `undefined` до получения первого события.\n * @example\n * ```tsx\n * function App() {\n * const theme = useTheme();\n * return <div className={theme}>...</div>;\n * }\n * ```\n */\nexport function useTheme(): Theme | undefined {\n const [theme, setTheme] = useState<Theme | undefined>(() => {\n let initial: Theme | undefined;\n const unsubscribe = on('theme.changed', (value) => {\n initial = value;\n });\n unsubscribe();\n return initial;\n });\n\n useEffect(() => {\n const unsubscribe = on('theme.changed', (value) => {\n setTheme(value);\n });\n\n return unsubscribe;\n }, []);\n\n return theme;\n}\n","import { hostApi } from '@weavix/sdk-core';\nimport { useEffect, useState } from 'react';\n\n/**\n * Реактивный хук для получения айди текущего пользователя.\n * @returns Айди пользователя (например, `'qwertyu'`), или `undefined` до получения первого события.\n * @example\n * ```tsx\n * function App() {\n * const userId = useUserId();\n * return <span>Айди: {userId}</span>;\n * }\n * ```\n */\nexport function useUserId(): string | undefined {\n const [userId, setUserId] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n const init = async () => {\n const id = (await hostApi.getUserId()) as string | undefined;\n\n setUserId(id);\n };\n\n init();\n }, []);\n\n return userId;\n}\n","import {\n type BasicContext,\n type ContextLevel,\n type Theme,\n dispatchHostEvent,\n hostApi,\n setHandler,\n uiApi,\n} from '@weavix/sdk-core';\nimport {\n type ReactNode,\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useContext as useSlotContext } from '../hooks/useContext';\nimport { useIsYateam } from '../hooks/useIsYateam';\nimport { useLanguage } from '../hooks/useLanguage';\nimport { useTheme } from '../hooks/useTheme';\nimport { useUserId } from '../hooks/useUserId';\nimport { ErrorBoundary } from './ErrorBoundary';\nimport { PluginError } from './PluginError';\n\n/**\n * Generic registerHandler — no Tracker-specific types.\n */\nexport type RegisterHandlerFunction = (\n methodName: string,\n handler: (...args: unknown[]) => unknown,\n) => void;\n\ninterface CommonPluginContextValue {\n /** Current host theme. Updated reactively on theme.changed. */\n theme: Theme | undefined;\n /** Current host language. Updated reactively on language.changed. */\n language: string | undefined;\n /** Service in which the plugin was opened. */\n service: string;\n /** User ID. */\n userId?: string;\n /** Is this a yateam environment? */\n isYateam?: boolean;\n /** Origin of the parent window (host). */\n origin: string;\n /** Slot in which the plugin is opened. */\n slot: string;\n /** URL inside the plugin. */\n innerUrl: string;\n /** Plugin query parameters. */\n queryParams: Record<string, string>;\n /** Register a handler for responding to host requests. */\n registerHandler: RegisterHandlerFunction;\n}\n\n/**\n * Plugin context at contextLevel = 'basic'.\n * slotContext contains only entityId.\n */\nexport interface BasicPluginContextValue extends CommonPluginContextValue {\n /** Page context — only entityId at basic level. */\n slotContext: BasicContext | undefined;\n\n /** Context level declared in the manifest. */\n contextLevel: 'basic';\n}\n\n/**\n * Plugin context at contextLevel = 'full'.\n * slotContext contains the full slot object.\n */\nexport interface FullPluginContextValue extends CommonPluginContextValue {\n /** Page context — full slot object at full level. */\n slotContext: unknown;\n\n /** Context level declared in the manifest. */\n contextLevel: 'full';\n}\n\nexport type PluginContextValue = BasicPluginContextValue | FullPluginContextValue;\n\n/** Internal context type — only stable data (slot + registerHandler) */\ntype InternalContextValue = {\n slot: string;\n registerHandler: RegisterHandlerFunction;\n innerUrl: string;\n queryParams: Record<string, string>;\n contextLevel: ContextLevel;\n entityId: string | null;\n entityMeta: Record<string, string> | undefined;\n};\n\nconst PluginContext = createContext<InternalContextValue | null>(null);\n\n/**\n * Hook for getting theme, language, slot and slot context from PluginProvider.\n *\n * All values are reactive — updated automatically on push events from the host:\n * - `theme` — on `theme.changed`\n * - `language` — on `language.changed`\n * - `slotContext` — on `context.changed`\n *\n * Supports two context levels:\n * - `'basic'` (default) — slotContext contains only `{ entityId }`.\n * - `'full'` — slotContext contains the full slot object.\n * Requires `contextLevel: \"full\"` in the plugin manifest.\n */\nexport function usePluginContext(): BasicPluginContextValue;\nexport function usePluginContext(level: 'basic'): BasicPluginContextValue;\nexport function usePluginContext(level: 'full'): FullPluginContextValue;\nexport function usePluginContext(\n level: ContextLevel = 'basic',\n): BasicPluginContextValue | FullPluginContextValue {\n const ctx = useContext(PluginContext);\n if (!ctx) {\n throw new Error('usePluginContext must be used within PluginProvider');\n }\n\n // Runtime guard: code requests more than manifest allows\n if (level === 'full' && ctx.contextLevel !== 'full') {\n throw new Error(\n \"🛑 [Security] Code requests 'full' context, but manifest declares 'basic'. \" +\n 'Change the contextLevel in your manifest to get full access.',\n );\n }\n\n // Reactive values — each hook subscribes to its own event\n const theme = useTheme();\n const language = useLanguage();\n const isYateam = useIsYateam();\n const userId = useUserId();\n const fullSlotContext = useSlotContext();\n\n const commonContextValue = {\n service: hostApi.getService(),\n origin: hostApi.getOrigin(),\n slot: ctx.slot,\n innerUrl: ctx.innerUrl,\n queryParams: ctx.queryParams,\n registerHandler: ctx.registerHandler,\n theme,\n language,\n isYateam,\n userId,\n };\n\n if (level === 'basic') {\n const basicSlotContext: BasicContext | undefined = ctx.entityId\n ? { entityId: ctx.entityId, ...(ctx.entityMeta ? { entityMeta: ctx.entityMeta } : {}) }\n : undefined;\n\n return {\n ...commonContextValue,\n contextLevel: 'basic',\n slotContext: basicSlotContext,\n } as BasicPluginContextValue;\n }\n\n return {\n ...commonContextValue,\n contextLevel: 'full',\n slotContext: fullSlotContext,\n } as FullPluginContextValue;\n}\n\nexport interface PluginProviderProps {\n children: ReactNode;\n /**\n * Automatically resize the plugin container when content changes.\n * @default true\n */\n autoResize?: boolean;\n /**\n * Component to display during initialization.\n * @default undefined (nothing shown)\n */\n fallback?: ReactNode;\n /**\n * Component to display on initialization error.\n * @default <PluginError error={error} />\n */\n errorFallback?: (error: Error) => ReactNode;\n /**\n * Automatically notify the host that the plugin is ready after initialization.\n * @default true\n */\n autoNotifyReady?: boolean;\n}\n\nexport const isInternalUrl = (url: string) => {\n try {\n const urlObj = new URL(url, window.location.href);\n return urlObj.origin === window.location.origin;\n } catch {\n return true;\n }\n};\n\n/**\n * Generic plugin provider.\n * Wraps the application and manages the plugin lifecycle.\n *\n * After initialization, theme, language and slot context are available via\n * `usePluginContext()` and update reactively on push events from the host.\n * @example\n * ```tsx\n * root.render(\n * <PluginProvider>\n * <App />\n * </PluginProvider>\n * );\n * ```\n */\nexport function PluginProvider({\n children,\n autoResize = true,\n fallback,\n errorFallback,\n autoNotifyReady = true,\n}: PluginProviderProps) {\n const initializedRef = useRef(false);\n const [initialized, setInitialized] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [internalValue, setInternalValue] = useState<InternalContextValue | null>(null);\n\n const registerHandler = useMemo<RegisterHandlerFunction>(() => {\n return (methodName: string, handler: (...args: unknown[]) => unknown) =>\n setHandler(methodName as never, handler as never);\n }, []);\n\n useEffect(() => {\n const handleLinkClick = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n const linkElement = target.closest<HTMLElement>('[href], [data-href]');\n\n if (!linkElement) return;\n\n const href = linkElement.getAttribute('href') || linkElement.getAttribute('data-href');\n if (!href) return;\n\n if (isInternalUrl(href)) {\n return;\n }\n\n event.preventDefault();\n\n const targetAttr = linkElement.getAttribute('target');\n const newTab = targetAttr === '_blank';\n\n uiApi\n .navigate({\n path: href,\n options: {\n newTab,\n },\n })\n .then(() => {\n console.info(`Navigation: ${href}`);\n })\n .catch((err) => {\n console.error('Navigation error:', err);\n });\n };\n\n document.addEventListener('click', handleLinkClick);\n\n return () => {\n document.removeEventListener('click', handleLinkClick);\n };\n }, []);\n\n useEffect(() => {\n // Prevent double initialization in React StrictMode\n if (initializedRef.current) {\n return;\n }\n\n const initPlugin = async () => {\n try {\n hostApi.init({ autoResize });\n initializedRef.current = true;\n\n const contextLevel = hostApi.getContextLevel();\n const entityId = hostApi.getEntityId();\n const entityMeta = hostApi.getEntityMeta();\n\n setInternalValue({\n slot: hostApi.getSlot(),\n innerUrl: hostApi.getInnerUrl(),\n queryParams: hostApi.getQueryParams(),\n contextLevel,\n entityId,\n entityMeta,\n registerHandler,\n });\n\n if (autoNotifyReady) {\n await hostApi.notifyReady();\n }\n\n // Fetch initial values and prime the eventBus cache so that\n // hooks subscribing after these responses arrive still get the values.\n // For basic contextLevel, skip the context.get postMessage call.\n const [theme, language, context, isYateam, userId] = await Promise.allSettled([\n hostApi.getTheme(),\n hostApi.getLanguage(),\n contextLevel === 'full' ? hostApi.getContext() : Promise.resolve(null),\n hostApi.getIsYateam(),\n hostApi.getUserId(),\n ]);\n\n if (theme.status === 'fulfilled' && theme.value) {\n dispatchHostEvent({\n messageId: '',\n type: 'event',\n method: 'theme.changed',\n result: theme.value,\n });\n }\n if (language.status === 'fulfilled' && language.value) {\n dispatchHostEvent({\n messageId: '',\n type: 'event',\n method: 'language.changed',\n result: language.value,\n });\n }\n\n if (isYateam.status === 'fulfilled' && isYateam.value) {\n dispatchHostEvent({\n messageId: '',\n type: 'event',\n method: 'isYateam.changed',\n result: isYateam.value,\n });\n }\n\n if (userId.status === 'fulfilled' && userId.value) {\n dispatchHostEvent({\n messageId: '',\n type: 'event',\n method: 'userId.changed',\n result: userId.value,\n });\n }\n\n // For basic level, dispatch entityId as context.\n // For full level, dispatch the full context from host.\n if (contextLevel === 'basic') {\n if (entityId) {\n dispatchHostEvent({\n messageId: '',\n type: 'event',\n method: 'context.changed',\n result: { entityId, ...(entityMeta ? { entityMeta } : {}) },\n });\n }\n } else if (context.status === 'fulfilled' && context.value) {\n dispatchHostEvent({\n messageId: '',\n type: 'event',\n method: 'context.changed',\n result: context.value,\n });\n }\n\n setInitialized(true);\n } catch (err) {\n setError(err as Error);\n }\n };\n\n initPlugin();\n }, [autoResize, registerHandler, autoNotifyReady]);\n\n if (error) {\n if (errorFallback) {\n return <>{errorFallback(error)}</>;\n }\n\n return <PluginError error={error} />;\n }\n\n if (!initialized || !internalValue) {\n return <>{fallback}</>;\n }\n\n return (\n <ErrorBoundary\n fallback={errorFallback || ((pluginError) => <PluginError error={pluginError} />)}\n >\n <PluginContext.Provider value={internalValue}>{children}</PluginContext.Provider>\n </ErrorBoundary>\n );\n}\n","import { type ConfirmOptions, type ConfirmResult, uiApi } from '@weavix/sdk-core';\nimport { useCallback } from 'react';\n\nexport type UseConfirmReturn = {\n show: (options: ConfirmOptions) => Promise<ConfirmResult>;\n};\n\nconst useConfirmImpl = () => {\n const show = useCallback((options: ConfirmOptions) => uiApi.confirm.show(options), []);\n\n return { show };\n};\n\nexport const useConfirm = useConfirmImpl as () => UseConfirmReturn;\n","import { type LocalizedString, getLocalizedString } from '@weavix/sdk-core';\nimport { useLanguage } from './useLanguage';\n\nconst useLocalizedStringImpl = (fallbackLanguage = 'ru') => {\n const language = useLanguage();\n\n return (value: LocalizedString): string => {\n return getLocalizedString(value, language, fallbackLanguage);\n };\n};\n\n/**\n * Хук для получения локализованной строки на основе текущего языка из контекста.\n */\nexport const useLocalizedString = useLocalizedStringImpl as (\n fallbackLanguage?: string,\n) => (value: LocalizedString) => string;\n","import { type ToastOptions, uiApi } from '@weavix/sdk-core';\nimport { useCallback } from 'react';\n\nexport type UseToasterReturn = {\n add: (options: ToastOptions) => Promise<{ name: string }>;\n};\n\nconst useToasterImpl = () => {\n const add = useCallback((options: ToastOptions) => uiApi.toaster.add(options), []);\n\n return { add };\n};\n\nexport const useToaster = useToasterImpl as () => UseToasterReturn;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/components/ErrorBoundary.tsx","../src/components/PluginError.tsx","../src/components/PluginLoader.tsx","../src/hooks/useContext.ts","../src/hooks/useIsYateam.ts","../src/hooks/useLanguage.ts","../src/hooks/useTheme.ts","../src/hooks/useUserId.ts","../src/components/PluginProvider.tsx","../src/hooks/useConfirm.ts","../src/hooks/useLocalizedString.ts","../src/hooks/usePluginBootstrap.ts","../src/hooks/useToaster.ts"],"sourcesContent":["import { Component, ReactNode } from 'react';\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n fallback: (error: Error) => ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error('ErrorBoundary caught an error:', error, errorInfo);\n }\n\n render() {\n if (this.state.hasError && this.state.error) {\n return this.props.fallback(this.state.error);\n }\n\n return this.props.children;\n }\n}\n","import type { FC } from 'react';\nimport './PluginError.scss';\n\nexport interface PluginErrorProps {\n error: Error;\n}\n\nconst PluginErrorImpl = ({ error }: PluginErrorProps) => (\n <div className=\"plugin-error\">\n <div className=\"plugin-error__container\">\n <div className=\"plugin-error__header\">\n <svg\n className=\"plugin-error__icon\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#f44336\" />\n <path\n d=\"M12 7v6m0 4h.01\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n <h3 className=\"plugin-error__title\">Ошибка инициализации плагина</h3>\n </div>\n <div className=\"plugin-error__message\">\n Не удалось инициализировать плагин. Проверьте параметры запуска и попробуйте\n перезагрузить страницу.\n </div>\n <details className=\"plugin-error__details\">\n <summary className=\"plugin-error__summary\">Детали ошибки</summary>\n <pre className=\"plugin-error__stack\">\n {error.message}\n {error.stack && `\\n\\n${error.stack}`}\n </pre>\n </details>\n </div>\n </div>\n);\n\n/**\n * Дефолтный компонент для отображения ошибки инициализации плагина\n */\nexport const PluginError = PluginErrorImpl as FC<PluginErrorProps>;\n","import type { FC } from 'react';\nimport './PluginLoader.scss';\n\nconst PluginLoaderImpl = () => (\n <div className=\"plugin-loader\">\n <div className=\"plugin-loader__content\">\n <div className=\"plugin-loader__spinner\" />\n <div className=\"plugin-loader__text\">Загрузка плагина...</div>\n </div>\n </div>\n);\n\n/**\n * Простой лоадер для отображения во время инициализации плагина\n */\nexport const PluginLoader = PluginLoaderImpl as FC;\n","import { on } from '@weavix/sdk-core';\nimport { useEffect, useState } from 'react';\n\n/**\n * Reactive hook for receiving the current slot context pushed by the host.\n * @template T - Type of the context object (defaults to `unknown`)\n * @returns Current context, or `undefined` until the first event arrives from the host.\n * @example\n * ```tsx\n * interface IssueContext {\n * key: string;\n * summary: string;\n * }\n *\n * function App() {\n * const context = useContext<IssueContext>();\n * if (!context) return <Loader />;\n * return <div>{context.summary}</div>;\n * }\n * ```\n */\nexport function useContext<T = unknown>(): T | undefined {\n const [context, setContext] = useState<T | undefined>(() => {\n let initial: T | undefined;\n const unsubscribe = on('context.changed', (value) => {\n initial = value as T;\n });\n unsubscribe();\n return initial;\n });\n\n useEffect(() => {\n const unsubscribe = on('context.changed', (value) => {\n setContext(value as T);\n });\n\n return unsubscribe;\n }, []);\n\n return context;\n}\n","import { hostApi } from '@weavix/sdk-core';\nimport { useEffect, useState } from 'react';\n\n/**\n * Реактивный хук для получения текущей сборки приложения.\n * @returns Является ли ятимом приложение (например, 'true'), или `undefined` до получения первого события.\n * @example\n * ```tsx\n * function App() {\n * const isYateam = useIsYateam();\n * return <span>Ятим ли сейчас?: {isYateam}</span>;\n * }\n * ```\n */\nexport function useIsYateam(): boolean | undefined {\n const [isYateam, setIsYateam] = useState<boolean | undefined>(undefined);\n\n useEffect(() => {\n const init = async () => {\n const yateam = (await hostApi.getIsYateam()) as boolean | undefined;\n setIsYateam(yateam);\n };\n\n init();\n }, []);\n\n return isYateam;\n}\n","import { on } from '@weavix/sdk-core';\nimport { useEffect, useState } from 'react';\n\n/**\n * Реактивный хук для получения текущего языка хоста.\n * @returns Код текущего языка (например, `'ru'`, `'en'`), или `undefined` до получения первого события.\n * @example\n * ```tsx\n * function App() {\n * const language = useLanguage();\n * return <span>Текущий язык: {language}</span>;\n * }\n * ```\n */\nexport function useLanguage(): string | undefined {\n const [language, setLanguage] = useState<string | undefined>(() => {\n let initial: string | undefined;\n const unsubscribe = on('language.changed', (value) => {\n initial = value;\n });\n unsubscribe();\n return initial;\n });\n\n useEffect(() => {\n const unsubscribe = on('language.changed', (value) => {\n setLanguage(value);\n });\n\n return unsubscribe;\n }, []);\n\n return language;\n}\n","import { type Theme, on } from '@weavix/sdk-core';\nimport { useEffect, useState } from 'react';\n\n/**\n * Реактивный хук для получения текущей темы хоста.\n * @returns Текущая тема (`'light'` | `'dark'` и т.д.), или `undefined` до получения первого события.\n * @example\n * ```tsx\n * function App() {\n * const theme = useTheme();\n * return <div className={theme}>...</div>;\n * }\n * ```\n */\nexport function useTheme(): Theme | undefined {\n const [theme, setTheme] = useState<Theme | undefined>(() => {\n let initial: Theme | undefined;\n const unsubscribe = on('theme.changed', (value) => {\n initial = value;\n });\n unsubscribe();\n return initial;\n });\n\n useEffect(() => {\n const unsubscribe = on('theme.changed', (value) => {\n setTheme(value);\n });\n\n return unsubscribe;\n }, []);\n\n return theme;\n}\n","import { hostApi } from '@weavix/sdk-core';\nimport { useEffect, useState } from 'react';\n\n/**\n * Реактивный хук для получения айди текущего пользователя.\n * @returns Айди пользователя (например, `'qwertyu'`), или `undefined` до получения первого события.\n * @example\n * ```tsx\n * function App() {\n * const userId = useUserId();\n * return <span>Айди: {userId}</span>;\n * }\n * ```\n */\nexport function useUserId(): string | undefined {\n const [userId, setUserId] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n const init = async () => {\n const id = (await hostApi.getUserId()) as string | undefined;\n\n setUserId(id);\n };\n\n init();\n }, []);\n\n return userId;\n}\n","import {\n type BasicContext,\n type ContextLevel,\n type Theme,\n dispatchHostEvent,\n hostApi,\n setHandler,\n uiApi,\n} from '@weavix/sdk-core';\nimport {\n type ReactNode,\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useContext as useSlotContext } from '../hooks/useContext';\nimport { useIsYateam } from '../hooks/useIsYateam';\nimport { useLanguage } from '../hooks/useLanguage';\nimport { useTheme } from '../hooks/useTheme';\nimport { useUserId } from '../hooks/useUserId';\nimport { ErrorBoundary } from './ErrorBoundary';\nimport { PluginError } from './PluginError';\n\n/**\n * Generic registerHandler — no Tracker-specific types.\n */\nexport type RegisterHandlerFunction = (\n methodName: string,\n handler: (...args: unknown[]) => unknown,\n) => void;\n\ninterface CommonPluginContextValue {\n /** Current host theme. Updated reactively on theme.changed. */\n theme: Theme | undefined;\n /** Current host language. Updated reactively on language.changed. */\n language: string | undefined;\n /** Service in which the plugin was opened. */\n service: string;\n /** User ID. */\n userId?: string;\n /** Is this a yateam environment? */\n isYateam?: boolean;\n /** Origin of the parent window (host). */\n origin: string;\n /** Slot in which the plugin is opened. */\n slot: string;\n /** URL inside the plugin. */\n innerUrl: string;\n /** Plugin query parameters. */\n queryParams: Record<string, string>;\n /** Register a handler for responding to host requests. */\n registerHandler: RegisterHandlerFunction;\n}\n\n/**\n * Plugin context at contextLevel = 'basic'.\n * slotContext contains only entityId.\n */\nexport interface BasicPluginContextValue extends CommonPluginContextValue {\n /** Page context — only entityId at basic level. */\n slotContext: BasicContext | undefined;\n\n /** Context level declared in the manifest. */\n contextLevel: 'basic';\n}\n\n/**\n * Plugin context at contextLevel = 'full'.\n * slotContext contains the full slot object.\n */\nexport interface FullPluginContextValue extends CommonPluginContextValue {\n /** Page context — full slot object at full level. */\n slotContext: unknown;\n\n /** Context level declared in the manifest. */\n contextLevel: 'full';\n}\n\nexport type PluginContextValue = BasicPluginContextValue | FullPluginContextValue;\n\n/** Internal context type — only stable data (slot + registerHandler) */\ntype InternalContextValue = {\n slot: string;\n registerHandler: RegisterHandlerFunction;\n innerUrl: string;\n queryParams: Record<string, string>;\n contextLevel: ContextLevel;\n entityId: string | null;\n entityMeta: Record<string, string> | undefined;\n};\n\nconst PluginContext = createContext<InternalContextValue | null>(null);\n\n/**\n * Hook for getting theme, language, slot and slot context from PluginProvider.\n *\n * All values are reactive — updated automatically on push events from the host:\n * - `theme` — on `theme.changed`\n * - `language` — on `language.changed`\n * - `slotContext` — on `context.changed`\n *\n * Supports two context levels:\n * - `'basic'` (default) — slotContext contains only `{ entityId }`.\n * - `'full'` — slotContext contains the full slot object.\n * Requires `contextLevel: \"full\"` in the plugin manifest.\n */\nexport function usePluginContext(): BasicPluginContextValue;\nexport function usePluginContext(level: 'basic'): BasicPluginContextValue;\nexport function usePluginContext(level: 'full'): FullPluginContextValue;\nexport function usePluginContext(\n level: ContextLevel = 'basic',\n): BasicPluginContextValue | FullPluginContextValue {\n const ctx = useContext(PluginContext);\n if (!ctx) {\n throw new Error('usePluginContext must be used within PluginProvider');\n }\n\n // Runtime guard: code requests more than manifest allows\n if (level === 'full' && ctx.contextLevel !== 'full') {\n throw new Error(\n \"🛑 [Security] Code requests 'full' context, but manifest declares 'basic'. \" +\n 'Change the contextLevel in your manifest to get full access.',\n );\n }\n\n // Reactive values — each hook subscribes to its own event\n const theme = useTheme();\n const language = useLanguage();\n const isYateam = useIsYateam();\n const userId = useUserId();\n const fullSlotContext = useSlotContext();\n\n const commonContextValue = {\n service: hostApi.getService(),\n origin: hostApi.getOrigin(),\n slot: ctx.slot,\n innerUrl: ctx.innerUrl,\n queryParams: ctx.queryParams,\n registerHandler: ctx.registerHandler,\n theme,\n language,\n isYateam,\n userId,\n };\n\n if (level === 'basic') {\n const basicSlotContext: BasicContext | undefined = ctx.entityId\n ? { entityId: ctx.entityId, ...(ctx.entityMeta ? { entityMeta: ctx.entityMeta } : {}) }\n : undefined;\n\n return {\n ...commonContextValue,\n contextLevel: 'basic',\n slotContext: basicSlotContext,\n } as BasicPluginContextValue;\n }\n\n return {\n ...commonContextValue,\n contextLevel: 'full',\n slotContext: fullSlotContext,\n } as FullPluginContextValue;\n}\n\nexport interface PluginProviderProps {\n children: ReactNode;\n /**\n * Automatically resize the plugin container when content changes.\n * @default true\n */\n autoResize?: boolean;\n /**\n * Component to display during initialization.\n * @default undefined (nothing shown)\n */\n fallback?: ReactNode;\n /**\n * Component to display on initialization error.\n * @default <PluginError error={error} />\n */\n errorFallback?: (error: Error) => ReactNode;\n /**\n * Automatically notify the host that the plugin is ready after initialization.\n * @default true\n */\n autoNotifyReady?: boolean;\n}\n\nexport const isInternalUrl = (url: string) => {\n try {\n const urlObj = new URL(url, window.location.href);\n return urlObj.origin === window.location.origin;\n } catch {\n return true;\n }\n};\n\n/**\n * Generic plugin provider.\n * Wraps the application and manages the plugin lifecycle.\n *\n * After initialization, theme, language and slot context are available via\n * `usePluginContext()` and update reactively on push events from the host.\n * @example\n * ```tsx\n * root.render(\n * <PluginProvider>\n * <App />\n * </PluginProvider>\n * );\n * ```\n */\nexport function PluginProvider({\n children,\n autoResize = true,\n fallback,\n errorFallback,\n autoNotifyReady = true,\n}: PluginProviderProps) {\n const initializedRef = useRef(false);\n const [initialized, setInitialized] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [internalValue, setInternalValue] = useState<InternalContextValue | null>(null);\n\n const registerHandler = useMemo<RegisterHandlerFunction>(() => {\n return (methodName: string, handler: (...args: unknown[]) => unknown) =>\n setHandler(methodName as never, handler as never);\n }, []);\n\n useEffect(() => {\n const handleLinkClick = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n const linkElement = target.closest<HTMLElement>('[href], [data-href]');\n\n if (!linkElement) return;\n\n const href = linkElement.getAttribute('href') || linkElement.getAttribute('data-href');\n if (!href) return;\n\n if (isInternalUrl(href)) {\n return;\n }\n\n event.preventDefault();\n\n const targetAttr = linkElement.getAttribute('target');\n const newTab = targetAttr === '_blank';\n\n uiApi\n .navigate({\n path: href,\n options: {\n newTab,\n },\n })\n .then(() => {\n console.info(`Navigation: ${href}`);\n })\n .catch((err) => {\n console.error('Navigation error:', err);\n });\n };\n\n document.addEventListener('click', handleLinkClick);\n\n return () => {\n document.removeEventListener('click', handleLinkClick);\n };\n }, []);\n\n useEffect(() => {\n // Prevent double initialization in React StrictMode\n if (initializedRef.current) {\n return;\n }\n\n const initPlugin = async () => {\n try {\n hostApi.init({ autoResize });\n initializedRef.current = true;\n\n const contextLevel = hostApi.getContextLevel();\n const entityId = hostApi.getEntityId();\n const entityMeta = hostApi.getEntityMeta();\n\n setInternalValue({\n slot: hostApi.getSlot(),\n innerUrl: hostApi.getInnerUrl(),\n queryParams: hostApi.getQueryParams(),\n contextLevel,\n entityId,\n entityMeta,\n registerHandler,\n });\n\n if (autoNotifyReady) {\n await hostApi.notifyReady();\n }\n\n // Fetch initial values and prime the eventBus cache so that\n // hooks subscribing after these responses arrive still get the values.\n // For basic contextLevel, skip the context.get postMessage call.\n const [theme, language, context, isYateam, userId] = await Promise.allSettled([\n hostApi.getTheme(),\n hostApi.getLanguage(),\n contextLevel === 'full' ? hostApi.getContext() : Promise.resolve(null),\n hostApi.getIsYateam(),\n hostApi.getUserId(),\n ]);\n\n if (theme.status === 'fulfilled' && theme.value) {\n dispatchHostEvent({\n messageId: '',\n type: 'event',\n method: 'theme.changed',\n result: theme.value,\n });\n }\n if (language.status === 'fulfilled' && language.value) {\n dispatchHostEvent({\n messageId: '',\n type: 'event',\n method: 'language.changed',\n result: language.value,\n });\n }\n\n if (isYateam.status === 'fulfilled' && isYateam.value) {\n dispatchHostEvent({\n messageId: '',\n type: 'event',\n method: 'isYateam.changed',\n result: isYateam.value,\n });\n }\n\n if (userId.status === 'fulfilled' && userId.value) {\n dispatchHostEvent({\n messageId: '',\n type: 'event',\n method: 'userId.changed',\n result: userId.value,\n });\n }\n\n // For basic level, dispatch entityId as context.\n // For full level, dispatch the full context from host.\n if (contextLevel === 'basic') {\n if (entityId) {\n dispatchHostEvent({\n messageId: '',\n type: 'event',\n method: 'context.changed',\n result: { entityId, ...(entityMeta ? { entityMeta } : {}) },\n });\n }\n } else if (context.status === 'fulfilled' && context.value) {\n dispatchHostEvent({\n messageId: '',\n type: 'event',\n method: 'context.changed',\n result: context.value,\n });\n }\n\n setInitialized(true);\n } catch (err) {\n setError(err as Error);\n }\n };\n\n initPlugin();\n }, [autoResize, registerHandler, autoNotifyReady]);\n\n if (error) {\n if (errorFallback) {\n return <>{errorFallback(error)}</>;\n }\n\n return <PluginError error={error} />;\n }\n\n if (!initialized || !internalValue) {\n return <>{fallback}</>;\n }\n\n return (\n <ErrorBoundary\n fallback={errorFallback || ((pluginError) => <PluginError error={pluginError} />)}\n >\n <PluginContext.Provider value={internalValue}>{children}</PluginContext.Provider>\n </ErrorBoundary>\n );\n}\n","import { type ConfirmOptions, type ConfirmResult, uiApi } from '@weavix/sdk-core';\nimport { useCallback } from 'react';\n\nexport type UseConfirmReturn = {\n show: (options: ConfirmOptions) => Promise<ConfirmResult>;\n};\n\nconst useConfirmImpl = () => {\n const show = useCallback((options: ConfirmOptions) => uiApi.confirm.show(options), []);\n\n return { show };\n};\n\nexport const useConfirm = useConfirmImpl as () => UseConfirmReturn;\n","import { type LocalizedString, getLocalizedString } from '@weavix/sdk-core';\nimport { useLanguage } from './useLanguage';\n\nconst useLocalizedStringImpl = (fallbackLanguage = 'ru') => {\n const language = useLanguage();\n\n return (value: LocalizedString): string => {\n return getLocalizedString(value, language, fallbackLanguage);\n };\n};\n\n/**\n * Хук для получения локализованной строки на основе текущего языка из контекста.\n */\nexport const useLocalizedString = useLocalizedStringImpl as (\n fallbackLanguage?: string,\n) => (value: LocalizedString) => string;\n","import {\n HostApi,\n type HostInitOptions,\n type Theme,\n type Unsubscribe,\n dispatchHostEvent,\n on,\n} from '@weavix/sdk-core';\nimport { useEffect, useRef, useState } from 'react';\n\nexport type PluginBootstrapState<TContext> = {\n host: HostApi<TContext>;\n loading: boolean;\n error: string | null;\n theme?: Theme;\n language?: string;\n context?: TContext;\n userId?: string;\n isYateam?: boolean;\n};\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : 'Unknown plugin bootstrap error';\n}\n\ntype BootstrapEventMethod = Parameters<typeof dispatchHostEvent>[0]['method'];\n\nfunction dispatchInitialValue(method: BootstrapEventMethod, result: unknown) {\n if (result === undefined || result === null) {\n return;\n }\n\n dispatchHostEvent({\n messageId: '',\n type: 'event',\n method,\n result,\n });\n}\n\nexport function usePluginBootstrap<TContext>(\n options: HostInitOptions = {},\n): PluginBootstrapState<TContext> {\n const { autoResize = true } = options;\n const hostRef = useRef<HostApi<TContext> | null>(null);\n\n if (!hostRef.current) {\n hostRef.current = new HostApi<TContext>();\n }\n\n const host = hostRef.current;\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [theme, setTheme] = useState<Theme>();\n const [language, setLanguage] = useState<string>();\n const [context, setContext] = useState<TContext>();\n const [userId, setUserId] = useState<string>();\n const [isYateam, setIsYateam] = useState<boolean>();\n\n useEffect(() => {\n let cancelled = false;\n const unsubscribes: Unsubscribe[] = [];\n\n const subscribe = <M extends Parameters<typeof on>[0]>(\n method: M,\n callback: (value: unknown) => void,\n ) => {\n unsubscribes.push(on(method, callback as never));\n };\n\n try {\n host.init({ autoResize });\n\n subscribe('context.changed', (value) => setContext(value as TContext));\n subscribe('theme.changed', (value) => setTheme(value as Theme));\n subscribe('language.changed', (value) => setLanguage(value as string));\n subscribe('userId.changed', (value) => setUserId(value as string));\n subscribe('isYateam.changed', (value) => setIsYateam(value as boolean));\n } catch (initError) {\n setError(getErrorMessage(initError));\n setLoading(false);\n\n return () => {\n unsubscribes.forEach((unsubscribe) => unsubscribe());\n host.destroy();\n };\n }\n\n const bootstrap = async () => {\n try {\n const contextPromise =\n host.getContextLevel() === 'full'\n ? host.getContext()\n : Promise.resolve(undefined);\n const [\n resolvedContext,\n resolvedTheme,\n resolvedLanguage,\n resolvedUserId,\n resolvedIsYateam,\n ] = await Promise.all([\n contextPromise,\n host.getTheme() as Promise<Theme>,\n host.getLanguage() as Promise<string>,\n host.getUserId() as Promise<string | undefined>,\n host.getIsYateam() as Promise<boolean | undefined>,\n ]);\n\n if (cancelled) {\n return;\n }\n\n setContext(resolvedContext);\n setTheme(resolvedTheme);\n setLanguage(resolvedLanguage);\n setUserId(resolvedUserId);\n setIsYateam(resolvedIsYateam);\n\n dispatchInitialValue('context.changed', resolvedContext);\n dispatchInitialValue('theme.changed', resolvedTheme);\n dispatchInitialValue('language.changed', resolvedLanguage);\n dispatchInitialValue('userId.changed', resolvedUserId);\n dispatchInitialValue('isYateam.changed', resolvedIsYateam);\n\n setLoading(false);\n await host.notifyReady();\n } catch (bootstrapError) {\n if (cancelled) {\n return;\n }\n\n setError(getErrorMessage(bootstrapError));\n setLoading(false);\n }\n };\n\n bootstrap();\n\n return () => {\n cancelled = true;\n unsubscribes.forEach((unsubscribe) => unsubscribe());\n host.destroy();\n };\n }, [autoResize, host]);\n\n return {\n host,\n loading,\n error,\n theme,\n language,\n context,\n userId,\n isYateam,\n };\n}\n","import { type ToastOptions, uiApi } from '@weavix/sdk-core';\nimport { useCallback } from 'react';\n\nexport type UseToasterReturn = {\n add: (options: ToastOptions) => Promise<{ name: string }>;\n};\n\nconst useToasterImpl = () => {\n const add = useCallback((options: ToastOptions) => uiApi.toaster.add(options), []);\n\n return { add };\n};\n\nexport const useToaster = useToasterImpl as () => UseToasterReturn;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weavix/sdk-react",
3
- "version": "0.0.21",
3
+ "version": "0.0.23",
4
4
  "exports": {
5
5
  ".": {
6
6
  "types": "./dist/index.d.ts",
@@ -12,7 +12,7 @@
12
12
  "README.md"
13
13
  ],
14
14
  "dependencies": {
15
- "@weavix/sdk-core": "0.0.21"
15
+ "@weavix/sdk-core": "0.0.23"
16
16
  },
17
17
  "peerDependencies": {
18
18
  "react": "^18.0.0"