@tma.js/sdk 1.4.3 → 1.4.6

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.
Files changed (283) hide show
  1. package/README.md +2 -2
  2. package/dist/dts/bridge/events/events.d.ts +16 -16
  3. package/dist/dts/bridge/methods/methods.d.ts +27 -27
  4. package/dist/dts/bridge/methods/popup.d.ts +1 -1
  5. package/dist/dts/{init/css → css}/bindMiniAppCSSVars.d.ts +2 -2
  6. package/dist/dts/{init/css → css}/bindThemeCSSVars.d.ts +1 -1
  7. package/dist/dts/{init/css → css}/bindViewportCSSVars.d.ts +1 -1
  8. package/dist/dts/css/index.d.ts +4 -0
  9. package/dist/dts/index.d.ts +1 -0
  10. package/dist/dts/init-data/types.d.ts +3 -3
  11. package/dist/dts/launch-params/types.d.ts +1 -1
  12. package/dist/dts/theme-params/types.d.ts +1 -1
  13. package/dist/index.cjs +1 -2
  14. package/dist/index.iife.js +1 -2
  15. package/dist/index.mjs +126 -115
  16. package/package.json +2 -3
  17. package/dist/index.cjs.map +0 -1
  18. package/dist/index.iife.js.map +0 -1
  19. package/dist/index.mjs.map +0 -1
  20. package/src/__tests__/globals.ts +0 -39
  21. package/src/back-button/BackButton.ts +0 -90
  22. package/src/back-button/__tests__/BackButton.ts +0 -129
  23. package/src/back-button/index.ts +0 -2
  24. package/src/back-button/types.ts +0 -14
  25. package/src/bridge/__tests__/parseMessage.ts +0 -23
  26. package/src/bridge/__tests__/request.ts +0 -236
  27. package/src/bridge/env/__tests__/hasExternalNotify.ts +0 -15
  28. package/src/bridge/env/__tests__/hasWebviewProxy.ts +0 -15
  29. package/src/bridge/env/__tests__/isIframe.ts +0 -30
  30. package/src/bridge/env/hasExternalNotify.ts +0 -19
  31. package/src/bridge/env/hasWebviewProxy.ts +0 -19
  32. package/src/bridge/env/index.ts +0 -3
  33. package/src/bridge/env/isIframe.ts +0 -11
  34. package/src/bridge/errors/MethodUnsupportedError.ts +0 -13
  35. package/src/bridge/errors/ParameterUnsupportedError.ts +0 -13
  36. package/src/bridge/errors/index.ts +0 -2
  37. package/src/bridge/events/__tests__/createEmitter.ts +0 -143
  38. package/src/bridge/events/__tests__/off.ts +0 -34
  39. package/src/bridge/events/__tests__/on.ts +0 -49
  40. package/src/bridge/events/__tests__/onTelegramEvent.ts +0 -49
  41. package/src/bridge/events/__tests__/once.ts +0 -64
  42. package/src/bridge/events/__tests__/singletonEmitter.ts +0 -22
  43. package/src/bridge/events/__tests__/subscribe.ts +0 -49
  44. package/src/bridge/events/__tests__/unsubscribe.ts +0 -34
  45. package/src/bridge/events/createEmitter.ts +0 -108
  46. package/src/bridge/events/events.ts +0 -170
  47. package/src/bridge/events/index.ts +0 -9
  48. package/src/bridge/events/off.ts +0 -14
  49. package/src/bridge/events/on.ts +0 -19
  50. package/src/bridge/events/onTelegramEvent.ts +0 -81
  51. package/src/bridge/events/once.ts +0 -18
  52. package/src/bridge/events/parsers/__tests__/clipboardTextReceived.ts +0 -21
  53. package/src/bridge/events/parsers/__tests__/invoiceClosed.ts +0 -12
  54. package/src/bridge/events/parsers/__tests__/popupClosed.ts +0 -10
  55. package/src/bridge/events/parsers/__tests__/qrTextReceived.ts +0 -9
  56. package/src/bridge/events/parsers/__tests__/theme-changed.ts +0 -42
  57. package/src/bridge/events/parsers/__tests__/viewportChanged.ts +0 -49
  58. package/src/bridge/events/parsers/clipboardTextReceived.ts +0 -26
  59. package/src/bridge/events/parsers/customMethodInvoked.ts +0 -25
  60. package/src/bridge/events/parsers/index.ts +0 -9
  61. package/src/bridge/events/parsers/invoiceClosed.ts +0 -26
  62. package/src/bridge/events/parsers/phoneRequested.ts +0 -14
  63. package/src/bridge/events/parsers/popupClosed.ts +0 -19
  64. package/src/bridge/events/parsers/qrTextReceived.ts +0 -14
  65. package/src/bridge/events/parsers/theme-changed.ts +0 -58
  66. package/src/bridge/events/parsers/viewportChanged.ts +0 -33
  67. package/src/bridge/events/parsers/writeAccessRequested.ts +0 -14
  68. package/src/bridge/events/singletonEmitter.ts +0 -19
  69. package/src/bridge/events/subscribe.ts +0 -15
  70. package/src/bridge/events/unsubscribe.ts +0 -10
  71. package/src/bridge/index.ts +0 -7
  72. package/src/bridge/invokeCustomMethod.ts +0 -56
  73. package/src/bridge/methods/__tests__/createPostEvent.ts +0 -37
  74. package/src/bridge/methods/__tests__/postEvent.ts +0 -137
  75. package/src/bridge/methods/createPostEvent.ts +0 -40
  76. package/src/bridge/methods/custom-methods.ts +0 -68
  77. package/src/bridge/methods/haptic.ts +0 -52
  78. package/src/bridge/methods/index.ts +0 -6
  79. package/src/bridge/methods/methods.ts +0 -370
  80. package/src/bridge/methods/popup.ts +0 -53
  81. package/src/bridge/methods/postEvent.ts +0 -101
  82. package/src/bridge/parseMessage.ts +0 -28
  83. package/src/bridge/request.ts +0 -176
  84. package/src/classnames/__tests__/classNames.ts +0 -20
  85. package/src/classnames/__tests__/mergeClassNames.ts +0 -21
  86. package/src/classnames/classNames.ts +0 -34
  87. package/src/classnames/index.ts +0 -2
  88. package/src/classnames/mergeClassNames.ts +0 -60
  89. package/src/closing-behavior/ClosingBehavior.ts +0 -64
  90. package/src/closing-behavior/__tests__/ClosingBehavior.ts +0 -86
  91. package/src/closing-behavior/index.ts +0 -2
  92. package/src/closing-behavior/types.ts +0 -12
  93. package/src/cloud-storage/CloudStorage.ts +0 -138
  94. package/src/cloud-storage/index.ts +0 -1
  95. package/src/colors/__tests__/isColorDark.ts +0 -12
  96. package/src/colors/__tests__/isRGB.ts +0 -13
  97. package/src/colors/__tests__/isRGBShort.ts +0 -13
  98. package/src/colors/__tests__/toRGB.ts +0 -23
  99. package/src/colors/index.ts +0 -5
  100. package/src/colors/isColorDark.ts +0 -22
  101. package/src/colors/isRGB.ts +0 -9
  102. package/src/colors/isRGBShort.ts +0 -9
  103. package/src/colors/toRGB.ts +0 -49
  104. package/src/colors/types.ts +0 -9
  105. package/src/event-emitter/EventEmitter.ts +0 -146
  106. package/src/event-emitter/__tests__/EventEmitter.ts +0 -145
  107. package/src/event-emitter/index.ts +0 -2
  108. package/src/event-emitter/types.ts +0 -60
  109. package/src/globals.ts +0 -38
  110. package/src/haptic-feedback/HapticFeedback.ts +0 -70
  111. package/src/haptic-feedback/__tests__/HapticFeedback.ts +0 -68
  112. package/src/haptic-feedback/index.ts +0 -1
  113. package/src/index.ts +0 -179
  114. package/src/init/catchCustomStyles.ts +0 -17
  115. package/src/init/creators/__tests__/createViewport.ts +0 -96
  116. package/src/init/creators/createBackButton.ts +0 -25
  117. package/src/init/creators/createClosingBehavior.ts +0 -24
  118. package/src/init/creators/createMainButton.ts +0 -51
  119. package/src/init/creators/createMiniApp.ts +0 -48
  120. package/src/init/creators/createRequestIdGenerator.ts +0 -13
  121. package/src/init/creators/createSettingsButton.ts +0 -25
  122. package/src/init/creators/createThemeParams.ts +0 -11
  123. package/src/init/creators/createViewport.ts +0 -94
  124. package/src/init/creators/index.ts +0 -8
  125. package/src/init/css/bindMiniAppCSSVars.ts +0 -48
  126. package/src/init/css/bindThemeCSSVars.ts +0 -31
  127. package/src/init/css/bindViewportCSSVars.ts +0 -36
  128. package/src/init/css/index.ts +0 -1
  129. package/src/init/css/processCSSVarsOption.ts +0 -57
  130. package/src/init/css/setCSSVar.ts +0 -8
  131. package/src/init/index.ts +0 -2
  132. package/src/init/init.ts +0 -134
  133. package/src/init/types.ts +0 -94
  134. package/src/init-data/InitData.ts +0 -96
  135. package/src/init-data/__tests__/InitData.ts +0 -98
  136. package/src/init-data/__tests__/chatParser.ts +0 -102
  137. package/src/init-data/__tests__/initDataParser.ts +0 -136
  138. package/src/init-data/__tests__/parseInitData.ts +0 -136
  139. package/src/init-data/__tests__/userParser.ts +0 -96
  140. package/src/init-data/chatParser.ts +0 -19
  141. package/src/init-data/index.ts +0 -6
  142. package/src/init-data/initDataParser.ts +0 -41
  143. package/src/init-data/parseInitData.ts +0 -10
  144. package/src/init-data/types.ts +0 -164
  145. package/src/init-data/userParser.ts +0 -45
  146. package/src/invoice/Invoice.ts +0 -123
  147. package/src/invoice/index.ts +0 -2
  148. package/src/invoice/types.ts +0 -11
  149. package/src/launch-params/__tests__/retrieveFromUrl.ts +0 -19
  150. package/src/launch-params/computeLaunchData.ts +0 -81
  151. package/src/launch-params/computePageReload.ts +0 -13
  152. package/src/launch-params/getFirstNavigationEntry.ts +0 -10
  153. package/src/launch-params/index.ts +0 -13
  154. package/src/launch-params/launchParamsParser.ts +0 -45
  155. package/src/launch-params/parseLaunchParams.ts +0 -10
  156. package/src/launch-params/retrieveCurrent.ts +0 -27
  157. package/src/launch-params/retrieveFromLocation.ts +0 -10
  158. package/src/launch-params/retrieveFromPerformance.ts +0 -18
  159. package/src/launch-params/retrieveFromUrl.ts +0 -19
  160. package/src/launch-params/retrieveLaunchData.ts +0 -30
  161. package/src/launch-params/serializeLaunchParams.ts +0 -37
  162. package/src/launch-params/storage.ts +0 -33
  163. package/src/launch-params/types.ts +0 -62
  164. package/src/logger/Logger.ts +0 -72
  165. package/src/logger/__tests__/Logger.ts +0 -107
  166. package/src/logger/index.ts +0 -1
  167. package/src/main-button/MainButton.ts +0 -239
  168. package/src/main-button/__tests__/MainButton.ts +0 -346
  169. package/src/main-button/index.ts +0 -2
  170. package/src/main-button/types.ts +0 -26
  171. package/src/mini-app/MiniApp.ts +0 -348
  172. package/src/mini-app/__tests__/MiniApp.ts +0 -140
  173. package/src/mini-app/contactParser.ts +0 -29
  174. package/src/mini-app/index.ts +0 -2
  175. package/src/mini-app/types.ts +0 -38
  176. package/src/misc/__tests__/isRecord.ts +0 -21
  177. package/src/misc/index.ts +0 -2
  178. package/src/misc/isRecord.ts +0 -7
  179. package/src/misc/isTMA.ts +0 -13
  180. package/src/navigation/HashNavigator/HashNavigator.ts +0 -220
  181. package/src/navigation/HashNavigator/__tests__/HashNavigator.ts +0 -144
  182. package/src/navigation/HashNavigator/__tests__/drop.ts +0 -42
  183. package/src/navigation/HashNavigator/__tests__/go.ts +0 -9
  184. package/src/navigation/HashNavigator/drop.ts +0 -36
  185. package/src/navigation/HashNavigator/go.ts +0 -28
  186. package/src/navigation/HashNavigator/index.ts +0 -2
  187. package/src/navigation/HashNavigator/types.ts +0 -41
  188. package/src/navigation/Navigator/Navigator.ts +0 -282
  189. package/src/navigation/Navigator/index.ts +0 -2
  190. package/src/navigation/Navigator/types.ts +0 -55
  191. package/src/navigation/ensurePrefix.ts +0 -9
  192. package/src/navigation/getHash.ts +0 -17
  193. package/src/navigation/index.ts +0 -4
  194. package/src/parsing/ArrayValueParser.ts +0 -79
  195. package/src/parsing/ParseError.ts +0 -27
  196. package/src/parsing/ParseSchemaFieldError.ts +0 -21
  197. package/src/parsing/ValueParser.ts +0 -71
  198. package/src/parsing/__tests__/ArrayValueParser.ts +0 -18
  199. package/src/parsing/__tests__/toRecord.ts +0 -10
  200. package/src/parsing/createValueParserGenerator.ts +0 -16
  201. package/src/parsing/index.ts +0 -10
  202. package/src/parsing/parseBySchema.ts +0 -65
  203. package/src/parsing/parsers/__tests__/array.ts +0 -39
  204. package/src/parsing/parsers/__tests__/boolean.ts +0 -31
  205. package/src/parsing/parsers/__tests__/date.ts +0 -25
  206. package/src/parsing/parsers/__tests__/json.ts +0 -80
  207. package/src/parsing/parsers/__tests__/number.ts +0 -23
  208. package/src/parsing/parsers/__tests__/rgb.ts +0 -22
  209. package/src/parsing/parsers/__tests__/searchParams.ts +0 -105
  210. package/src/parsing/parsers/__tests__/string.ts +0 -25
  211. package/src/parsing/parsers/array.ts +0 -9
  212. package/src/parsing/parsers/boolean.ts +0 -22
  213. package/src/parsing/parsers/date.ts +0 -11
  214. package/src/parsing/parsers/index.ts +0 -8
  215. package/src/parsing/parsers/json.ts +0 -17
  216. package/src/parsing/parsers/number.ts +0 -21
  217. package/src/parsing/parsers/rgb.ts +0 -10
  218. package/src/parsing/parsers/searchParams.ts +0 -24
  219. package/src/parsing/parsers/string.ts +0 -12
  220. package/src/parsing/toRecord.ts +0 -27
  221. package/src/parsing/types.ts +0 -32
  222. package/src/parsing/unexpectedTypeError.ts +0 -6
  223. package/src/popup/Popup.ts +0 -91
  224. package/src/popup/__tests__/Popup.ts +0 -130
  225. package/src/popup/__tests__/preparePopupParams.ts +0 -85
  226. package/src/popup/index.ts +0 -2
  227. package/src/popup/preparePopupParams.ts +0 -59
  228. package/src/popup/types.ts +0 -69
  229. package/src/qr-scanner/QRScanner.ts +0 -95
  230. package/src/qr-scanner/index.ts +0 -2
  231. package/src/qr-scanner/types.ts +0 -11
  232. package/src/settings-button/SettingsButton.ts +0 -85
  233. package/src/settings-button/index.ts +0 -2
  234. package/src/settings-button/types.ts +0 -15
  235. package/src/state/State.ts +0 -67
  236. package/src/state/index.ts +0 -2
  237. package/src/state/types.ts +0 -31
  238. package/src/storage.ts +0 -69
  239. package/src/supports/__tests__/supports.ts +0 -123
  240. package/src/supports/createSupportsFunc.ts +0 -18
  241. package/src/supports/createSupportsParamFunc.ts +0 -27
  242. package/src/supports/index.ts +0 -4
  243. package/src/supports/supports.ts +0 -84
  244. package/src/supports/types.ts +0 -1
  245. package/src/theme-params/ThemeParams.ts +0 -131
  246. package/src/theme-params/__tests__/keys.ts +0 -19
  247. package/src/theme-params/__tests__/parseThemeParams.ts +0 -29
  248. package/src/theme-params/__tests__/serializeThemeParams.ts +0 -29
  249. package/src/theme-params/__tests__/themeParamsParser.ts +0 -29
  250. package/src/theme-params/index.ts +0 -6
  251. package/src/theme-params/keys.ts +0 -24
  252. package/src/theme-params/parseThemeParams.ts +0 -10
  253. package/src/theme-params/requestThemeParams.ts +0 -13
  254. package/src/theme-params/serializeThemeParams.ts +0 -20
  255. package/src/theme-params/themeParamsParser.ts +0 -22
  256. package/src/theme-params/types.ts +0 -33
  257. package/src/timeout/TimeoutError.ts +0 -6
  258. package/src/timeout/__tests__/isTimeoutError.ts +0 -9
  259. package/src/timeout/__tests__/withTimeout.ts +0 -28
  260. package/src/timeout/index.ts +0 -4
  261. package/src/timeout/isTimeoutError.ts +0 -9
  262. package/src/timeout/sleep.ts +0 -10
  263. package/src/timeout/withTimeout.ts +0 -24
  264. package/src/types/index.ts +0 -4
  265. package/src/types/methods.ts +0 -18
  266. package/src/types/platform.ts +0 -14
  267. package/src/types/request-id.ts +0 -10
  268. package/src/types/utils.ts +0 -50
  269. package/src/utils/Utils.ts +0 -107
  270. package/src/utils/index.ts +0 -1
  271. package/src/version/__tests__/compareVersions.ts +0 -19
  272. package/src/version/compareVersions.ts +0 -28
  273. package/src/version/index.ts +0 -2
  274. package/src/version/types.ts +0 -4
  275. package/src/viewport/Viewport.ts +0 -171
  276. package/src/viewport/__tests__/isStableViewportPlatform.ts +0 -15
  277. package/src/viewport/__tests__/utils.ts +0 -12
  278. package/src/viewport/index.ts +0 -4
  279. package/src/viewport/isStableViewportPlatform.ts +0 -10
  280. package/src/viewport/requestViewport.ts +0 -23
  281. package/src/viewport/types.ts +0 -23
  282. package/src/viewport/utils.ts +0 -7
  283. /package/dist/dts/{init/css → css}/setCSSVar.d.ts +0 -0
@@ -1,107 +0,0 @@
1
- import {
2
- afterAll,
3
- afterEach,
4
- beforeAll,
5
- describe,
6
- expect,
7
- it,
8
- vi,
9
- } from 'vitest';
10
-
11
- import { Logger } from '../Logger';
12
-
13
- const now = new Date('2022-11-04T09:09:43.007Z');
14
-
15
- afterEach(() => {
16
- vi.resetAllMocks();
17
- });
18
-
19
- beforeAll(() => {
20
- vi.useFakeTimers().setSystemTime(now);
21
- });
22
-
23
- afterAll(() => {
24
- vi.useRealTimers();
25
- });
26
-
27
- it('should not call console methods if logger is disabled', () => {
28
- const logger = new Logger('', false);
29
- const spy = vi.fn();
30
-
31
- vi.spyOn(console, 'log').mockImplementation(spy);
32
- vi.spyOn(console, 'warn').mockImplementation(spy);
33
- vi.spyOn(console, 'error').mockImplementation(spy);
34
-
35
- logger.log();
36
- logger.warn();
37
- logger.error();
38
- expect(spy).not.toHaveBeenCalled();
39
- });
40
-
41
- describe('enable', () => {
42
- it('should start logging messages into console', () => {
43
- const logger = new Logger('', false);
44
- const spy = vi.fn();
45
-
46
- vi.spyOn(console, 'log').mockImplementation(spy);
47
- logger.log();
48
- expect(spy).not.toHaveBeenCalled();
49
-
50
- logger.enable();
51
- logger.log();
52
- expect(spy).toHaveBeenCalledOnce();
53
- });
54
- });
55
-
56
- describe('disable', () => {
57
- it('should stop logging messages into console', () => {
58
- const logger = new Logger('', true);
59
- const spy = vi.fn();
60
-
61
- vi.spyOn(console, 'log').mockImplementation(spy);
62
- logger.log();
63
- expect(spy).toHaveBeenCalledOnce();
64
-
65
- spy.mockReset();
66
-
67
- logger.disable();
68
- logger.log();
69
- expect(spy).not.toHaveBeenCalled();
70
- });
71
- });
72
-
73
- describe('error', () => {
74
- it('should call console.error()', () => {
75
- const logger = new Logger('My prefix', true);
76
- const spy = vi.fn();
77
- vi.spyOn(console, 'error').mockImplementation(spy);
78
-
79
- logger.error('Test');
80
- expect(spy).toHaveBeenCalledOnce();
81
- expect(spy).toHaveBeenCalledWith('[09:09:43.007]', 'My prefix', 'Test');
82
- });
83
- });
84
-
85
- describe('log', () => {
86
- it('should call console.log()', () => {
87
- const logger = new Logger('My prefix', true);
88
- const spy = vi.fn();
89
- vi.spyOn(console, 'log').mockImplementation(spy);
90
-
91
- logger.log('Test');
92
- expect(spy).toHaveBeenCalledOnce();
93
- expect(spy).toHaveBeenCalledWith('[09:09:43.007]', 'My prefix', 'Test');
94
- });
95
- });
96
-
97
- describe('warn', () => {
98
- it('should call console.warn()', () => {
99
- const logger = new Logger('My prefix', true);
100
- const spy = vi.fn();
101
- vi.spyOn(console, 'warn').mockImplementation(spy);
102
-
103
- logger.warn('Test');
104
- expect(spy).toHaveBeenCalledOnce();
105
- expect(spy).toHaveBeenCalledWith('[09:09:43.007]', 'My prefix', 'Test');
106
- });
107
- });
@@ -1 +0,0 @@
1
- export * from './Logger.js';
@@ -1,239 +0,0 @@
1
- import {
2
- off,
3
- on,
4
- type PostEvent,
5
- postEvent as defaultPostEvent,
6
- } from '~/bridge/index.js';
7
- import { EventEmitter } from '~/event-emitter/index.js';
8
- import { State } from '~/state/index.js';
9
- import type { RGB } from '~/colors/index.js';
10
-
11
- import type {
12
- MainButtonEvents,
13
- MainButtonParams,
14
- MainButtonProps,
15
- MainButtonState,
16
- } from './types.js';
17
-
18
- type Emitter = EventEmitter<MainButtonEvents>;
19
-
20
- /**
21
- * Controls the main button, which is displayed at the bottom
22
- * of the Mini App in the Telegram interface.
23
- */
24
- export class MainButton {
25
- private readonly ee: Emitter = new EventEmitter();
26
-
27
- private readonly state: State<MainButtonState>;
28
-
29
- private readonly postEvent: PostEvent;
30
-
31
- constructor(props: MainButtonProps) {
32
- const {
33
- postEvent = defaultPostEvent,
34
- text,
35
- textColor,
36
- backgroundColor,
37
- isEnabled,
38
- isVisible,
39
- isLoaderVisible,
40
- } = props;
41
-
42
- this.postEvent = postEvent;
43
- this.state = new State({
44
- backgroundColor,
45
- isEnabled,
46
- isVisible,
47
- isLoaderVisible,
48
- text,
49
- textColor,
50
- }, this.ee);
51
- }
52
-
53
- /**
54
- * Sends current local state to Telegram application.
55
- */
56
- private commit(): void {
57
- // We should not commit changes until payload is correct. We could
58
- // have some invalid values in case, button instance was created
59
- // with empty values. Otherwise, an unexpected behaviour could be received.
60
- if (this.text === '') {
61
- return;
62
- }
63
-
64
- this.postEvent('web_app_setup_main_button', {
65
- is_visible: this.isVisible,
66
- is_active: this.isEnabled,
67
- is_progress_visible: this.isLoaderVisible,
68
- text: this.text,
69
- color: this.backgroundColor,
70
- text_color: this.textColor,
71
- });
72
- }
73
-
74
- private set isEnabled(isEnabled: boolean) {
75
- this.setParams({ isEnabled });
76
- }
77
-
78
- /**
79
- * True if the Main Button is currently enabled.
80
- */
81
- get isEnabled(): boolean {
82
- return this.state.get('isEnabled');
83
- }
84
-
85
- private set isLoaderVisible(isLoaderVisible: boolean) {
86
- this.setParams({ isLoaderVisible });
87
- }
88
-
89
- /**
90
- * True if the Main Button loader is currently visible.
91
- */
92
- get isLoaderVisible(): boolean {
93
- return this.state.get('isLoaderVisible');
94
- }
95
-
96
- private set isVisible(isVisible: boolean) {
97
- this.setParams({ isVisible });
98
- }
99
-
100
- /**
101
- * True if the Main Button is currently visible.
102
- */
103
- get isVisible(): boolean {
104
- return this.state.get('isVisible');
105
- }
106
-
107
- /**
108
- * The Main Button background color.
109
- */
110
- get backgroundColor(): RGB {
111
- return this.state.get('backgroundColor');
112
- }
113
-
114
- /**
115
- * The Main Button text.
116
- */
117
- get text(): string {
118
- return this.state.get('text');
119
- }
120
-
121
- /**
122
- * The Main Button text color.
123
- */
124
- get textColor(): RGB {
125
- return this.state.get('textColor');
126
- }
127
-
128
- /**
129
- * Disables the Main Button.
130
- */
131
- disable(): this {
132
- // FIXME: This method does not work on Android. Event "main_button_pressed"
133
- // keeps getting received even in case, button is disabled.
134
- // Issue: https://github.com/Telegram-Mini-Apps/documentation/issues/1
135
- this.isEnabled = false;
136
- return this;
137
- }
138
-
139
- /**
140
- * Enables the Main Button.
141
- */
142
- enable(): this {
143
- this.isEnabled = true;
144
- return this;
145
- }
146
-
147
- /**
148
- * Hides the Main Button.
149
- */
150
- hide(): this {
151
- this.isVisible = false;
152
- return this;
153
- }
154
-
155
- /**
156
- * Hides the Main Button loader.
157
- */
158
- hideLoader(): this {
159
- this.isLoaderVisible = false;
160
- return this;
161
- }
162
-
163
- /**
164
- * Adds new event listener.
165
- * @param event - event name.
166
- * @param listener - event listener.
167
- */
168
- on: Emitter['on'] = (event, listener) => (
169
- // FIXME: Event 'main_button_pressed' is still being received on Android
170
- // even if the main button is disabled.
171
- // Issue: https://github.com/Telegram-Mini-Apps/tma.js/issues/3
172
- event === 'click'
173
- ? on('main_button_pressed', listener)
174
- : this.ee.on(event, listener)
175
- );
176
-
177
- /**
178
- * Removes event listener.
179
- * @param event - event name.
180
- * @param listener - event listener.
181
- */
182
- off: Emitter['off'] = (event, listener) => (
183
- event === 'click'
184
- ? off('main_button_pressed', listener)
185
- : this.ee.off(event, listener)
186
- );
187
-
188
- /**
189
- * Shows the Main Button. Note that opening the Mini App from the attachment menu hides the
190
- * main button until the user interacts with the Mini App interface.
191
- */
192
- show(): this {
193
- this.isVisible = true;
194
- return this;
195
- }
196
-
197
- /**
198
- * A method to show a loading indicator on the Main Button. It is recommended to display
199
- * loader if the action tied to the button may take a long time.
200
- */
201
- showLoader(): this {
202
- this.isLoaderVisible = true;
203
- return this;
204
- }
205
-
206
- /**
207
- * Sets new Main Button text. Minimal length for text is 1 symbol, and maximum is 64 symbols.
208
- * @param text - new text.
209
- */
210
- setText(text: string): this {
211
- return this.setParams({ text });
212
- }
213
-
214
- /**
215
- * Sets new Main Button text color.
216
- * @param textColor - new text color.
217
- */
218
- setTextColor(textColor: RGB): this {
219
- return this.setParams({ textColor });
220
- }
221
-
222
- /**
223
- * Updates current Main Button color.
224
- * @param backgroundColor - color to set.
225
- */
226
- setBackgroundColor(backgroundColor: RGB): this {
227
- return this.setParams({ backgroundColor });
228
- }
229
-
230
- /**
231
- * Allows setting multiple Main Button parameters.
232
- * @param params - Main Button parameters.
233
- */
234
- setParams(params: MainButtonParams): this {
235
- this.state.set(params);
236
- this.commit();
237
- return this;
238
- }
239
- }
@@ -1,346 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
-
3
- import { MainButton } from '../MainButton';
4
-
5
- describe('disable', () => {
6
- it('should call "web_app_setup_main_button" method with parameter where "is_active" property equal to false', () => {
7
- const postEvent = vi.fn();
8
- const mainButton = new MainButton({
9
- text: 'Test',
10
- textColor: '#000000',
11
- backgroundColor: '#ffffff',
12
- postEvent,
13
- isLoaderVisible: false,
14
- isVisible: false,
15
- isEnabled: false,
16
- });
17
-
18
- mainButton.disable();
19
- expect(postEvent).toHaveBeenCalledTimes(1);
20
- expect(postEvent.mock.calls[0][0]).toBe('web_app_setup_main_button');
21
- expect(postEvent.mock.calls[0][1]).toHaveProperty('is_active', false);
22
- });
23
-
24
- it('should emit "change:isEnabled" event with false value', () => {
25
- const listener = vi.fn();
26
- const postEvent = vi.fn();
27
- const mainButton = new MainButton({
28
- text: 'Test',
29
- textColor: '#000000',
30
- backgroundColor: '#ffffff',
31
- postEvent,
32
- isLoaderVisible: false,
33
- isVisible: false,
34
- isEnabled: true,
35
- });
36
-
37
- mainButton.on('change:isEnabled', listener);
38
- mainButton.disable();
39
- expect(listener).toHaveBeenCalledTimes(1);
40
- expect(listener).toHaveBeenCalledWith(false);
41
- });
42
- });
43
-
44
- describe('enable', () => {
45
- it('should call "web_app_setup_main_button" method with parameter where "is_active" property equal to true', () => {
46
- const postEvent = vi.fn();
47
- const mainButton = new MainButton({
48
- text: 'Test',
49
- textColor: '#000000',
50
- backgroundColor: '#ffffff',
51
- postEvent,
52
- isLoaderVisible: false,
53
- isVisible: false,
54
- isEnabled: false,
55
- });
56
-
57
- mainButton.enable();
58
- expect(postEvent).toHaveBeenCalledTimes(1);
59
- expect(postEvent.mock.calls[0][0]).toBe('web_app_setup_main_button');
60
- expect(postEvent.mock.calls[0][1]).toHaveProperty('is_active', true);
61
- });
62
-
63
- it('should emit "change:isEnabled" event with true value', () => {
64
- const listener = vi.fn();
65
- const mainButton = new MainButton({
66
- text: 'Test',
67
- textColor: '#000000',
68
- backgroundColor: '#ffffff',
69
- postEvent: vi.fn(),
70
- isLoaderVisible: false,
71
- isVisible: false,
72
- isEnabled: false,
73
- });
74
-
75
- mainButton.on('change:isEnabled', listener);
76
- mainButton.enable();
77
- expect(listener).toHaveBeenCalledTimes(1);
78
- expect(listener).toHaveBeenCalledWith(true);
79
- });
80
- });
81
-
82
- describe('hide', () => {
83
- it('should call "web_app_setup_main_button" method with parameter where "is_visible" property equal to false', () => {
84
- const postEvent = vi.fn();
85
- const mainButton = new MainButton({
86
- text: 'Test',
87
- textColor: '#000000',
88
- backgroundColor: '#ffffff',
89
- postEvent,
90
- isLoaderVisible: false,
91
- isVisible: true,
92
- isEnabled: false,
93
- });
94
-
95
- mainButton.hide();
96
- expect(postEvent).toHaveBeenCalledTimes(1);
97
- expect(postEvent.mock.calls[0][0]).toBe('web_app_setup_main_button');
98
- expect(postEvent.mock.calls[0][1]).toHaveProperty('is_visible', false);
99
- });
100
-
101
- it('should emit "change:isVisible" event with false value', () => {
102
- const listener = vi.fn();
103
- const mainButton = new MainButton({
104
- text: 'Test',
105
- textColor: '#000000',
106
- backgroundColor: '#ffffff',
107
- postEvent: vi.fn(),
108
- isLoaderVisible: false,
109
- isVisible: true,
110
- isEnabled: false,
111
- });
112
-
113
- mainButton.on('change:isVisible', listener);
114
- mainButton.hide();
115
- expect(listener).toHaveBeenCalledTimes(1);
116
- expect(listener).toHaveBeenCalledWith(false);
117
- });
118
- });
119
-
120
- describe('hideLoader', () => {
121
- it('should call "web_app_setup_main_button" method with parameter where "is_progress_visible" property equal to false', () => {
122
- const postEvent = vi.fn();
123
- const mainButton = new MainButton({
124
- text: 'Test',
125
- textColor: '#000000',
126
- backgroundColor: '#ffffff',
127
- postEvent,
128
- isLoaderVisible: true,
129
- isVisible: false,
130
- isEnabled: false,
131
- });
132
-
133
- mainButton.hideLoader();
134
- expect(postEvent).toHaveBeenCalledTimes(1);
135
- expect(postEvent.mock.calls[0][0]).toBe('web_app_setup_main_button');
136
- expect(postEvent.mock.calls[0][1]).toHaveProperty('is_progress_visible', false);
137
- });
138
-
139
- it('should emit "change:isLoaderVisible" event with false value', () => {
140
- const listener = vi.fn();
141
- const mainButton = new MainButton({
142
- text: 'Test',
143
- textColor: '#000000',
144
- backgroundColor: '#ffffff',
145
- postEvent: vi.fn(),
146
- isLoaderVisible: true,
147
- isVisible: false,
148
- isEnabled: false,
149
- });
150
-
151
- mainButton.on('change:isLoaderVisible', listener);
152
- mainButton.hideLoader();
153
- expect(listener).toHaveBeenCalledTimes(1);
154
- expect(listener).toHaveBeenCalledWith(false);
155
- });
156
- });
157
-
158
- describe('show', () => {
159
- it('should call "web_app_setup_main_button" method with parameter where "is_visible" property equal to true', () => {
160
- const postEvent = vi.fn();
161
- const mainButton = new MainButton({
162
- text: 'Test',
163
- textColor: '#000000',
164
- backgroundColor: '#ffffff',
165
- postEvent,
166
- isLoaderVisible: false,
167
- isVisible: false,
168
- isEnabled: false,
169
- });
170
-
171
- mainButton.show();
172
- expect(postEvent).toHaveBeenCalledTimes(1);
173
- expect(postEvent.mock.calls[0][0]).toBe('web_app_setup_main_button');
174
- expect(postEvent.mock.calls[0][1]).toHaveProperty('is_visible', true);
175
- });
176
-
177
- it('should emit "change:isVisible" event with true value', () => {
178
- const listener = vi.fn();
179
- const mainButton = new MainButton({
180
- text: 'Test',
181
- textColor: '#000000',
182
- backgroundColor: '#ffffff',
183
- postEvent: vi.fn(),
184
- isLoaderVisible: false,
185
- isVisible: false,
186
- isEnabled: false,
187
- });
188
-
189
- mainButton.on('change:isVisible', listener);
190
- mainButton.show();
191
- expect(listener).toHaveBeenCalledTimes(1);
192
- expect(listener).toHaveBeenCalledWith(true);
193
- });
194
- });
195
-
196
- describe('showLoader', () => {
197
- it('should call "web_app_setup_main_button" method with parameter where "is_progress_visible" property equal to true', () => {
198
- const postEvent = vi.fn();
199
- const mainButton = new MainButton({
200
- text: 'Test',
201
- textColor: '#000000',
202
- backgroundColor: '#ffffff',
203
- postEvent,
204
- isLoaderVisible: false,
205
- isVisible: false,
206
- isEnabled: false,
207
- });
208
-
209
- mainButton.showLoader();
210
- expect(postEvent).toHaveBeenCalledTimes(1);
211
- expect(postEvent.mock.calls[0][0]).toBe('web_app_setup_main_button');
212
- expect(postEvent.mock.calls[0][1]).toHaveProperty('is_progress_visible', true);
213
- });
214
-
215
- it('should emit "change:isLoaderVisible" event with true value', () => {
216
- const listener = vi.fn();
217
- const mainButton = new MainButton({
218
- text: 'Test',
219
- textColor: '#000000',
220
- backgroundColor: '#ffffff',
221
- postEvent: vi.fn(),
222
- isLoaderVisible: false,
223
- isVisible: false,
224
- isEnabled: false,
225
- });
226
-
227
- mainButton.on('change:isLoaderVisible', listener);
228
- mainButton.showLoader();
229
- expect(listener).toHaveBeenCalledTimes(1);
230
- expect(listener).toHaveBeenCalledWith(true);
231
- });
232
- });
233
-
234
- describe('setText', () => {
235
- it('should call "web_app_setup_main_button" method with parameter where "text" property equal to specified value', () => {
236
- const postEvent = vi.fn();
237
- const mainButton = new MainButton({
238
- text: 'Test',
239
- textColor: '#000000',
240
- backgroundColor: '#ffffff',
241
- postEvent,
242
- isLoaderVisible: false,
243
- isVisible: false,
244
- isEnabled: false,
245
- });
246
-
247
- mainButton.setText('WOW');
248
- expect(postEvent).toHaveBeenCalledTimes(1);
249
- expect(postEvent.mock.calls[0][0]).toBe('web_app_setup_main_button');
250
- expect(postEvent.mock.calls[0][1]).toHaveProperty('text', 'WOW');
251
- });
252
-
253
- it('should emit "change:text" event with specified value', () => {
254
- const listener = vi.fn();
255
- const mainButton = new MainButton({
256
- text: 'Test',
257
- textColor: '#000000',
258
- backgroundColor: '#ffffff',
259
- postEvent: vi.fn(),
260
- isLoaderVisible: false,
261
- isVisible: false,
262
- isEnabled: false,
263
- });
264
-
265
- mainButton.on('change:text', listener);
266
- mainButton.setText('Punch');
267
- expect(listener).toHaveBeenCalledTimes(1);
268
- expect(listener).toHaveBeenCalledWith('Punch');
269
- });
270
- });
271
-
272
- describe('setTextColor', () => {
273
- it('should call "web_app_setup_main_button" method with parameter where "text_color" property equal to specified value', () => {
274
- const postEvent = vi.fn();
275
- const mainButton = new MainButton({
276
- text: 'Test',
277
- textColor: '#000000',
278
- backgroundColor: '#ffffff',
279
- postEvent,
280
- isLoaderVisible: false,
281
- isVisible: false,
282
- isEnabled: false,
283
- });
284
-
285
- mainButton.setTextColor('#ffaacc');
286
- expect(postEvent).toHaveBeenCalledTimes(1);
287
- expect(postEvent.mock.calls[0][0]).toBe('web_app_setup_main_button');
288
- expect(postEvent.mock.calls[0][1]).toHaveProperty('text_color', '#ffaacc');
289
- });
290
-
291
- it('should emit "change:textColor" event with specified value', () => {
292
- const listener = vi.fn();
293
- const mainButton = new MainButton({
294
- text: 'Test',
295
- textColor: '#000000',
296
- backgroundColor: '#ffffff',
297
- postEvent: vi.fn(),
298
- isLoaderVisible: false,
299
- isVisible: false,
300
- isEnabled: false,
301
- });
302
-
303
- mainButton.on('change:textColor', listener);
304
- mainButton.setTextColor('#aaaaaa');
305
- expect(listener).toHaveBeenCalledTimes(1);
306
- expect(listener).toHaveBeenCalledWith('#aaaaaa');
307
- });
308
- });
309
-
310
- describe('setColor', () => {
311
- it('should call "web_app_setup_main_button" method with parameter where "color" property equal to specified value', () => {
312
- const postEvent = vi.fn();
313
- const mainButton = new MainButton({
314
- text: 'Test',
315
- textColor: '#000000',
316
- backgroundColor: '#ffffff',
317
- postEvent,
318
- isLoaderVisible: false,
319
- isVisible: false,
320
- isEnabled: false,
321
- });
322
-
323
- mainButton.setBackgroundColor('#ffaacc');
324
- expect(postEvent).toHaveBeenCalledTimes(1);
325
- expect(postEvent.mock.calls[0][0]).toBe('web_app_setup_main_button');
326
- expect(postEvent.mock.calls[0][1]).toHaveProperty('color', '#ffaacc');
327
- });
328
-
329
- it('should emit "change:backgroundColor" event with specified value', () => {
330
- const listener = vi.fn();
331
- const mainButton = new MainButton({
332
- text: 'Test',
333
- textColor: '#000000',
334
- backgroundColor: '#ffffff',
335
- postEvent: vi.fn(),
336
- isLoaderVisible: false,
337
- isVisible: false,
338
- isEnabled: false,
339
- });
340
-
341
- mainButton.on('change:backgroundColor', listener);
342
- mainButton.setBackgroundColor('#aaaaaa');
343
- expect(listener).toHaveBeenCalledTimes(1);
344
- expect(listener).toHaveBeenCalledWith('#aaaaaa');
345
- });
346
- });
@@ -1,2 +0,0 @@
1
- export * from './MainButton.js';
2
- export * from './types.js';