@weavix/sdk-react 0.0.28 → 0.0.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -44,7 +44,7 @@ function AppFull() {
44
44
  - **`PluginProvider`** — initializes the plugin, manages lifecycle, provides context
45
45
  - **`usePluginContext()`** — hook for accessing theme, language, slot, slotContext, registerHandler
46
46
  - **`isInternalUrl()`** — utility for checking if a URL is internal
47
- - **Hooks**: `useTheme`, `useLanguage`, `useIsYateam`, `useUserId`, `useIsOrbita`, `useConfirm`, `useToaster`, `useLocalizedString`
47
+ - **Hooks**: `useTheme`, `useLanguage`, `useIsYateam`, `useUserId`, `useOrgId`, `useIsOrbita`, `useConfirm`, `useToaster`, `useLocalizedString`
48
48
  - **Components**: `PluginError`, `PluginLoader`, `ErrorBoundary`
49
49
  - **Re-exports from `@weavix/sdk-core`**: `hostApi`, `uiApi`, `on`, `dispatchHostEvent`, error codes, types (no `trackerApi` — use tracker-react packages for Tracker HTTP)
50
50
 
@@ -13,6 +13,8 @@ interface CommonPluginContextValue {
13
13
  service: string;
14
14
  /** User ID. */
15
15
  userId?: string;
16
+ /** Organization ID. */
17
+ orgId?: string;
16
18
  /** Is this a yateam environment? */
17
19
  isYateam?: boolean;
18
20
  /** Is the Orbit enabled */
@@ -1 +1 @@
1
- {"version":3,"file":"PluginProvider.d.ts","sourceRoot":"","sources":["../../src/components/PluginProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,YAAY,EAEjB,KAAK,KAAK,EAKb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACH,KAAK,SAAS,EAOjB,MAAM,OAAO,CAAC;AAUf;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,KACvC,IAAI,CAAC;AAEV,UAAU,wBAAwB;IAC9B,+DAA+D;IAC/D,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,qEAAqE;IACrE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,0DAA0D;IAC1D,eAAe,EAAE,uBAAuB,CAAC;CAC5C;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAwB,SAAQ,wBAAwB;IACrE,mDAAmD;IACnD,WAAW,EAAE,YAAY,GAAG,SAAS,CAAC;IAEtC,8CAA8C;IAC9C,YAAY,EAAE,OAAO,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAuB,SAAQ,wBAAwB;IACpE,qDAAqD;IACrD,WAAW,EAAE,OAAO,CAAC;IAErB,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,kBAAkB,GAAG,uBAAuB,GAAG,sBAAsB,CAAC;AAelF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,IAAI,uBAAuB,CAAC;AAC5D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAAC;AAC1E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,sBAAsB,CAAC;AA0DxE,MAAM,WAAW,mBAAmB;IAChC,QAAQ,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC;IAC5C;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,YAOxC,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,EAC3B,QAAQ,EACR,UAAiB,EACjB,QAAQ,EACR,aAAa,EACb,eAAsB,GACzB,EAAE,mBAAmB,2CA0LrB"}
1
+ {"version":3,"file":"PluginProvider.d.ts","sourceRoot":"","sources":["../../src/components/PluginProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,YAAY,EAEjB,KAAK,KAAK,EAKb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACH,KAAK,SAAS,EAOjB,MAAM,OAAO,CAAC;AAWf;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,KACvC,IAAI,CAAC;AAEV,UAAU,wBAAwB;IAC9B,+DAA+D;IAC/D,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,qEAAqE;IACrE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,0DAA0D;IAC1D,eAAe,EAAE,uBAAuB,CAAC;CAC5C;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAwB,SAAQ,wBAAwB;IACrE,mDAAmD;IACnD,WAAW,EAAE,YAAY,GAAG,SAAS,CAAC;IAEtC,8CAA8C;IAC9C,YAAY,EAAE,OAAO,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAuB,SAAQ,wBAAwB;IACpE,qDAAqD;IACrD,WAAW,EAAE,OAAO,CAAC;IAErB,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,kBAAkB,GAAG,uBAAuB,GAAG,sBAAsB,CAAC;AAelF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,IAAI,uBAAuB,CAAC;AAC5D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAAC;AAC1E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,sBAAsB,CAAC;AA4DxE,MAAM,WAAW,mBAAmB;IAChC,QAAQ,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC;IAC5C;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,YAOxC,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,EAC3B,QAAQ,EACR,UAAiB,EACjB,QAAQ,EACR,aAAa,EACb,eAAsB,GACzB,EAAE,mBAAmB,2CAoMrB"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Реактивный хук для получения айди текущей организации.
3
+ * @returns Айди организации (например, `'org123'`), или `undefined` до получения первого события.
4
+ * @example
5
+ * ```tsx
6
+ * function App() {
7
+ * const orgId = useOrgId();
8
+ * return <span>Айди организации: {orgId}</span>;
9
+ * }
10
+ * ```
11
+ */
12
+ export declare function useOrgId(): string | undefined;
13
+ //# sourceMappingURL=useOrgId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOrgId.d.ts","sourceRoot":"","sources":["../../src/hooks/useOrgId.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,IAAI,MAAM,GAAG,SAAS,CAc7C"}
@@ -7,6 +7,7 @@ export type PluginBootstrapState<TContext> = {
7
7
  language?: string;
8
8
  context?: TContext;
9
9
  userId?: string;
10
+ orgId?: string;
10
11
  isYateam?: boolean;
11
12
  isOrbita?: boolean;
12
13
  };
@@ -1 +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;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAqBF,wBAAgB,kBAAkB,CAAC,QAAQ,EACvC,OAAO,GAAE,eAAoB,GAC9B,oBAAoB,CAAC,QAAQ,CAAC,CAwHhC"}
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,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAqBF,wBAAgB,kBAAkB,CAAC,QAAQ,EACvC,OAAO,GAAE,eAAoB,GAC9B,oBAAoB,CAAC,QAAQ,CAAC,CA+HhC"}
package/dist/index.d.ts CHANGED
@@ -9,6 +9,7 @@ export { useIsYateam } from './hooks/useIsYateam';
9
9
  export { useIsOrbita } from './hooks/useIsOrbita';
10
10
  export { useLanguage } from './hooks/useLanguage';
11
11
  export { useLocalizedString } from './hooks/useLocalizedString';
12
+ export { useOrgId } from './hooks/useOrgId';
12
13
  export { usePluginBootstrap } from './hooks/usePluginBootstrap';
13
14
  export { useTheme } from './hooks/useTheme';
14
15
  export { useToaster } from './hooks/useToaster';
@@ -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,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"}
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,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,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
@@ -113,8 +113,18 @@ function L() {
113
113
  }), []), e;
114
114
  }
115
115
  //#endregion
116
- //#region src/hooks/useTheme.ts
116
+ //#region src/hooks/useOrgId.ts
117
117
  function R() {
118
+ let [e, t] = s(void 0);
119
+ return i(() => {
120
+ (async () => {
121
+ t(await E.getOrgId());
122
+ })();
123
+ }, []), e;
124
+ }
125
+ //#endregion
126
+ //#region src/hooks/useTheme.ts
127
+ function z() {
118
128
  let [e, t] = s(() => {
119
129
  let e;
120
130
  return O("theme.changed", (t) => {
@@ -127,7 +137,7 @@ function R() {
127
137
  }
128
138
  //#endregion
129
139
  //#region src/hooks/useUserId.ts
130
- function z() {
140
+ function B() {
131
141
  let [e, t] = s(void 0);
132
142
  return i(() => {
133
143
  (async () => {
@@ -137,7 +147,7 @@ function z() {
137
147
  }
138
148
  //#endregion
139
149
  //#region src/hooks/useIsOrbita.ts
140
- function B() {
150
+ function V() {
141
151
  let [e, t] = s(() => {
142
152
  let e;
143
153
  return O("isOrbita.changed", (t) => {
@@ -148,12 +158,12 @@ function B() {
148
158
  }
149
159
  //#endregion
150
160
  //#region src/components/PluginProvider.tsx
151
- var V = t(null);
152
- function H(e = "basic") {
153
- let t = r(V);
161
+ var H = t(null);
162
+ function U(e = "basic") {
163
+ let t = r(H);
154
164
  if (!t) throw Error("usePluginContext must be used within PluginProvider");
155
165
  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.");
156
- let n = R(), i = L(), a = I(), o = z(), s = F(), c = B(), l = {
166
+ let n = z(), i = L(), a = I(), o = B(), s = R(), c = F(), l = V(), u = {
157
167
  service: E.getService(),
158
168
  origin: E.getOrigin(),
159
169
  slot: t.slot,
@@ -164,7 +174,8 @@ function H(e = "basic") {
164
174
  language: i,
165
175
  isYateam: a,
166
176
  userId: o,
167
- isOrbita: c
177
+ orgId: s,
178
+ isOrbita: l
168
179
  };
169
180
  if (e === "basic") {
170
181
  let e = t.entityId ? {
@@ -172,32 +183,32 @@ function H(e = "basic") {
172
183
  ...t.entityMeta ? { entityMeta: t.entityMeta } : {}
173
184
  } : void 0;
174
185
  return {
175
- ...l,
186
+ ...u,
176
187
  contextLevel: "basic",
177
188
  slotContext: e
178
189
  };
179
190
  }
180
191
  return {
181
- ...l,
192
+ ...u,
182
193
  contextLevel: "full",
183
- slotContext: s
194
+ slotContext: c
184
195
  };
185
196
  }
186
- var U = (e) => {
197
+ var W = (e) => {
187
198
  try {
188
199
  return new URL(e, window.location.href).origin === window.location.origin;
189
200
  } catch {
190
201
  return !0;
191
202
  }
192
203
  };
193
- function W({ children: e, autoResize: t = !0, fallback: n, errorFallback: r, autoNotifyReady: u = !0 }) {
204
+ function G({ children: e, autoResize: t = !0, fallback: n, errorFallback: r, autoNotifyReady: u = !0 }) {
194
205
  let d = o(!1), [f, p] = s(!1), [m, h] = s(null), [g, _] = s(null), v = a(() => (e, t) => k(e, t), []);
195
206
  return i(() => {
196
207
  let e = (e) => {
197
208
  let t = e.target.closest("[href], [data-href]");
198
209
  if (!t) return;
199
210
  let n = t.getAttribute("href") || t.getAttribute("data-href");
200
- if (!n || U(n)) return;
211
+ if (!n || W(n)) return;
201
212
  e.preventDefault();
202
213
  let r = t.getAttribute("target") === "_blank";
203
214
  j.navigate({
@@ -226,12 +237,13 @@ function W({ children: e, autoResize: t = !0, fallback: n, errorFallback: r, aut
226
237
  entityMeta: r,
227
238
  registerHandler: v
228
239
  }), u && await E.notifyReady();
229
- let [i, a, o, s, c, l] = await Promise.allSettled([
240
+ let [i, a, o, s, c, l, f] = await Promise.allSettled([
230
241
  E.getTheme(),
231
242
  E.getLanguage(),
232
243
  e === "full" ? E.getContext() : Promise.resolve(null),
233
244
  E.getIsYateam(),
234
245
  E.getUserId(),
246
+ E.getOrgId(),
235
247
  E.getIsOrbita()
236
248
  ]);
237
249
  i.status === "fulfilled" && i.value && x({
@@ -249,16 +261,21 @@ function W({ children: e, autoResize: t = !0, fallback: n, errorFallback: r, aut
249
261
  type: "event",
250
262
  method: "isYateam.changed",
251
263
  result: s.value
252
- }), l.status === "fulfilled" && x({
264
+ }), f.status === "fulfilled" && x({
253
265
  messageId: "",
254
266
  type: "event",
255
267
  method: "isOrbita.changed",
256
- result: l.value
268
+ result: f.value
257
269
  }), c.status === "fulfilled" && c.value && x({
258
270
  messageId: "",
259
271
  type: "event",
260
272
  method: "userId.changed",
261
273
  result: c.value
274
+ }), l.status === "fulfilled" && l.value && x({
275
+ messageId: "",
276
+ type: "event",
277
+ method: "orgId.changed",
278
+ result: l.value
262
279
  }), e === "basic" ? n && x({
263
280
  messageId: "",
264
281
  type: "event",
@@ -283,22 +300,22 @@ function W({ children: e, autoResize: t = !0, fallback: n, errorFallback: r, aut
283
300
  u
284
301
  ]), m ? r ? /* @__PURE__ */ l(c, { children: r(m) }) : /* @__PURE__ */ l(N, { error: m }) : !f || !g ? /* @__PURE__ */ l(c, { children: n }) : /* @__PURE__ */ l(M, {
285
302
  fallback: r || ((e) => /* @__PURE__ */ l(N, { error: e })),
286
- children: /* @__PURE__ */ l(V.Provider, {
303
+ children: /* @__PURE__ */ l(H.Provider, {
287
304
  value: g,
288
305
  children: e
289
306
  })
290
307
  });
291
308
  }
292
- var G = () => ({ show: n((e) => j.confirm.show(e), []) }), K = (e = "ru") => {
309
+ var K = () => ({ show: n((e) => j.confirm.show(e), []) }), q = (e = "ru") => {
293
310
  let t = L();
294
311
  return (n) => w(n, t, e);
295
312
  };
296
313
  //#endregion
297
314
  //#region src/hooks/usePluginBootstrap.ts
298
- function q(e) {
315
+ function J(e) {
299
316
  return e instanceof Error ? e.message : "Unknown plugin bootstrap error";
300
317
  }
301
- function J(e, t) {
318
+ function Y(e, t) {
302
319
  t != null && x({
303
320
  messageId: "",
304
321
  type: "event",
@@ -306,36 +323,37 @@ function J(e, t) {
306
323
  result: t
307
324
  });
308
325
  }
309
- function Y(e = {}) {
326
+ function X(e = {}) {
310
327
  let { autoResize: t = !0 } = e, n = o(null);
311
328
  n.current ||= new f();
312
- 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(), [S, C] = s();
329
+ 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(), [S, C] = s(), [w, T] = s();
313
330
  return i(() => {
314
331
  let e = !1, n = [], i = (e, t) => {
315
332
  n.push(O(e, t));
316
333
  };
317
334
  try {
318
- 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)), i("isOrbita.changed", (e) => C(e));
335
+ 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("orgId.changed", (e) => x(e)), i("isYateam.changed", (e) => C(e)), i("isOrbita.changed", (e) => T(e));
319
336
  } catch (e) {
320
- return u(q(e)), c(!1), () => {
337
+ return u(J(e)), c(!1), () => {
321
338
  n.forEach((e) => e()), r.destroy();
322
339
  };
323
340
  }
324
341
  return (async () => {
325
342
  try {
326
- let t = r.getContextLevel() === "full" ? r.getContext() : Promise.resolve(void 0), [n, i, a, o, s, l] = await Promise.all([
343
+ let t = r.getContextLevel() === "full" ? r.getContext() : Promise.resolve(void 0), [n, i, a, o, s, l, u] = await Promise.all([
327
344
  t,
328
345
  r.getTheme(),
329
346
  r.getLanguage(),
330
347
  r.getUserId(),
348
+ r.getOrgId(),
331
349
  r.getIsYateam(),
332
350
  r.getIsOrbita()
333
351
  ]);
334
352
  if (e) return;
335
- _(n), p(i), h(a), y(o), x(s), C(l), J("context.changed", n), J("theme.changed", i), J("language.changed", a), J("userId.changed", o), J("isYateam.changed", s), J("isOrbita.changed", l), c(!1), await r.notifyReady();
353
+ _(n), p(i), h(a), y(o), x(s), C(l), T(u), Y("context.changed", n), Y("theme.changed", i), Y("language.changed", a), Y("userId.changed", o), Y("orgId.changed", s), Y("isYateam.changed", l), Y("isOrbita.changed", u), c(!1), await r.notifyReady();
336
354
  } catch (t) {
337
355
  if (e) return;
338
- u(q(t)), c(!1);
356
+ u(J(t)), c(!1);
339
357
  }
340
358
  })(), () => {
341
359
  e = !0, n.forEach((e) => e()), r.destroy();
@@ -348,12 +366,13 @@ function Y(e = {}) {
348
366
  language: m,
349
367
  context: g,
350
368
  userId: v,
351
- isYateam: b,
352
- isOrbita: S
369
+ orgId: b,
370
+ isYateam: S,
371
+ isOrbita: w
353
372
  };
354
373
  }
355
- var X = () => ({ add: n((e) => j.toaster.add(e), []) });
374
+ var Z = () => ({ add: n((e) => j.toaster.add(e), []) });
356
375
  //#endregion
357
- 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, W as PluginProvider, v as UNKNOWN_ERROR, y as VALIDATION_ERROR, b as dispatchHostEvent, S as getField, C as getLocalizedString, T as hostApi, U as isInternalUrl, D as on, A as uiApi, G as useConfirm, B as useIsOrbita, I as useIsYateam, L as useLanguage, K as useLocalizedString, Y as usePluginBootstrap, H as usePluginContext, R as useTheme, X as useToaster, z as useUserId };
376
+ 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, G as PluginProvider, v as UNKNOWN_ERROR, y as VALIDATION_ERROR, b as dispatchHostEvent, S as getField, C as getLocalizedString, T as hostApi, W as isInternalUrl, D as on, A as uiApi, K as useConfirm, V as useIsOrbita, I as useIsYateam, L as useLanguage, q as useLocalizedString, R as useOrgId, X as usePluginBootstrap, U as usePluginContext, z as useTheme, Z as useToaster, B as useUserId };
358
377
 
359
378
  //# 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/hooks/useIsOrbita.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 { on } 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 isOrbita = useIsOrbita();\n * return <span>Orbita: {String(isOrbita)}</span>;\n * }\n * ```\n */\nexport function useIsOrbita(): boolean | undefined {\n const [isOrbita, setIsOrbita] = useState<boolean | undefined>(() => {\n let initial: boolean | undefined;\n const unsubscribe = on('isOrbita.changed', (value) => {\n initial = value;\n });\n\n unsubscribe();\n\n return initial;\n });\n\n useEffect(() => {\n return on('isOrbita.changed', setIsOrbita);\n }, []);\n\n return isOrbita;\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';\nimport { useIsOrbita } from '../hooks/useIsOrbita';\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 /** Is the Orbit enabled */\n isOrbita?: 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 * - `isOrbita` — on `isOrbita.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 const isOrbita = useIsOrbita();\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 isOrbita,\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, isOrbita] =\n await Promise.allSettled([\n hostApi.getTheme(),\n hostApi.getLanguage(),\n contextLevel === 'full' ? hostApi.getContext() : Promise.resolve(null),\n hostApi.getIsYateam(),\n hostApi.getUserId(),\n hostApi.getIsOrbita(),\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 (isOrbita.status === 'fulfilled') {\n dispatchHostEvent({\n messageId: '',\n type: 'event',\n method: 'isOrbita.changed',\n result: isOrbita.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 isOrbita?: 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 const [isOrbita, setIsOrbita] = 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 subscribe('isOrbita.changed', (value) => setIsOrbita(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 resolvedIsOrbita,\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 host.getIsOrbita() 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 setIsOrbita(resolvedIsOrbita);\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 dispatchInitialValue('isOrbita.changed', resolvedIsOrbita);\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 isOrbita,\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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"}
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/useOrgId.ts","../src/hooks/useTheme.ts","../src/hooks/useUserId.ts","../src/hooks/useIsOrbita.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 { hostApi } from '@weavix/sdk-core';\nimport { useEffect, useState } from 'react';\n\n/**\n * Реактивный хук для получения айди текущей организации.\n * @returns Айди организации (например, `'org123'`), или `undefined` до получения первого события.\n * @example\n * ```tsx\n * function App() {\n * const orgId = useOrgId();\n * return <span>Айди организации: {orgId}</span>;\n * }\n * ```\n */\nexport function useOrgId(): string | undefined {\n const [orgId, setOrgId] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n const init = async () => {\n const id = (await hostApi.getOrgId()) as string | undefined;\n\n setOrgId(id);\n };\n\n init();\n }, []);\n\n return orgId;\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 { on } 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 isOrbita = useIsOrbita();\n * return <span>Orbita: {String(isOrbita)}</span>;\n * }\n * ```\n */\nexport function useIsOrbita(): boolean | undefined {\n const [isOrbita, setIsOrbita] = useState<boolean | undefined>(() => {\n let initial: boolean | undefined;\n const unsubscribe = on('isOrbita.changed', (value) => {\n initial = value;\n });\n\n unsubscribe();\n\n return initial;\n });\n\n useEffect(() => {\n return on('isOrbita.changed', setIsOrbita);\n }, []);\n\n return isOrbita;\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 { useOrgId } from '../hooks/useOrgId';\nimport { useTheme } from '../hooks/useTheme';\nimport { useUserId } from '../hooks/useUserId';\nimport { ErrorBoundary } from './ErrorBoundary';\nimport { PluginError } from './PluginError';\nimport { useIsOrbita } from '../hooks/useIsOrbita';\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 /** Organization ID. */\n orgId?: string;\n /** Is this a yateam environment? */\n isYateam?: boolean;\n /** Is the Orbit enabled */\n isOrbita?: 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 * - `isOrbita` — on `isOrbita.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 orgId = useOrgId();\n const fullSlotContext = useSlotContext();\n const isOrbita = useIsOrbita();\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 orgId,\n isOrbita,\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, orgId, isOrbita] =\n await Promise.allSettled([\n hostApi.getTheme(),\n hostApi.getLanguage(),\n contextLevel === 'full' ? hostApi.getContext() : Promise.resolve(null),\n hostApi.getIsYateam(),\n hostApi.getUserId(),\n hostApi.getOrgId(),\n hostApi.getIsOrbita(),\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 (isOrbita.status === 'fulfilled') {\n dispatchHostEvent({\n messageId: '',\n type: 'event',\n method: 'isOrbita.changed',\n result: isOrbita.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 if (orgId.status === 'fulfilled' && orgId.value) {\n dispatchHostEvent({\n messageId: '',\n type: 'event',\n method: 'orgId.changed',\n result: orgId.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 orgId?: string;\n isYateam?: boolean;\n isOrbita?: 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 [orgId, setOrgId] = useState<string>();\n const [isYateam, setIsYateam] = useState<boolean>();\n const [isOrbita, setIsOrbita] = 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('orgId.changed', (value) => setOrgId(value as string));\n subscribe('isYateam.changed', (value) => setIsYateam(value as boolean));\n subscribe('isOrbita.changed', (value) => setIsOrbita(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 resolvedOrgId,\n resolvedIsYateam,\n resolvedIsOrbita,\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.getOrgId() as Promise<string | undefined>,\n host.getIsYateam() as Promise<boolean | undefined>,\n host.getIsOrbita() 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 setOrgId(resolvedOrgId);\n setIsYateam(resolvedIsYateam);\n setIsOrbita(resolvedIsOrbita);\n\n dispatchInitialValue('context.changed', resolvedContext);\n dispatchInitialValue('theme.changed', resolvedTheme);\n dispatchInitialValue('language.changed', resolvedLanguage);\n dispatchInitialValue('userId.changed', resolvedUserId);\n dispatchInitialValue('orgId.changed', resolvedOrgId);\n dispatchInitialValue('isYateam.changed', resolvedIsYateam);\n dispatchInitialValue('isOrbita.changed', resolvedIsOrbita);\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 orgId,\n isYateam,\n isOrbita,\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.28",
3
+ "version": "0.0.30",
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.28"
15
+ "@weavix/sdk-core": "0.0.30"
16
16
  },
17
17
  "peerDependencies": {
18
18
  "react": "^18.0.0"