@weavix/sdk-react 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -0
- package/dist/index.d.ts +265 -0
- package/dist/index.mjs +1198 -0
- package/dist/index.mjs.map +1 -0
- package/dist/sdk-react.css +1 -0
- package/package.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# @weavix/sdk-react
|
|
2
|
+
|
|
3
|
+
React hooks and components for the Tracker Plugin SDK — Weavix flavor.
|
|
4
|
+
|
|
5
|
+
> Это external-публикация. Внутренний (Yandex) аналог: `@yandex-data-ui/tracker-plugin-sdk-react`.
|
|
6
|
+
|
|
7
|
+
## Установка
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @weavix/sdk-react @weavix/sdk-core @weavix/tracker-api-types react
|
|
11
|
+
# или
|
|
12
|
+
pnpm add @weavix/sdk-react @weavix/sdk-core @weavix/tracker-api-types react
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Что внутри
|
|
16
|
+
|
|
17
|
+
- `<TrackerPluginProvider>` — провайдер инициализирует плагин.
|
|
18
|
+
- `useTrackerPluginContext()` — реактивные значения (theme, language, slot, slotContext) и `registerHandler`.
|
|
19
|
+
- `useTheme()`, `useLanguage()`, `useUserId()`, `useIsYateam()` — реактивные хуки.
|
|
20
|
+
- `useToaster()`, `useConfirm()` — UI-методы.
|
|
21
|
+
- `useLocalizedString()`, `useContext()` — вспомогательные.
|
|
22
|
+
- `<PluginError>`, `<PluginLoader>` — компоненты для fallback'ов.
|
|
23
|
+
|
|
24
|
+
API surface идентичен internal flavor'у.
|
|
25
|
+
|
|
26
|
+
## Пример
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
import { TrackerPluginProvider, useToaster } from '@weavix/sdk-react';
|
|
30
|
+
|
|
31
|
+
function App() {
|
|
32
|
+
const toaster = useToaster();
|
|
33
|
+
return <button onClick={() => toaster.add({ title: 'Hi' })}>Toast</button>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
root.render(
|
|
37
|
+
<TrackerPluginProvider>
|
|
38
|
+
<App />
|
|
39
|
+
</TrackerPluginProvider>
|
|
40
|
+
);
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## License
|
|
44
|
+
|
|
45
|
+
UNLICENSED.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { ConfirmOptions } from '@weavix/sdk-core';
|
|
2
|
+
import { ConfirmResult } from '@weavix/sdk-core';
|
|
3
|
+
import { ContentSizeUpdateRequest } from '@weavix/sdk-core';
|
|
4
|
+
import type { FC } from 'react';
|
|
5
|
+
import { GetDataResultMap } from '@weavix/sdk-core';
|
|
6
|
+
import { getField } from '@weavix/sdk-core';
|
|
7
|
+
import { getLocalizedString } from '@weavix/sdk-core';
|
|
8
|
+
import { HandlerFunction } from '@weavix/sdk-core';
|
|
9
|
+
import { Handlers } from '@weavix/sdk-core';
|
|
10
|
+
import { hostApi } from '@weavix/sdk-core';
|
|
11
|
+
import { HostEventCallback } from '@weavix/sdk-core';
|
|
12
|
+
import { HostEventContract } from '@weavix/sdk-core';
|
|
13
|
+
import { HostEventMethod } from '@weavix/sdk-core';
|
|
14
|
+
import { JSX as JSX_2 } from 'react/jsx-runtime';
|
|
15
|
+
import { LocalizedString } from '@weavix/sdk-core';
|
|
16
|
+
import { METHOD_NOT_SUPPORTED } from '@weavix/sdk-core';
|
|
17
|
+
import { MISSING_REQUIRED_SCOPE } from '@weavix/sdk-core';
|
|
18
|
+
import { PLUGIN_ID_IS_NOT_CORRECT } from '@weavix/sdk-core';
|
|
19
|
+
import { PLUGIN_ID_OR_SLOT_NOT_PROVIDED } from '@weavix/sdk-core';
|
|
20
|
+
import { PluginActionError } from '@weavix/sdk-core';
|
|
21
|
+
import { ReactNode } from 'react';
|
|
22
|
+
import { SlotContextMap } from '@weavix/sdk-core';
|
|
23
|
+
import { Theme } from '@weavix/sdk-core';
|
|
24
|
+
import { ToastAction } from '@weavix/sdk-core';
|
|
25
|
+
import { ToastOptions } from '@weavix/sdk-core';
|
|
26
|
+
import { TrackerApi } from '@weavix/sdk-core';
|
|
27
|
+
import { trackerApi } from '@weavix/sdk-core';
|
|
28
|
+
import { TrackerApiCallOptions } from '@weavix/sdk-core';
|
|
29
|
+
import { TrackerApiInitOptions } from '@weavix/sdk-core';
|
|
30
|
+
import { TrackerApiV3 } from '@weavix/sdk-core';
|
|
31
|
+
import { TriggerActionData } from '@weavix/sdk-core';
|
|
32
|
+
import { uiApi } from '@weavix/sdk-core';
|
|
33
|
+
import { UNKNOWN_ERROR } from '@weavix/sdk-core';
|
|
34
|
+
import { Unsubscribe } from '@weavix/sdk-core';
|
|
35
|
+
import { VALIDATION_ERROR } from '@weavix/sdk-core';
|
|
36
|
+
|
|
37
|
+
export { ConfirmOptions }
|
|
38
|
+
|
|
39
|
+
declare type ConfirmOptions_2 = {
|
|
40
|
+
title?: string;
|
|
41
|
+
message: string;
|
|
42
|
+
textButtonApply?: string;
|
|
43
|
+
textButtonCancel?: string;
|
|
44
|
+
theme?: 'normal' | 'danger';
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export { ConfirmResult }
|
|
48
|
+
|
|
49
|
+
declare type ConfirmResult_2 = { confirmed: boolean };
|
|
50
|
+
|
|
51
|
+
export { ContentSizeUpdateRequest }
|
|
52
|
+
|
|
53
|
+
export { getField }
|
|
54
|
+
|
|
55
|
+
export { getLocalizedString }
|
|
56
|
+
|
|
57
|
+
export { hostApi }
|
|
58
|
+
|
|
59
|
+
export { HostEventCallback }
|
|
60
|
+
|
|
61
|
+
export { HostEventContract }
|
|
62
|
+
|
|
63
|
+
export { HostEventMethod }
|
|
64
|
+
|
|
65
|
+
export { LocalizedString }
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Структурный shape `LocalizedString` — общая база, к которой структурно
|
|
69
|
+
* совместимы api-types `LocalizedString` обоих flavors. Реальная функция
|
|
70
|
+
* `getLocalizedString` читает только ключи `ru` и `en`, поэтому более
|
|
71
|
+
* узкие api-types-варианты (с дополнительными ключами) совместимы.
|
|
72
|
+
*/
|
|
73
|
+
declare type LocalizedString_2 = string | { ru?: string; en?: string };
|
|
74
|
+
|
|
75
|
+
export { METHOD_NOT_SUPPORTED }
|
|
76
|
+
|
|
77
|
+
export { MISSING_REQUIRED_SCOPE }
|
|
78
|
+
|
|
79
|
+
export { PLUGIN_ID_IS_NOT_CORRECT }
|
|
80
|
+
|
|
81
|
+
export { PLUGIN_ID_OR_SLOT_NOT_PROVIDED }
|
|
82
|
+
|
|
83
|
+
export { PluginActionError }
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Дефолтный компонент для отображения ошибки инициализации плагина
|
|
87
|
+
*/
|
|
88
|
+
export declare const PluginError = PluginErrorImpl as FC<PluginErrorProps>;
|
|
89
|
+
|
|
90
|
+
export declare interface PluginErrorProps {
|
|
91
|
+
error: Error;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Простой лоадер для отображения во время инициализации плагина
|
|
96
|
+
*/
|
|
97
|
+
export declare const PluginLoader = PluginLoaderImpl as FC;
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Сигнатура registerHandler: для 'getData' тип handler зависит от слота (GetDataResultMap[TSlot]).
|
|
101
|
+
*/
|
|
102
|
+
export declare type RegisterHandlerFunction<TSlot extends keyof SlotContextMap> = <TKey extends keyof Handlers>(methodName: TKey, handler: TKey extends 'getData' ? TSlot extends keyof GetDataResultMap ? () => GetDataResultMap[TSlot] : never : HandlerFunction<TKey>) => void;
|
|
103
|
+
|
|
104
|
+
export { SlotContextMap }
|
|
105
|
+
|
|
106
|
+
export { Theme }
|
|
107
|
+
|
|
108
|
+
export { ToastAction }
|
|
109
|
+
|
|
110
|
+
declare type ToastAction_2 = {
|
|
111
|
+
label: string;
|
|
112
|
+
onClick: () => void;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
export { ToastOptions }
|
|
116
|
+
|
|
117
|
+
declare type ToastOptions_2 = {
|
|
118
|
+
name?: string;
|
|
119
|
+
title: string;
|
|
120
|
+
content?: string;
|
|
121
|
+
theme?: 'success' | 'danger' | 'warning' | 'info';
|
|
122
|
+
autoHiding?: number;
|
|
123
|
+
isClosable?: boolean;
|
|
124
|
+
actions?: ToastAction_2[];
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
export { TrackerApi }
|
|
128
|
+
|
|
129
|
+
export { trackerApi }
|
|
130
|
+
|
|
131
|
+
export { TrackerApiCallOptions }
|
|
132
|
+
|
|
133
|
+
export { TrackerApiInitOptions }
|
|
134
|
+
|
|
135
|
+
export { TrackerApiV3 }
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Стабильные данные контекста — не меняются после инициализации.
|
|
139
|
+
* Реактивные значения (theme, language, slotContext) доступны через useTrackerPluginContext().
|
|
140
|
+
*/
|
|
141
|
+
export declare interface TrackerPluginContextValue<TSlot extends keyof SlotContextMap = keyof SlotContextMap> {
|
|
142
|
+
/** Текущая тема хоста. Обновляется реактивно при получении theme.changed. */
|
|
143
|
+
theme: Theme | undefined;
|
|
144
|
+
/** Текущий язык хоста. Обновляется реактивно при получении language.changed. */
|
|
145
|
+
language: string | undefined;
|
|
146
|
+
/** Сервис, в котором открылся плагин. */
|
|
147
|
+
service: string;
|
|
148
|
+
/** Id пользователя. */
|
|
149
|
+
userId?: string;
|
|
150
|
+
/** Это ятим? */
|
|
151
|
+
isYateam?: boolean;
|
|
152
|
+
/** Origin родительского окна (хоста). */
|
|
153
|
+
origin: string;
|
|
154
|
+
/** Слот, в котором открыт плагин. */
|
|
155
|
+
slot: TSlot;
|
|
156
|
+
/** URL внутри плагина. */
|
|
157
|
+
innerUrl: string;
|
|
158
|
+
/** Query-параметры плагина */
|
|
159
|
+
queryParams: Record<string, string>;
|
|
160
|
+
/** Контекст страницы. Обновляется реактивно при получении context.changed. */
|
|
161
|
+
slotContext: SlotContextMap[TSlot] | undefined;
|
|
162
|
+
/** Регистрация обработчика для ответов на запросы хоста. */
|
|
163
|
+
registerHandler: RegisterHandlerFunction<TSlot>;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Провайдер для инициализации плагина Tracker.
|
|
168
|
+
* Оборачивает приложение и управляет жизненным циклом плагина.
|
|
169
|
+
*
|
|
170
|
+
* После инициализации тема, язык и контекст страницы доступны через
|
|
171
|
+
* `useTrackerPluginContext()` и обновляются реактивно при push-событиях от хоста.
|
|
172
|
+
* @example
|
|
173
|
+
* ```tsx
|
|
174
|
+
* root.render(
|
|
175
|
+
* <TrackerPluginProvider>
|
|
176
|
+
* <App />
|
|
177
|
+
* </TrackerPluginProvider>
|
|
178
|
+
* );
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
181
|
+
export declare function TrackerPluginProvider({ children, autoResize, fallback, errorFallback, autoNotifyReady, }: TrackerPluginProviderProps): JSX_2.Element;
|
|
182
|
+
|
|
183
|
+
export declare interface TrackerPluginProviderProps {
|
|
184
|
+
children: ReactNode;
|
|
185
|
+
/**
|
|
186
|
+
* Автоматически изменять размер контейнера плагина при изменении содержимого
|
|
187
|
+
* @default true
|
|
188
|
+
*/
|
|
189
|
+
autoResize?: boolean;
|
|
190
|
+
/**
|
|
191
|
+
* Компонент для отображения во время инициализации
|
|
192
|
+
* @default <PluginLoader />
|
|
193
|
+
*/
|
|
194
|
+
fallback?: ReactNode;
|
|
195
|
+
/**
|
|
196
|
+
* Компонент для отображения при ошибке инициализации
|
|
197
|
+
* @default <PluginError error={error} />
|
|
198
|
+
*/
|
|
199
|
+
errorFallback?: (error: Error) => ReactNode;
|
|
200
|
+
/**
|
|
201
|
+
* Автоматически уведомить хост о готовности плагина после инициализации
|
|
202
|
+
* @default true
|
|
203
|
+
*/
|
|
204
|
+
autoNotifyReady?: boolean;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export { TriggerActionData }
|
|
208
|
+
|
|
209
|
+
export { uiApi }
|
|
210
|
+
|
|
211
|
+
export { UNKNOWN_ERROR }
|
|
212
|
+
|
|
213
|
+
export { Unsubscribe }
|
|
214
|
+
|
|
215
|
+
export declare const useConfirm = useConfirmImpl as () => UseConfirmReturn;
|
|
216
|
+
|
|
217
|
+
declare type UseConfirmReturn = {
|
|
218
|
+
show: (options: ConfirmOptions_2) => Promise<ConfirmResult_2>;
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Хук для получения локализованной строки на основе текущего языка из контекста.
|
|
223
|
+
*/
|
|
224
|
+
export declare const useLocalizedString = useLocalizedStringImpl as (
|
|
225
|
+
fallbackLanguage?: string,
|
|
226
|
+
) => (value: LocalizedString_2) => string;
|
|
227
|
+
|
|
228
|
+
export declare const useToaster = useToasterImpl as () => UseToasterReturn;
|
|
229
|
+
|
|
230
|
+
declare type UseToasterReturn = {
|
|
231
|
+
add: (options: ToastOptions_2) => Promise<{ name: string }>;
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Хук для получения темы, языка, слота и контекста слота из TrackerPluginProvider.
|
|
236
|
+
*
|
|
237
|
+
* Все значения реактивны — обновляются автоматически при push-событиях от хоста:
|
|
238
|
+
* - `theme` — при `theme.changed`
|
|
239
|
+
* - `language` — при `language.changed`
|
|
240
|
+
* - `slotContext` — при `context.changed`
|
|
241
|
+
*
|
|
242
|
+
* Без generic — возвращает union; после проверки `slot === 'issue.action'` и т.п. сужается тип `slotContext`.
|
|
243
|
+
* С generic — сразу типизирует под один слот: `useTrackerPluginContext<'issue.action'>()`.
|
|
244
|
+
* @example
|
|
245
|
+
* ```tsx
|
|
246
|
+
* // Без generic — сужение через slot
|
|
247
|
+
* const { slot, slotContext, theme, language } = useTrackerPluginContext();
|
|
248
|
+
* if (slot === 'issue.action') {
|
|
249
|
+
* // slotContext: Issue
|
|
250
|
+
* }
|
|
251
|
+
*
|
|
252
|
+
* // С generic — сразу типизировано
|
|
253
|
+
* const { slotContext } = useTrackerPluginContext<'issue.action'>();
|
|
254
|
+
* // slotContext: Issue | undefined
|
|
255
|
+
* ```
|
|
256
|
+
*/
|
|
257
|
+
export declare function useTrackerPluginContext(): {
|
|
258
|
+
[K in keyof SlotContextMap]: TrackerPluginContextValue<K>;
|
|
259
|
+
}[keyof SlotContextMap];
|
|
260
|
+
|
|
261
|
+
export declare function useTrackerPluginContext<TSlot extends keyof SlotContextMap>(): TrackerPluginContextValue<TSlot>;
|
|
262
|
+
|
|
263
|
+
export { VALIDATION_ERROR }
|
|
264
|
+
|
|
265
|
+
export { }
|