@tma.js/sdk 1.4.4 → 1.4.7
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 +2 -2
- package/dist/dts/bridge/env/index.d.ts +0 -1
- package/dist/dts/bridge/events/events.d.ts +16 -16
- package/dist/dts/bridge/methods/methods.d.ts +27 -27
- package/dist/dts/bridge/methods/popup.d.ts +1 -1
- package/dist/dts/index.d.ts +3 -3
- package/dist/dts/init-data/types.d.ts +3 -3
- package/dist/dts/launch-params/index.d.ts +1 -4
- package/dist/dts/launch-params/retrieveFromLocation.d.ts +2 -2
- package/dist/dts/launch-params/retrieveFromPerformance.d.ts +3 -4
- package/dist/dts/launch-params/retrieveFromUrl.d.ts +3 -2
- package/dist/dts/launch-params/retrieveLaunchData.d.ts +1 -0
- package/dist/dts/launch-params/retrieveLaunchParams.d.ts +6 -0
- package/dist/dts/launch-params/storage.d.ts +3 -5
- package/dist/dts/launch-params/types.d.ts +1 -1
- package/dist/dts/{launch-params → misc}/getFirstNavigationEntry.d.ts +1 -1
- package/dist/dts/misc/index.d.ts +3 -0
- package/dist/dts/{bridge/env → misc}/isIframe.d.ts +1 -1
- package/dist/dts/misc/isPageReload.d.ts +5 -0
- package/dist/dts/theme-params/types.d.ts +1 -1
- package/dist/index.cjs +1 -2
- package/dist/index.iife.js +1 -2
- package/dist/index.mjs +841 -866
- package/package.json +2 -3
- package/dist/dts/launch-params/computeLaunchData.d.ts +0 -6
- package/dist/dts/launch-params/computePageReload.d.ts +0 -6
- package/dist/dts/launch-params/retrieveCurrent.d.ts +0 -5
- package/dist/index.cjs.map +0 -1
- package/dist/index.iife.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/src/__tests__/globals.ts +0 -39
- package/src/back-button/BackButton.ts +0 -90
- package/src/back-button/__tests__/BackButton.ts +0 -129
- package/src/back-button/index.ts +0 -2
- package/src/back-button/types.ts +0 -14
- package/src/bridge/__tests__/parseMessage.ts +0 -23
- package/src/bridge/__tests__/request.ts +0 -236
- package/src/bridge/env/__tests__/hasExternalNotify.ts +0 -15
- package/src/bridge/env/__tests__/hasWebviewProxy.ts +0 -15
- package/src/bridge/env/__tests__/isIframe.ts +0 -30
- package/src/bridge/env/hasExternalNotify.ts +0 -19
- package/src/bridge/env/hasWebviewProxy.ts +0 -19
- package/src/bridge/env/index.ts +0 -3
- package/src/bridge/env/isIframe.ts +0 -11
- package/src/bridge/errors/MethodUnsupportedError.ts +0 -13
- package/src/bridge/errors/ParameterUnsupportedError.ts +0 -13
- package/src/bridge/errors/index.ts +0 -2
- package/src/bridge/events/__tests__/createEmitter.ts +0 -143
- package/src/bridge/events/__tests__/off.ts +0 -34
- package/src/bridge/events/__tests__/on.ts +0 -49
- package/src/bridge/events/__tests__/onTelegramEvent.ts +0 -49
- package/src/bridge/events/__tests__/once.ts +0 -64
- package/src/bridge/events/__tests__/singletonEmitter.ts +0 -22
- package/src/bridge/events/__tests__/subscribe.ts +0 -49
- package/src/bridge/events/__tests__/unsubscribe.ts +0 -34
- package/src/bridge/events/createEmitter.ts +0 -108
- package/src/bridge/events/events.ts +0 -170
- package/src/bridge/events/index.ts +0 -9
- package/src/bridge/events/off.ts +0 -14
- package/src/bridge/events/on.ts +0 -19
- package/src/bridge/events/onTelegramEvent.ts +0 -81
- package/src/bridge/events/once.ts +0 -18
- package/src/bridge/events/parsers/__tests__/clipboardTextReceived.ts +0 -21
- package/src/bridge/events/parsers/__tests__/invoiceClosed.ts +0 -12
- package/src/bridge/events/parsers/__tests__/popupClosed.ts +0 -10
- package/src/bridge/events/parsers/__tests__/qrTextReceived.ts +0 -9
- package/src/bridge/events/parsers/__tests__/theme-changed.ts +0 -42
- package/src/bridge/events/parsers/__tests__/viewportChanged.ts +0 -49
- package/src/bridge/events/parsers/clipboardTextReceived.ts +0 -26
- package/src/bridge/events/parsers/customMethodInvoked.ts +0 -25
- package/src/bridge/events/parsers/index.ts +0 -9
- package/src/bridge/events/parsers/invoiceClosed.ts +0 -26
- package/src/bridge/events/parsers/phoneRequested.ts +0 -14
- package/src/bridge/events/parsers/popupClosed.ts +0 -19
- package/src/bridge/events/parsers/qrTextReceived.ts +0 -14
- package/src/bridge/events/parsers/theme-changed.ts +0 -58
- package/src/bridge/events/parsers/viewportChanged.ts +0 -33
- package/src/bridge/events/parsers/writeAccessRequested.ts +0 -14
- package/src/bridge/events/singletonEmitter.ts +0 -19
- package/src/bridge/events/subscribe.ts +0 -15
- package/src/bridge/events/unsubscribe.ts +0 -10
- package/src/bridge/index.ts +0 -7
- package/src/bridge/invokeCustomMethod.ts +0 -56
- package/src/bridge/methods/__tests__/createPostEvent.ts +0 -37
- package/src/bridge/methods/__tests__/postEvent.ts +0 -137
- package/src/bridge/methods/createPostEvent.ts +0 -40
- package/src/bridge/methods/custom-methods.ts +0 -68
- package/src/bridge/methods/haptic.ts +0 -52
- package/src/bridge/methods/index.ts +0 -6
- package/src/bridge/methods/methods.ts +0 -370
- package/src/bridge/methods/popup.ts +0 -53
- package/src/bridge/methods/postEvent.ts +0 -101
- package/src/bridge/parseMessage.ts +0 -28
- package/src/bridge/request.ts +0 -176
- package/src/classnames/__tests__/classNames.ts +0 -20
- package/src/classnames/__tests__/mergeClassNames.ts +0 -21
- package/src/classnames/classNames.ts +0 -34
- package/src/classnames/index.ts +0 -2
- package/src/classnames/mergeClassNames.ts +0 -60
- package/src/closing-behavior/ClosingBehavior.ts +0 -64
- package/src/closing-behavior/__tests__/ClosingBehavior.ts +0 -86
- package/src/closing-behavior/index.ts +0 -2
- package/src/closing-behavior/types.ts +0 -12
- package/src/cloud-storage/CloudStorage.ts +0 -138
- package/src/cloud-storage/index.ts +0 -1
- package/src/colors/__tests__/isColorDark.ts +0 -12
- package/src/colors/__tests__/isRGB.ts +0 -13
- package/src/colors/__tests__/isRGBShort.ts +0 -13
- package/src/colors/__tests__/toRGB.ts +0 -23
- package/src/colors/index.ts +0 -5
- package/src/colors/isColorDark.ts +0 -22
- package/src/colors/isRGB.ts +0 -9
- package/src/colors/isRGBShort.ts +0 -9
- package/src/colors/toRGB.ts +0 -49
- package/src/colors/types.ts +0 -9
- package/src/css/__tests__/bindMiniAppCSSVars.ts +0 -175
- package/src/css/__tests__/bindThemeCSSVars.ts +0 -52
- package/src/css/__tests__/bindViewportCSSVars.ts +0 -55
- package/src/css/__tests__/setCSSVar.ts +0 -14
- package/src/css/bindMiniAppCSSVars.ts +0 -51
- package/src/css/bindThemeCSSVars.ts +0 -31
- package/src/css/bindViewportCSSVars.ts +0 -36
- package/src/css/index.ts +0 -4
- package/src/css/setCSSVar.ts +0 -8
- package/src/event-emitter/EventEmitter.ts +0 -146
- package/src/event-emitter/__tests__/EventEmitter.ts +0 -145
- package/src/event-emitter/index.ts +0 -2
- package/src/event-emitter/types.ts +0 -60
- package/src/globals.ts +0 -38
- package/src/haptic-feedback/HapticFeedback.ts +0 -70
- package/src/haptic-feedback/__tests__/HapticFeedback.ts +0 -68
- package/src/haptic-feedback/index.ts +0 -1
- package/src/index.ts +0 -185
- package/src/init/catchCustomStyles.ts +0 -17
- package/src/init/creators/__tests__/createViewport.ts +0 -96
- package/src/init/creators/createBackButton.ts +0 -25
- package/src/init/creators/createClosingBehavior.ts +0 -24
- package/src/init/creators/createMainButton.ts +0 -51
- package/src/init/creators/createMiniApp.ts +0 -48
- package/src/init/creators/createRequestIdGenerator.ts +0 -13
- package/src/init/creators/createSettingsButton.ts +0 -25
- package/src/init/creators/createThemeParams.ts +0 -11
- package/src/init/creators/createViewport.ts +0 -94
- package/src/init/creators/index.ts +0 -8
- package/src/init/css/index.ts +0 -1
- package/src/init/css/processCSSVarsOption.ts +0 -55
- package/src/init/index.ts +0 -2
- package/src/init/init.ts +0 -134
- package/src/init/types.ts +0 -94
- package/src/init-data/InitData.ts +0 -96
- package/src/init-data/__tests__/InitData.ts +0 -98
- package/src/init-data/__tests__/chatParser.ts +0 -102
- package/src/init-data/__tests__/initDataParser.ts +0 -136
- package/src/init-data/__tests__/parseInitData.ts +0 -136
- package/src/init-data/__tests__/userParser.ts +0 -96
- package/src/init-data/chatParser.ts +0 -19
- package/src/init-data/index.ts +0 -6
- package/src/init-data/initDataParser.ts +0 -41
- package/src/init-data/parseInitData.ts +0 -10
- package/src/init-data/types.ts +0 -164
- package/src/init-data/userParser.ts +0 -45
- package/src/invoice/Invoice.ts +0 -123
- package/src/invoice/index.ts +0 -2
- package/src/invoice/types.ts +0 -11
- package/src/launch-params/__tests__/retrieveFromUrl.ts +0 -19
- package/src/launch-params/computeLaunchData.ts +0 -81
- package/src/launch-params/computePageReload.ts +0 -13
- package/src/launch-params/getFirstNavigationEntry.ts +0 -10
- package/src/launch-params/index.ts +0 -13
- package/src/launch-params/launchParamsParser.ts +0 -45
- package/src/launch-params/parseLaunchParams.ts +0 -10
- package/src/launch-params/retrieveCurrent.ts +0 -27
- package/src/launch-params/retrieveFromLocation.ts +0 -10
- package/src/launch-params/retrieveFromPerformance.ts +0 -18
- package/src/launch-params/retrieveFromUrl.ts +0 -19
- package/src/launch-params/retrieveLaunchData.ts +0 -30
- package/src/launch-params/serializeLaunchParams.ts +0 -37
- package/src/launch-params/storage.ts +0 -33
- package/src/launch-params/types.ts +0 -62
- package/src/logger/Logger.ts +0 -72
- package/src/logger/__tests__/Logger.ts +0 -107
- package/src/logger/index.ts +0 -1
- package/src/main-button/MainButton.ts +0 -239
- package/src/main-button/__tests__/MainButton.ts +0 -346
- package/src/main-button/index.ts +0 -2
- package/src/main-button/types.ts +0 -26
- package/src/mini-app/MiniApp.ts +0 -348
- package/src/mini-app/__tests__/MiniApp.ts +0 -140
- package/src/mini-app/contactParser.ts +0 -29
- package/src/mini-app/index.ts +0 -2
- package/src/mini-app/types.ts +0 -38
- package/src/misc/__tests__/isRecord.ts +0 -21
- package/src/misc/index.ts +0 -2
- package/src/misc/isRecord.ts +0 -7
- package/src/misc/isTMA.ts +0 -13
- package/src/navigation/HashNavigator/HashNavigator.ts +0 -220
- package/src/navigation/HashNavigator/__tests__/HashNavigator.ts +0 -144
- package/src/navigation/HashNavigator/__tests__/drop.ts +0 -42
- package/src/navigation/HashNavigator/__tests__/go.ts +0 -9
- package/src/navigation/HashNavigator/drop.ts +0 -36
- package/src/navigation/HashNavigator/go.ts +0 -28
- package/src/navigation/HashNavigator/index.ts +0 -2
- package/src/navigation/HashNavigator/types.ts +0 -41
- package/src/navigation/Navigator/Navigator.ts +0 -282
- package/src/navigation/Navigator/index.ts +0 -2
- package/src/navigation/Navigator/types.ts +0 -55
- package/src/navigation/ensurePrefix.ts +0 -9
- package/src/navigation/getHash.ts +0 -17
- package/src/navigation/index.ts +0 -4
- package/src/parsing/ArrayValueParser.ts +0 -79
- package/src/parsing/ParseError.ts +0 -27
- package/src/parsing/ParseSchemaFieldError.ts +0 -21
- package/src/parsing/ValueParser.ts +0 -71
- package/src/parsing/__tests__/ArrayValueParser.ts +0 -18
- package/src/parsing/__tests__/toRecord.ts +0 -10
- package/src/parsing/createValueParserGenerator.ts +0 -16
- package/src/parsing/index.ts +0 -10
- package/src/parsing/parseBySchema.ts +0 -65
- package/src/parsing/parsers/__tests__/array.ts +0 -39
- package/src/parsing/parsers/__tests__/boolean.ts +0 -31
- package/src/parsing/parsers/__tests__/date.ts +0 -25
- package/src/parsing/parsers/__tests__/json.ts +0 -80
- package/src/parsing/parsers/__tests__/number.ts +0 -23
- package/src/parsing/parsers/__tests__/rgb.ts +0 -22
- package/src/parsing/parsers/__tests__/searchParams.ts +0 -105
- package/src/parsing/parsers/__tests__/string.ts +0 -25
- package/src/parsing/parsers/array.ts +0 -9
- package/src/parsing/parsers/boolean.ts +0 -22
- package/src/parsing/parsers/date.ts +0 -11
- package/src/parsing/parsers/index.ts +0 -8
- package/src/parsing/parsers/json.ts +0 -17
- package/src/parsing/parsers/number.ts +0 -21
- package/src/parsing/parsers/rgb.ts +0 -10
- package/src/parsing/parsers/searchParams.ts +0 -24
- package/src/parsing/parsers/string.ts +0 -12
- package/src/parsing/toRecord.ts +0 -27
- package/src/parsing/types.ts +0 -32
- package/src/parsing/unexpectedTypeError.ts +0 -6
- package/src/popup/Popup.ts +0 -91
- package/src/popup/__tests__/Popup.ts +0 -130
- package/src/popup/__tests__/preparePopupParams.ts +0 -85
- package/src/popup/index.ts +0 -2
- package/src/popup/preparePopupParams.ts +0 -59
- package/src/popup/types.ts +0 -69
- package/src/qr-scanner/QRScanner.ts +0 -95
- package/src/qr-scanner/index.ts +0 -2
- package/src/qr-scanner/types.ts +0 -11
- package/src/settings-button/SettingsButton.ts +0 -85
- package/src/settings-button/index.ts +0 -2
- package/src/settings-button/types.ts +0 -15
- package/src/state/State.ts +0 -67
- package/src/state/index.ts +0 -2
- package/src/state/types.ts +0 -31
- package/src/storage.ts +0 -69
- package/src/supports/__tests__/supports.ts +0 -123
- package/src/supports/createSupportsFunc.ts +0 -18
- package/src/supports/createSupportsParamFunc.ts +0 -27
- package/src/supports/index.ts +0 -4
- package/src/supports/supports.ts +0 -84
- package/src/supports/types.ts +0 -1
- package/src/theme-params/ThemeParams.ts +0 -131
- package/src/theme-params/__tests__/keys.ts +0 -19
- package/src/theme-params/__tests__/parseThemeParams.ts +0 -29
- package/src/theme-params/__tests__/serializeThemeParams.ts +0 -29
- package/src/theme-params/__tests__/themeParamsParser.ts +0 -29
- package/src/theme-params/index.ts +0 -6
- package/src/theme-params/keys.ts +0 -24
- package/src/theme-params/parseThemeParams.ts +0 -10
- package/src/theme-params/requestThemeParams.ts +0 -13
- package/src/theme-params/serializeThemeParams.ts +0 -20
- package/src/theme-params/themeParamsParser.ts +0 -22
- package/src/theme-params/types.ts +0 -33
- package/src/timeout/TimeoutError.ts +0 -6
- package/src/timeout/__tests__/isTimeoutError.ts +0 -9
- package/src/timeout/__tests__/withTimeout.ts +0 -28
- package/src/timeout/index.ts +0 -4
- package/src/timeout/isTimeoutError.ts +0 -9
- package/src/timeout/sleep.ts +0 -10
- package/src/timeout/withTimeout.ts +0 -24
- package/src/types/index.ts +0 -4
- package/src/types/methods.ts +0 -18
- package/src/types/platform.ts +0 -14
- package/src/types/request-id.ts +0 -10
- package/src/types/utils.ts +0 -50
- package/src/utils/Utils.ts +0 -107
- package/src/utils/index.ts +0 -1
- package/src/version/__tests__/compareVersions.ts +0 -19
- package/src/version/compareVersions.ts +0 -28
- package/src/version/index.ts +0 -2
- package/src/version/types.ts +0 -4
- package/src/viewport/Viewport.ts +0 -171
- package/src/viewport/__tests__/isStableViewportPlatform.ts +0 -15
- package/src/viewport/__tests__/utils.ts +0 -12
- package/src/viewport/index.ts +0 -4
- package/src/viewport/isStableViewportPlatform.ts +0 -10
- package/src/viewport/requestViewport.ts +0 -23
- package/src/viewport/types.ts +0 -23
- package/src/viewport/utils.ts +0 -7
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
AnySubscribeListener,
|
|
3
|
-
EmptyEventName,
|
|
4
|
-
EventListener, EventName,
|
|
5
|
-
EventParams, NonEmptyEventName, RemoveEventListener,
|
|
6
|
-
} from './types.js';
|
|
7
|
-
|
|
8
|
-
type AddedEventListener = [listener: EventListener<any>, once: boolean];
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Opinionated event emitter implementation.
|
|
12
|
-
*/
|
|
13
|
-
export class EventEmitter<Schema> {
|
|
14
|
-
private readonly listeners: Map<string, AddedEventListener[]> = new Map();
|
|
15
|
-
|
|
16
|
-
private readonly subscribeListeners: AnySubscribeListener<Schema>[] = [];
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Adds specified event listener.
|
|
20
|
-
* @param event - event name.
|
|
21
|
-
* @param listener - event listener.
|
|
22
|
-
* @param once - should listener called only once.
|
|
23
|
-
*/
|
|
24
|
-
private addListener<E extends EventName<Schema>>(
|
|
25
|
-
event: E,
|
|
26
|
-
listener: EventListener<Schema[E]>,
|
|
27
|
-
once: boolean,
|
|
28
|
-
): RemoveEventListener {
|
|
29
|
-
let listeners = this.listeners.get(event);
|
|
30
|
-
if (!listeners) {
|
|
31
|
-
listeners = [];
|
|
32
|
-
this.listeners.set(event, listeners);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
listeners.push([listener, once]);
|
|
36
|
-
|
|
37
|
-
return () => this.off(event, listener);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Emits known event which has no parameters.
|
|
42
|
-
* @param event - event name.
|
|
43
|
-
*/
|
|
44
|
-
emit<E extends EmptyEventName<Schema>>(event: E): void;
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Emits known event which has parameters.
|
|
48
|
-
* @param event - event name.
|
|
49
|
-
* @param args - list of event listener arguments.
|
|
50
|
-
*/
|
|
51
|
-
emit<E extends NonEmptyEventName<Schema>>(
|
|
52
|
-
event: E,
|
|
53
|
-
...args: EventParams<Schema[E]>
|
|
54
|
-
): void;
|
|
55
|
-
|
|
56
|
-
emit(event: EventName<Schema>, ...args: any[]): void {
|
|
57
|
-
this.subscribeListeners.forEach((l) => (l as any)(event, ...args));
|
|
58
|
-
|
|
59
|
-
const listeners = this.listeners.get(event);
|
|
60
|
-
if (!listeners) {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
listeners.forEach(([listener, once], idx) => {
|
|
65
|
-
listener(...args);
|
|
66
|
-
if (once) {
|
|
67
|
-
listeners.splice(idx, 1);
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Adds event listener.
|
|
74
|
-
* @param event - event name.
|
|
75
|
-
* @param listener - event listener.
|
|
76
|
-
* @returns Function to remove event listener.
|
|
77
|
-
*/
|
|
78
|
-
on<E extends EventName<Schema>>(
|
|
79
|
-
event: E,
|
|
80
|
-
listener: EventListener<Schema[E]>,
|
|
81
|
-
): RemoveEventListener {
|
|
82
|
-
return this.addListener(event, listener, false);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Adds event listener following the logic, described in `on` method, but calls specified
|
|
87
|
-
* listener only once, removing it after.
|
|
88
|
-
* @param event - event name.
|
|
89
|
-
* @param listener - event listener.
|
|
90
|
-
* @returns Function to remove event listener.
|
|
91
|
-
* @see on
|
|
92
|
-
*/
|
|
93
|
-
once<E extends EventName<Schema>>(
|
|
94
|
-
event: E,
|
|
95
|
-
listener: EventListener<Schema[E]>,
|
|
96
|
-
): RemoveEventListener {
|
|
97
|
-
return this.addListener(event, listener, true);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Removes event listener. In case, specified listener was bound several times, it removes
|
|
102
|
-
* only a single one.
|
|
103
|
-
* @param event - event name.
|
|
104
|
-
* @param listener - event listener.
|
|
105
|
-
*/
|
|
106
|
-
off<E extends EventName<Schema>>(event: E, listener: EventListener<Schema[E]>): void {
|
|
107
|
-
const listeners = this.listeners.get(event);
|
|
108
|
-
if (!listeners) {
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
for (let i = 0; i < listeners.length; i += 1) {
|
|
113
|
-
if (listener === listeners[i][0]) {
|
|
114
|
-
listeners.splice(i, 1);
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Adds event listener to all events.
|
|
122
|
-
* @param listener - events listener.
|
|
123
|
-
* @returns Function to remove event listener.
|
|
124
|
-
* @see on
|
|
125
|
-
* @see once
|
|
126
|
-
*/
|
|
127
|
-
subscribe(listener: AnySubscribeListener<Schema>): RemoveEventListener {
|
|
128
|
-
this.subscribeListeners.push(listener);
|
|
129
|
-
return () => this.unsubscribe(listener);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Removes global event listener. In case, specified listener was bound several times, it removes
|
|
134
|
-
* only a single one.
|
|
135
|
-
* @param listener - events listener.
|
|
136
|
-
* @returns Function to remove event listener.
|
|
137
|
-
*/
|
|
138
|
-
unsubscribe(listener: AnySubscribeListener<Schema>): void {
|
|
139
|
-
for (let i = 0; i < this.subscribeListeners.length; i += 1) {
|
|
140
|
-
if (this.subscribeListeners[i] === listener) {
|
|
141
|
-
this.subscribeListeners.splice(i, 1);
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
|
|
3
|
-
import { EventEmitter } from '../EventEmitter';
|
|
4
|
-
|
|
5
|
-
interface EventsMap {
|
|
6
|
-
test: (a: number, b: boolean) => void;
|
|
7
|
-
hey: never;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
let ee: EventEmitter<EventsMap>;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
ee = new EventEmitter<EventsMap>();
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
describe('on', () => {
|
|
17
|
-
it('should emit bound listener with specified arguments', () => {
|
|
18
|
-
const listener = vi.fn();
|
|
19
|
-
ee.on('test', listener);
|
|
20
|
-
ee.emit('test', 1, true);
|
|
21
|
-
expect(listener).toHaveBeenCalledOnce();
|
|
22
|
-
expect(listener).toBeCalledWith(1, true);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it('should emit bound listener with specified arguments as many times as it was bound', () => {
|
|
26
|
-
const listener = vi.fn();
|
|
27
|
-
ee.on('test', listener);
|
|
28
|
-
ee.on('test', listener);
|
|
29
|
-
ee.emit('test', 1, true);
|
|
30
|
-
expect(listener).toHaveBeenCalledTimes(2);
|
|
31
|
-
expect(listener).toHaveBeenNthCalledWith(1, 1, true);
|
|
32
|
-
expect(listener).toHaveBeenNthCalledWith(2, 1, true);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
it('should not emit bound listener in case, event name does not match', () => {
|
|
36
|
-
const listener = vi.fn();
|
|
37
|
-
ee.on('test', listener);
|
|
38
|
-
ee.emit('hey');
|
|
39
|
-
expect(listener).not.toBeCalled();
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it('should remove listener if returned function was called', () => {
|
|
43
|
-
const listener = vi.fn();
|
|
44
|
-
const off = ee.on('test', listener);
|
|
45
|
-
|
|
46
|
-
off();
|
|
47
|
-
ee.emit('test', 1, true);
|
|
48
|
-
expect(listener).not.toBeCalled();
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
describe('once', () => {
|
|
53
|
-
it('should emit bound listener with specified arguments only once', () => {
|
|
54
|
-
const listener = vi.fn();
|
|
55
|
-
ee.once('test', listener);
|
|
56
|
-
ee.emit('test', 1, true);
|
|
57
|
-
ee.emit('test', 1, true);
|
|
58
|
-
ee.emit('test', 1, true);
|
|
59
|
-
expect(listener).toHaveBeenCalledOnce();
|
|
60
|
-
expect(listener).toBeCalledWith(1, true);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it('should emit bound listener with specified arguments as many times as it was bound', () => {
|
|
64
|
-
const listener = vi.fn();
|
|
65
|
-
ee.once('test', listener);
|
|
66
|
-
ee.once('test', listener);
|
|
67
|
-
ee.emit('test', 1, true);
|
|
68
|
-
ee.emit('test', 1, true);
|
|
69
|
-
expect(listener).toHaveBeenCalledTimes(2);
|
|
70
|
-
expect(listener).toHaveBeenNthCalledWith(1, 1, true);
|
|
71
|
-
expect(listener).toHaveBeenNthCalledWith(2, 1, true);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it('should not emit bound listener in case, event name does not match', () => {
|
|
75
|
-
const listener = vi.fn();
|
|
76
|
-
ee.once('test', listener);
|
|
77
|
-
ee.emit('hey');
|
|
78
|
-
expect(listener).not.toBeCalled();
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it('should remove listener if returned function was called', () => {
|
|
82
|
-
const listener = vi.fn();
|
|
83
|
-
const off = ee.once('test', listener);
|
|
84
|
-
|
|
85
|
-
off();
|
|
86
|
-
ee.emit('test', 1, true);
|
|
87
|
-
expect(listener).not.toBeCalled();
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
describe('off', () => {
|
|
92
|
-
it('should not emit bound listener in case, it was unbound', () => {
|
|
93
|
-
const listener = vi.fn();
|
|
94
|
-
ee.on('test', listener);
|
|
95
|
-
ee.off('test', listener);
|
|
96
|
-
ee.emit('test', 1, true);
|
|
97
|
-
expect(listener).not.toBeCalled();
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it('should not do anything in case, event has no listeners', () => {
|
|
101
|
-
expect(() => {
|
|
102
|
-
const listener = vi.fn();
|
|
103
|
-
ee.off('test', listener);
|
|
104
|
-
}).not.toThrow();
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it('should remove event listener bound via "once" method', () => {
|
|
108
|
-
const listener = vi.fn();
|
|
109
|
-
ee.once('test', listener);
|
|
110
|
-
ee.off('test', listener);
|
|
111
|
-
ee.emit('test', 1, true);
|
|
112
|
-
expect(listener).not.toBeCalled();
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
it('should not do anything if received not bound listener', () => {
|
|
116
|
-
ee.on('test', vi.fn());
|
|
117
|
-
expect(() => ee.off('test', vi.fn())).not.toThrow();
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
describe('subscribe', () => {
|
|
122
|
-
it('should catch any emitted event', () => {
|
|
123
|
-
const listener = vi.fn();
|
|
124
|
-
ee.subscribe(listener);
|
|
125
|
-
ee.emit('test', 1, true);
|
|
126
|
-
ee.emit('hey');
|
|
127
|
-
expect(listener).toBeCalledTimes(2);
|
|
128
|
-
expect(listener).toHaveBeenNthCalledWith(1, 'test', 1, true);
|
|
129
|
-
expect(listener).toHaveBeenNthCalledWith(2, 'hey');
|
|
130
|
-
});
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
describe('unsubscribe', () => {
|
|
134
|
-
it('should not emit event if it was unbound', () => {
|
|
135
|
-
const listener = vi.fn();
|
|
136
|
-
ee.subscribe(listener);
|
|
137
|
-
ee.unsubscribe(listener);
|
|
138
|
-
ee.emit('test', 1, true);
|
|
139
|
-
expect(listener).not.toBeCalled();
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
it('should not do anything if received not bound listener', () => {
|
|
143
|
-
expect(() => ee.unsubscribe(vi.fn())).not.toThrow();
|
|
144
|
-
});
|
|
145
|
-
});
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import type { IsNever } from '~/types/index.js';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Function accepting the list of passed arguments and returning nothing.
|
|
5
|
-
*/
|
|
6
|
-
type VoidFunc<Args extends any[] = []> = (...args: Args) => void;
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Accepts type assuming, it is responsible for describing event listener
|
|
10
|
-
* parameters. Covers following cases:
|
|
11
|
-
* 1. If function is passed, return its arguments.
|
|
12
|
-
* 2. If never or void is passed, return empty tuple.
|
|
13
|
-
* 3. If array is passed return this type.
|
|
14
|
-
* 4. Otherwise, return tuple with passed type.
|
|
15
|
-
*/
|
|
16
|
-
export type EventParams<Params> = Params extends any[]
|
|
17
|
-
? Params
|
|
18
|
-
: Params extends (...args: any[]) => any
|
|
19
|
-
? Parameters<Params>
|
|
20
|
-
: IsNever<Params> extends true
|
|
21
|
-
? []
|
|
22
|
-
: Params extends void
|
|
23
|
-
? []
|
|
24
|
-
: [Params];
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Returns function that represents event listener with specified
|
|
28
|
-
* list of parameters.
|
|
29
|
-
*/
|
|
30
|
-
export type EventListener<Params> = VoidFunc<EventParams<Params>>;
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Returns event names.
|
|
34
|
-
*/
|
|
35
|
-
export type EventName<Schema> = Extract<keyof Schema, string>;
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Returns event names which do not require any arguments.
|
|
39
|
-
*/
|
|
40
|
-
export type EmptyEventName<Schema> = {
|
|
41
|
-
[E in EventName<Schema>]: EventParams<Schema[E]> extends [] ? E : never;
|
|
42
|
-
}[EventName<Schema>];
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Returns event names which require arguments.
|
|
46
|
-
*/
|
|
47
|
-
export type NonEmptyEventName<Schema> =
|
|
48
|
-
Exclude<EventName<Schema>, EmptyEventName<Schema>>;
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Represents any listener, which could be used in EventEmitter.subscribe.
|
|
52
|
-
*/
|
|
53
|
-
export type AnySubscribeListener<Schema> = {
|
|
54
|
-
[E in keyof Schema]: (event: E, ...args: EventParams<Schema[E]>) => void;
|
|
55
|
-
}[keyof Schema];
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Function which removes event listener.
|
|
59
|
-
*/
|
|
60
|
-
export type RemoveEventListener = () => void;
|
package/src/globals.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { Logger } from '~/logger/index.js';
|
|
2
|
-
|
|
3
|
-
let currentTargetOrigin = 'https://web.telegram.org';
|
|
4
|
-
|
|
5
|
-
export const logger = new Logger('[SDK]', false);
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Sets new debug mode. Enabling debug mode leads to printing
|
|
9
|
-
* additional messages in console, related to the processes
|
|
10
|
-
* inside the package.
|
|
11
|
-
* @param value - should debug mode be enabled.
|
|
12
|
-
*/
|
|
13
|
-
export function setDebug(value: boolean): void {
|
|
14
|
-
if (value) {
|
|
15
|
-
logger.enable();
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
logger.disable();
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Sets new global targetOrigin, used by `postEvent` method.
|
|
23
|
-
* Default value is "https://web.telegram.org". You don't need to
|
|
24
|
-
* use this method until you know what you are doing.
|
|
25
|
-
*
|
|
26
|
-
* This method could be used for test purposes.
|
|
27
|
-
* @param value - new target origin.
|
|
28
|
-
*/
|
|
29
|
-
export function setTargetOrigin(value: string): void {
|
|
30
|
-
currentTargetOrigin = value;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Returns current global target origin.
|
|
35
|
-
*/
|
|
36
|
-
export function targetOrigin(): string {
|
|
37
|
-
return currentTargetOrigin;
|
|
38
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type ImpactHapticFeedbackStyle,
|
|
3
|
-
type NotificationHapticFeedbackType,
|
|
4
|
-
type PostEvent,
|
|
5
|
-
postEvent as defaultPostEvent,
|
|
6
|
-
} from '~/bridge/index.js';
|
|
7
|
-
import {
|
|
8
|
-
createSupportsFunc,
|
|
9
|
-
type SupportsFunc,
|
|
10
|
-
} from '~/supports/index.js';
|
|
11
|
-
import type { Version } from '~/version/index.js';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Class which controls haptic feedback. It allows calling different types of
|
|
15
|
-
* haptic notifications which usually occur after user interaction with
|
|
16
|
-
* application.
|
|
17
|
-
*/
|
|
18
|
-
export class HapticFeedback {
|
|
19
|
-
constructor(
|
|
20
|
-
version: Version,
|
|
21
|
-
private readonly postEvent: PostEvent = defaultPostEvent,
|
|
22
|
-
) {
|
|
23
|
-
this.supports = createSupportsFunc(version, {
|
|
24
|
-
impactOccurred: 'web_app_trigger_haptic_feedback',
|
|
25
|
-
notificationOccurred: 'web_app_trigger_haptic_feedback',
|
|
26
|
-
selectionChanged: 'web_app_trigger_haptic_feedback',
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* A method tells that an impact occurred. The Telegram app may play the
|
|
32
|
-
* appropriate haptics based on style value passed.
|
|
33
|
-
* @param style - impact style.
|
|
34
|
-
*/
|
|
35
|
-
impactOccurred(style: ImpactHapticFeedbackStyle): void {
|
|
36
|
-
this.postEvent('web_app_trigger_haptic_feedback', {
|
|
37
|
-
type: 'impact',
|
|
38
|
-
impact_style: style,
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* A method tells that a task or action has succeeded, failed, or produced
|
|
44
|
-
* a warning. The Telegram app may play the appropriate haptics based on
|
|
45
|
-
* type value passed.
|
|
46
|
-
* @param type - notification type.
|
|
47
|
-
*/
|
|
48
|
-
notificationOccurred(type: NotificationHapticFeedbackType): void {
|
|
49
|
-
this.postEvent('web_app_trigger_haptic_feedback', {
|
|
50
|
-
type: 'notification',
|
|
51
|
-
notification_type: type,
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* A method tells that the user has changed a selection. The Telegram app
|
|
57
|
-
* may play the appropriate haptics.
|
|
58
|
-
*
|
|
59
|
-
* Do not use this feedback when the user makes or confirms a selection;
|
|
60
|
-
* use it only when the selection changes.
|
|
61
|
-
*/
|
|
62
|
-
selectionChanged(): void {
|
|
63
|
-
this.postEvent('web_app_trigger_haptic_feedback', { type: 'selection_change' });
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Checks if specified method is supported by current component.
|
|
68
|
-
*/
|
|
69
|
-
supports: SupportsFunc<'impactOccurred' | 'notificationOccurred' | 'selectionChanged'>;
|
|
70
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
|
|
3
|
-
import { HapticFeedback } from '../HapticFeedback';
|
|
4
|
-
|
|
5
|
-
describe('impactOccurred', () => {
|
|
6
|
-
it('should call "web_app_trigger_haptic_feedback" method with { type: "impact", style: {{style}} }', () => {
|
|
7
|
-
const postEvent = vi.fn();
|
|
8
|
-
const haptic = new HapticFeedback('', postEvent);
|
|
9
|
-
|
|
10
|
-
expect(postEvent).toHaveBeenCalledTimes(0);
|
|
11
|
-
haptic.impactOccurred('heavy');
|
|
12
|
-
expect(postEvent).toHaveBeenCalledTimes(1);
|
|
13
|
-
expect(postEvent).toHaveBeenCalledWith('web_app_trigger_haptic_feedback', {
|
|
14
|
-
type: 'impact',
|
|
15
|
-
impact_style: 'heavy',
|
|
16
|
-
});
|
|
17
|
-
});
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
describe('notificationOccurred', () => {
|
|
21
|
-
it('should call "web_app_trigger_haptic_feedback" method with { type: "notification", notification_type: {{type}} }', () => {
|
|
22
|
-
const postEvent = vi.fn();
|
|
23
|
-
const haptic = new HapticFeedback('', postEvent);
|
|
24
|
-
|
|
25
|
-
expect(postEvent).toHaveBeenCalledTimes(0);
|
|
26
|
-
haptic.notificationOccurred('success');
|
|
27
|
-
expect(postEvent).toHaveBeenCalledTimes(1);
|
|
28
|
-
expect(postEvent).toHaveBeenCalledWith('web_app_trigger_haptic_feedback', {
|
|
29
|
-
type: 'notification',
|
|
30
|
-
notification_type: 'success',
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
describe('selectionChanged', () => {
|
|
36
|
-
it('should call "web_app_trigger_haptic_feedback" method with { type: "selection_change" }', () => {
|
|
37
|
-
const postEvent = vi.fn();
|
|
38
|
-
const haptic = new HapticFeedback('', postEvent);
|
|
39
|
-
|
|
40
|
-
expect(postEvent).toHaveBeenCalledTimes(0);
|
|
41
|
-
haptic.selectionChanged();
|
|
42
|
-
expect(postEvent).toHaveBeenCalledTimes(1);
|
|
43
|
-
expect(postEvent).toHaveBeenCalledWith('web_app_trigger_haptic_feedback', {
|
|
44
|
-
type: 'selection_change',
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
describe('supports', () => {
|
|
50
|
-
describe('impactOccurred / notificationOccurred / selectionChanged', () => {
|
|
51
|
-
it('should return true in case, HapticFeedback version is 6.1 or higher. False, otherwise', () => {
|
|
52
|
-
const haptic1 = new HapticFeedback('6.0');
|
|
53
|
-
expect(haptic1.supports('impactOccurred')).toBe(false);
|
|
54
|
-
expect(haptic1.supports('notificationOccurred')).toBe(false);
|
|
55
|
-
expect(haptic1.supports('selectionChanged')).toBe(false);
|
|
56
|
-
|
|
57
|
-
const haptic2 = new HapticFeedback('6.1');
|
|
58
|
-
expect(haptic2.supports('impactOccurred')).toBe(true);
|
|
59
|
-
expect(haptic2.supports('notificationOccurred')).toBe(true);
|
|
60
|
-
expect(haptic2.supports('selectionChanged')).toBe(true);
|
|
61
|
-
|
|
62
|
-
const haptic3 = new HapticFeedback('6.2');
|
|
63
|
-
expect(haptic3.supports('impactOccurred')).toBe(true);
|
|
64
|
-
expect(haptic3.supports('notificationOccurred')).toBe(true);
|
|
65
|
-
expect(haptic3.supports('selectionChanged')).toBe(true);
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './HapticFeedback.js';
|